3、RBAC核心组件详解:用户与用户组、角色定义、权限粒度
3.1 用户与用户组:权限管理的起点
说到RBAC,大家第一反应肯定是角色。但我得说,用户和用户组才是真正的起点。没有用户,角色给谁挂?权限给谁用?
在我的项目经验里,很多团队一开始把用户管得很粗糙。就在用户表里塞一个「角色ID」,然后就开始搞权限分配。结果用户一多,一个人兼职好几个岗位,权限乱成一锅粥。
用户就是系统中的操作主体。可以是人、服务账号、的调用方。每个用户有唯一标识(user_id),挂载一组属性(部门、职级、地域等)。
用户组是用户的集合。举个例子:「财务部全体成员」就是一个用户组。你不需要给财务部50个人一个一个分配角色,只需要给「财务组」分配一次。组内成员自动继承。
核心原则:用户组≠角色。用户组解决的是「谁」,角色解决的是「能做什么」。别混在一起。
我曾经在一个金融项目里,看到有人把「管理员组」当作一个角色来用,结果组里加了一个临时实习生,直接拥有了删除密钥的权限……嗯,血的教训。
3.2 角色定义:连接「人」和「权限」的桥梁
角色是什么?说白了,就是一个权限的命名集合。我习惯把角色理解为「岗位说明书」:这个岗位的人,允许做什么操作,能看到什么数据。
好的角色定义应该满足三个特征:
- 语义化:角色名一看就懂,比如「KeyAdmin」「Auditor」「Operator」,别用role_001这种。
- 职责单一:一个角色只代表一类职责。不要搞「超级管理员」包揽一切,那样做审计你会疯。
- 可继承:角色之间可以有层级。比如「SeniorKeyAdmin」继承「KeyAdmin」的所有权限,再附加一些高级操作。
我参与过的一个云平台,角色定义表长这样:
| 角色ID | 角色名 | 描述 | 父角色 |
|---|---|---|---|
| R001 | KeyReader | 仅查看密钥元数据 | NULL |
| R002 | KeyOperator | 创建、轮换密钥 | R001 |
| R003 | KeyAdmin | 完全管控密钥生命周期 | R002 |
| R004 | Auditor | 审计日志只读 | NULL |
注意:别把权限直接写死在角色里。角色应该只存储权限ID的引用。权限本身的变更通过权限表管理,不破坏角色结构。
3.3 权限粒度:你到底能管到多细?
权限粒度,是RBAC里最容易出问题的地方。你想想看,一个密钥管理系统,难道只分「能看」和「不能看」吗?显然不够。
我一般把权限粒度分为三个层次:
- 粗粒度(资源级):比如「可以操作所有密钥」——太粗了,审计很难定位具体违规。
- 中粒度(操作级):比如「可以对A密钥执行轮换操作」——常见,但对象一多管理复杂。
- 细粒度(属性级):比如「可以修改A密钥的标签,但不能修改该密钥的加密算法」——最灵活,但配置成本高。
我建议你在密钥权限审计时,至少做到操作级+资源级的组合。即:哪个用户、通过哪个角色、对哪些密钥、执行了什么操作。这样才能追溯。
理想粒度模型:权限 = (资源类型,资源ID模式,操作,约束条件)
示例:密钥(类型=对称,ID=prod-*,操作=decrypt,约束=仅工作时间段)
为什么要有约束条件?因为我曾经遇到过一种攻击:一个运维人员利用半夜的API调用,用合法角色解密了生产数据库密钥,数据就流出去了。如果权限上附加了「操作时间」约束,这种问题就能被系统阻止。
3.4 三者的关系:一张图说清
用户、用户组、角色、权限,它们之间到底怎么连?我画了张图,你看一眼就明白。
3.5 实践中的坑与建议
讲完理论,我分享几个实际踩过的坑:
- 坑1:角色膨胀——职责稍微不同就新建角色,最后上百个角色管理瘫痪。我建议定期合并语义相似的角色,使用「角色层级继承」来复用基础权限。
- 坑2:权限交叉——同一个用户通过多个角色获得了对同一资源的互相矛盾的操作。比如角色A说「允许解密」,角色B说「禁止解密」。最终裁决逻辑必须提前定好:默认拒绝?还是允许合取?我个人习惯强制拒绝优先。
- 坑3:用户组嵌套过深——用户组A包含组B,组B包含组C……审计时权限继承链条太长,很难分析。我建议限制最大嵌套深度为3层。
特别注意: 对于密钥管理系统,不要使用「通配符角色」比如 *:*:decrypt 这种。每个密钥操作都应该是可审计可追溯的。
3.6 表格总结:组件对比
最后用一个表格把三个核心组件做个对比,方便你快速参考:
| 组件 | 核心语义 | 主要属性 | 审计关注点 |
|---|---|---|---|
| 用户 | 操作主体 | user_id, 部门, 职级, 状态 | 是否活跃、是否被冒用 |
| 用户组 | 用户集合 | group_id, 成员列表 | 成员变更记录、组嵌套深度 |
| 角色 | 权限集合 | role_id, 父角色, 权限列表 | 角色语义是否清晰、是否存在空角色 |
| 权限 | 资源+操作+约束 | 资源类型, 操作, 条件 | 粒度是否匹配业务、约束是否生效 |
嗯,到这里你应该对RBAC的三大核心组件有了比较立体的理解。记住:用户和用户组解决「谁」的问题,角色解决「能做什么」的问题,权限粒度决定「做到多细」。三者配合好了,密钥审计才能有据可查。