相关术语
在权限模型中有如下相关术语:
| 英文名 | 中文名 | 描述 |
|---|---|---|
| Subject | 主体 | 通常是用户或者用户组 |
| Action | 操作 | 对Object的操作,比如访问、创建、删除、查询、修改等 |
| Object | 对象 | 权限所作用的对象,通常指各类资源 |
| Effect | 效力 | 限规则匹配后的操作,比如Allow/Deny |
| Condition | 限制条件 | 权限生效的条件 |
| Permission | 权限 | 用来指代是否允许某人在某种条件下对某种资源做某种操作 |
| Role | 角色 | 权限集合,包含了一个或多个权限 |
| Policy | 策略 | 一组规则/声明,在特定用户尝试执行特定操作时进行评估,然后将策略应用于用户、组和角色 |
权限模型
常见的权限模型有5种,下面一一介绍。
1. 权限控制列表ACL
ACL(Access Control List,权限控制列表),用来判断用户是否可以对资源做特定的操作,例如,允许Colin创建文章的ACL策略为:
Subject: Colin
Action: Create
Obejct: Article
在ACL中,权限管理是围绕资源Object来进行的,这也是比较简单的一种模型。
2. 自主访问控制DAC
DAC(Discretionary Access Control,自主访问控制)是ACL的扩展模型。可以让Subject将其拥有的权限授予其它Subject,例如Colin具有创建文章的权限
Subject: Colin
Action: Create
Object: Article
那么Colin也可以将创建文章的权限赋予其它用户。
3. 强制访问控制MAC
MAC(Mandatory Access Control,强制访问控制),也是ACL的扩展模型,安全性更高。 在MAC权限模型下,Subject和Object同时具有安全属性,授权时需要同时满足两点才能授权通过:
- Subject可以对Object做Action操作。
- Object可以被Subject做Action操作。 也就是说,如果设置了”Colin和James可以创建文章”这个MAC策略:
Subject: Colin
Action: Create
Object: Article
Subject: James
Action: Create
Object: Article
同时还有另一个MAC策略,“文章可以被Colin创建”:
Subject: Article
Action: Create
Object: Colin
只有Colin才可以创建文章,James不可以创建,因为它不满足第二条条件。
也就是说MAC要求权限是双向可通的,那么这个授权才能够通过。
上面三种都是旧时代的权限控制模型,现代应用主要使用后两种,RBAC和ABAC。
4. 基于角色的访问控制RBAC
RBAC(Role-Based Access Control,基于角色的访问控制)。引入了Role的概念,并且将权限与角色进行关联,用户通过扮演某种角色来具有该角色的所有权限,如下图所示

- 每个用户具有一个或者多个角色
- 每个角色关联一个或者多个权限
- 每个权限包含了一个或者多个操作
- 操作包含了对资源的操作集合 角色的引入将用户与权限之间解耦,通过抽象出不同的角色,可以灵活地对用户进行授权。
通过对用户赋予一个角色,就可以批量授予这个角色的所有权限;对角色的权限的修改,就相当于对所有与此角色关联的用户的权限进行修改。
RBAC还可以分为RBAC0、RBAC1、RBAC2、RBAC3。
- RBAC0:基础模型,只包含核心的四个要素。用户、角色、会话、权限。
- RBAC1:在RBAC0的基础上,添加了角色继承。角色可以继承其它角色,在拥有其它角色权限的同时,还可以关联额外的权限。
- RBAC2:在RBAC0的基础上,添加了约束。
- 互斥约束:同一个用户不能拥有互斥的角色。互斥的角色不能拥有一样的权限。互斥的权限不能分配给同一个角色。
- 基数约束:一个角色被分配的数量有限。例如公司的CEO。
- 先决条件约束:要获得较高的权限,首先要拥有较低以及的权限。例如,先有副总经理的权限,再有总经理的权限。
- 静态职责分离:用户无法被同时赋予有冲突的角色。
- 动态职责分离:用户会话中,无法同时激活有冲突的角色。
- RBAC3:同时结合了RBAC1和RBAC2。
以一个示例来说明RBAC:
- 存在write_article和manager_article的权限
Permission:
- Name: write_article
- Effect: "allow"
- Action: ["Create", "Update", "Read"]
- Object: ["Article"]
- Name: manage_article
- Effect: "allow"
- Action: ["Delete", "Read"]
- Object: ["Article"]- 有三个角色,Writer具有write_article的权限,Manager具有manager_article的权限,CEO具有全部权限。
Role:
- Name: Writer
Permissions:
- write_article
- Name: Manager
Permissions:
- manage_article
- Name: CEO
Permissions:
- write_article
- manage_article- 为用户赋予角色
Subject: Colin
Roles:
- Writer这样Colin就具有了Writer的所有权限。
5. 基于属性的权限认证ABAC
ABAC(Attribute-Based Access Control,基于属性的权限认证)这是最强大的权限认证。 相对于RBAC,具有更细的控制粒度,主要规定了下面的四种属性:
- 用户属性:例如性别、年龄、工作等。
- 资源属性:例如创建时间、所属位置等。
- 操作属性:例如创建、修改等。
- 环境属性:例如来源IP、当前时间等。
例如:
Subject:
Name: Colin
Department: Product
Role: Writer
Action:
- create
- update
Resource:
Type: Article
Tag:
- technology
- software
Mode:
- draft
Contextual:
IP: 10.0.0.10上面的策略表示,用户可以在来源IP为10.0.0.10的客户端,创建和更新带有technology与software标签的草稿文章。
ABAC也被称作PBAC(Policy-Based Access Control)和CBAC(Claims-Based Access Control)。
相关开源项目
Casbin
支持ACL、RBAC、ABAC等访问模型。
keto
keto 是一个云原生权限控制服务,通过提供 REST API 进行授权,支持 RBAC、ABAC、ACL、AWS IAM 策略、Kubernetes Roles 等权限模型。