2. 权限模型基础:RBAC、ABAC、PBAC

做防越权审计,绕不开权限模型。说白了,权限模型就是一套规则,用来回答三个问题:谁能对什么资源执行什么操作。

我见过不少项目,一开始没想清楚用哪种模型,后面越改越乱。你想想看,权限模型选错了,后续的查询审计、越权拦截全得重来。所以这一章,我们把三种主流模型——RBAC、ABAC、PBAC——拆开讲透。

2.1 RBAC:基于角色的访问控制

RBAC 是最经典的模型。核心思路就一句话:把权限打包成“角色”,再把角色分配给用户。

RBAC 三要素

  • 用户:实际操作的人或系统
  • 角色:权限的集合,比如“管理员”、“审计员”、“普通用户”
  • 权限:对资源的具体操作,比如“读取订单”、“删除用户”

举个例子:我做过的一个内部工单系统,用户只有三种角色:普通员工能提工单、部门主管能审批、管理员能删除工单。权限清晰,管理也简单。

但 RBAC 有个坑——我遇到过一个大客户,角色数膨胀到 200 多个。为什么?因为每个业务线都想有自己的“专属角色”,结果角色定义混乱,越权漏洞就藏在这些细碎的角色里。

我的建议:RBAC 适合角色相对稳定、权限变化少的场景。如果你的业务有几十种“规则”要动态调整,RBAC 就会变得很笨重。

2.2 ABAC:基于属性的访问控制

ABAC 比 RBAC 灵活得多。它不是靠“角色”做判断,而是根据属性来动态计算权限。

属性可以分成四类:

  • 主体属性:用户部门、职级、所在区域
  • 资源属性:文档密级、数据创建时间、所属项目
  • 环境属性:访问时间、 IP 段、设备类型
  • 操作属性:读、写、删除

判断逻辑就好比:如果用户是财务部的,并且现在是工作时间,并且文档密级是“内部”,那么允许读取。

我记得在做一个医疗系统时,医生只能看到自己科室的病历,这是 RBAC 能搞定的。但另一位医生会诊时,需要临时看到其他科室的病历——这个时候,RBAC 就麻烦了。用 ABAC 定义一条策略:“如果医生被临时授权了会诊单,并且会诊单关联了病历 ID,则允许读取”,就解决了。

注意:ABAC 的灵活是有代价的。策略写多了,性能会下降,审计日志也会变得复杂。我曾经见过一个项目,策略引擎处理一次鉴权要 300 毫秒,严重拖慢接口响应。所以,设计策略时必须考虑缓存和索引。

2.3 PBAC:基于策略的访问控制

PBAC 可以理解为 ABAC 的“高级版”。它把权限判断完全抽象成一组策略,策略里可以包含角色、属性、甚至上下文逻辑。

PBAC 的核心是 PEP(策略执行点) 和 PDP(策略决策点) 分离。

  • PEP 负责拦截请求,把它转给 PDP
  • PDP 拿着策略库算一遍,返回 Permit 或 Deny

我们在做某云平台的多租户权限时,用的就是 PBAC。每个租户可以自定义策略,但底层 PDP 是统一引擎。这样既有弹性,又能保证审计标准一致。

三种模型对比

模型 核心概念 灵活性 管理成本 适用场景
RBAC 角色绑定权限 低 低 职能清晰、人员稳定的系统
ABAC 属性组合判断 中高 中 需要细粒度控制、动态规则的系统
PBAC 策略引擎+执行点分离 高 较高 多租户、复杂合规、大规模分布式系统

2.4 我在防越权审计中怎么选模型?

很多初学者问我:到底选哪个?我的经验是,不要迷信“最先进的”。

  1. 先看业务复杂度:如果角色不超过 20 个,权限规则大多硬编码,RBAC 够用就别乱升级。
  2. 再看审计要求:如果有严格的合规审计(比如 HIPAA、PCI-DSS),PBAC 能让策略和审计日志分离,复盘时更清晰。
  3. 最后看团队能力:ABAC/PBAC 需要平台团队维护策略引擎,小团队硬上容易变成烫手山芋。

顺便说一句,我参与过的一个金融项目,一开始选了 ABAC,结果策略数量膨胀到上万条,PDP 查询慢得离谱。后来我们改成了“RBAC + 关键点的 ABAC 策略”,性能才拉回来。说白了,混搭也是一种解法。

2.5 一张图理清三种模型的关系

下面的图展示了三者在「抽象层级」和「灵活性」上的定位。权限策略从具体到抽象:

  • RBAC 在角色层做控制
  • ABAC 在属性层做判断
  • PBAC 在策略引擎层做统一裁决
RBAC / ABAC / PBAC 层级与灵活性对比图 三种权限模型的关系与定位 应用层:业务代码 / API 网关 接收用户请求,调用鉴权组件 PEP 在此层拦截请求 RBAC 角色 → 权限 低灵活性 · 低管理成本 ABAC 属性 → 策略 中灵活性 · 中管理成本 PBAC 策略引擎 高灵活性 · 较高管理成本 灵活性 从左到右:RBAC(低)→ ABAC(中)→ PBAC(高) 适用场景:简单 → 复杂 实践中常见混合架构:RBAC 为主体 + ABAC 做局部动态策略

2.6 避坑指南

这一章最后,分享几个我踩过的坑:

  • 不要一开始就设计“万能模型”:我见过有人上来就搞 PBAC,结果策略引擎写了三个月,业务已经改版两次了。从小做起,逐步演进。
  • 别忘了审计日志的颗粒度:无论选哪种模型,审计时都要能追溯到“谁、什么时候、通过什么策略、给了什么权限”。ABAC/PBAC 的策略解析要记得落日志。
  • 小心“隐式授权”:比如 RBAC 里,角色继承可能导致用户意外获得高权限。我曾经排查过一个越权漏洞,根源就是角色树里有个“父角色”泄露了权限。
  • 测试要覆盖边界:属性组合成千上万,写策略时的“默认拒绝”一定要验证。我习惯在策略引擎里加一条 Deny All 兜底规则,确保任何未匹配的请求都被拦截。