土法炼钢兴趣小组的算法知识备份

【身份与访问控制工程】RBAC、ABAC、ReBAC:权限模型怎么选

文章导航

分类入口
architecturesecurity
标签入口
#rbac#abac#rebac#authorization#permissions#role-explosion#policy-engine

目录

授权架构总览 中,我们从宏观层面讨论了 RBAC → ABAC → ReBAC 的推理链。本文从数据结构、查询模式和工程运维三个维度,把三种模型放到同一个坐标系中比较——回答一个具体问题:你的业务到哪个阶段,当前的权限模型会开始出现系统性问题?

一、RBAC:最简单,最有陷阱

1.1 RBAC 的数据结构

RBAC(Role-Based Access Control)的核心数据结构是三个集合和两张关系表:

一次授权检查就是问:是否存在一条路径 \(u \xrightarrow{UA} r \xrightarrow{PA} p\)

1.2 角色爆炸:RBAC 的熵增定律

RBAC 的工程寿命取决于业务的复杂度增长率。典型路径:

角色爆炸不是缺陷,是 RBAC 的物理定律:RBAC 的每个角色必须在前端设计中提供所有维度——当权限问题的维度从 1 增加到 3(如部门 + 项目 + 审批级别),角色数量按 \(\prod_{i} n_i\) 增长。

1.3 RBAC 仍是主流——为什么

大部分 SaaS 业务的前期权限需求确实只有一维(角色)或二维(角色 + 租户)。RBAC 在这些场景下是最优解:

关键判断:当你的角色数量超过”你可以在一页列表里扫完”的量(约 50 个),或者角色名开始出现诸如 Engineering-Manager-APAC-ProjectX 的复合前缀——RBAC 已经到了需要重新评估的阶段。

二、ABAC:表达能力换管理复杂性

2.1 ABAC 的核心抽象

ABAC(Attribute-Based Access Control)的语法是:

如果 主体属性 + 资源属性 + 环境属性 满足 策略规则 → 允许/拒绝

例如:

允许 IF
  subject.department == resource.department
  AND subject.clearance_level >= resource.sensitivity_level
  AND environmental.current_time BETWEEN 09:00 AND 18:00
  AND environmental.ip_address IN trusted_networks

2.2 ABAC 的富策略语言与”策略失控”

ABAC 的表达力来自于富属性——NIST SP 800-162 定义了 ABAC 的属性模型,但其工程实现没有统一标准。不同的策略引擎对属性模型和策略语言的定义不同:

ABAC 的工程风险不是”策略写不对”——单条策略很容易写对。风险是策略之间的交互

Policy 1: 允许 Finance 部门访问 finance-data
Policy 2: 拒绝 Contractor 访问 finance-data
Policy 3: 允许 Project-Alpha 成员访问项目相关数据

问题:Finance 部门的 Contractor 能不能访问 Project-Alpha 中的 finance-data?

策略数量超过 50 条后,两两之间的交互已经超出单个人的心算能力。ABAC 的运维成本集中在策略审计(“为什么张三能看到这条数据?”——需要求值所有相关策略)和策略冲突检测(有没有两条策略互相矛盾)上。

2.3 ABAC 的工程启动清单

  1. 先定义属性源(Identity Provider 的用户属性、资源元数据、环境上下文),再定义策略。
  2. 策略默认拒绝——只显式允许。
  3. 实现”策略解释”功能——“为什么这次访问被拒绝了?”的输出必须能追溯到具体策略。
  4. 策略变更走 CI/CD 和 code review——不要有”在线编辑器直接改生产策略”的管理员入口。

三、ReBAC:把关系变成权限

3.1 ReBAC 的核心思想

RBAC 和 ABAC 都从”主体有什么属性”出发,ReBAC(Relationship-Based Access Control)从”主体和资源有什么关系”出发。核心语法变成了图:

Allow if: requestor -[editor_of]-> document
Allow if: requestor -[member_of]-> group -[owner_of]-> document
Allow if: requestor -[manager_of]-> user -[creator_of]-> document

这就是 Google Zanzibar 论文的核心模型——在下一篇文章中详细拆解。这里只讨论 ReBAC 与前两种模型在概念层面的对比。

3.2 ReBAC 的表达力优势

ReBAC 的独特优势在于”间接关系”——“请求者不是文档的 Editor,但请求者是文档所在 Project 的 Manager”。这在 RBAC 中需要创建一个 Project-Manager-Role,在 ABAC 中需要维护 subject.managed_projects 属性和 resource.project 属性并做 JOIN。在 ReBAC 中,这是一条图查询——从请求者节点出发,走若干条边,看能不能到达资源节点。

3.3 三种模型的工程权衡

维度 RBAC ABAC ReBAC
查询复杂度 O(n_roles) ≈ O(1) 依赖策略求值引擎 O(graph depth)
管理员心智模型 “角色=一组权限” “规则=属性条件” “关系=图上的路径”
适合的问题维度 1-2 维(角色 + 可选租户) 3+ 维,属性丰富的场景 关系密集型(组织树、文件共享、社交图)
100 条策略时的可维护性 好(角色可归类) 中(需要策略冲突审计) 中-高(取决于关系图的清晰度)
典型适用场景 SaaS 的功能权限 金融合规、医疗数据隐私 Google Drive 分享、企业组织树权限

选型框架: - 如果你的权限问题是”什么人能做什么操作” → RBAC - 如果变成”什么人在什么条件下能做什么操作” → ABAC - 如果变成”什么人和什么资源之间有什么联系从而能做什么操作” → ReBAC

三者可以在同一系统中混合使用——RBAC 管功能权限,ABAC 管数据权限,ReBAC 管分享和协作权限。


上一篇服务身份:mTLS、SPIFFE/SPIRE 与 Workload Identity 下一篇Zanzibar 风格权限系统

同主题继续阅读

把当前热点继续串成多页阅读,而不是停在单篇消费。

2026-06-13 · architecture / security

【身份与访问控制工程】IAM 全景:为什么这是高价值赛道

从 2020 年 SolarWinds 到 2024 年 Okta 支持系统泄露,身份基础设施的安全失败反复证明一件事:IAM 不是 IT 支撑系统,而是安全架构的承重墙。本文建立现代 IAM 的全景地图——从认证协议、令牌体系、权限模型到身份治理与平台选型,给出 5 个贯穿全系列的核心问题。

2026-06-18 · architecture / security

【身份与访问控制工程】Zanzibar 风格权限系统:Google 的全球授权引擎

Google Zanzibar 论文在 2019 年发布后,引发了开源授权系统的一波重新设计:Auth0 FGA、SpiceDB、Permify、Ory Keto——全都基于 Zanzibar 的'关系图+命名空间配置'模型。但论文本身只讲了 What,没深入 Why。本文从 Zanzibar 的 relation tuple 模型、namespace config 的语义、consistency 模型(Zookie)和工程权衡出发,拆解为什么 Zanzibar 的设计决策是这样的,以及你自己实现时要面对什么。

2026-06-18 · architecture / security

【身份与访问控制工程】OPA、Cedar 与策略引擎落地

OPA 是 CNCF 的策略引擎标准答案,Rego 是它的策略语言;Cedar 是 AWS 开源的新竞争者,基于 Rust 的 WASM 编译执行、语法更接近 SQL。两者在架构模式(sidecar vs 中心化)、策略语言设计哲学和性能特征上有根本差异。本文从策略引擎的架构模式出发,拆解 OPA Rego 的核心语义与性能限制、Cedar 的设计取舍,以及策略即代码(Policy as Code)在 CI/CD 中的落地。

2026-06-19 · architecture / security

【身份与访问控制工程】B2B SaaS 多租户权限设计

多租户权限系统是 IAM 中工程复杂度最高的场景之一——每个租户想要自己的角色、自己的组织树、自己的审批流和完全隔离的数据。这四种需求会互相冲突。本文从租户隔离模型出发,拆解四层权限架构、租户级 RBAC 的扩展方案、组织树与数据权限的联动,以及跨租户授权(如第三方服务商访问客户数据)的架构设计。


By .