4. 访问控制模型

说到数据保护,访问控制是绕不开的核心。说白了,就是搞清楚一个问题:谁能碰什么数据,在什么条件下可以碰。

我在项目里见过太多因为访问控制没做好而翻车的情况。有人把生产库的读写权限直接给了全部门,有人给实习生配了管理员账号。嗯,这些事后都成了安全审计的重灾区。

今天咱们就把四种主流的访问控制模型掰开揉碎了聊。DAC、MAC、RBAC、ABAC,一个一个来。

4.1 DAC - 自主访问控制

DAC 是最早出现的模型,也是 Linux/Unix 文件权限的基础。

核心逻辑:资源的所有者说了算。你创建了一个文件,你就可以决定谁能读、谁能写、谁能执行。这就是“自主”的含义——权限由用户自由支配。

典型场景:Linux 文件系统权限(rwx)、Windows 共享文件夹权限。

DAC 的优点就是灵活。但正因为太灵活,也容易出问题。我记得有一次做数据泄露调查,发现一个核心数据库的备份文件被某个工程师设置了 777 权限(任何人都可以读写执行)。问起来,人家说“方便同事排查问题”。结果就是任何人都能下载这份备份。

我曾经踩过的坑:DAC 模型下,权限的传递很难控制。A 把文件读权限给了 B,B 转手就给了 C。你作为所有者根本不知情。所以 DAC 适合个人或小团队,到了企业级规模,就得慎重了。

4.2 MAC - 强制访问控制

MAC 和 DAC 正好相反。资源的所有者说了不算,系统级的安全策略说了算。

核心逻辑:系统给每个主体(用户/进程)和每个客体(文件/数据)打一个安全标签。只有标签匹配,才能访问。你没办法自己修改安全级别,你也没办法把文件权限随意分配给其他人。

MAC 的代表是 SELinux 和 AppArmor。我在做政府项目的时候接触过 SELinux,那个配置的复杂度,说句实话,第一次接触真的头皮发麻。

对比维度 DAC MAC
权限决策者 资源所有者 系统安全策略
灵活性 高 低
安全性 低(容易泄露) 高(难以绕过)
典型场景 个人电脑、小团队 军方、政府、金融核心系统
管理成本 低 高

我个人习惯:把 MAC 当作安全兜底策略。DAC 给用户自由,允许他们自己分配权限;但 MAC 在底层设置一条红线——不管你怎么设,核心数据你不能越级访问。两者结合使用,既灵活又安全。

4.3 RBAC - 基于角色的访问控制

RBAC 是目前企业级应用最广泛的模型。为什么?因为它解决了权限管理的规模化问题。你想想看,如果公司有 5000 人,你给每个人单独分配权限,那不得累死?

核心逻辑:不直接给用户分配权限,而是给角色分配权限,再把角色分配给用户。

举个例子:

  • 角色“财务审核员” → 拥有“查看财务报表”和“提交审核报告”的权限
  • 用户张三 → 被分配到“财务审核员”角色
  • 张三自然就拥有了上面的权限

这样做的好处很明显:当员工离职或转岗时,只需要调整他/她的角色就行,不用去翻几百条权限记录。我曾经在一个项目中优化权限体系,从 DAC 迁移到了 RBAC,光这一项就把年度安全审计的工时从两周压缩到了两天。

来个简单的 RBAC 权限校验伪代码:

// RBAC 权限校验示例
class AccessController {
    // 用户 → 角色 映射
    private userRoles = {
        'alice': ['admin', 'editor'],
        'bob': ['viewer']
    }
    
    // 角色 → 权限 映射
    private rolePermissions = {
        'admin': ['read', 'write', 'delete'],
        'editor': ['read', 'write'],
        'viewer': ['read']
    }
    
    function checkAccess(user, action) {
        roles = this.userRoles[user]
        for (role in roles) {
            if (this.rolePermissions[role].includes(action)) {
                return true
            }
        }
        return false
    }
}

避坑指南:角色别设计得太细。我曾经见过一个项目设计了 200 多个角色,结果比直接给用户分配权限还难管理。角色颗粒度控制好,一般 10-20 个核心角色就覆盖了 90% 的场景。

4.4 ABAC - 基于属性的访问控制

ABAC 是这四种模型里最灵活、粒度最细的。它的核心思想是:权限决策不只看“你是谁”,还要看“你在哪”、“用什么设备”、“当前时间是多少”、“数据敏感级别是什么”等等。

核心逻辑:把权限决策要素抽象成属性进行匹配。

  • 主体属性:用户 ID、部门、职级、安全等级
  • 客体属性:文件类型、敏感级别、所属项目
  • 环境属性:访问时间、IP 地址、设备类型
  • 操作属性:读取、写入、删除、导出

比如一条 ABAC 策略可以写成:

// ABAC 策略示例(伪代码)
策略:仅允许高级工程师在办公网络下,
      访问敏感级别为“机密”且属于“项目X”的文档,
      但禁止下载或打印。

条件:
  user.department == 'engineering'
  user.level >= 'senior'
  network.ip_range == 'office_vpn'
  doc.sensitivity == 'confidential'
  doc.project == 'project_x'
  action not in ['download', 'print']

我在做 SaaS 平台的数据隔离方案时就用到了 ABAC。不同租户之间不仅要隔离,还要允许交叉授权(比如某个客户授权给供应商的员工查看部分数据)。这种情况下 RBAC 很难满足,但 ABAC 可以通过“租户 ID + 用户角色 + 数据范围”的组合策略轻松搞定。

4.5 四种模型对比总结

模型 核心理念 灵活性 管理复杂度 适用场景
DAC 所有者决定权限 高 低 个人电脑、小团队文件共享
MAC 系统级标签强制控制 低 高 高安全等级环境(军事、金融核心)
RBAC 通过角色分配权限 中 中 企业级应用(ERP、CRM)
ABAC 基于属性集动态决策 极高 极高 复杂权限场景(多租户、微服务)

下面这张图比较直观地展示了四种模型的关系和演进逻辑:

访问控制模型演进与核心差异 DAC 自主访问控制 MAC 强制访问控制 RBAC 基于角色控制 ABAC 基于属性控制 左半部分:所有者控制 & 标签控制 DAC:资源所有者自由分配权限(灵活性高) MAC:系统级安全标签强制约束(安全性高) 右半部分:角色控制 & 属性控制 RBAC:通过角色批量管理权限(规模化) ABAC:任意属性组合实现动态决策(最精细) 实战选择策略 小团队/个人 → DAC 高安全等级 → MAC + RBAC 企业级应用 → RBAC 复杂场景 → ABAC 没有银弹,根据组织规模和安全要求选择合适的模型,或者组合使用

4.6 实战选择策略

模型理论讲完了,咱们聊聊怎么选。说实话,没有唯一的正确答案,但我有几点经验可以分享:

  • 小团队(< 20人):DAC + 简单的共享文件夹权限就够了。别搞复杂,管理成本比安全收益还高。
  • 中型企业(20-500人):RBAC 是最好的起点。把角色定义清楚,覆盖 80% 的场景,剩下的用例外策略处理。
  • 大型企业/高安全场景:RBAC + MAC 组合。核心系统用 MAC 兜底,应用层用 RBAC 管理日常权限。
  • 复杂多租户/微服务场景:直接上 ABAC。我最近在做的一个项目就是把 RBAC 升级到了 ABAC,因为客户的需求实在太复杂——同一个用户在不同项目里的权限都不同,甚至同一个文档在不同的时间段权限也不同。这种情况 RBAC 的角色根本定义不过来。

我个人习惯:先做权限矩阵分析。把所有的“主体-客体-操作”组合列出来,看看能不能用角色归类。如果归类后仍有大量“例外”,那就说明 RBAC 不够用,往 ABAC 方向走。这个分析过程本身就能帮你理清业务需求。