1. 权限模型基础:从 DAC 到 MAC 再到 RBAC

权限模型这东西,说白了就是「谁能在什么条件下对什么东西做什么事」。我早年刚接触安全设计时,觉得权限不就是个开关嘛——能访问或不能访问。后来被现实狠狠教育了几次,才明白这里面的门道有多深。

今天咱们就把权限模型的演进史捋一遍。从最早的 DAC,到强控的 MAC,再到如今最主流的 RBAC。每个模型都有它的诞生背景和适用场景,理解了这些,你才能在设计系统时选对路子。

1.1 DAC:自主访问控制

DAC 全称 Discretionary Access Control,中文叫「自主访问控制」。它是权限模型里最古老、也最直观的一种。

核心思想:资源的所有者说了算。

你创建了一个文件,你就是它的主人。你可以决定谁能读、谁能写、谁能执行。Linux 文件系统就是典型的 DAC——chmod 755、chown 这些命令,本质上都是在做 DAC 的权限分配。

DAC 的关键特征:

  • 权限由资源所有者自主管理
  • 权限可以传递(比如 A 授权给 B,B 再授权给 C)
  • 实现简单,性能开销小

我在项目中遇到过一个问题:某内部系统用了 DAC 模型,结果一个部门主管把自己的文件夹权限「共享」给了全公司。你想想看,这本来只是部门内部的项目文档,一夜之间所有人都能看了。这就是 DAC 最大的隐患——权限传播不可控。

避坑指南:我曾经接手过一个遗留系统,里面 DAC 权限链长达 7 层。A 授权给 B,B 授权给 C……最后根本查不清谁到底有什么权限。如果你要用 DAC,务必加上「权限传播深度限制」和「授权审计日志」。

1.2 MAC:强制访问控制

MAC 全称 Mandatory Access Control,中文叫「强制访问控制」。它和 DAC 完全是两个极端。

核心思想:系统说了算,用户没得选。

在 MAC 模型里,每个主体(用户、进程)和每个客体(文件、资源)都被打上了安全标签。系统根据预设的规则来判断是否允许访问。用户?用户没有修改权限的资格。

最经典的 MAC 实现是 SELinux 和 AppArmor。嗯,这里要注意——很多 Linux 管理员觉得 SELinux 烦人,直接关了。但如果你做的是金融系统或政务系统,MAC 几乎是强制要求。

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

为什么会这样?因为 MAC 的设计初衷就是「防内鬼」。假设一个恶意软件拿到了你的用户权限,在 DAC 下它可以为所欲为。但在 MAC 下,即使它拿到了你的身份,系统策略依然会阻止它访问机密文件。

个人经验:我建议在容器化环境中至少开启 AppArmor 或 seccomp。Docker 默认的安全配置其实很松,加上 MAC 层保护后,即使容器被攻破,攻击者也很难逃逸到宿主机。

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

RBAC 全称 Role-Based Access Control,中文叫「基于角色的访问控制」。它是我个人最常用的模型,也是目前企业级系统的标配。

核心思想:权限不直接给用户,而是给角色。用户通过扮演角色来获得权限。

你想想看,一个公司有成百上千员工,如果每个人单独配权限,那 IT 部门得累死。RBAC 的做法是:先定义好「管理员」「审计员」「普通用户」这些角色,然后把权限挂到角色上。新员工入职,直接分配一个角色就完事了。

RBAC 的三个基本规则:

  1. 角色分配:用户只有被分配了角色,才能获得权限
  2. 角色授权:角色只有被授予了权限,用户才能执行操作
  3. 权限互斥:某些角色不能同时分配给同一个人(比如出纳和会计)
# 一个简化的 RBAC 数据模型示例
# 用户表
users: { id, name, department }

# 角色表
roles: { id, name, description }

# 权限表
permissions: { id, resource, action }

# 用户-角色关联
user_roles: { user_id, role_id }

# 角色-权限关联
role_permissions: { role_id, permission_id }

我在项目中遇到过最典型的 RBAC 坑是「角色爆炸」。一开始只定义了 3 个角色,半年后变成了 47 个。为什么会这样?因为业务方不断提新需求:「这个报表 A 组能看,B 组不能看」「这个按钮只有经理能点,主管不行」……

避坑指南:我曾经在一个电商平台项目里,因为角色粒度太细,最后搞出了 200 多个角色。后来我们引入了「角色继承」和「属性条件」才把数量降下来。记住:RBAC 的角色数量建议控制在 20 个以内,超过这个数就该考虑升级到 ABAC 了。

1.4 三种模型的演进逻辑

从 DAC 到 MAC 再到 RBAC,不是简单的「新模型取代旧模型」,而是不同安全需求催生了不同的解决方案。

权限模型演进逻辑 DAC 自主访问控制 MAC 强制访问控制 RBAC 基于角色访问控制 特征 • 所有者自主授权 • 权限可传递 • 实现简单 特征 • 系统强制策略 • 安全标签机制 • 防绕过能力强 特征 • 角色抽象层 • 权限与用户解耦 • 管理成本低 适用场景 个人文件管理 小团队协作 Linux 文件系统 适用场景 军事/政务系统 金融核心交易 容器安全加固 适用场景 企业管理系统 SaaS 平台 API 网关权限

我个人习惯这样选型:

  • 个人工具或原型系统 → DAC 就够了,别过度设计
  • 合规要求高的系统(金融、医疗、政务)→ 必须上 MAC 或至少 MAC + RBAC 混合
  • 企业级业务系统 → RBAC 是首选,灵活性和安全性平衡得最好

一个小建议:别死磕单一模型。我在实际项目中经常用「RBAC + 属性约束」的混合方案。比如:角色决定「能做什么」,但加上「部门属性」「时间属性」「IP 属性」等条件做二次过滤。这样既保留了 RBAC 的易管理性,又弥补了它「粒度不够细」的短板。

1.5 本章小结

权限模型没有银弹。DAC 灵活但危险,MAC 安全但僵化,RBAC 平衡但容易角色膨胀。理解它们的核心差异和适用场景,比死记硬背概念重要得多。