3. RBAC高级特性
基础 RBAC(RBAC0)仅定义了用户-角色-权限的三元关系。在实际企业权限治理中,往往需要更精细的层级结构和约束规则。NIST 标准在 RBAC0 之上扩展了三个高级模型:RBAC1(角色继承)、RBAC2(约束模型) 和 RBAC3(统一模型),并引入了 动态职责分离(DSD) 机制。
3.1 RBAC1:角色继承模型
角色继承(Role Hierarchy)允许一个角色自动获得其父角色的所有权限,形成偏序关系。继承关系分为两类:
- 通用继承:支持多继承,一个子角色可继承多个父角色的权限。
- 受限继承:仅支持单继承(树形结构),避免权限来源混乱。
核心价值:消除权限冗余。例如“高级工程师”继承“工程师”的所有权限,只需定义增量权限即可。
3.2 RBAC2:约束模型
RBAC2 在 RBAC0 基础上增加了约束规则,防止权限滥用或冲突。核心约束包括:
| 约束类型 | 说明 | 典型场景 |
|---|---|---|
| 互斥角色(SSD) | 同一用户不能同时拥有两个互斥角色 | 出纳员与会计员不能由同一人担任 |
| 基数约束 | 限制角色可被分配的最大用户数 | “超级管理员”最多 3 人 |
| 先决条件角色 | 用户必须先拥有角色 A 才能申请角色 B | 必须先有“工程师”才能有“高级工程师” |
| 会话约束 | 限制单个会话中可激活的角色数量或组合 | 同一会话不能同时激活“开发”和“生产运维” |
常见误区:互斥角色(SSD)是静态定义,在角色分配时即检查;而动态职责分离(DSD)是在会话激活时检查,两者不可混淆。
3.3 RBAC3:统一模型
RBAC3 将 RBAC1 的角色继承与 RBAC2 的约束模型合并,形成最完整的 RBAC 体系。在 RBAC3 中,约束规则不仅作用于角色分配,还作用于继承关系:
- 继承约束:如果角色 A 与角色 B 互斥,则 A 的任何祖先角色也不能与 B 同时分配给同一用户。
- 基数传递:父角色的基数限制会向下传递到子角色,防止通过继承绕过人数限制。
- 先决条件继承:子角色继承父角色的先决条件,并可以附加额外条件。
3.4 动态职责分离(DSD)
动态职责分离(Dynamic Separation of Duty)与静态互斥角色(SSD)的核心区别在于检查时机:
| 特性 | 静态互斥(SSD) | 动态职责分离(DSD) |
|---|---|---|
| 检查时机 | 角色分配时 | 会话激活时 |
| 用户可拥有 | 不能同时拥有互斥角色 | 可以拥有互斥角色,但不能在同一会话中激活 |
| 灵活性 | 低,分配即锁定 | 高,支持不同场景切换角色 |
| 典型场景 | 财务制度强制要求 | 开发与测试角色切换 |
实践建议:对于合规要求严格的场景(如 SOX、PCI-DSS),优先使用 SSD;对于需要灵活切换职责的 DevOps 团队,DSD 是更优选择。
DSD 实现要点
- 会话角色集管理:在用户创建会话时,检查当前已激活角色与待激活角色是否存在 DSD 冲突。
- DSD 规则存储:通常以
(role_id, conflict_role_id)或(role_id, conflict_set_id)形式存储在关系表中。 - 运行时拦截:在权限中间件中增加 DSD 校验逻辑,拒绝违反规则的会话激活请求。
-- DSD 规则表示例
CREATE TABLE dsd_rules (
id INT PRIMARY KEY,
role_id INT NOT NULL,
conflict_role_id INT NOT NULL,
description VARCHAR(255),
FOREIGN KEY (role_id) REFERENCES roles(id),
FOREIGN KEY (conflict_role_id) REFERENCES roles(id)
);
-- 查询某角色是否存在 DSD 冲突
SELECT conflict_role_id
FROM dsd_rules
WHERE role_id = ?
OR conflict_role_id = ?;
RBAC 模型演进对比
| 模型 | 核心特性 | 适用阶段 |
|---|---|---|
| RBAC0 | 用户-角色-权限基础映射 | 小型系统、简单权限管理 |
| RBAC1 | 角色继承,消除权限冗余 | 组织层级清晰的企业 |
| RBAC2 | 静态约束(SSD、基数、先决条件) | 合规要求严格的行业 |
| RBAC3 | 继承 + 约束统一管理 | 大型企业、复杂组织架构 |
在实际工程中,RBAC3 是最推荐的实现基线。它既保留了角色继承带来的权限复用效率,又通过约束模型确保了合规边界。下一层级的 ABAC 将在 RBAC3 的基础上进一步引入属性维度的动态授权能力。