3 ABAC模型原理与构成:属性定义、策略引擎、环境上下文

3.1 模型边界:从角色到属性的范式迁移

ABAC(Attribute-Based Access Control)将授权决策从预定义的角色迁移到任意属性组合。其核心边界在于:任何可被系统采集的属性均能参与策略判断,不再受“角色”这个中间概念的约束。这使得 ABAC 能表达“医生可查看自己科室患者的病历,但操作时间必须在 08:00‑18:00”这种细粒度规则。

维度RBACABAC
授权基础角色(Role)任意属性(Attribute)
粒度粗(角色绑定权限)细(属性组合求值)
策略变更影响涉及角色指派通常不波及用户表
运行时开销低(查角色权限缓存)较高(每次请求需计算属性并求值)
选型权衡要点:ABAC 的灵活性与精细度以更高的策略管理和运行时计算成本为代价。若业务中权限规则长期稳定且变化少,RBAC 仍是更经济的选择。

3.2 分层职责:属性定义、策略引擎与环境上下文

ABAC 的完整架构可拆解为四个核心层次,每层职责明确,如下图所示。

ABAC 分层数据流与决策链路 用户属性源 部门 / 职称 / 安全等级 资源属性源 科室 / 密级 / 文档类型 环境上下文 时间 / IP / 设备指纹 操作属性 read / write / delete 策略决策点(PDP) 属性组合求值引擎 加载策略 → 收集上下文 → 做出决策 策略库(PAP) 决策结果 Permit / Deny 检索策略 环境上下文由 PDP 在请求时 从请求头/系统时钟/网络层采集
  • 属性定义层:明确用户、资源、环境、操作四类属性的来源、命名空间和值域。例如 user.department 取自 LDAP,resource.classification 取自文档元数据。
  • 策略引擎(PDP):核心决策组件。接收PEP发来的请求上下文,从策略库中加载匹配的策略,对属性组合进行布尔逻辑求值,返回 Permit/Deny/Indeterminate。
  • 环境上下文:请求时的瞬态信息,如系统时间、客户IP、网络类型、设备指纹。环境上下文由 PDP 在请求时动态采集,不持久化存储。

3.3 数据流与信任链路

  1. 发起请求:用户通过客户端执行操作,PEP 拦截请求并提取操作属性(如 HTTP 方法、资源路径)。
  2. 构造上下文:PEP 将用户标识、资源标识、环境信息(时间、IP)打包为“请求上下文”发送给 PDP。
  3. 属性解析:PDP 根据上下文从属性源(身份库、资源数据库、环境传感器)拉取完整属性集合。
  4. 策略匹配:PDP 从策略库加载所有生效策略,按优先级匹配当前请求。
  5. 策略评估:执行策略表达式(如 user.department == resource.department AND time.between("08:00","18:00"))得出决策。
  6. 决策返回:PDP 将结果(含 Obligation 建议,如“记录审计日志”)返回给 PEP,PEP 执行或拒绝操作。
信任链路风险点:
  • 属性源篡改 —— 若 LDAP/数据库被攻破,策略将失效。
  • 环境上下文欺骗 —— 客户端可伪造 IP 或时间戳,需在传输层做签名验证。
  • 策略表达式解析漏洞 —— 复杂嵌套的 and/or/not 可能导致无限递归或注入。

3.4 策略表达式示例(配置原则)

策略通常以 JSON 或 YAML 形式存储,不包含可执行代码。以下是一个简化的 XACML 风格策略片段,描述“医生在上班时间可读写本科室病历”:

{
  "policyId": "med-record-access",
  "effect": "Permit",
  "target": {
    "resource": { "type": "medicalRecord" },
    "action": { "name": ["read", "write"] }
  },
  "condition": {
    "allOf": [
      { "attribute": "user.role", "equals": "doctor" },
      { "attribute": "user.department", "equal": "resource.department" },
      { "attribute": "environment.currentTime", "inRange": ["08:00", "18:00"] }
    ]
  }
}

配置原则:

  • 属性引用路径必须统一格式(如 user.xxx、resource.xxx、environment.xxx)。
  • 避免在 condition 中使用子查询或函数调用,防止性能退化。
  • 所有环境上下文属性需在 PDP 端重新获取,不可信任客户端传入的值。

3.5 落地步骤与验收标准

阶段具体活动产出物
① 属性建模识别所有参与授权的属性,明确属性源、数据类型、更新频率。属性字典(JSON Schema)
② 策略设计与业务方梳理权限规则,编写原子策略与复合策略。策略库(YAML/JSON 文件)
③ 引擎选型选择 PDP 实现(如 Open Policy Agent、AWS Cedar、自研引擎)。技术选型报告
④ 集成属性源连接 LDAP、数据库、CMDB 等,配置属性缓存策略。属性同步适配器
⑤ 集成 PEP在 API 网关或应用拦截器内调用 PDP,处理决策结果。PEP 集成代码 + 测试
⑥ 压力测试模拟高并发请求,测量 PDP 延迟(目标 < 5ms)。性能报告

验收标准:

  • 属性覆盖度:所有业务场景所需属性均已在属性字典中定义且可正常获取。
  • 策略评估延迟:P99 不超过 10ms,P50 不超过 3ms。
  • 属性变更生效时间:属性更新后(如用户部门调整)在 1 分钟内影响授权结果。
  • 环境上下文注入失败时,PDP 应返回 Deny(安全默认原则)。
落地建议:初期可先实现“静态属性 + 静态策略”,后续迭代引入动态属性(如实时风险评估)和热加载策略(避免停机部署)。