第四章 ABAC模型与属性驱动授权
4.1 边界与分层
ABAC(Attribute‑Based Access Control)将授权决策从固定的角色/权限三元组解耦为基于任意属性组合的评估。在B端系统中,ABAC通常作为RBAC的补充层部署于策略决策点(PDP)中,与身份认证、资源服务、审计日志形成分层架构:
- 属性定义层:统一管理主体、资源、环境三类属性元数据。
- 策略表达式层:定义规则引擎(如XACML、自定义表达式)与策略存储。
- 决策执行层:PDP完成属性匹配与逻辑运算,PEP实施访问决策。
- 审计与监控层:记录每次属性取值与决策结果,用于调试与合规。
4.2 组件职责
| 组件 | 职责 | 典型实现 |
|---|---|---|
| PEP(策略执行点) | 拦截请求,调用PDP决策,执行Allow/Deny | API网关过滤器 |
| PDP(策略决策点) | 加载策略,获取属性,运算表达式,返回决策 | 独立微服务或策略引擎 |
| PIP(策略信息点) | 从身份源、资源元数据、运行时环境提取属性值 | LDAP、CMDB、设备传感器 |
| 策略定义器 | 编写、版本管理、测试属性表达式 | 策略管理控制台 |
4.3 数据流与控制流
一次ABAC请求的典型信任链路:
- 用户请求→PEP:HTTP请求携带身份令牌与操作意图。
- PEP→PDP:发送
subject_id, resource_id, action, environment_context。 - PDP→PIP:根据策略所需属性键,从PIP拉取对应值(如用户部门、资源等级、当前时间)。
- PDP内部评估:策略引擎将属性值代入表达式树,计算布尔结果。
- PDP→PEP:返回Permit/Deny+义务。
- 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的互补关系
| 维度 | RBAC | ABAC | 互补模式 |
|---|---|---|---|
| 粒度 | 角色级 | 属性级 | 角色授权基础权限,属性细调例外 |
| 动态性 | 静态权限集 | 运行时环境敏感 | 环境属性(时间、IP)动态叠加 |
| 管理成本 | 角色爆炸 | 属性定义与策略维护 | 核心角色+少量ABAC策略减少爆炸 |
最佳实践:使用RBAC管理“谁可以做什么”,使用ABAC控制“在什么条件下可以做”。典型融合结构:
1. 用户→角色(权限粗粒度)
2. 角色→资源(默认允许)
3. ABAC策略(覆盖角色权限或增加环境约束)
1. 用户→角色(权限粗粒度)
2. 角色→资源(默认允许)
3. ABAC策略(覆盖角色权限或增加环境约束)
4.6 选型权衡与风险点
- 性能风险:每次决策需拉取多个属性,若PIP远程调用延迟大,决策时间会飙升。解决方案:属性值缓存、预计算、批量获取。
- 策略冲突:多条规则同时命中时需定义优先级(First-match / Weighted / Deny-override)。
- 调试困难:属性值分散且受运行时状态影响。验收时需要属性追踪日志:记录每次决策使用的属性快照与表达式中间结果。
- 属性爆炸:无约束的属性扩展可能导致策略难以维护。验收标准中应限定属性分类不超过50个核心属性。
4.7 落地步骤
- 属性建模:梳理主体(用户、组织)、资源(API、文档)、环境(时间、网络、设备)三类属性的来源与格式。
- PIP网关建立:统一属性查询接口,返回JSON结构。
- 策略引擎选型:根据性能要求选择OPA或自研,设计表达式语法与优先级算法。
- 沙箱测试:编写典型场景(如跨部门访问、非工作时间操作)的自动化测试用例。
- 灰度上线:先对非关键资源启用ABAC决策,对比RBAC结果一致性。
4.8 验收标准
- 决策正确率100%(以RBAC+ABAC组合预期为准)
- PDP单次决策延迟 ≤ 20ms(99.9%)
- 属性变更无需重启策略引擎(热加载支持)
- 每条策略均有唯一ID与变更记录,可回溯至需求
常见误区:将PIP直接暴露给策略引擎,造成引擎依赖具体数据源。正确做法是PIP作为属性值抽象层,业务逻辑只写属性名称,不关心数据源类型。