2 RBAC九宫图:角色层级关系、权限继承机制、静态与动态职责分离

RBAC模型经过二十余年工业验证,已从单一的用户→角色→权限三元组演变为包含层级、约束、会话的完整体系。九宫图将这一体系拆解为3 个维度 × 3 个层级,帮助架构师在选型时快速定位当前场景所需的RBAC子集。

本章定位:围绕九宫图的模块边界与分层,厘清角色层级关系、权限继承机制、静态与动态职责分离三者的职责边界、数据流及信任链路,为后续RBAC与ABAC的冲突分析奠定基础。

2.1 模块边界与分层模型

九宫图并非9个孤立盒子,而是按核心要素层、机制层、约束层纵向堆叠,按用户侧、角色侧、权限侧横向切分。下表列出每个格子的所属模块与职责边界:

层次 用户侧 角色侧 权限侧
核心要素层 用户管理(身份源、属性) 角色定义(角色ID、名称、分类) 权限注册(资源、操作、环境)
机制层 用户-角色分配(UA) 角色层级关系(上级/下级、继承链) 权限继承机制(沿层级向上传递)
约束层 静态职责分离(SSD) 动态职责分离(DSD) 会话与审计(激活角色集、日志)
  • 核心要素层:定义最基本的用户、角色、权限三元组,是RBAC0的覆盖范围。
  • 机制层:引入角色层级与继承,对应RBAC1;UA和PA的分配关系在此层细化。
  • 约束层:叠加SSD/DSD及会话控制,对应RBAC2;约束条件在此层生效。

2.2 角色层级关系

角色层级(Role Hierarchy)定义了角色之间的偏序关系:若角色A > 角色B,则A继承B的所有权限,同时A的用户也可激活B的角色。这种关系不是树形而是有向无环图(DAG),允许一个角色有多个父节点和子节点。

常见误区:层级≠组织架构。RBAC层级是“权限范围”的包含关系,而非汇报线。例如“高级工程师”继承“工程师”的权限,但组织上两者可能平级。

层级关系在九宫图中位于机制层·角色侧,其核心职责包括:

  • 继承传递:下级角色的权限自动附加到上级角色。
  • 冲突检测:若A和B存在互斥约束,则不能出现在同一条继承链中。
  • 范围裁剪:支持私有权限(不继承给上级)与公共权限(沿层级扩散)。

2.3 权限继承机制

权限继承是角色层级的具体体现。当用户激活某个角色时,系统需沿层级自底向上递归收集所有子角色的权限,同时受限于继承阻断规则(如显式拒绝)。

数据流方向如下:

  1. 用户发起请求 → 上下文解析器提取用户身份与激活角色集。
  2. 权限引擎查询该角色集中每个角色的层级祖先链。
  3. 合并所有祖先角色的权限,去重并按“拒绝优先”规则裁决。
  4. 返回允许/拒绝决策。

下面用一段伪码描述核心逻辑(仅供理解,非生产代码):

function collectPermissions(roleId):
    permissions = emptySet
    queue = [roleId]
    visited = set()
    while queue not empty:
        current = queue.pop()
        if current in visited: continue
        visited.add(current)
        permissions.addAll( getRolePermissions(current) )
        // 向上收集父角色权限
        for parent in getParentRoles(current):
            if not isBlocked(current, parent):
                queue.add(parent)
    return permissions

2.4 静态与动态职责分离

职责分离(Separation of Duty)为了防止单一用户获得冲突权限组合。九宫图中它们分别位于约束层的用户侧和角色侧:

特性 静态职责分离(SSD) 动态职责分离(DSD)
检查时机 角色分配时(用户-角色绑定前) 会话激活角色时(运行时)
约束粒度 角色互斥集(用户最多分配其中N个) 会话内互斥(同一会话不能同时激活)
典型场景 出纳与会计不能分配给同一人 同一人可在不同会话中扮演出纳和会计
实现代价 低(分配时校验一次) 高(每次会话激活/切换时校验)
安全强度 高(永久禁止) 中(仅会话级别隔离)
选型建议:金融、医疗等强监管领域应优先采用SSD;对灵活性和用户体验要求高的场景(如内部协同平台),可退化为DSD并辅以审计告警。

2.5 九宫图整体结构(SVG)

下图完整展示RBAC九宫图的模块边界、分层关系及数据流。箭头表示“继承/分配”方向,虚线表示约束作用点。

RBAC 九宫图:角色层级与职责分离 RBAC 九宫图:角色层级 · 权限继承 · 职责分离 用户侧 角色侧 权限侧 核心要素层 机制层 约束层 用户管理 身份源 · 属性 · 状态 角色管理 定义 · 分类 · 元数据 权限管理 资源 · 操作 · 环境 用户-角色分配 UA · 有效期 · 映射 角色层级关系 DAG · 偏序 · 继承链 权限继承机制 向上收集 · 阻断 · 合并 静态职责分离 SSD · 分配时互斥 动态职责分离 DSD · 会话内互斥 会话与审计 激活角色集 · 日志 约束作用 会话绑定 图例: 核心要素层 机制层 约束层 分配/继承流向 约束作用

2.6 数据流与信任链路

九宫图内的数据流遵循自下而上收集、自上而下约束的原则:

  • 正向流(分配方向):用户管理 → 用户-角色分配 → 角色管理 → 角色层级 → 权限继承 → 权限管理。
  • 反向流(决策方向):权限继承(收集所有祖先权限)→ 角色层级(确认角色有效)→ 用户-角色分配(校验用户是否拥有该角色)→ 用户管理。
  • 约束注入点:SSD在用户-角色分配时介入,DSD在会话激活角色时介入。

信任链路核心假设:角色管理层是可信的(由安全管理员维护),权限继承关系不可被普通用户篡改。约束层通过策略决策点(PDP)进行校验,策略信息点(PIP)提供用户属性和会话上下文。

2.7 选型权衡

决策维度 采用层级+继承 采用SSD 采用DSD
管理成本 中(需维护DAG一致性) 低(一次性分配校验) 高(运行时频繁校验)
灵活性 高(权限自动扩散) 低(角色绑定后不可变) 中(同一用户可分时扮演)
安全风险 继承泄漏(需阻断机制) 分配冲突(提前阻断) 会话混淆(需审计兜底)
适用场景 组织层级稳定的企业 金融、医疗等强合规 研发环境、多角色平台

2.8 风险点

  • 继承爆炸:层级过深(超过6层)导致权限收集性能劣化,建议限制最大深度并启用缓存。
  • SSD过度约束:互斥角色集定义过宽导致用户无法完成正常业务,建议搭配“特权提升”审批流程。
  • DSD绕过:用户通过多浏览器/多设备创建多个会话同时激活互斥角色,需结合设备指纹或IP绑定。
  • 层级环路:DAG中意外出现循环导致继承陷入死循环,必须在角色变更时进行拓扑排序检测。
关键风险:权限继承的“隐式授予”最容易被忽略。审计时需将继承后的权限集合显式展平,否则会产生“用户不知道自己有权限”的安全盲区。

2.9 落地步骤

  1. 盘点现有角色与权限:梳理当前系统中所有角色及其直接权限,形成基线清单。
  2. 设计角色层级DAG:按业务域划分层级,确保无环,并标注每个节点的私有权限。
  3. 配置继承阻断规则:对敏感权限设置“不继承”标志,防止向上扩散。
  4. 定义SSD互斥集:与业务合规团队一起列出不可同时分配的角色对,配置到策略引擎。
  5. 实现DSD校验点:在会话创建/角色切换时插入DSD检查,返回403并触发审计事件。
  6. 灰度验证与展平审计:在测试环境模拟用户请求,输出展平后的权限集合,逐项比对预期。

2.10 验收标准

验收项 通过标准 验证方式
角色层级正确性 上级角色自动获得下级角色的公共权限 批量API测试 + 权限展平对比
继承阻断生效 标记为私有的权限不向上传递 构造继承链,验证上级角色无权访问
SSD分配拒绝 用户分配互斥角色时立即报错 尝试为同一用户分配两个互斥角色
DSD会话隔离 同一用户在不同会话中可激活互斥角色 创建两个会话分别激活互斥角色,均成功
性能基准 权限收集耗时 ≤ 20ms(P99) 压测脚本模拟1000并发请求
验收提醒:SSD和DSD的测试用例必须包含“边界值”——例如用户已分配N-1个互斥角色时,再分配第N个是否被拒绝。这类边界异常在线上最容易遗漏。