4. RBAC模型核心原理与变体

4.1 边界与分层

ABAC(Attribute‑Based Access Control)将授权决策从固定的角色/权限三元组解耦为基于任意属性组合的评估。在B端系统中,ABAC通常作为RBAC的补充层部署于策略决策点(PDP)中,与身份认证、资源服务、审计日志形成分层架构:

  • 属性定义层:统一管理主体、资源、环境三类属性元数据。
  • 策略表达式层:定义规则引擎(如XACML、自定义表达式)与策略存储。
  • 决策执行层:PDP完成属性匹配与逻辑运算,PEP实施访问决策。
  • 审计与监控层:记录每次属性取值与决策结果,用于调试与合规。

4.2 组件职责

组件职责典型实现
PEP(策略执行点)拦截请求,调用PDP决策,执行Allow/DenyAPI网关过滤器
PDP(策略决策点)加载策略,获取属性,运算表达式,返回决策独立微服务或策略引擎
PIP(策略信息点)从身份源、资源元数据、运行时环境提取属性值LDAP、CMDB、设备传感器
策略定义器编写、版本管理、测试属性表达式策略管理控制台

4.3 数据流与控制流

一次ABAC请求的典型信任链路:

  1. 用户请求→PEP:HTTP请求携带身份令牌与操作意图。
  2. PEP→PDP:发送subject_id, resource_id, action, environment_context。
  3. PDP→PIP:根据策略所需属性键,从PIP拉取对应值(如用户部门、资源等级、当前时间)。
  4. PDP内部评估:策略引擎将属性值代入表达式树,计算布尔结果。
  5. PDP→PEP:返回Permit/Deny+义务。
  6. PEP→资源服务:仅当Allow时转发请求。
关键控制流:PDP不直接调用外部服务获取属性,所有属性统一通过PIP接口获取,确保策略引擎与数据源解耦。

4.4 策略表达式引擎

策略表达式通常为条件-目标结构,例如判定“只有当用户所属部门与资源所属部门相同且访问时间在9:00-18:00时允许”。以下为一个简化JSON策略示例:

{
  "ruleId": "deptTimeRule",
  "effect": "Permit",
  "condition": {
    "allOf": [
      { "attr": "subject.department", "op": "eq", "value": "resource.ownerDept" },
      { "attr": "environment.currentHour", "op": "between", "value": [9,18] }
    ]
  }
}

实际生产环境中,表达式引擎支持嵌套逻辑、数值计算、字符串正则等。常见实现有OPA(Rego)、阿里OAuth2.0 XACML、自定义AST解释器。

4.5 ABAC与RBAC的互补关系

维度RBACABAC互补模式
粒度角色级属性级角色授权基础权限,属性细调例外
动态性静态权限集运行时环境敏感环境属性(时间、IP)动态叠加
管理成本角色爆炸属性定义与策略维护核心角色+少量ABAC策略减少爆炸
最佳实践:使用RBAC管理“谁可以做什么”,使用ABAC控制“在什么条件下可以做”。典型融合结构:
1. 用户→角色(权限粗粒度)
2. 角色→资源(默认允许)
3. ABAC策略(覆盖角色权限或增加环境约束)

4.6 选型权衡与风险点

  • 性能风险:每次决策需拉取多个属性,若PIP远程调用延迟大,决策时间会飙升。解决方案:属性值缓存、预计算、批量获取。
  • 策略冲突:多条规则同时命中时需定义优先级(First-match / Weighted / Deny-override)。
  • 调试困难:属性值分散且受运行时状态影响。验收时需要属性追踪日志:记录每次决策使用的属性快照与表达式中间结果。
  • 属性爆炸:无约束的属性扩展可能导致策略难以维护。验收标准中应限定属性分类不超过50个核心属性。

4.7 落地步骤

  1. 属性建模:梳理主体(用户、组织)、资源(API、文档)、环境(时间、网络、设备)三类属性的来源与格式。
  2. PIP网关建立:统一属性查询接口,返回JSON结构。
  3. 策略引擎选型:根据性能要求选择OPA或自研,设计表达式语法与优先级算法。
  4. 沙箱测试:编写典型场景(如跨部门访问、非工作时间操作)的自动化测试用例。
  5. 灰度上线:先对非关键资源启用ABAC决策,对比RBAC结果一致性。

4.8 验收标准

  • 决策正确率100%(以RBAC+ABAC组合预期为准)
  • PDP单次决策延迟 ≤ 20ms(99.9%)
  • 属性变更无需重启策略引擎(热加载支持)
  • 每条策略均有唯一ID与变更记录,可回溯至需求
ABAC核心架构与数据流 主体属性源 (用户、组织、角色) 资源属性源 (API、文档、等级) 环境属性源 (时间、IP、设备) PIP 属性聚合器 PDP 策略决策点 表达式引擎 + 策略存储 属性值 PEP 策略执行点 Permit / Deny 用户请求 资源服务 策略表达式引擎 审计日志
常见误区:将PIP直接暴露给策略引擎,造成引擎依赖具体数据源。正确做法是PIP作为属性值抽象层,业务逻辑只写属性名称,不关心数据源类型。