权限模型RBAC, DAC, ABAC
在web系统中常用的权限模型有RBAC和DAC,而ABAC则多用于操作系统中的授权,硬件中的授权, 如:software-defined networking 。
RBAC:role based access control, 基于角色的权限控制,一般用户不被直接授予权限,而是通过Role过group来获得权限,常见的方式是:
1. 管理员创建了几个role,当然每个系统一般会有系统自带的role(不能删除修改),管理员可以创建财务Role,IT部门Role,HR部门Role,开发Role等,然后给每个role分配权限。IT role可以管理整个公司的员工,创建新员工,把新员工加到相关的Role中,这样新员工就具有相关的权限了。这种结构一般涉及这几个表:
Role:记录role名称等描述;
Permission:记录对于资源的action的,例如:User:Edit, 代表可以编辑user,Group:Edit代表可以管理group
role_permission: role和permission的对应关系。
user_role: 记录用户属于什么小组。
如果是这样基于Role的设计,有时要做变动:有的单位是有group的,把人放在一个group中,在group里的员工会有自己的资源或相关操作,或者有些feature需要在group上进行控制。(这些feature并不是permission相关的操作,例如对于会议系统而言,在财务group中,可能会被禁止screen sharing)这时如果一名员工既属于一个部门相关的role,又属于一个部门相关的group,不免有些麻烦。另一个做法可以是:
Role和Group同时具有,role只用于设置系统级角色权限,和部门无关,而group上也可以分配permission,这样用户如果在这个group中就自动可以获得相应的permission了,而group admin只需要管理group中的人就可以实现group中人的permission的分配及group相关feature的分配,如果group上直接分配permission会加大role_permission表的设计复杂度,也可以group上还是对应role(group级别的role),然后人员不直接分配role,而是通过这个人属于哪个group来看有哪些role,再决定最终的permission。 这篇文章推荐使用group指向role的方式。
如果碰到需要给某个对象资源分配权限给某些人的时候,可以用ACL,这个在spring security中有实现,参见:https://www.baeldung.com/spring-security-acl
但RBAC模型中一般不建议直接给用户分配多余的权限,因为这样可能会使得产生称为Privilege Creep的现象:随着一个人的职位或部门发生变更,权限会逐渐变大的现象。如果是纯粹的基于role或group的话,administrator一般直接把人员换个group即可,不会产生这种情况,但如果直接给该人分配了权限,则又可能会产生privilege creep的现象。
基于RBAC的模型另一个很重要的问题是权限仅仅是对某种资源上action的描述,是笼统的一类资源,并不会具体到是什么资源,因此对于SAAS系统又可能出现A公司的admin管理B公司员工的现象,一个简单的做法是在系统的权限校验中,多加一个简单的判断:检查要访问的资源的container是什么,是否和操作者是同一个container,这里的container一般是指org公司的范畴。
DAC:discretionary access controls,我觉得可以翻译为:自由决定授权控制。是指资源的owner或creator可以直接控制分配该资源的管理action,例如文件owner可以分配文件的修改读取权限给某个人,meeting的owner可以决定谁可以访问该meeting的内容。windows的文件管理也是采用DAC模型的。一般web系统中常见对文件的管理,也即谁创建的谁来直接分配给人权限。
ABAC:Attribute-Based Access Control Attribute-based control models allow access decisions based not only on the identity, action, and target object but also on contextual information related to a request. ABAC models use policies that include multiple attributes for rules.
Attributes can be almost any characteristic of users, the network, and devices on the net- work. For example, user attributes can include group membership, the department where they work, and devices they use such as desktop PCs or mobile devices. The network can be the local internal network, a wireless network, an intranet, or a wide area network (WAN). Devices can include firewalls, proxy servers, web servers, database servers, and more.
The XACML standard is perhaps the most well-known example of this model, which uses XML documents to describe access policies.
通常基于ABAC的权限描述都比较详细臃肿,一般很少在web系统中使用。
References:
1. CISSP OSG document
2. https://www.baeldung.com/java-access-control-models
3. https://www.baeldung.com/spring-security-acl