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 1970s MAC 1980s RBAC 1990s ABAC 2000s+ 演进核心逻辑 • 决策依据:从“谁拥有” → “系统强制” → “角色定义” → “属性组合” • 控制粒度:从“粗放” → “精细” • 动态能力:从“静态” → “动态”

说白了,没有完美的模型,只有合适的模型。我见过一些企业,DAC、RBAC、ABAC混着用——核心交易用RBAC,敏感数据用MAC兜底,临时权限用ABAC动态发放。这种混合架构,反而是最务实的做法。

一个小建议:不管选哪种模型,先把权限审计做好。我见过太多系统,权限模型设计得天花乱坠,结果没人审计,半年后权限全乱套了。审计日志,才是访问控制体系的最后一道保险。