2. 访问控制模型演进:从DAC到ABAC
聊访问控制,我习惯先问一个问题:“系统里的资源,到底谁说了算?”
这个问题看似简单,但不同年代、不同规模的企业,答案完全不一样。我见过不少团队,一开始用Linux文件权限(DAC)管得好好的,等用户量一上来,权限乱成一锅粥,才急急忙忙换RBAC。结果换了RBAC,又发现业务规则太灵活,角色根本定义不清楚……
嗯,这其实就是访问控制模型演进的真实写照。今天咱们就把DAC、MAC、RBAC、ABAC这四种模型掰开揉碎,看看它们各自解决什么问题,又有什么坑。
2.1 DAC:自主访问控制
核心思想:资源的所有者说了算。
DAC是最早、最直观的模型。你创建一个文件,你就是它的主人。你可以决定谁能读、谁能写、谁能执行。Linux的rwx权限、Windows的NTFS权限,都是典型的DAC实现。
优点:简单、灵活、用户自主性强。
缺点:权限分散,难以集中管控。用户可能不小心把敏感文件共享给所有人。
我在项目中遇到过一个小团队,用Linux共享目录做文档协作。结果有人把包含数据库密码的配置文件设成了777,整个团队都能看。这就是DAC的典型风险——用户太自由,安全就没了底线。
2.2 MAC:强制访问控制
核心思想:系统说了算,用户不能改。
MAC正好和DAC相反。系统给每个主体(用户、进程)和客体(文件、资源)都打上一个安全标签(比如“绝密”“机密”“公开”)。访问规则由系统强制实施,用户无权修改。
| 特性 | DAC | MAC |
|---|---|---|
| 决策者 | 资源所有者 | 系统安全策略 |
| 灵活性 | 高 | 低 |
| 安全性 | 低(依赖用户判断) | 高(强制规则) |
| 典型场景 | 个人电脑、小团队 | 军事、政府、金融核心系统 |
MAC最经典的实现是SELinux和AppArmor。说实话,我在企业里很少见到把MAC用到极致的——配置太复杂了,一不小心就把正常业务给“强制”掉了。但如果你做的是等保三级或金融核心交易系统,MAC几乎是必选项。
避坑指南:我曾经帮一家银行做审计,发现他们的SELinux策略写错了,导致核心交易进程无法访问日志文件。结果系统连续运行了3个月,日志全是空的。嗯,MAC虽好,但一定要配合充分的测试和监控。
2.3 RBAC:基于角色的访问控制
核心思想:用户不直接拥有权限,而是通过角色获得权限。
RBAC是目前企业里最主流的模型。你想想看,一个公司有成百上千个员工,如果每个人单独配权限,HR得疯掉。RBAC的做法是:先定义好角色(比如“财务经理”“开发工程师”),再把权限分配给角色,最后把用户加入角色。
// RBAC核心关系(伪代码)
User --> Role --> Permission
// 示例:张三被赋予“财务经理”角色
// “财务经理”角色拥有“查看财务报表”和“审批报销单”权限
// 张三自动获得这两个权限
RBAC的好处很明显:权限管理从“点对点”变成了“角色对权限”,维护成本大幅降低。我在做电商平台时,就用RBAC管理了200多个内部系统和工具,效果不错。
但RBAC也有硬伤。举个例子:如果业务规则是“只有当天值班的运维才能重启服务器”,RBAC就傻眼了——因为“值班”是一个动态属性,不是固定的角色。你总不能每天给不同的人创建新角色吧?
我的经验:RBAC适合权限相对稳定、角色定义清晰的场景。如果你们的业务规则经常变,或者权限判断需要依赖上下文(时间、地点、设备),那RBAC就不够用了。这时候,该上ABAC了。
2.4 ABAC:基于属性的访问控制
核心思想:用属性来描述一切,用策略来定义规则。
ABAC把权限决策的维度扩展到了极致。它不再依赖固定的角色,而是根据主体属性(用户部门、职级)、客体属性(文件密级、创建时间)、环境属性(访问时间、IP地址)来动态计算是否允许访问。
// ABAC策略示例(XACML风格)
策略:允许访问财务报表
条件:
主体.部门 == "财务部" AND
主体.职级 IN ["经理", "总监"] AND
客体.密级 == "机密" AND
环境.时间 BETWEEN "09:00" AND "18:00" AND
环境.IP范围 IN "内网段"
你看,这个策略把“谁、什么、什么时候、从哪里”都考虑进去了。ABAC的灵活性是前三种模型没法比的。但代价也很明显:策略引擎复杂、性能开销大、维护成本高。
我曾经帮一家互联网公司设计权限体系,他们一开始想全上ABAC。结果策略写了几百条,互相冲突,调试了两个月还没上线。最后我建议他们:核心业务用RBAC兜底,边缘的、动态的场景用ABAC补充。这才把项目救回来。
2.5 四种模型对比与选型建议
| 维度 | DAC | MAC | RBAC | ABAC |
|---|---|---|---|---|
| 控制粒度 | 粗 | 中 | 中 | 细 |
| 灵活性 | 高 | 低 | 中 | 高 |
| 管理复杂度 | 低 | 高 | 中 | 高 |
| 动态决策 | 不支持 | 不支持 | 有限支持 | 原生支持 |
| 适用规模 | 个人/小团队 | 高安全领域 | 中大型企业 | 超大规模/复杂业务 |
选型的时候,我个人的建议是:
- 别一上来就ABAC。先问自己:RBAC能不能搞定?如果能,就别折腾。
- DAC只适合非核心资源。比如个人文档、临时共享。核心数据千万别用DAC。
- MAC是“最后一道防线”。如果你做的是合规要求极高的系统,MAC可以作为兜底策略,但别指望它解决所有问题。
- ABAC是未来趋势。但需要配套的策略管理工具和性能优化方案。我见过不少团队,ABAC策略引擎成了性能瓶颈。
2.6 一张图看懂演进逻辑
下面这张图,是我自己总结的访问控制模型演进路线。你可以看到,从DAC到ABAC,核心变化是决策依据越来越丰富,控制粒度越来越细。
说白了,没有完美的模型,只有合适的模型。我见过一些企业,DAC、RBAC、ABAC混着用——核心交易用RBAC,敏感数据用MAC兜底,临时权限用ABAC动态发放。这种混合架构,反而是最务实的做法。
一个小建议:不管选哪种模型,先把权限审计做好。我见过太多系统,权限模型设计得天花乱坠,结果没人审计,半年后权限全乱套了。审计日志,才是访问控制体系的最后一道保险。