.NET的代码访问安全(CAS)机制
.NET Framework中一个比较难懂的部分是CAS,很多开发人员都对此不甚了了。很多次在讲课中提到这些内容,大家的反应也不一。下面这个图很好地说明了CAS是如何工作的?
下面略微地对其进行讲解
首先,CLR会在运行程序集之前,收集该程序集所携带的证据(Evidence),这个证据其实就好比是我们的身份证的概念。不过,程序集的证据有很多种类型,例如它所运行的位置(区域),它所携带的签名(强名称),或者来自某个发行者等等,如下图所示。有两个比较特殊的证据这里没有列出来:所有代码,应用程序目录。
一个程序集可能携带多个证据。例如它既在本地区域(My Computer)运行,又带有强名称。这样就有两个证据。
得到了程序集所携带的证据信息之外,CLR继续工作。它检查安全策略(4个策略级别都会检查),在每个级别,把每一个证据匹配到的代码组,所对应的权限集所包含的权限进行合并。
这里首先要搞清楚的是,安全策略会有4个级别,企业=》计算机=》用户=》应用程序域。这四个策略级别都需要检查。
最后,把四个级别检查得到的权限结果,取它们的交集。得到程序集所最终拥有的权限。
所以,要理解CAS,重要几个概念如下
1. Security Policy Level 安全策略级别:一共有4个
2. Code Group 代码组:可以自定义(企业级别可能需要域管理员才能更改,计算机级别需要本机管理员才能更改,用户级别可以由用户自己更改,应用程序域级别由程序指定).代码组还可以嵌套,就是说可能有子代码组。一般是先按区域定义代码组,然后再在不同的区域代码组中定义子代码组。例如默认情况下,计算机这个级别的代码组定义如下
代码组有几个特殊的选项,可以在必要的情况下,阻止进一步的检查
3.Evidence 证据:程序集所携带的条件
4.PermissionSet 权限集:权限的集合
代码组是对某类证据所应该匹配的权限集的定义
5.Permission 权限
下面有一个典型的场景,有助于大家的理解:
一个人从Internet上下载了一个程序到了本地计算机,这时如果执行的话,会因为在”我的电脑”这个区域,所以会通过Computer这个Security Policy的代码组检查获得Fulltrust权限
如果他的机器是加入了AD,而域管理员设置了位于”我的电脑”这个区域所获得的权限是Everything权限的话,那么两者相权,最后得到的权限是Everything的(比Fulltrust更低)
用户不是很放心这个程序集,想以Internet这个区域的权限集运行它,而且这时候他不是以管理员登陆的(不能修改Machine级别的Security Policy),他可以修改User这个级别的设置,例如把”我的电脑”这个区域的权限集指定为internet
最后这个程序集只能以Internet的权限集运行,而用户所做的这些更改不会影响到计算机以及其他用户
CAS是完全独立的,但没有取代掉RBS,¨它只是加了一道可以设置的防线
两者结合取最小权限
¨例如CAS授予程序集可以访问某个文件夹,但用户权限不被授权,则仍然不能访问
¨程序集=>CAS=>RBS(ACL)