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 在日志平台组件拓扑中的协作流程:

权限规则模型架构:PDP / PEP 与 RBAC + ABAC 协作 用户 / 客户端 PEP(执行点) PDP(决策点) OPA 引擎 请求 决策请求 策略评估 决策结果 allow/deny 响应 RBAC 角色映射 user → role → perm ABAC 属性上下文 user/res/env 属性 OPA 策略仓库 Rego 规则集 说明 PEP 拦截请求 → 组装属性上下文 → 调用 PDP → OPA 评估 RBAC/ABAC 策略 → 返回决策 → 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 输出与预期一致。