【发布时间】:2018-09-03 21:19:42
【问题描述】:
我想要实现的是一个具有以下功能的插件系统:
- 从可能不受我(开发人员)信任但受安装插件的最终用户信任的来源加载外部插件
- 在特定范围内授予每个插件的权限;例如一个插件可能有权从特定位置读取文件,而其他插件可能被允许连接到特定网站位置
- 每个插件权限的特殊情况:与另一个对象交互,最有可能作为接口实例提供,而不访问其任何非公共成员(甚至不使用偷偷摸摸的反射技术)
- 在插件代码造成任何损害之前防止最终用户不同意的操作,例如访问非公共成员或在文件系统上操作
在搜索过程中,我主要发现了涉及代码访问安全性的 SO 解决方案,据我所知,该解决方案在 .NET 4.x 中已经过时。我还在 MSDN 页面上阅读了一些关于新安全模型的内容,看来library code that exposes protected resources 在这里是必要的;但是,我找不到任何显示如何应用此类代码的示例。我的猜测是,这将涉及创建单独的 AppDomain 并可能使用 Principal 权限,但据我所知,这是差不多的。
在旁注中,我还发现只需要强命名程序集的提及,但我不相信这就足够了。如果我没记错的话,强大的命名优势之一是插件开发人员可以通过使用自己的私钥签署程序集哈希来证明自己的身份,而其他人可以使用众所周知且受信任的公钥进行检查。然而,仅此一项似乎太不灵活了,因为它要么要求开发人员亲自决定应该信任谁的代码,要么只信任任何学会签署他们的程序集的人。
如果有一个使用最新安全模型的安全管理代码示例,我将不胜感激。我目前的想法:
- 用于公开潜在敏感操作(例如 A 和 B)的服务接口
- 服务的虚拟实现,重点是防止未经授权执行这些操作
- 来自不同程序集的两个插件,一个具有执行操作 A 的权限,另一个具有操作 B 的权限
- 一个应用程序,它设置服务、加载带有插件的程序集并尝试为每个插件执行操作,以便阻止未经授权的操作并正确执行授权操作
- 在应用程序中运行时,两个插件本身都不应该能够访问一般敏感的 API,例如文件 I/O 或网络,但应该可以通过服务来完成
- 所有这些,同时尽可能密切关注 these recommendations(与 2010 年的 SO 问题中基于 CAS 的解决方案相反)
当然,如果它以更好的方式实现目标,欢迎您提出替代架构。
【问题讨论】:
-
CAS 本身并未被弃用,但不鼓励将其用作受信任代码(您的应用程序)和不受信任(插件)之间的安全边界。据我了解,这是因为 MS 不想进一步开发它,也不会修复任何允许绕过它的漏洞。如果您要在您链接的文章的“保护资源访问”部分中执行未知代码,他们列出了您可以使用的“替代措施”。 CAS 在这方面没有“替代”(作为提到的安全边界)。
-
插件是否需要用 C# 编写(或者说插件有任何语言限制)?
-
一般来说,我假设与主应用程序的 .NET 版本兼容的 .NET 程序集将作为插件得到支持(无论是用 C# 还是 VB 或其他 .NET 编译语言编写)。我没有直接支持其他库的计划;如果有人想插入一个,他们需要为它创建一个基于 .NET 的接口。
-
虽然它不能解决您问题的核心,但我认为 OIDC 混合流可能值得研究,作为一种对哪些插件可以访问哪些 API 进行细粒度控制的方法。您可以将范围应用于 API 表面的相关部分,并根据插件的访问级别将声明分配给插件。无论您最终使用哪种强签名或类似的基础设施,都可以提供身份验证的基础,而声明和范围则处理插件被允许执行的具体操作。
-
我想一些额外的解决方案不会受到伤害。最好能解释一下为什么提议的使用 CAS 的解决方案提供了比直接生成 AppDomain 并设置其权限更好的沙盒。
标签: c# .net security plugins permissions