.net安全编程 阅读笔记(二)

安全策略

安全策略是一组映射证据和权限关系的规则.特别是当程序集或应用程序域是以它们自己现实的证据组为基础, 此时, 运行库就会使用安全策略来决定授予这些程序集或应用程序域哪些代码访问权限. 它使管理员或用户能全面控制代码,包括其想要进行的操作和想要访问的资源.

.NET 将安全策略分为四个级别:企业, 计算机,用户和应用程序域. 其中, 前三个是可以独立配置的.因为应用程序域只存在于运行库里,因此, 必须编程配置应用程序域的策略. 当运行库载入一个程序集或创建一个应用程序域时, 它会首先决定企业策略授予的权限, 其次决定计算机策略, 最后是用户策略, 每个策略级别都会在前一个的基础上做出限制,即不能授予高于上一个级别的权限. 运行库根据每一个策略级别授予的权限决定最后的权限并将其授予程序集.

大致上说, 企业级的安全策略是提供一个企业范围的安全策略, 该策略可以在企业内所有的计算机上强制执行, 而计算机级的,则是针对特定的计算机执行的安全策略, 但一台计算机可能会有多个用户,于是,可以利用用户策略进行进一步限制. 每个策略级别包含三个关键元素: 代码组, 命名了的权限集, 完全信任的程序集.

代码组

代码组是安全策略的基本构造块, 它提供了证据和权限的映射, 策略解决方案进程使用该证据和权限来决定授予程序集和应用程序域哪些代码访问权限.每个策略级别都由一组代码组构成, 它们以树的结构方式被组织.在策略解决方案进程中, 运行库遍历每个策略级别的代码组, 并比较程序集或应用程序域出示的证据和每个代码组的成员条件, 如果证据符合代码组的成员条件, 那么运行库将授予其相应的权限, 这些权限是被包含在代码组的权限集里的. 每个代码组都有一个名称和一个描述,并包含以下元素:

 1. 成员条件: 成员条件定义了程序集或应用程序域必须具有的证据, 从而使其具有成员资格, 成员条件支持所欲的标准证据类型及用户证据类型.

 2. 权限集: 权限集是一组授予程序集或应用程序域的权限, 而该程序集或应用程序域具有成员资格.当使用.NET管理工具来配置安全策略时, 它们表现为命了名的权限集.

 3. 属性, 存在两个可选属性(Exclusive和LevelFinal),可以将其分配给代码组以修改正常的策略解决方案进程.

命名的权限集

简单来说, 命名的权限集是一个分配名称之后的权限组, 每个策略级别会保持自己的命名权限集, 而这些命名权限集也只是在其策略级别范围内有效.默认的安全策略为企业, 计算机和用户策略级别定义了一个命名了的标准权限集.
FullTrust: 非限制性访问所欲的操作和权限.
SkipVerification: 除了能跳过检查的权限以外, 不能访问任何操作或资源.
Execution: 除了执行的权限外, 不能访问任何操作或资源.
Nothing: 包括执行的权限在内的所有权限都不能访问任何操作或资源.
LocalIntranet: Microsoft信任的默认安全策略定义的一组权限集, 它适合于从本地企业内部网络下载的代码.
Internet: Microsoft信任的默认安全策略定义的一组权限集, 它适合于从Internet上下载的代码.
Everything: 唯一可修改的标准权限集, 默认情况下, 除了SecurityPermission的SkipVerification元素之外, Everything包含了所有的权限, 他们具有非限制性的访问.

完全信任的程序集

每个策略级别包含了一个完全信任程序集列表. 当运行库在策略解决方案中载入这些程序集时,它会自动分配给该程序集相应策略级别的完全信任权限, 它们不受正常策略解决方案进程的限制.


 配置安全策略

安全策略是存储在XML文件里的,企业,计算机和用户策略级别都分别包含一个文件,有以下四种方式来配置安全策略:

 1. 使用.Net Framework配置工具(Mscorcfg.exe), 它是由.Net Framework提供的Microsoft管理控制台(MMC)的插件, .Net Framework提供了一个图形界面来管理安全策略.

 2. 使用代码访问安全性策略工具(Caspol.exe), 它是一个.Net Framework 提供的命令行工具.

 3. 使用.net 类库包含的安全类, 编程实现安全策略.

 4. 直接编辑个体安全策略文件包含的XML.当然这个方法并不推荐.

 

编程安全策略

对于大多数用户和安全管理员来说, 使用.NET安全管理工具配置安全策略已经足够, 但为了完全控制所有的安全策略功能, 则必须自己编程来实现.

抽象类System.Security.Policy.CodeGroup提供了代码组的基础表现形式定义了位于策略解决方案进程中心的功能。其中,CodeGroup类中最重要的方法是Resolve, 它以Evidence集作为参数, 运行库调用每个策略级别的根CodeGroup的Resolve方法, 它还将程序及的Evidence集传递给Resolve。在Resolve方法中,CodeGroup负责决定程序集的证据是否赋予Resolve成员资格, 如何应用属性,CodeGroup如何使用或是否该使用它的子代码组来继续策略解决方案进程。Resolve返回一个PolicyStatement, 它代表了树形结构所有代码组对程序集赋予成员资格的Resolve的网络影响。CodeGroup子类之间的关键不同之处在于它们如何处理Resolve方法。具体实现可以参见其子类,UnionCodeGroup,FileCodeGroup等。在示范代码组的创建和操作之前,首先来介绍一下成员条件和策略语句。

编程成员条件

成员条件是实现ImembershipCondition接口的类,代码组的四种类型都包含了一个ImembershipCondition实例,必须指定该实例为代码组构造函数的参数,同时,还可以在构造函数之后利用属性修改或获得ImembershipCondition。 ImembershipCondition接口定义了一个名为check的方法,它以Evidence集为参数并返回一个布尔值来确定证据对象的值是否满足可配置的条件。在策略解决方案中,CodeGroup调用ImembershipCondition的check方法来计算一个程序集或应用程序域是否赋予了代码组的成员资格。

.Net Framework包含了如下八种标准成员条件类,它们都是System.Security.Policy命名空间的成员。

AllMembershipCondition:不考虑证据的所有代码,无论证据是什么,总是返回true。
ApplicationDirectoryMembershipCondition:Evidence集包含ApplicationDirectory和Url证据,Url证据代表一个位置,该位置是ApplicationDirectory证据代表的代码组。
HashMembershipCondition:Evidence集包含了一个具有指定散列值的Hash类。
PublisherMembershipCondition:Evidence集包含了一个具有指定发行者证书的Publisher类。
SiteMembershipCondition:Evidence集包含了一个具有指定站点名称的Site类。
StrongNameMembershipCondition:Evidence集包含了一个具有指定散列的StrongName类。
UrlMembershipCondition:Evidence集包含了一个具有指定Url位置的Url类。
ZoneMembershipCondition:Evidence集包含了一个具有指定安全域的Zone类。

编程策略语句

PolicyStatement类代表了代码组对其成员的影响,包括代码组的属性和其权限集。PolicyStatement类提供了两个构造函数,第一个构造函数是以System.Security.Permission作为参数,它制定了代码组授予其成员的权限。第二个构造函数以PermissionSet和System.Security.Policy.PolicyStatementAtrribute枚举的一个成员作为参数,它代表了代码组的属性集,包括All,Exclusive,LevelFinal,Nothing。

创建代码组

以下示例创建了一个带有Exclusive属性的UnionCodeGroup,该属性与从oreilly.com域内任意网站下载的所有代码都相匹配,并授权其非限制性访问所有文件系统。

Code

 

 

posted on 2009-01-06 14:03  blue-boy  阅读(491)  评论(0编辑  收藏  举报

导航