3. 权限模型对比:DAC、MAC、RBAC、ABAC 的区别与选择

说到权限模型,很多人第一反应就是“用 RBAC 就好了”。

但真是这样吗?
我在项目里踩过不少坑。有一次,一个金融核心系统硬套 RBAC,结果角色膨胀到两百多个,维护成本爆炸。
你想想看,选错模型,后面重构的代价有多高。

这一章,我就把这四种主流模型掰开揉碎了讲清楚。
它们有什么区别?

3.1 权限模型演进史

先看一张总览图,帮你快速建立整体认知。这张图展示了四种模型的核心要素和典型决策路径。

四种权限模型对比图 DAC / MAC / RBAC / ABAC 核心要素对比 DAC 自主访问控制 - 资源所有者管权限 - 常见于文件系统 - 核心:owner 决定 - 风险:权限易泄露 MAC 强制访问控制 - 系统策略强制管 - 常见于军方/政府 - 核心:标签 & 等级 - 风险:灵活性差 RBAC 基于角色访问控制 - 角色关联权限 - 常见于企业应用 - 核心:角色 中介 - 风险:角色爆炸 ABAC 基于属性访问控制 - 属性动态判断 - 常见于云平台 - 核心:属性 & 策略 - 风险:性能开销大 选型判断点 用户能否自主授权? 选型判断点 等级标签是否强制? 选型判断点 角色能否覆盖场景? 选型判断点 需要动态细粒度? 业务场景决定模型选型 没有银弹,只有最适合的方案 图注 深色节点:各模型核心特征 橙色节点:选型判断点

3.2 四大模型核心区别

接下来,我把每个模型的特点说透。

3.2.1 DAC(自主访问控制)

这是最古老的模型了。资源归谁,谁说了算。
说白了,就是“我的文件我做主”。

核心逻辑:资源所有者可以自行决定谁可以访问自己的资源。

特点

  • 灵活性高:owner 可以随时授权/撤销
  • 风险大:权限容易被滥用。我曾经见过一个项目,普通员工把重要文档的读权限开放给了全公司……
  • 常见场景:Linux 文件系统(rwx)、Windows NTFS 共享

注意:DAC 不适用于需要严格中央管控的系统。因为权限分散,很难做统一审计。

3.2.2 MAC(强制访问控制)

和 DAC 相反,MAC 是“系统说了算”。

系统给每个主体和客体都打上安全标签(比如:绝密、机密、公开)。
你是什么级别,就只能看什么级别的信息。不能自己改。

特点

  • 安全性高:策略由中央系统强制实施
  • 灵活性低:用户自己无法调整
  • 常见场景:军事系统、政府涉密系统、SELinux

小经验:我参与过一个政务系统,他们强制要求使用 MAC。项目组花了大量的精力在标签管理和等级映射上。如果不是硬性合规要求,普通业务系统真心不建议上 MAC。

3.2.3 RBAC(基于角色访问控制)

这是我们课程的重点。为什么 RBAC 普及率最高?
因为它引入了一个关键概念——角色。

角色把“用户”和“权限”解耦了。
你想想看,一个公司几百号人,每人分配权限累死。但如果我们定义几个角色,比如:管理员、运营、财务……把权限配给角色,再把角色赋予用户,是不是就清晰很多?

特点

  • 易于管理:角色数量远少于用户数量
  • 职责分离:支持互斥角色(比如:出纳不能兼任会计)
  • 常见场景:企业 ERP、CMS、SaaS 平台、SDK 权限设计

我个人的习惯:在设计 SDK 的 RBAC 适配时,优先考虑角色层级(Role Hierarchy)和职责分离。这两个特性能覆盖 90% 的业务场景。

3.2.4 ABAC(基于属性访问控制)

如果说 RBAC 是“静态”的,那 ABAC 就是“动态”的。
它不依赖角色,而是依赖一堆属性。

属性有哪些?

  • 主体属性:用户年龄、部门、职级
  • 资源属性:文档密级、创建时间
  • 环境属性:访问时间、IP 地址、设备类型

举个例子:
“允许部门经理在工作时间(9:00-18:00),从公司内网,查看本部门员工的绩效报告(非机密级)”
你看,一个判断条件里混了一堆属性。这就是 ABAC 的威力。

性能陷阱:ABAC 虽然灵活,但每次请求都要计算策略。一旦策略数超过几百条,响应延迟就会明显增加。我在一个云平台项目中就吃过这个亏,后来加了一层策略缓存才解决问题。

3.3 选型决策指南

好,四种模型都讲完了。那到底怎么选?

我建议你从下面四个维度来思考。

评估维度 DAC MAC RBAC ABAC
业务复杂度 简单 简单 中等 复杂
用户规模 小(< 50人) 小/中 中/大(> 100人) 大(> 1000人)
审计需求 低 高 中/高 高
性能要求 高 高 高 中/低(有性能开销)
动态性 低 低 中 高
维护成本 低 高 中 高

3.4 个人推荐选型模型(避坑指南)

说了这么多理论,来点实际的。

  1. 如果你是初创产品,快速迭代中:从 RBAC 入手,别碰 ABAC。RBAC 的模型清晰,团队理解成本低。
  2. 如果你是 SDK 提供商,要适配多种客户:还是 RBAC。角色-权限的数据模型容易序列化,也方便前端做配置界面。我在设计 OpenAPI 权限时,就坚持用 RBAC 做底座。
  3. 如果你在金融、银行系统:考虑混合模型。比如内核用 RBAC,在细粒度的交易授权上用 ABAC 做补充。我曾经在银行项目中,就用了“RBAC + 属性条件”的模式,既保证了基础管理的清晰,又满足了动态风控的需求。
  4. 如果你真需要强制安全等级:比如涉密系统,MAC 是唯一选择。别纠结。

避坑提醒:我曾经见过一个团队,为了追求“先进性”,在没有复杂场景的情况下强行上 ABAC。结果半年后,策略数膨胀到 500 多条,每次权限校验都要加载全量策略,系统直接卡死。最后不得不回退到 RBAC。

所以,记住一句:能用 RBAC 解决,就别折腾 ABAC。 这句话,我拿经验换来的。