2、RBAC与传统访问控制对比:DAC、MAC、RBAC的优缺点及适用场景

做权限模型选型,很多团队上来就套RBAC,觉得它最流行。但真相是——没有万能模型,只有合适的模型。我自己第一次做企业级权限系统时,就踩过「模型选错」的坑。后来复盘才明白,先理解DAC、MAC、RBAC的本质差异,比直接画角色树重要得多。

核心观点:三种模型对应三种不同的安全哲学。DAC交权给用户,MAC交权给系统,RBAC交权给角色。选哪个,取决于你愿意把「谁可以做什么」的决定权放在哪一层。

2.1 自主访问控制(DAC)

DAC的全称是Discretionary Access Control,翻译过来就是「资源主人说了算」。什么意思?每个文件的创建者可以自主决定谁有权限读、写、执行。

我记得最早接触DAC是在Linux文件系统上。一个普通用户创建了一个文件,chmod 777就把所有权限敞开了。这种模型在早期Unix时代很常见,因为它简单、灵活。

优点:用户直接控制,方便共享;实现成本低;适合团队内部非敏感信息交换。

缺点:权限容易扩散——一个同事离职,他的文件也许永远没人关闭。我在项目中遇到过,一个部门经理嫌申请流程慢,直接把自己文件夹的写权限给了全公司,结果某天被误删了一整版报表。这就是DAC的典型「好心办坏事」。

适用场景:个人桌面环境、非结构化团队协作、低安全等级的临时项目。

维度DAC特点
决策权归属资源创建者(用户)
灵活性高(用户可随意授权)
安全性低(难以控制权限扩散)
管理成本低(不依赖集中管理)
典型代表Linux rwx、Windows NTFS ACL

避坑提醒:千万不要用DAC管理核心业务系统的访问权。你想想看,每个用户都能给别人授权,权限图很快就会变成一团乱麻,审计时根本说不清楚「这个权限是谁给的、为什么给」。

2.2 强制访问控制(MAC)

MAC走的是另一个极端——权力交给系统,用户自己不能改。系统根据安全标签(比如机密、秘密、绝密)和预设规则,自动决定谁可以访问什么。

我第一次接触MAC是在做军工项目审计的时候。那个系统里每个用户有个「安全级别」,每个文档也有一个。系统直接拒绝低级用户访问高级文档,管理员都没法强行放行。说实话,当时我被这种「硬核」方式震住了——安全性确实强,但灵活性也几乎为零。

优点:安全性极高,权限不可绕过;适合高密级场景;审计路径清晰,因为所有决定都由系统规则驱动,不存在人为放水。

缺点:太僵化了。我曾经帮一个客户做MAC改造,他们发现同一个部门里,经理和员工需要访问相同级别的文件,但经理有时还得审批更高级的文件。MAC标签改了又改,最终搞出十几个级别,管理成本飙升。说白了,MAC适合「信息密级分得很清晰」的组织,但现实世界往往是灰度的。

适用场景:军事、政府、涉密研发、金融核心交易数据(需要严格的分级保护)。

维度MAC特点
决策权归属系统(基于安全标签)
灵活性极低(用户无权调整)
安全性极高(强制策略不可绕过)
管理成本高(标签定义 + 策略维护)
典型代表SELinux、Trusted Solaris、MLS系统

2.3 基于角色的访问控制(RBAC)

RBAC是我日常打交道最多的模型。它的思路很简单:把权限打包成角色,把人分配进角色里。你不需要给每个人单独授权,只需要定义好「财务专员角色」「财务经理角色」……然后谁做这岗位,就挂上对应角色。

我做过一个大型ERP系统的权限审计,系统里大概有200个微服务、3000多个API。如果用DAC,每个用户一条ACL,几百人就得几千条规则,乱到没法审计。换成RBAC后,我只定义了12个核心角色,所有权限全收敛了,审计报告一下子清晰起来。

优点:权限与岗位挂钩,支持「职责分离」(比如一个人不能同时拥有订单创建和订单审批角色);适合中大型组织;审计方便,能把「谁有什么角色」查清楚。

缺点:角色设计是门艺术。如果你把业务场景分得太细,角色数量会爆增——我见过一个客户,角色表里有800多个角色,比用户数还多,这就失去了RBAC的意义。另一个问题是「角色爆炸」和「权限继承层级混乱」,要预先花不少精力设计角色继承树。

适用场景:企业管理系统、SaaS后台、云平台IAM、金融、医疗等对审计有需求的场景。

维度RBAC特点
决策权归属角色(管理员定义角色权限)
灵活性中等(角色可调整,用户角色可变更)
安全性较高(支持细粒度控制 + 职责分离)
管理成本中高(角色设计投入大,但后期维护相对稳定)
典型代表RBAC0~RBAC3、NIST RBAC标准、AWS IAM、Kubernetes RBAC

2.4 三种模型的核心思想对比

我画了一张对比图,把三种模型的「控制哲学」串起来。你一眼就能看出它们的根源差异。

DAC、MAC、RBAC核心思想对比 三种访问控制模型的核心思想对比 DAC 资源创建者 → 任意授权 用户自主管理ACL 适用:个人/非敏感场景 MAC 系统标签 → 强制匹配 用户/管理员不可改写 适用:军工/涉密/严格分级 RBAC 角色 → 权限 → 用户 支持职责分离、角色继承 适用:企业/云平台/审计要求 从左到右:控制权从「用户」转移到「系统」再到「角色」

从图上你能直观感受到:DAC是用户自己在门口贴告示「谁可以进」;MAC是系统在门口装了个铁门,只认特定通行证;RBAC则是给每个人发一张岗位卡,凭卡找对应权限。

2.5 快速选型参考

实际上,很多系统是混合使用的。比如Linux容器底层用MAC(SELinux),上层用RBAC。但作为审计人员,我建议你先明确核心诉求:

  • 如果你最怕的是权限失控 → 优先MAC或严格RBAC
  • 如果你最怕的是管理负担 → 优先RBAC,把角色控制在50个以内
  • 如果你团队小、变数大 → DAC反而最省事,但必须定期清理

我的经验:做权限审计时,我常常先看模型选型对不对味。如果一个普通电商项目用了MAC,多半是过度设计,审计员会看到大量「权限绕行」的补丁。反之,军工系统用了DAC,审计报告能写出一部短篇小说。选对了模型,后面至少省一半审计精力。

最后总结一句——别再问我「哪个模型最好」。没有最好,只有「你的场景最适合」。你想想看,一个财务系统和一台个人笔记,安全需求能一样吗?