securityPolicy配置节是定义一个安全策略文件与其信任级别名称之间的映射的集合。配置如下所示
其中name是指定映射到策略文件的命名的安全级别,一般的值有Full,Hight,Medium,Low,Minimal,UserDefined;policyFile指的是当前安全级别中对应的配置文件,该文件会存放在Windows\Microsoft.NET\Framework64\{.Net Framework Version}\Config或Windows\Microsoft.NET\Framework\{.Net Framework Version}\Config中。其默认配置如下
打开其中一个配置文件
SecurityClasses中添加了一些下面各种配置用到的安全类,包括以CodeAccessPermission为基类的代码访问权限,其包含在各个权限集PerssionSet里面;以Condition为后缀的类,用于判定被测试的程序集是否属于代码组,以CodeGroup为基类的代码组类,实际上这些类我也没了解太多。PermissionSet节点是权限配置的集合,其Name属性为ASP.NET的指的是。里面的子节点IPermission则是对CodeAccessPermission的子类的配置。IPermission的class属性的值需要和SecurityClass节点的name属性对应。针对不同的Permission权限类可以指定不同的配置。
在MSDN官网上面的文章中介绍了几个权限类,这里也顺带翻译一下
OleDbPermission
通过OleDbPermission权限类能使你的网页应用程序支持多种数据库类型,添加无限制的OleDbPermission 权限到你的策略文件中意味着你的应用程序可以在服务器上使用OLE DB Provider,例如达到对catelog.mdb数据库的访问方式进行限制。
在上面add节点中,ConnectionString属性是指定一条可用的连接字符串,KeyRestrictions属性用于指定在连接字符串中可用或者不可用的参数。其可用还是不可用的设置在KeyRestrictionBehavior属性中设置,它有两个值AllowOnly和PreventUsage。
如果毋需任何限制则改成下面的配置,关键是Unrestricted属性的设置。
EventLogPermission
通过EvntLogPermission权限类可以控制当前应用程序能否许可进入Windows的事件日志。其IPermission设置如下所示
access属性设置了administer才能使被信任的应用程序写入事件日志。
建立事件源:假设你的应用程序需要使用应用程序指定事件源,则必须在安装的时候启用管理员特权。最好是使用那些支持Windows Installer或者支持 InstallUtil.exe系统组件的.NET的安装类型。假如你在安装或者部署的时候不能建立事件源,计算机管理员进入下面的注册表中建立一个新的事件源。
但你不能通过提升ASP.NET进程账户的权限来通过写入权限,否则攻击者可以更改一些日志相关的设置。
FileIOPermission
如果你需要允许你的应用程序进入应用程序虚目录以外的地方,则需要使用这个FileIOPermission权限类。例如下面定义一个应用程序可以读取"C:\SomeDir"目录下的文件。
在让应用程序访问应用程序虚目录以外的文件时,你需要降低代码访问的安全性来保障应用程序隔离能力。假如在一个服务器中有多个应用程序,你需要给不同的应用程序配备不同的标识来保护一些比如是ACLs文件的资源。
以上内容均是配置策略而已,当我在MSDN上看FileIOPermission类介绍的时候发现以下的一段代码,
这段代码就是使用代码访问权限的例子了,加入不具备FileIOPermission的进程读取C盘下的test_r就会抛出异常,在博客园另外一位园友的博客中也看到相关的示例代码。
用这些权限类的作用就是使得它后面的代码执行是经过具备权限的,不具备权限则不能执行下去。这些权限判定的代码可以在用户自己编写,也有可能出现在.NET Framework的类库里面。这里的权限就比Windows标识中具备的权限粒度更细,可以让同一windows标识下不同的应用程序具备有差别的权限。
那下面则介绍如何给ASP.NET应用程序分配信任等级,通过在web.config中的turst配置节进行设置。
一般常用的属性有level,这也是必填的,用于指定当前的信任等级,这个信任等级就对应securityPolicy配置节中的配置。orginUrl属性作用是指定 URL 以用于在中等信任中配置的限制 WebPermission 权限。如果存在,则此属性可用于只允许连接到 WebPermission 所指定的特定 URL 的某些类(如 HttpWebRequest)。看起了挺拗口且不好理解。在我理解是这个属性当信任级别设置成中等的时候才生效,如果给这个属性设置了一个url,这个URL会添加到WebPermission的类的可连接列表ConnectList中。凡是该列表中的URL在发出网络请求时都可以通过。
当然这个turst节点可以出现在不同路径下而达到对不同路径下的代码具备不一样的访问权限。如下所示
参考文章
ASP.NET 信任级别和策略文件
来自 <https://msdn.microsoft.com/zh-cn/library/wyts434y(v=vs.110).aspx>
FRAMEWORK安全性之代码访问安全和角色安全
来自 <http://www.cnblogs.com/luminji/archive/2010/10/29/1864248.html>
How To: Use Code Access Security in ASP.NET 2.0
来自 <https://msdn.microsoft.com/en-us/library/ms998326.aspx>
trust 元素(ASP.NET 设置架构)
来自 <https://msdn.microsoft.com/zh-cn/library/tkscy493(v=vs.110).aspx>
管理安全策略
来自 <https://msdn.microsoft.com/zh-cn/library/wztcyd2e(v=vs.100).aspx>