权限设计模式
自主权限访问控制DAC
DAC的概念
DAC: Discretionry Access Control
DAC权限模式下系统会自动识别用户,然后根据被操作对象(Subject)的权限控制列表ACL(Access Control List)或者权限控制矩阵(ACM:Access Control Matrix)的信息来决定用户的是否对其有相应的权限,例如:read or modify;
而拥有对象权限的用户,又可以将该对象的权限分配给其他用户,所以称之为"自主(Discretionry)"控制;
DAC的应用场景
DAC设计最常见的应用就是文件系统的权限设计,例如Microsoft的NTFS文件系统;
DAC的缺点
DAC最大的缺点就是对权限控制比较分散,不便于管理,比如:无法简单的将一组文件设置统一的权限开放给指定的用户;
强制访问控制MAC
MAC的概念
MAC:Mandatory Access Control
MAC是威力弥补DAC权限控制过于分散的问题而诞生的,在MAC的设计中,每一个对象(Subject)都有一些权限标识,每个用户同样也会有一些权限标识,而用户能否对该对象进行操作取决于双方的权限标识关系,这个限制判断通常是由系统硬性限制的.例如:在影视作品中我们经常能看到特工在查询机密文件时,屏幕提示需要“无法访问,需要一级安全许可”,这个例子中,文件上就有“一级安全许可”的权限标识,而用户并不具有。
MAC的应用场景
MAC非常适合机密机构或者其他等级观念强烈的行业,但对于类似商业服务系统,则因为不够灵活而不能适用。
基于角色的访问控制RBAC
RBAC的概念, RBAC官方文档
RBAC: Role-Based Access Control
RBAC的诞生是因为DAC和MAC的诸多限制,并成为迄今为止最为普及的权限设计模型。
RBAC在用户和权限之间引入了"角色(Role)"的概念,其模型如下图:
如图所示,每个用户关联一个或多个角色,每个角色关联一个或多个权限,从而可以实现了非常灵活的权限管理。角色可以根据实际业务需求灵活创建,这样就省去了每新增一个用户就要关联一遍所有权限的麻烦;
简单来说RBAC就是:用户关联角色,角色关联权限。另外,RBAC是可以模拟出DAC和MAC的效果的;
RBAC规范的扩展模式
角色继承
角色继承: Hierarchical Role
角色继承就是指角色可以继承于其他角色,在拥有其他角色权限的同时,自己还可以关联额外的权限;
这种设计可以给角色分组和分层,一定程度简化了权限管理工作;
职责分离
职责分离: Separation of Duty
为了避免用户拥有过多权限而产生利益冲突,RBAC提出了职责分离的设计的模式; 例如: 一个篮球运动员同时拥有裁判的权限(看一眼就给你判犯规狠不狠);
职责划分的两种模式:
- 静态职责分离(Static Separation of Duty): 用户无法同时被赋予有冲突的角色;
- 动态职责分离(Dynamic Separation Of Duty): 用户在一次会话(Session)中不能同时激活自身所拥有的、互相冲突的角色,只能选择其中之一;
用户和对象的权限控制
从上面对RBAC的描述,都只是在用户和权限之间进行设计,并没有设计到用户和对象之间的权限判断,而在实际业务系统中限制用户能够使用的对象是很常见的需求;例如下面的需求,我们就需要使用用户和对象的权限控制
华中区域的销售没有权限查询华南区域的客户数据,虽然他们都具有销售的角色,而销售的角色拥有查询客户信息的权限
基于属性的权限验证ABAC
ABAC的概念
ABAC: Attri-Based Access Control
ABAC不同于常见的将用户通过某种方式关联到权限的方式,ABAC则是通过动态计算一个或一组属性来判断是否满足某种条件。属性通常来说分为四类:
-
用户属性: 如用户年龄
-
环境属性: 如当前时间
-
操作属性: 如读取
-
对象属性: 如一篇文章,又称资源属性
举例:
允许所有班主任在上课时间自由进出校门”这条规则,其中,“班主任”是用户的角色属性,“上课时间”是环境属性,“进出”是操作属性,而“校门”就是对象属性了
为了实现便捷的规则设置和规则判断执行,ABAC通常有配置文件(XML、YAML等)或DSL配合规则解析引擎使用。XACML(eXtensible Access Control Markup Language)是ABAC的一个实现,但是该设计过于复杂.
ABAC的特点
- 集中化管理
- 可以按需实现不同颗粒度的权限控制
- 不需要预定义判断逻辑,减轻了权限系统的维护成本,特别是在需求经常变化的系统中
- 定义权限时,不能直观看出用户和对象间的关系
- 规则如果稍微复杂一点,或者设计混乱,会给管理者维护和追查带来麻烦
- 权限判断需要实时执行,规则过多会导致性能问题
ABAC有时也被称为PBAC(Policy-Based Access Control)或CBAC(Claims-Based Access Control)