权限设计模式

权限设计模式


自主权限访问控制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)"的概念,其模型如下图:

img

如图所示,每个用户关联一个或多个角色,每个角色关联一个或多个权限,从而可以实现了非常灵活的权限管理。角色可以根据实际业务需求灵活创建,这样就省去了每新增一个用户就要关联一遍所有权限的麻烦;

简单来说RBAC就是:用户关联角色,角色关联权限。另外,RBAC是可以模拟出DAC和MAC的效果的;

RBAC规范的扩展模式

角色继承

角色继承: Hierarchical Role

img

角色继承就是指角色可以继承于其他角色,在拥有其他角色权限的同时,自己还可以关联额外的权限;

这种设计可以给角色分组和分层,一定程度简化了权限管理工作;

职责分离

职责分离: Separation of Duty

为了避免用户拥有过多权限而产生利益冲突,RBAC提出了职责分离的设计的模式; 例如: 一个篮球运动员同时拥有裁判的权限(看一眼就给你判犯规狠不狠);

职责划分的两种模式:

  • 静态职责分离(Static Separation of Duty): 用户无法同时被赋予有冲突的角色;
  • 动态职责分离(Dynamic Separation Of Duty): 用户在一次会话(Session)中不能同时激活自身所拥有的、互相冲突的角色,只能选择其中之一;

img

用户和对象的权限控制

从上面对RBAC的描述,都只是在用户和权限之间进行设计,并没有设计到用户和对象之间的权限判断,而在实际业务系统中限制用户能够使用的对象是很常见的需求;例如下面的需求,我们就需要使用用户和对象的权限控制

华中区域的销售没有权限查询华南区域的客户数据,虽然他们都具有销售的角色,而销售的角色拥有查询客户信息的权限

go语言中对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)

posted @ 2019-07-08 16:00  梧桐花落  阅读(2034)  评论(0编辑  收藏  举报