.NET安全系列之一:代码访问安全(CAS)
.NET安全系列之⼀:代码访问安全(CAS)
从这篇⽂章起,我将⽤⼀个系列总结⼀下.NET平台中安全相关问题,本系列将分7篇⽂章,如下:
这⼀部分重点介绍CAS,CAS技术允许我们通过验证源代码的⽅式衡量⼀个程序集的受信任程度,并确保其没有被篡改。
这⼀部分介绍了独⽴存储的相关概念及使⽤。
这⼀部分讨论如何衡量⼀个⽤户的受信任程度,⽤户的概念在Windows及其平台上许多技术中都有实现。资源访问控制技术基于⽤户与⾓⾊的思想实现所以被放到⼀起讨论。
这⼀部分介绍了.NET中⽀持的⼀些加密算法,包括对称加密算法,⾮对称加密算法,散列算法,以及⼀些证书,签名相关的技术。
这⼀部分介绍了Windows 2000系统开始⽀持的DPAPI(数据包括API)技术。通过DPAPI,可以在⽤户、进程、会话或机器级别上加密应⽤程序的数据从⽽确保其机密性。
这⼀部分介绍了对.NET程序集进⾏签名的⽅法。
这⼀部分讨论了两台计算机之间建⽴安全链接的常⽤技术,及部分ASP.NET中的安全话题。
这是本系列的第⼀篇,详细介绍了CAS。
女生过生日送什么礼物好⾸先介绍⼏个与.NET安全相关的概念并引出CAS的概念。
移动代码
移动代码通常指通过⽹络发布的应⽤程序代码。由于⽹络的不可信性,所以有必要限制授予下载代码(移动代码)的权限集。
CLR这样的虚拟机让.NET平台以⼀种优雅的⽅式解决了这个问题。如,遇到代码会破坏⽂件的情况,CLR能截获并阻⽌这个恶意操作,这个机制称为CAS – 代码访问安全。
CAS纵览
.NET中定义了⼤约30个权限,可以被⽤来准予或者拒绝程序集代码的运⾏。每个权限定义了对重要资源如注册表、⽂件或⽂件夹等进⾏访问的控制规则,对程序集授予信任意味着授予它⼀些必要的权限以使它能正常运⾏。
在CLR中,CAS机制⽤在以下两种情况中:
1. 在程序集装载期间,CLR授予它⼀些权限。
2. 当代码请求执⾏某个重要操作时,CLR必须验证包含这个代码的程序集具备适当的权限。
针对上述第⼀种情况,.NET中对程序的信任需要获取,仅当程序集能提供⼀系列证据,CLR才认为它是可信任的。这些证据与程序的来源和其中的数据有关。
根据程序集的证据给程序授予权限的步骤是可配置的。下图说明了整个过程:
由上图可以看出即使⼀个应⽤程序提供了证据,它也有可能不被授予权限。这全由安全策略中的配置决定。安全策略中的信息类似:如果程序集⾥的信息是由xxx发布的,则赋予它如下权限集。
当程序集获取⼀个权限集之后,程序集可以运⾏。⽽且可以在运⾏期间在这个被许可的权限集范围内修改这个权限集和安全管理⾏为。
CAS发挥作⽤的第⼆个场合是运⾏程序集代码时进⾏的检查权限。
.NET Framework的代码请求CLR验证调⽤⽅代码是否具备合适的权限。CLR把调⽤⽅代码看作当前线程栈上的⼀组⽅法。CLR验证包含这⼀组⽅法的所有程序集都具备多要求的权限,这称作栈审核。栈的遍历防⽌可信度低的程序集利⽤可信度⾼的程序集(例如微软开发的)进⾏某些恶意操作。
做个总结,代码访问安全性的主要⽬的是保护资源(例如本地磁盘,注册表或⽹络等)免受有害代码的破坏。代码组(Code Group)与权限(Permissions)是代码访问安全中两个最重要的概念。代码组⽤于把具有相似特征的代码集合到⼀组。把程序集放到代码组所使⽤信息称为"证据"。权限是允许每⼀个代码组执⾏的动作。这些概念将在下⽂详细介绍。CAS的作⽤过程:CLR中负责载⼊和运⾏托管代码的VES(Virtual Execution System)加载程序集并把程序集与⼀个或多个代码组相匹配。每⼀个代码组都被赋予了⼀个或多个权限,这样指定了各代码组的程序集可以执⾏什么动作。程序集可以在相应的权限下运⾏。
证据和权限
证据(evidence)是从程序集⾥提出来的⼀块信息,可以为程序集的验证提供证据。
.NET Framework类库中提供了8种⽤于程序集验证的证据,当我们需要验证程序集时可以由其中提取这些证据的⼀种,分别介绍如下:
1. System.Policy.ApplicationDirectory类实例表⽰的证据证明程序集存储在某个⽂件夹⾥。
2. System.Policy.Gac类实例表⽰的证据证明程序集是存储在GAC中的。
3. System.Policy.Site类实例表⽰的证据证明程序集是从某个⽹站(如wwwblogs)获取或下载的。
4. System.Policy.Url类实例表⽰的证据证明程序集获取⾃某个URL处(如wwwblogs/a.dll)。
5. System.Policy.Zone类实例表⽰的证据证明程序集是由某个区域获取的:
.NET提供了以下5个区域:
Internet
已添加到IE受限站点列表的Internet⽹站。
已添加到IE可信站点列表的Internet⽹站。
本地内部⽹
本地系统存储(我的电脑)
以上每个区域对应着System.Security.SecurityZone枚举的⼀个值。这些区域在Internet Explorer中配置并应⽤到整个系统。
6. System.Policy.Publisher类实例表⽰的证据表⽰发布者使⽤验证码技术签署程序集,根据这个证书⽣成的证据
7. System.Policy.StrongName类实例表⽰的证据表⽰程序集的强名(如果有)⽣成的证据。强名的区域设置不被该特征考虑。
8. System.Policy.Hash类实例表⽰的证据表⽰根据程序集的散列值⽣成的证据。
可以给应⽤程序集添加⾃⼰的证据(必须在签署程序集之前添加),这样可以完全配置安全机制。
System.Security.Policy.Evidence类的实例表⽰⼀个数据集合,其中包含两个证据集合,⼀个⽤于存储.NET Framework所提供的证据,另⼀个提供专有证据。⽤assembly.Evidence可获取程序集的证据。
证据提供⽅
程序集的证据由CLR在程序集载⼊AppDomain之前提供。有两种情况:
1. 由AppDomain运⾏库宿主在将第⼀个程序集载⼊AppDomain之前提供
包含AppDomain运⾏库宿主的程序集必须获得名为ControlEvidence的元权限。(这对微软开发的运⾏库不是问题)
2. 由类装载器在包含请求的程序集被载⼊AppDomain之前提供。
类装载器是CLR的⼀部分,被授予完全信任并且拥有元权限。
综上,任何情况下,证据获取机制都需要ControlEvidence元权限。
权限
权限允许代码执⾏⼀组操作,.Net中有4种权限,分别介绍如下:
1. 标准权限
下⾯列出的权限定义了所有能被程序集利⽤的资源。
System.Security.Permissions.EnvironmentPermission
读写环境变量的能⼒
System.Security.Permissions.FileDialogPermission
访问⽤户在Open对话框中选择⽂件的能⼒。通常⽤于没有赋予FileIOPermission权限,不能对⽂件进⾏有限的访问时。
System.Security.Permissions.FileIOPermission
处理⽂件的能⼒(其中包括读⽂件、写⽂件、添加⽂件的内容,创建、更改和访问⽂件夹)
System.Security.Permissions.IsolatedStoragePermission
访问独⽴存储的能⼒,独⽴存储与各⽤户相关,并具有代码⾝份的⼀些特征。
System.Security.Permissions.IsolatedStorageFilePermission
指定允许使⽤私有虚拟⽂件系统
System.Security.Permissions.ReflectionPermission
使⽤System.Reflection在运⾏期间查类型信息的能⼒
System.Security.Permissions.RegistryPermission
读、写、创建和删除注册表项和值的能⼒
System.Security.Permissions.UIPermission
访问⽤户界⾯的能⼒
System.Security.Permissions.DataProtectionPermission
允许在代码中为实现数据保护添加安全⾏为
System.Security.Permissions.KeyContainerPermission
控制访问密匙容器的能⼒
System.Security.Permissions.StorePermission
控制访问包含X509证书的存储区域的能⼒
System.Security.Permissions.SecurityPermission
执⾏、断⾔权限、调⽤⾮托管代码、忽略验证和其他权限的能⼒
System.Configuration.UsersettingsPermission
System.Security.Permissions.ResourcePermissionBase
控制使⽤代码访问安全权限的能⼒
System.Diagnostics.EventLogPermission
读写事件⽇志的能⼒
好记星魔塔攻略System.Diagnostics.PerformanceCounterPermission
利⽤性能计数器的能⼒
System.DirectoryServices.DirectoryServicesPermission
通过System.DirectoryServices类访问Active Directory的能⼒
System.ServiceProcess.ServiceControllerPermission
控制Windows服务的能⼒
System.Net.DnsPermission
使⽤TCP/IP域名系统(DNS)的能⼒
System.Net.SocketPermission
在⽹络传输地址上创建或接受TCP/IP连接的能⼒
System.Net.WebPermission
连接Web或接受Web连接的能⼒
System.Net.NetworkInformation.NetworkInformationPermission
System.Net.Mail.SmtpPermission
System.Web.AspNetHostingPermission
System.Messaging.MessageQueuePermission
释小龙电影全集国语通过Microsoft Message Queue使⽤消息队列的能⼒
System.Drawing.Printing.PrintingPermission
打印的能⼒
System.Data.Common.DBDataPermission
System.Data.OleDB. OleDbPermission
使⽤OLE DB提供程序的能⼒
System.Data.SqlClient.SqlClientPermission
使⽤SQL Server的.NET数据提供程序访问SQL Server数据库的能⼒
System.Data.Odbc.OdbcPermission
System.Data.OracleClient.OraclePermission
System.Data.SqlClient.SqlNotificationPermission
System.Transactions.DistributedTransactionPermission
这些权限派⽣⾃System.Security.CodeAccessPermission类。这个基类中的⽅法允许在代码中确保拥有权限、请求权限来拒绝授权访问,但它们不能⽤于获取安全策略⽆法授予的权限。对于以上这些权限,还可以进⾏更细粒别的操作。如FileIOPermission权限,不仅仅是⽂件的访问权限,还可以指定⽂件访问的具体级别。在使⽤这些权限时,应该把这部分代码放⼊try/catch块中,在程序运⾏受到限制时,应该给出⽤户可选的替换解决⽅案。⽽不是让程序⽆声的崩溃掉或不给提⽰的停⽌执⾏。
2. 标识权限(也称⾝份权限)
CLR为(⼏乎所有)程序集提供的证据。其不同之处在于它们的授予不依赖于安全策略,⽽是仅依赖于程序集提供的证据。所以只有CLR能把⾝份权限赋予代码,所以⾝份权限不能包括在权限集合中。
例如,⼀段代码是来⾃某个发布者,管理员把与另⼀个发布者相关的⾝份权限赋予这段代码是毫⽆意义的。
标识权限有如下⼏种:
System.Security.Permissions.PublisherIdentityPermission
System.Security.Permissions.SiteIdentityPermission
System.Security.Permissions.StrongNameIdentityPermission
System.Security.Permissions.URLIdentityPermission
System.Security.Permissions.GacIdentityPermission
System.Security.Permissions.ZoneIdentityPermission
这些类均派⽣⾃CodeAccessPermission,所以它们可以像其它权限那样⽤在代码⾥。
3. 安全权限
安全权限(⼜称元权限)是授予安全管理程序本⾝的⼀类权限。以下⼏点需要特别注意:
可以通过System.Security.Permissions.SecurityPermission在代码中操作元权限。
元权限允许执⾏⾮托管的代码(SecurityPermissionFlag.UnmanagedCode)
元权限允许从程序中提取证据(SecurityPermissionFlag.ControlEvidence)
元权限允许执⾏没有经过验证的代码(SecurityPermissionFlag.SkipVerfication)
4. ⾃定义权限
为资源访问定义⾃⼰的权限,可以从通过CodeAccessPermission的派⽣⾃定义的类,这些类可以实现与.NET代码访问安全系统相同的功能,包括堆栈和策略管理。需要创建⾃⼰的代码访问权限的原因:
保护.NET Framework没有保护的资源。
唐嫣成为金鹰女神
提供⽐现有权限更精细的管理。
权限集合
.NET中定义了⼏个权限集合,可以向代码组应⽤⼀个权限集合,已命名的权限集合有:
FullTrust: 没有权限的限制
SkipVerification: 不进⾏验证
Execution: 运⾏的能⼒,但是不能访问受保护的资源
Nothing: 没有权限,代码不能执⾏
LocalIntranet: 本地内部⽹的默认策略,它是权限全集的⼦集。
Internet: 未知来源的代码的默认策略,这是限制最严格的策略。(没有IO,访问事件⽇志等能⼒)
Everything: 这个集合中的所有权限,其中不包括忽略代码验证的权限。
这其中只有Everything权限集合是可以修改的,其它的都不可以修改。
通过应⽤安全策略根据证据授予权限
安全策略级别
.NET提供了4种安全策略级别
安全策略配置者应⽤于
企业管理员位于企业计算机上的程序集⾥的托管代码
计算机管理员存储于计算机上的程序集⾥的托管代码
⽤户管理员或相关⽤户使⽤特定⽤户权限运⾏的进程⾥的托管代码
应⽤程序域应⽤程序域的宿主位于应⽤程序⾥的托管代码
授予程序集的权限集是授予每个策略的权限集的交集,安全策略是由层次的。⼀般来说,⼤多数安全规则集中于"计算机"策略(事实上,默认情况下其它策略授予所有权限,就像只有"计算机"安全策略这⼀个)。
安全策略深⼊分析
安全策略有以下部分组成:
存储在树结构中的代码组唐朝由盛转衰
⼀组权限集
⼀组被安全策略授予完全信任的程序集(策略程序集或完全信任程序集)
⼀个代码组将⼀个证据和⼀个安全策略的权限集合对应起来。代码组有⼀个称之为成员条件的⼊⼝需求(entry requirement),如果要把程序集划归某个代码组,该程序集就必须符合那个代码组的成员条件。每⼀个代码组有且只有⼀个条件。官⽅⽂档解释:"如果程序集的⼀个证据和代码组的证据相同,那么这个证据集⾪属于这
个代码组。"所以如果创建了⾃定义证据,那么还需要创建⾃定义代码来使⽤它们。代码组可以使⽤的成员条件即证据参见上⽂。代码组是分层安排的,根部是All Code成员条件的代码组。如下图:
程序集的每⼀个代码组都将扩展程序集的权限,代码树中下⾯的代码组具有的权限⽐上⾯的代码组⾼。Every指忽略代码验证的权限即元权限。
调整代码访问安全策略的⼯具
.NET中提供了两种调整代码访问安全策略的⼯具,⼀个是基于命令⾏的⼯具 – ,另⼀个是基于mmc管理单元的⼯具。
命令⾏⼯具的优势在于可以创建脚本,更改安全策略,并把策略应⽤到多台计算机上。所以在接下来的部分将重点介绍Caspol⼯具:
基本⽤法
< -? 查看帮助。
< > C:/a.txt 输出到指定⽂件
这些⽤法与Windows中其他运⾏于cmd的⼯具相同。
下⾯把重点放在与调整CAS策略相关的⽤法
参数:-listdescription 缩写 -ld
公务员年度考核个人总结作⽤:以层次结构列出机器上的代码组及其描述。
其输出如下:
参数:-listgroups
作⽤:查看机器中的代码访问组。
执⾏结果:

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。