4. 权限规则模型设计:RBAC、ABAC、PDP 与 PEP
权限规则模型是 OPA 策略集成日志平台的核心骨架。本章围绕四种关键模型与组件展开:基于角色的访问控制(RBAC)、属性基访问控制(ABAC)、策略决策点(PDP) 与 策略执行点(PEP)。理解它们的职责与协作关系,是编写可测试、可审计策略规则的前提。
4.1 模型对比:RBAC vs ABAC
| 维度 | RBAC(基于角色) | ABAC(基于属性) |
|---|---|---|
| 授权依据 | 用户 → 角色 → 权限 | 用户/资源/环境属性 → 策略 |
| 粒度 | 粗粒度(角色级) | 细粒度(属性级) |
| 动态性 | 静态,角色变更需管理 | 动态,属性实时计算 |
| 适用场景 | 组织层级清晰、权限稳定 | 多租户、上下文敏感、临时授权 |
| OPA 实现 | data.roles[user] 查表 |
input.attributes 规则引擎 |
实践建议:在日志平台中,RBAC 适合控制“能否查看日志源”,ABAC 适合控制“能否查看特定租户下敏感字段”。两者可组合使用,形成混合模型。
4.2 策略决策点(PDP)与策略执行点(PEP)
PDP 与 PEP 是 OPA 与日志平台集成的两个关键组件,职责分离清晰:
- PDP(Policy Decision Point):负责接收请求上下文,执行策略规则,返回决策结果(allow / deny + 附带信息)。在 OPA 中,PDP 即 OPA 引擎本身。
- PEP(Policy Enforcement Point):位于应用或网关侧,拦截请求,调用 PDP 获取决策,并根据决策结果执行放行、拒绝或降权操作。
关键原则:PDP 只做决策,不做执行;PEP 只做执行,不做决策。这种分离保证了策略逻辑的集中管理与审计。
4.3 权限规则模型架构图
下图展示了 RBAC + ABAC 混合模型下,PDP 与 PEP 在日志平台组件拓扑中的协作流程:
4.4 权限规则测试要点
在日志平台中测试权限规则时,需覆盖以下场景:
- RBAC 角色继承测试:验证子角色是否继承父角色权限,无越权。
- ABAC 属性边界测试:验证时间、IP、资源标签等属性边界值。
- PDP 决策一致性测试:相同输入下,多次调用返回相同决策。
- PEP 执行正确性测试:PEP 是否按决策结果正确放行/拒绝/降权。
- 组合策略优先级测试:RBAC 与 ABAC 规则冲突时,按预设优先级执行。
常见陷阱:PEP 缓存 PDP 决策结果时,若策略已更新但缓存未失效,会导致权限漂移。建议在日志平台中为策略版本号添加时间戳,PEP 每次请求携带版本号,PDP 返回最新策略版本。
4.5 策略规则示例(Rego)
以下是一个混合 RBAC + ABAC 的 Rego 策略片段,用于日志平台中的日志查询权限控制:
package platform.logs
# RBAC 角色定义
roles = {
"admin": ["read", "write", "delete"],
"operator": ["read", "write"],
"viewer": ["read"]
}
# ABAC 属性约束:仅允许查看所属租户的日志
default allow = false
allow {
# RBAC 检查:用户角色包含 read 权限
input.user.role == role
roles[role][_] == "read"
# ABAC 检查:用户租户与日志租户匹配
input.user.tenant == input.log.tenant
# 环境属性:仅在工作时间允许
time.now_hour >= 8
time.now_hour <= 20
}
测试策略:使用
opa test 命令编写单元测试,覆盖角色缺失、租户不匹配、非工作时间等边界情况,确保 PDP 输出与预期一致。