【38】 什么是基于角色的安全

2004-11-14 by 开心就好

原文地址: What Is Role Based Security

基于角色的安全是一种用户级别的安全形式,在这种形式里,服务器注重的不是单独用户的身份,而是她所处于的逻辑角色。这可以由多种方法来实现。一个方法就是在服务器上安置一些代表角色的本地逻辑组别。然后服务器应用程序可以查询这些组别的SID(WhatIsAGroup),然后根据这些组别的存在与否来做出安全方面的决定。譬如,假如某个服务器的特殊访问权限只限于 Admins角色组的成员,可以生成一个叫做APP_NAME_Admins 的本地组别来代表那角色。

这个简单的基于角色的架构的好处是,它简化了开发人员和管理员两者的事务,因为两者都依赖充分理解和可靠的操作系统机制来实现安全。管理员用Windows内置的工具把用户(或者域的组别)添加到应用程序的角色(本身就是服务器上的当地组别)里去,服务器程序则依赖Windows操作系统通过Kerberos (WhatIsKerberos)来提供认证和授权信息。服务器程序可以从自客户端获取的安全令牌(WhatIsAToken)里读取这些细节。最简单的方法就是调用代表用户的WindowsPrincipal对象的IsInRole方法。这个principal(主体)对象可以通过多种方式获取,但象 ASP.NET这样的大多数很完善的服务器端基础环境会通过Thread.CurrentPrincipal (WhatIsThreadDotCurrentPrincipal)属性来提供该对象。但在简单的桌面应用程序里,不必为Thread.CurrentPrincipal费心,因为该对象只是在服务器应用程序里才有使用的需要。在桌面应用程序里,你只要一句编码就能获取运行你的应用程序的当前用户的WindowsPrincipal 对象

<font face="Courier New" size="2">

IPrincipal WhoIsRunningThisApplication() {

return new WindowsPrincipal(WindowsIdentity.GetCurrent());

}

</font>

一些象 COM+(HowToImplementRoleBasedSecurityForAManagedCOMApp) 和授权管理器(WhatIsAuthorizationManager),甚至SQL Server这样的系统,提供它们自己的基于角色的基础设施,所以没必要另建安全组别。但概念是一样的。对基于角色系统需要注意的是一件事情是,它的粒度比不上基于 ACL系统(WhatIsACLBasedSecurity)的粒度。基于角色的系统的安全以用户为中心,而不是以用户想要访问的个别对象为中心。但这也意味着,基于角色的系统的安全没那么复杂(只要比较一下本书里涉及基于ACL的安全的条目个数与基于角色的安全的条目个数就知道了)。当然,有关安全系统里简洁性另有说法,让我们来听听Ferguson and Schneier (2003)是怎么说的:

没有哪个复杂系统是安全的。复杂度是安全的最大的敌人,因为复杂度几乎总是以功能或选项的方式出现的


Comments