2. 访问控制模型基础:DAC、MAC、RBAC、ABAC 模型对比与选型

聊到访问审批,绕不开一个基础问题——你到底用什么模型来控制权限?

我见过不少团队,一上来就拍脑袋说「我们用 RBAC」。结果业务一复杂,角色堆了几百个,维护成本比写代码还高。说白了,选模型就像选工具——拧螺丝用扳手,敲钉子用锤子,用对了事半功倍。

这一章,我把四种主流模型掰开揉碎讲清楚。你听完就能判断:你的场景,该用哪个。

2.1 DAC:自主访问控制

DAC 的全称是 Discretionary Access Control。翻译成人话就是——谁创建的资源,谁说了算。

你想想看,Linux 文件系统就是典型。你创建了一个文件,你可以决定谁能读、谁能写。这就是「自主」的含义:资源所有者拥有完全的授权权。

核心特征:

  • 资源所有者可自行授权
  • 权限可传递(比如 A 授权给 B,B 可以再授权给 C)
  • 粒度通常较粗(读、写、执行)

⚠ 我曾经踩过的坑: 某次内部文档系统用了纯 DAC 模型。员工 A 把一份机密文档授权给了 B,B 又转授权给了 C……最后权限链完全失控。审计时发现 30% 的文档被不该看到的人访问了。

DAC 的问题就在于——权限扩散不可控。 你没法保证每个所有者都按安全策略行事。

2.2 MAC:强制访问控制

MAC 和 DAC 正好相反。它不讲「人情」,只认标签。

系统给每个主体(用户、进程)和客体(文件、数据库)打上安全标签。比如「绝密」「机密」「内部」「公开」。只有标签匹配,才能访问。谁说了算?系统管理员,不是资源所有者。

特性 DAC MAC
授权主体 资源所有者 系统管理员
灵活性 高 低
安全性 低(易扩散) 高(强制策略)
典型场景 个人文件、共享文档 军事、政府、金融核心系统

我在做政府项目时用过 MAC。说实话,配置起来很痛苦——每个文件都要打标签,用户升级权限要走流程。但好处是:一旦配好,基本不用担心权限泄露。 因为用户自己改不了。

💡 我的建议: 除非你的业务有严格的合规要求(比如等保三级、GDPR 中的敏感数据),否则别轻易上 MAC。维护成本太高,业务部门会骂娘的。

2.3 RBAC:基于角色的访问控制

RBAC 是目前最主流的模型。它的思路很简单——把权限打包成角色,再把角色分配给用户。

举个例子:你公司有「运维工程师」「安全审计员」「部门经理」这些角色。每个角色对应一组权限。新员工入职,你只需要给他分配一个角色,不用一条条配权限。

# 一个简化的 RBAC 权限配置示例
roles:
  - name: "运维工程师"
    permissions:
      - "server:view"
      - "server:restart"
      - "log:read"
  - name: "安全审计员"
    permissions:
      - "log:read"
      - "log:export"
      - "audit:view"
users:
  - name: "张三"
    role: "运维工程师"
  - name: "李四"
    role: "安全审计员"

嗯,这里要注意——RBAC 虽然好用,但容易「角色爆炸」。我见过一个电商平台,为了适配各种业务场景,搞了 200 多个角色。最后连管理员自己都分不清「高级运营」和「资深运营」有什么区别。

RBAC 的黄金法则:

  • 角色数量控制在 20 个以内
  • 每个角色的权限要「内聚」——一个角色只做一类事
  • 避免「万能角色」——那种什么权限都有的角色,等于没控制

2.4 ABAC:基于属性的访问控制

ABAC 是这四种模型里最灵活的。它不看你是谁,也不看你是什么角色,而是看你、资源、环境这三者的属性。

举个例子:

  • 用户属性:部门=财务、职级=高级
  • 资源属性:密级=机密、所属部门=财务
  • 环境属性:时间=工作时间、IP=内网

策略可以写成:「允许财务部门的高级员工,在工作时间通过内网访问财务部的机密文档」。你看,这比 RBAC 精细多了。

💡 我个人的经验: ABAC 适合权限规则复杂、经常变化的场景。比如云计算平台的 IAM 策略、医疗系统的患者数据访问。但代价是——策略引擎的性能开销大,配置门槛高。 团队里得有人专门维护属性字典和策略规则。

2.5 四种模型对比总表

维度 DAC MAC RBAC ABAC
授权粒度 粗 中 中 细
灵活性 高 低 中 高
安全性 低 高 中 高
维护成本 低 高 中 高
适用规模 小团队 高安全环境 中大型组织 复杂动态场景
典型产品 Linux 文件系统 SELinux、Windows 强制完整性 Kubernetes RBAC、AWS IAM(基础版) Google Cloud IAM、XACML 引擎

2.6 选型建议:到底用哪个?

这个问题没有标准答案。但我可以给你一个决策框架:

  1. 团队小于 20 人,权限需求简单? → DAC 就够了。别折腾。
  2. 有合规要求,数据敏感度高? → MAC 或 ABAC。别省安全成本。
  3. 组织架构稳定,角色清晰? → RBAC。这是最稳妥的选择。
  4. 权限规则经常变,需要动态判断? → ABAC。但要做好策略管理。

⚠ 我见过最蠢的做法: 有人把四种模型混在一起用,没有清晰的边界。结果一个请求要经过 DAC 检查、MAC 检查、RBAC 检查、ABAC 检查……性能慢不说,策略冲突时根本不知道哪个模型说了算。

我的建议: 选一个模型作为主模型,其他模型作为补充。比如核心系统用 RBAC,敏感数据用 ABAC 做二次校验。别搞「四世同堂」。

2.7 知识体系总览

下面这张图,帮你把四种模型的核心逻辑串起来。你可以把它当作本章的「思维导图」。

访问控制模型对比总览 访问控制模型对比总览 DAC 自主访问控制 MAC 强制访问控制 RBAC 基于角色控制 ABAC 基于属性控制 资源所有者授权 权限可传递 粒度粗 系统管理员授权 安全标签匹配 高安全性 角色打包权限 用户关联角色 易角色爆炸 用户+资源+环境属性 动态策略判断 配置门槛高 选型建议:小团队用 DAC → 合规场景用 MAC → 稳定组织用 RBAC → 动态场景用 ABAC ⚠ 避坑提醒 不要四种模型混用,选一个主模型 核心系统用 RBAC,敏感数据用 ABAC 做二次校验 角色数量控制在 20 个以内,避免「万能角色」