权限模型概述:RBAC、ABAC、PBAC 原理与对比

做密钥权限审计 SDK 这些年,我碰到最多的坑就是权限模型选型。选错了,后面越权检测的覆盖率直接打折扣。说白了,权限模型就是你给系统定的一套“谁、在什么时候、凭什么、能干什么”的规则。咱们搞审计的人,必须把这套规则吃透,不然写出来的检测逻辑全是漏洞。

我的习惯:每接手一个新项目,先翻他们的权限模型文档。如果没有?那大概率就是全栈手写的 if-else 地狱。遇到这种我一般会先劝重构,再谈审计。

RBAC — 基于角色的访问控制

RBAC 应该是现在最普及的模型了。核心思路就一句话:把权限挂到角色上,再把人挂到角色上。你想想看,用户不直接跟权限打交道,省事不少。

  • 用户(User):就是具体的人或系统账号
  • 角色(Role):权限集合的代名词,比如“管理员”、“审计员”、“只读用户”
  • 权限(Permission):具体的操作,比如“读取密钥”、“签发证书”、“撤销权限”
  • 会话(Session):用户激活角色的桥梁

我在一个金融项目里遇到过典型问题:某个同事离职后账号没禁用,但他的角色在审计期内还是“高级管理员”……你懂我意思吧?RBAC 的粗粒度特性让它管理简单,但也容易留下“角色精分”的隐患——一个角色塞了太多权限,结果谁也说不清这角色到底能干嘛。

ABAC — 基于属性的访问控制

ABAC 就比 RBAC 灵活多了。它不用角色,而是靠 一堆属性 拼出决策。属性可以来自用户、资源、环境、操作动作……组合起来能写出非常细的规则。

举个例子:

允许读取 密钥 当且仅当
  用户.department == 密钥.owner_department
  AND 用户.安全等级 >= 密钥.安全等级
  AND 当前时间 IN [09:00, 18:00]
  AND 访问来源IP IN 公司网段

看到没?一条策略就把部门、密级、时间、地点全约束了。我曾经给一个云平台做过审计 SDK,他们用 ABAC 定了 200 多条属性规则,越权检测的召回率直接拉到 97% 以上。副作用就是性能压力大——每次鉴权要拉一串属性,延迟容易飙上去。

避坑啊:我见过一个团队把 ABAC 的属性定义写成 50 列宽表,结果每次鉴权都要 Join 五六张表。查询时间从 5ms 变成 500ms,上线当天就被投诉。后来我建议他们引入属性缓存 + 预计算,才压回来。

PBAC — 基于策略的访问控制

PBAC 这个名字容易跟 ABAC 搞混,但它们的侧重点不同。PBAC 的核心是 策略(Policy) 的独立管理和组合。它不限定你用属性还是角色来写策略,而是强调策略的声明式、可重组、可审计。

通常 PBAC 的体系里会有这么几层:

  1. 策略定义点(PDP):接收决策请求,根据策略集合做最终裁决
  2. 策略执行点(PEP):在资源入口拦截请求,问 PDP 要结果
  3. 策略管理点(PAP):给管理员写策略用的界面或 API
  4. 策略信息点(PIP):拉数据源(比如 LDAP、数据库)给 PDP 用

XACML 和 OPA 就是 PBAC 的典型实现。我在审计 SDK 里集成过 OPA,策略文件写成 Rego 语言,每次变更只需重载策略文件,不用改代码。这一点对审计来说太香了——策略变更历史可以全部留存,配合版本比对,谁什么时候改了哪条规则一目了然。

三种模型对比

下面这张表是我自己整理的,平时面试和写文档都用它。你看清楚区别在哪。

维度 RBAC ABAC PBAC
核心抽象 角色 属性 策略
粒度 粗(角色级) 细(属性表达式) 可粗可细(策略定义)
策略变更方式 改角色-权限映射 改规则引擎 改策略文件/库
适用场景 组织结构稳定的系统 多维度、多租户、动态属性 策略需频变、合规要求高
审计友好度 一般(角色膨胀后难追溯) 好(每条规则可记录属性来源) 最好(策略版本化管理)
性能开销 低(缓存角色即可) 中高(属性收集与计算) 中(PDP/PEP 通信开销)

关键点:审计 SDK 里我最关心的是“可审计性”和“变更可追溯”。从这张表看,PBAC > ABAC > RBAC。但也不是,如果业务简单,RBAC 加上操作日志也够用。

模型联动思路

实际生产中没人会只用一个模型。我见过最常用的组合是:

  • 基础层用 RBAC:定义粗粒度的角色和权限骨架,比如“管理员”、“操作员”
  • 在关键接口叠加 ABAC:比如密钥下载时需要校验 IP 属性、设备属性
  • 整个权限层用 PBAC 兜底:策略引擎里既有角色规则也有属性规则,统一由 PDP 决策

这样既控制了复杂度,又保留了灵活性。审计 SDK 的越权检测逻辑也要跟着这种混合模型调整——你不能只检查角色不检查属性,否则就是白忙活。

三种权限模型的核心组件与关系 RBAC 模型 用户 - 角色 - 权限 角色继承 / 角色分层 粗粒度,静态分配 ABAC 模型 主体属性 + 资源属性 环境属性 + 操作属性 布尔表达式决策 PBAC 模型 PEP → PDP → PAP / PIP 策略文件声明式 版本化 / 热加载 / 可审计 权限决策引擎(PDP / 鉴权中间件) 审计日志 / 越权检测点 审计 SDK 可以将三种模型的决策结果统一收口,形成可追溯的越权证据链

选型建议

如果让我给刚入行的同学一个建议:别一开始就想上 ABAC 或 PBAC。RBAC 虽然笨,但足够应付 80% 的场景。等到你发现角色膨胀到上千个、或者需要按时间/地点限制权限时,再用 ABAC 做增量补丁。PBAC 更适合那些合规审计极严的场景(比如金融/政务),因为策略版本管理和变更审批流程是刚需。

我的经验:在审计 SDK 里,我通常会预留一个“权限模型元数据”字段。不管底层用哪种模型,都把决策时用到的角色名、属性名、策略 ID 一起记录到审计日志里。这样以后做越权检测时,可以回溯“当时为什么放行了”还是“当时为什么拦截了”。这个习惯帮我修过好几次线上误判。