第4章 规则引擎架构:策略决策点(PDP)、策略执行点(PEP)、策略信息点(PIP)的协作
核心观点:ABAC 的真正落地依赖规则引擎的三大核心组件 —— PDP、PEP、PIP 的职责分离与高效协作。任何一方的边界模糊都会导致权限判断失真、性能劣化或安全漏洞。
4.1 模块边界与分层
规则引擎在 ABAC 中承担“理解策略 → 收集上下文 → 做出判断 → 强制执行”的全链路职责。按 XACML 参考架构的标准划分,边界如下:
| 层次 | 模块 | 边界定义 |
|---|---|---|
| 接入层 | PEP | 与业务应用直接交互,拦截请求并强制决策结果;不参与策略推理 |
| 决策层 | PDP | 纯策略推理引擎,只做「属性 + 策略 → 决策」的逻辑演算 |
| 数据层 | PIP | 对接所有属性源(用户/资源/环境),提供标准化属性查询接口 |
架构原则:PDP 不得直接访问数据库或业务 API;PEP 不得缓存策略或自行推导权限。所有属性获取必须经过 PIP 统一代理。
4.2 组件职责
- PEP(策略执行点):嵌入在业务网关、API 中间件或应用拦截器中。职责包括:① 拦截用户操作请求;② 构造属性上下文并转发给 PDP;③ 接收 PDP 决策结果并强制执行(允许/拒绝/降权);④ 记录审计日志。
- PDP(策略决策点):规则引擎的“大脑”。职责包括:① 加载并解析策略集(XACML/ALFA/自定义 DSL);② 接收 PEP 发来的属性上下文;③ 执行策略评估(组合、消歧、优先级裁决);④ 返回决策结果(Permit / Deny / NotApplicable / Indeterminate)。
- PIP(策略信息点):数据代理层。职责包括:① 对接用户身份系统(LDAP/IDP)、资源标签系统、环境上下文(时间/位置/设备);② 缓存高频属性以减少源系统压力;③ 统一属性格式并返回给 PDP。
4.3 数据流与控制流
一次完整的权限判断遵循 5 步协作模型,数据流与控制流在组件间交替传递:
- PEP 拦截 → 用户发起操作,PEP 提取请求主体、动作、资源三元组,封装为
RequestContext发送至 PDP。 - PDP 属性请求 → PDP 根据策略中声明的属性需求(如“用户部门”“资源密级”),向 PIP 发起批量属性查询。
- PIP 数据回填 → PIP 从用户系统、CMDB、环境传感器等数据源拉取属性,聚合后返回给 PDP。
- PDP 策略评估 → PDP 将属性注入策略引擎,执行规则匹配与组合算法,生成最终决策与责任链。
- PEP 强制执 → PDP 将决策结果(含 Obligation / Advice)返回 PEP,PEP 执行允许/拒绝、附加审计或触发二次验证。
常见误区:部分团队将属性获取逻辑写在 PEP 或 PDP 内部,导致 PIP 形同虚设。这会破坏数据层的统一治理,每次新增属性源都需要修改决策逻辑,最终使规则引擎退化为硬编码条件判断。
4.4 信任链路
三个组件之间必须建立明确的信任边界,防止中间人篡改或属性注入:
- PEP ↔ PDP:使用 mTLS 双向认证,请求与响应必须携带签名令牌(JWS),防止伪造请求或篡改决策结果。
- PDP ↔ PIP:PIP 应提供 signed attribute assertions,PDP 只接受来自受信 PIP 的属性响应,拒绝未签名的属性值。
- PIP → 数据源:PIP 自身需要凭证管理,以最小权限原则连接 LDAP、数据库或 API,避免属性泄露或被滥用。
信任链路检查清单:
□ 所有组件间通信使用 TLS 1.3 + 双向证书校验
□ 决策结果带有 PDP 的数字签名,PEP 必须验签
□ PIP 返回的属性包包含数据源指纹与时间戳,防止重放攻击
□ 所有组件间通信使用 TLS 1.3 + 双向证书校验
□ 决策结果带有 PDP 的数字签名,PEP 必须验签
□ PIP 返回的属性包包含数据源指纹与时间戳,防止重放攻击
4.5 选型权衡
| 维度 | 集中式 PDP | 分布式 PDP |
|---|---|---|
| 性能 | 单点瓶颈,适合低频复杂策略 | 高吞吐,适合微服务高频调用 |
| 一致性 | 强一致,全局策略统一 | 最终一致,需策略同步机制 |
| 运维复杂度 | 低,集中管理 | 高,需协调多个 PDP 实例 |
| 推荐场景 | 管理后台、低并发企业应用 | 大规模 SaaS、高并发 API 网关 |
4.6 风险点
- PDP 性能衰减:策略数量超过 10,000 条或属性维度超过 20 时,评估耗时指数增长。必须引入策略索引与评估超时熔断。
- PIP 级联故障:数据源不可用导致属性获取失败,PDP 应设定属性缺失默认值(Deny 优先),而非抛出异常。
- PEP 绕过风险:应用端直接调用资源接口而非通过 PEP,导致权限控制被绕过。需在基础设施层强制流量经过 PEP。
4.7 落地步骤
- 组件选型:确定 PDP(如 AuthZForce、OPA、自研引擎)、PEP SDK 语言版本、PIP 适配器列表。
- 属性源梳理:枚举所有用户属性、资源标签、环境上下文,完成 PIP 对接适配器开发。
- 策略迁移与分层:将现有 RBAC 权限转化为 ABAC 策略,按“全局策略→应用策略→资源策略”分层存放。
- 集成与联调:PEP 嵌入业务网关 → 连接 PDP 沙箱 → PIP 注册测试数据源 → 端到端验证 100 条典型场景。
- 灰度上线:先 10% 流量经新规则引擎,对比决策结果与旧 RBAC 系统,确认无误后全量切换。
4.8 验收标准
| 验收项 | 通过标准 |
|---|---|
| 决策正确率 | 与预期策略结果一致,覆盖 100% 已定义的权限场景 |
| PDP 性能 | P99 评估耗时 < 50ms(策略数 ≤ 5,000 条时) |
| PIP 可用性 | 任意属性源故障时 PDP 仍能在 500ms 内返回决策(使用默认值) |
| 信任链路 | 伪造请求/篡改结果可被 PEP 或 PDP 识别并拒决 |
| 审计完整性 | 每次决策均记录:请求上下文、决策结果、PDP 签名、时间戳 |
4.9 协作架构总览
下图展示了 PDP、PEP、PIP 及周边策略存储、数据源之间的完整协作关系与数据流向:
架构落地建议:初期可先实现「PEP + 轻量 PDP + 简单 PIP」的紧凑模式,待策略复杂度提升后再拆分为独立部署的 PDP 集群与分布式 PIP 适配器网格。每步拆分都必须回归验证信任链路与决策正确率。