1. RBAC 模型概述:从混乱到有序的权限治理

大家好,我是这次课程的主讲。先聊聊我自己的一个经历——刚入行那会儿,我管过一台内部 Wiki 服务器,用户就三十来号人。权限怎么管理的?直接在系统里给每个人配 `sudo`,谁要什么文件我就改一遍 `chmod`。那时候没出事,纯粹是运气好。后来项目大了,用户破千,我对着权限表彻底懵了:谁能改什么、谁不该看什么,完全是一本烂账。这就是没有 RBAC 的后果。

RBAC,全称 Role-Based Access Control,中文叫基于角色的访问控制。说白了,就是不再把人当成权限的基本单位,而是把角色作为管理核心。用户通过角色获得权限,而不是直接跟权限挂钩。这个转变,把权限管理从「点对点」的野蛮模式,拉进了「点对面」的工程化时代。

1.1 核心三要素:用户、角色、权限

RBAC 最核心的概念就三个东西,我习惯叫它「铁三角」:

  • 用户 (User):系统里真实操作的人或服务账号。在审计日志里,用户就是那个留下操作痕迹的主体。
  • 角色 (Role):一个权限的集合,代表一类职责。比如「审计管理员」这个角色,就包含了查看日志、导出日志、配置存储策略等一堆权限。
  • 权限 (Permission):对系统资源的操作许可。比如「读取日志文件」、「写入审计记录」、「删除归档」。在 RBAC 里,权限只跟角色绑定。

关键点:用户不直接拿权限,用户先被分配角色,角色再拥有权限。这件事在审计日志里非常重要——当你看到一条日志说「用户A删除了日志」,你不需要查 A 的个人权限表,只要看 A 当时被赋予了哪个角色,就能判断这个操作是否合规。

我在项目中遇到过一种情况:有两个用户,张三和李四,他们都属于「日志查询员」角色。但张三因为个人能力强,老板额外给了「删除日志」的权限。这就坏了规矩——权限直接绑在了用户身上,脱离了角色控制。后来审计的时候发现,张三删掉了一批关键记录,李四却因为角色相同被误认为是嫌疑人。这个坑,完全是权限设计没遵循 RBAC 造成的。

三者之间的关系,我画了一张图,你看一眼就懂了:

RBAC 核心三要素关系 用户 (User) 系统主体 / 操作者 角色 (Role) 权限集合 / 职责 权限 (Permission) 资源操作许可 分配 授予 关键逻辑 1. 用户不直接拥有权限,而是通过角色间接获得。 2. 角色是权限的『容器』,一个角色可以包含多个权限。 3. 用户可以拥有多个角色,权限自动叠加。 4. 审计时,只要记录『用户-角色』绑定,就能追溯到所有操作。

1.2 发展历史:RBAC 是怎么长成今天这样的?

RBAC 不是一天建成的。我把它分成三个阶段,你看完就知道为什么今天必须用它:

阶段 时间 特点 我见过的问题
混沌期 1990 年代前 ACL 直接绑用户
权限表奇大无比
有个系统 500+ 用户,ACL 表 4000 多行,维护人员辞职后谁也看不懂
理论成型期 1992–2000 NIST 发布 RBAC 标准
提出核心三要素
我做第一个 RBAC 系统时,照着抄了一段代码,发现角色继承全是坑
工业成熟期 2000 至今 RBAC0/1/2/3 成体系
融入云服务、审计合规
现在几乎每个云平台(AWS IAM、Azure RBAC)都在用这个模型

为什么要提这段历史?因为很多团队在切换 RBAC 的时候,还停在混沌期的思维里——老板说「给张三开个权限」,意思就是直接改张三的权限位。你想想看,一个系统如果每个用户都直接绑定权限,那跟十年前有什么区别?

1.3 常见 RBAC 变种:四个级别,对应不同规模

NIST 把 RBAC 分成了四个级别,我按复杂度从低到高给你列出来:

  1. RBAC0 – 核心模型:只有"用户-角色-权限"三级结构。适合小团队、简单应用。我建议创业期的产品先用这个,够用就行。
  2. RBAC1 – 角色继承:角色之间可以形成父子关系,子角色自动继承父角色权限。比如「超级审计员」继承「审计员」的所有权限。这里有个坑——我曾经的团队在角色继承图上搞出了死循环,系统直接崩了。
  3. RBAC2 – 约束模型:加入职责分离(SoD)。比如一个人不能同时担任「审计员」和「日志删除员」。这在金融审计场景是硬性要求。我曾经历过一次合规检查,因为没做 SoD,被监管当场要求整改。
  4. RBAC3 – 统一模型:等于 RBAC1 + RBAC2,既有继承又有约束。这是目前大型企业用的东西,通常是几百个角色、几千条约束规则的复杂度。

给个实用建议:做审计日志系统,起步从 RBAC0 开始就够了。先跑通用户-角色-权限的映射,再把日志记录做扎实。等业务复杂了,再慢慢往 RBAC1、RBAC2 升级。不要一开始就搞 RBAC3,容易把自己绕晕。

1.4 为什么审计日志需要 RBAC?

这个问题,我换个角度问:如果没有 RBAC,审计日志会变成什么样?

  • 每个用户的操作日志,你没法快速判断「这个操作谁批准的」。
  • 出一个安全事故,排查下来用户权限改过 50 次,每次都没记录。
  • 离职员工的权限回收不干净,留下后门。

RBAC 让审计日志清晰很多。因为你只要记录「用户在什么时间被赋予了哪个角色」,剩下的权限检查全部由角色定义完成。嗯,这就是 RBAC 的核心价值——把权限管理从「打补丁」变成「建框架」。

特别注意:RBAC 只是模型,不是银弹。编码实现的时候,角色-权限映射表、Session 中的角色缓存、以及审计日志的完整性,都需要你自己写好。如果代码写得烂,RBAC 也救不了你。