65.9K
CodeProject 正在变化。 阅读更多。
Home

CAS(代码访问安全)与 .NET 4.0 安全模型常见问题解答(附完整视频演示)

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.94/5 (20投票s)

2010年10月23日

CPOL

9分钟阅读

viewsIcon

104174

CAS(代码访问安全)与 .NET 4.0 安全模型常见问题解答(附完整视频演示)

引言 

什么是 CAS?

CAS 中的证据是什么?

什么是权限和权限集?

什么是代码组?

那么 CAS 在运行时是如何工作的?

我们可以看一个 CAS 的快速演示吗?

CASPOL.exe 是什么?

当我使用 CASPOL 打开 .NET 4.0 DLL/程序集时,它会抛出错误?

你能更详细地介绍一下安全透明模型吗?

安全透明模型的演示确实能让事情更清楚?

什么是沙盒的概念?

当我们控制代码时,安全透明模型是好的,但外部 DLL 呢?

但为什么要改变,CAS 的问题是什么?

那么在 .NET 4.0 及更高版本中,我们如何授予代码访问权限?

如果我仍然想在 .NET 4.0 中使用 CAS,该怎么办?

参考文献

该视频讨论了 CAS、证据、权限集和代码组。

引言

许多开发人员理解 CAS(代码访问安全)的概念,但很少有人知道如何实现。本文将实际讨论和演示 CAS 的所有这些方面,而您直到今天只能在理论上看到它们。

本文首先从 CAS 的基本概念开始,如证据、权限、代码组和 caspol.exe。然后,它将继续演示如何在实际世界中实现 CAS。本文进一步讨论了 .NET 4.0 为 CAS 所做的根本性更改。在这方面,它讨论了安全透明模型和沙盒。

相信我,这篇文章是您看到 CAS 实际运行的最后机会……尽情享受。

 
什么是 CAS?

代码访问安全是一种安全模型,它根据证据(例如代码的来源、发布者是谁?、强名称等)来授予或拒绝您的程序集的权限。
 

CAS 中的证据是什么?

当您想在您的环境中执行任何代码时,您首先想知道代码来自哪里。根据它来自哪里,您将想授予他访问权限。例如,从您自己的计算机编译的代码将比从互联网下载的代码拥有更高的权限。

为了了解这一点,我们需要探测程序集/exe/dll 并获取证据,例如代码的发布者是谁,代码来自哪个网站,它来自哪个区域(互联网、内网等)等。


什么是权限和权限集?

一旦收集了关于代码的证据,您就可以为代码分配权限。有各种权限可以分配给代码,例如代码是否可以创建文件,是否可以写入注册表,代码是否可以执行反射,代码是否可以打开文件对话框等。

这些权限被收集到权限集中,然后这些权限集被分配给代码。
 

什么是代码组?

代码组只不过是代码的类别。这些类别由权限和证据值定义。当 .NET 代码运行时,它根据运行时收集的证据被分配到一个代码组。

例如,有各种默认的代码组,如我的计算机区域、互联网区域、内网区域等。

我的计算机区域代码组被分配给那些其证据表明它们是安装在计算机上的程序集的代码,并且它们具有'互联网'权限集,该权限集具有各种权限,如文件对话框、执行、用户界面、打印等。
 

 

那么 CAS 在运行时是如何工作的?

当程序集运行时,会发生以下步骤:-

• 收集程序集的证据。换句话说,这个程序集来自哪里?
• 根据证据,程序集被分配到一个代码组。换句话说,程序集根据收集到的证据拥有什么权限。
• 根据代码组,程序集被分配安全权限。
• 使用安全权限,程序集在该权限范围内运行。


 

我们可以看一个 CAS 的快速演示吗?
 

如果您想为程序集分配权限,我们需要安装 .NET 配置工具并单击信任程序集菜单,如下图所示。
 


 

一旦您信任了该程序集,您就可以将信任调整为完全信任或无。
 


 

请观看下面的完整视频,其中解释了如何为 exe 或程序集分配权限、权限集、
 代码组和证据。

 

 

CASPOL.exe 是什么?
 

它是负责为程序集分配权限的核心 exe。 .NET 配置工具只是一个覆盖在 caspol.exe 之上的外壳,以方便我们的工作。CASPOL.exe 命令很晦涩,所以 .NET 配置工具更用户友好。如果您有兴趣使用 caspol.exe,您可以打开 Visual Studio 命令提示符并键入 caspol.exe 及其必要的参数。


当我使用 CASPOL 打开 .NET 4.0 DLL/程序集时,它会抛出错误?

如果您尝试在配置向导中打开 .NET 4.0 DLL,您将收到如下错误。
 


 

.NET 4.0 中的 CAS 已完全弃用,有两个重大更改:-

• 权限的授予不再依赖于 .NET CAS,现在由主机负责。因此,运行 .NET DLL 的主机将定义程序集将拥有什么样的权限。NET Framework 4.0 默认禁用 CAS,这意味着通过 Windows Explorer 或命令提示符启动的所有应用程序都以完全信任运行。托管的 .NET 应用程序,那些在 Internet Explorer 或 ASP.NET 中运行的应用程序,将以其主机授予的信任级别运行,部分受信任。

• 引入了安全透明模型,将 .NET 代码分为三个类别:安全关键、安全透明和安全安全关键。
 

你能更详细地介绍一下安全透明模型吗?

安全透明模型根据关联的风险将代码放入单独的“盒子”中。如果您知道代码可能会做错事,您可以将该代码标记为“安全透明”,如果您有您信任的代码,您可以将其放入“安全关键”中。

通过放置上述隔离,您已确保不安全的代码(安全透明)无法调用安全的代码(安全关键)。当您将代码标记为安全透明时,这类代码无法调用安全关键代码。

如果由于某种原因,透明代码想调用安全关键代码,它可以绕过安全安全关键代码的桥梁。
 


 

安全透明模型的演示确实能让事情更清楚?

下面是一个简单的视频,我们创建了一个简单的代码并将其标记为安全关键,然后我们尝试从安全透明代码调用它,结果会收到错误。
 

 

什么是沙盒的概念?

下一个问题回答了同样的问题。
 

当我们控制代码时,安全透明模型是好的,但外部 DLL 呢?

当我们控制代码时,安全透明代码是好的,但如果我们获得的是第三方程序集怎么办?在那些情况下,您可以使用沙盒的概念。需要注意的一个重要事项是 CAS 已弃用,但并未完全移除。

因此,如果您有第三方 DLL,您可以创建自己的 appdomain 并分配权限集,以便您的第三方 DLL 在受控环境中运行。下面是一个简单的代码片段,展示了如何完成这些操作。下面的代码片段创建了一个应用程序域,并仅分配了执行和用户界面显示权限。

然后我们尝试做一些有趣的事情,比如弹出文件浏览器对话框,结果会收到如下图所示的错误。

步骤 1:- 使用权限集类创建具有执行和 UI 显示两个权限的 appdomain。

PermissionSet permset = new PermissionSet(PermissionState.None);
permset.AddPermission(new SecurityPermission(SecurityPermissionFlag.Execution));
permset.AddPermission(new UIPermission(UIPermissionWindow.AllWindows));


步骤 2:- 如下面的代码片段所示,将上述定义的权限集应用于新创建的应用程序域。

AppDomainSetup objSetup = new AppDomainSetup();
objSetup.ApplicationBase = AppDomain.CurrentDomain.SetupInformation.ApplicationBase;
AppDomain domain = AppDomain.CreateDomain("New domain name", AppDomain.CurrentDomain.Evidence, objSetup, permset);


步骤 3:- 创建实例并尝试调用“ShowDialog”函数。

Interface1 i1 = (ClassLibrary1.Class1)domain.CreateInstanceAndUnwrap("ClassLibrary1", "ClassLibrary1.Class1");
i1.ShowDialog();

如果您尝试执行打开对话框,它将弹出如下代码所示的错误。
 

 

但为什么要改变,CAS 的问题是什么?


• CAS 的第一件事就是不容易,所有那些创建代码组、权限集等的晦涩步骤都会让你精疲力竭。

• 如果您需要将程序集移动到另一台计算机,您需要重新进行所有工作。

• 最糟糕的是 CAS 在非托管代码上不起作用。我敢肯定,您总是会下载非 .NET 编写的 exe。


那么在 .NET 4.0 及更高版本中,我们如何授予代码访问权限?

限制代码访问的最佳方法是在操作系统级别设置限制。Windows SRP(软件限制策略)有助于实现这一点。
• 使用管理员帐户登录。
• 在开始菜单的“运行”或“搜索”框中键入 gpedit.msc,然后单击“确定”,将打开组策略。
• 转到计算机配置 > Windows 设置 > 安全设置。
• 右键单击“软件限制策略”并创建新策略。

 

如果我仍然想在 .NET 4.0 中使用 CAS,该怎么办?


“<NetFx40_LegacySecurityPolicy>”配置元素允许您指定进程或库使用 CAS 策略。当您激活此元素时,策略和证据重载将按照旧版本 .NET 框架中的方式工作。
 

<configuration>
<runtime>
<NetFx40_LegacySecurityPolicy enabled="true"/>
</runtime>
</configuration>


http://blogs.rev-net.com/ddewinter/2010/03/02/tip-20-opting-out-of-security-changes-in-net-4-in-asp-net-and-custom-appdomains/

 

参考文献

MSDN 链接到 CAS http://msdn.microsoft.com/en-us/library/930b76w0(VS.90).aspx

.NET 4.0 中的安全新功能 http://www.simple-talk.com/dotnet/.net-framework/whats-new-in-code-access-security-in-.net-framework-4.0---part-i/

.NET 中的 CAS 优秀简洁的文章 http://www.devx.com/vb2themax/article/19886/1954

优秀的问答文章解释 CAS http://justindeveloper.wordpress.com/2010/02/09/application-security-for-developers/

您会使用沙盒的 5 个原因 http://blogs.msdn.com/b/shawnfa/archive/2006/04/19/579066.aspx

.NET 4.0 中的旧版 CAS 策略向后兼容性 http://blogs.rev-net.com/ddewinter/2010/03/02/tip-20-opting-out-of-security-changes-in-net-4-in-asp-net-and-custom-appdomains/

 

如需进一步阅读,请观看以下面试准备视频和分步视频系列。

© . All rights reserved.