3 ABAC模型原理与构成:属性定义、策略引擎、环境上下文
3.1 模型边界:从角色到属性的范式迁移
ABAC(Attribute-Based Access Control)将授权决策从预定义的角色迁移到任意属性组合。其核心边界在于:任何可被系统采集的属性均能参与策略判断,不再受“角色”这个中间概念的约束。这使得 ABAC 能表达“医生可查看自己科室患者的病历,但操作时间必须在 08:00‑18:00”这种细粒度规则。
| 维度 | RBAC | ABAC |
|---|---|---|
| 授权基础 | 角色(Role) | 任意属性(Attribute) |
| 粒度 | 粗(角色绑定权限) | 细(属性组合求值) |
| 策略变更影响 | 涉及角色指派 | 通常不波及用户表 |
| 运行时开销 | 低(查角色权限缓存) | 较高(每次请求需计算属性并求值) |
选型权衡要点:ABAC 的灵活性与精细度以更高的策略管理和运行时计算成本为代价。若业务中权限规则长期稳定且变化少,RBAC 仍是更经济的选择。
3.2 分层职责:属性定义、策略引擎与环境上下文
ABAC 的完整架构可拆解为四个核心层次,每层职责明确,如下图所示。
- 属性定义层:明确用户、资源、环境、操作四类属性的来源、命名空间和值域。例如
user.department取自 LDAP,resource.classification取自文档元数据。 - 策略引擎(PDP):核心决策组件。接收PEP发来的请求上下文,从策略库中加载匹配的策略,对属性组合进行布尔逻辑求值,返回 Permit/Deny/Indeterminate。
- 环境上下文:请求时的瞬态信息,如系统时间、客户IP、网络类型、设备指纹。环境上下文由 PDP 在请求时动态采集,不持久化存储。
3.3 数据流与信任链路
- 发起请求:用户通过客户端执行操作,PEP 拦截请求并提取操作属性(如 HTTP 方法、资源路径)。
- 构造上下文:PEP 将用户标识、资源标识、环境信息(时间、IP)打包为“请求上下文”发送给 PDP。
- 属性解析:PDP 根据上下文从属性源(身份库、资源数据库、环境传感器)拉取完整属性集合。
- 策略匹配:PDP 从策略库加载所有生效策略,按优先级匹配当前请求。
- 策略评估:执行策略表达式(如
user.department == resource.department AND time.between("08:00","18:00"))得出决策。 - 决策返回: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(安全默认原则)。
落地建议:初期可先实现“静态属性 + 静态策略”,后续迭代引入动态属性(如实时风险评估)和热加载策略(避免停机部署)。