3. 访问策略模型:RBAC、ABAC 与 PDP/PEP
策略模型这东西,说白了就是「谁在什么条件下能干什么」。我在网关安全项目里摸爬滚打这些年,见过太多因为策略模型选型失误导致的权限泄露事故。今天咱们就把 RBAC、ABAC 这两个主流模型,以及 PDP/PEP 这个决策执行架构彻底讲透。
3.1 基于角色的访问控制(RBAC)
RBAC 是最经典的策略模型。它的核心思想很简单:把权限分配给角色,再把角色分配给用户。用户不直接拥有权限,而是通过角色间接获得。
核心三要素:
- 用户(User):访问系统的实体,比如张三、李四
- 角色(Role):职责的集合,比如管理员、审计员、操作员
- 权限(Permission):对资源的操作许可,比如读日志、写配置
举个例子。我在某金融网关项目中,给运维团队定义了三个角色:
| 角色 | 可访问资源 | 允许操作 |
|---|---|---|
| 系统管理员 | 所有网关配置、策略库 | 增、删、改、查 |
| 安全审计员 | 审计日志、告警记录 | 只读 |
| 普通运维 | 设备状态、流量统计 | 查看、重启服务 |
新员工入职,我只需要给他分配一个角色,权限自动到位。离职时撤销角色关联就行。这种模型的好处是管理成本低,适合组织架构稳定的场景。
我曾经踩过的坑:角色爆炸。在一个大型政企项目里,因为业务场景太细,我定义了 200 多个角色。结果没人记得清每个角色有什么权限,最后不得不重构。RBAC 的角色数量建议控制在 20 个以内,超过这个数就该考虑 ABAC 了。
3.2 基于属性的访问控制(ABAC)
ABAC 比 RBAC 灵活得多。它不依赖固定的角色,而是根据属性动态计算决策。属性可以来自用户、资源、环境甚至操作本身。
你想想看,RBAC 能处理「允许运维人员在工作时间访问生产环境」这种需求吗?不能,因为「工作时间」这个条件角色表达不了。但 ABAC 可以。
ABAC 的四类属性:
- 主体属性:用户 ID、部门、职级、安全等级
- 资源属性:资源类型、所属项目、敏感级别
- 环境属性:访问时间、IP 段、设备状态、网络区域
- 操作属性:操作类型(读/写/执行)、操作频率
我习惯用策略表达式来描述 ABAC 规则。比如:
# 允许财务部员工在工作日 9:00-18:00 访问财务系统
PERMIT
WHEN subject.department == "财务部"
AND resource.type == "财务系统"
AND environment.time BETWEEN "09:00" AND "18:00"
AND environment.day_of_week IN ["Mon","Tue","Wed","Thu","Fri"]
这个表达式里没有角色,全是属性。新来的财务实习生,只要他的部门属性是「财务部」,策略自动生效。不需要提前建角色。
我个人建议:ABAC 虽然灵活,但别滥用。属性越多,策略引擎的计算开销越大。我在一个物联网网关项目里,因为加了 30 多个环境属性,导致每次访问决策延迟从 2ms 飙升到 50ms。后来精简到 8 个核心属性,性能才恢复。
3.3 RBAC vs ABAC:怎么选?
很多新手问我:到底用 RBAC 还是 ABAC?我的回答是:看场景,也可以混着用。
| 对比维度 | RBAC | ABAC |
|---|---|---|
| 管理复杂度 | 低,角色定义清晰 | 高,属性管理需要规范 |
| 灵活性 | 低,新增场景需新建角色 | 高,属性组合即可 |
| 性能 | 快,缓存友好 | 相对慢,需实时计算 |
| 适用场景 | 组织稳定、权限变化少 | 动态环境、细粒度控制 |
实际项目中,我常用的是RBAC + ABAC 混合模型。先用 RBAC 做粗粒度控制,比如「运维人员可以访问服务器」;再用 ABAC 做细粒度过滤,比如「只能访问自己负责的服务器,且必须在 VPN 环境下」。这样既保留了 RBAC 的管理效率,又获得了 ABAC 的灵活性。
3.4 策略决策点(PDP)与策略执行点(PEP)
模型讲完了,接下来是架构层面的东西。PDP 和 PEP 是策略执行的核心组件,我把它俩比作「大脑」和「手脚」。
- PDP(Policy Decision Point):策略决策点。它负责接收访问请求,根据策略模型计算「允许」还是「拒绝」。PDP 不关心请求怎么来的,只做决策。
- PEP(Policy Enforcement Point):策略执行点。它拦截实际访问请求,把请求发给 PDP 问「能放行吗?」,然后根据 PDP 的决策结果执行放行或阻断。
下面这张图展示了 PDP 和 PEP 的协作流程:
我在实际部署时,通常把 PDP 做成独立服务,部署在管控中心。PEP 则嵌入到每个网关节点里。这样做的好处是:策略变更只需要更新 PDP,所有 PEP 自动生效,不需要逐个重启网关。
避坑指南:PDP 必须是高可用的。我曾经因为 PDP 单点故障,导致全网网关无法做访问决策,所有请求都被 PEP 默认阻断。后来我加了 PDP 集群和本地缓存策略——PEP 缓存最近 1000 条决策结果,PDP 挂了也能撑一段时间。
3.5 三者如何联动?
最后咱们把 RBAC、ABAC、PDP/PEP 串起来。一个典型的网关访问策略模型是这样的:
- PEP 拦截请求,提取主体、资源、环境属性
- PEP 构造决策请求,发给 PDP
- PDP 先查 RBAC 角色,判断用户是否有基本权限
- PDP 再跑 ABAC 规则,检查属性条件是否满足
- PDP 返回 Permit 或 Deny
- PEP 执行最终动作
嗯,这里要注意:RBAC 和 ABAC 的执行顺序很重要。我习惯先 RBAC 后 ABAC。RBAC 先做粗筛,把明显没权限的请求直接拒绝,减少 ABAC 的计算压力。只有 RBAC 通过了的请求,才进入 ABAC 的细粒度判断。
总结一句话:RBAC 管「能不能进这个门」,ABAC 管「进门后能走多远」,PDP/PEP 管「谁来决策、谁来执行」。三者配合,才能构建出既灵活又安全的网关访问策略体系。