第4章 强制访问控制(MAC)
讲完了自主访问控制,咱们来聊聊一个更“硬核”的东西——强制访问控制。说实话,我刚接触这概念时第一反应是:什么算强制?难道 DAC 就不是强制的吗?后来在涉密项目里踩了坑才彻底明白。
强制访问控制(Mandatory Access Control,简称 MAC)的核心是:权限不由资源的拥有者说了算,而是由系统根据全局安全策略统一分配。说白了,你登录了系统,能访问什么、不能访问什么,不是文件主人能改的,得看系统给你贴的“安全标签”。
MAC 的本质:系统主客体都带安全标签,访问规则事先定死,用户不可绕过、不可修改。
4.1 核心概念:安全标签与多级安全
MAC 里最重要的两个概念就是主体(比如用户、进程)和客体(文件、数据库记录)的安全级别。每个主体有一个安全许可(Clearance),每个客体有一个安全分类(Classification)。常见的分级:公开、内部、机密、绝密。
我在一个政府项目里就见过这玩意儿——系统内核直接接管文件系统,用户明明是最低权限,却因为误操作把机密文件拖到了公开目录,直接被审计系统告警。嗯,如果是传统 DAC,那个文件就被公开了;但用了 MAC,系统直接拒绝移动,因为标签不匹配。
4.2 经典的 Bell‑LaPadula 模型
讲到 MAC 就不能不提 Bell‑LaPadula 模型(BLP)。这是美国军方搞出来的,核心就两条规则:
- 简单安全属性:主体不能读比他级别高的客体(不准向上读)。
- *属性(星号属性):主体不能写比他级别低的客体(不准向下写)。
这两条合在一起,就保证了“信息不能从高安全级流向低安全级”。你想想看,一个机密用户不能把机密文件复制到公开共享盘,否则就泄密了。我记得项目里配置 SELinux 策略时,为了调试一个服务,我写了条规则允许进程向下写,结果被安全团队打回来重审——这种疏忽在涉密环境里是红线。
避坑指南:我曾经在生产环境里误将 Apache 进程的 BLP 标签设得太高,导致日志写不到 /var/log。排查了三个小时才发现是 MAC 策略拦截了向下写。记住:WEB 服务通常需要“只读上级、只写下级”的折衷策略,别一刀切。
4.3 Biba 模型:完整性优先
BLP 主要保机密性,那完整性呢?Biba 模型补了这个缺。它的规则正好反过来:
- 主体不能读比自己级别低的客体(不准向下读),防止脏数据进来。
- 主体不能写比自己级别高的客体(不准向上写),防止污染高完整性数据。
说白了,Biba 是“数据完整版”。举个例子:一个正常流程是低权限用户只能查看低完整性日志,高权限管理员才能修改高完整性的配置文件。如果混了,就可能被注入恶意配置。我实际用 Biba 的场景不多,但在物联网固件签名验证里,基本思路就是 Biba——签名验证模块必须用最高完整性等级,否则签名结果不可信。
提示:BLP 和 Biba 可以同时使用吗?可以,但需要仔细设计标签空间,否则会冲突。很多安全操作系统(如 SELinux)允许同时配置多种模型,但实际项目中我建议先选一种为主,另一种为辅,否则策略爆炸很难维护。
4.4 应用场景:谁在用 MAC?
| 场景 | 典型 MAC 实现 | 为什么不用 DAC? |
|---|---|---|
| 军事/政府信息系统 | MLS(多级安全)、SELinux | 人为错误或恶意泄露无法被 DAC 阻断 |
| 金融数据仓库 | 标签强制分区 | 防止内部人员跨级查看交易记录 |
| 容器/云平台 | AppArmor、Seccomp | 最小权限原则,即使 root 也不能越权 |
| IoT 设备固件 | Biba 完整性模型 | 防止运行篡改后的固件 |
你看,MAC 在需要严格隔离、防止信息泄漏的场景里是标配。DAC 再强也架不住用户自己给自己授权,而 MAC 从根上断了这条路。
4.5 MAC 与 DAC、RBAC 的对比
我习惯用一个简单对比来记住它们:
| 模型 | 谁控制权限? | 用户能改吗? | 典型用例 |
|---|---|---|---|
| DAC | 资源拥有者 | 能改 | 普通 Linux 文件系统 |
| MAC | 系统安全策略 | 不能改 | 涉密系统、SELinux |
| RBAC | 角色管理员 | 通过角色间接改 | 企业 ERP 系统 |
要注意:实际系统常常组合使用。比如 Linux 既有 DAC 的权限位,也支持 SELinux(MAC),再叠加 RBAC 的用户组。但 MAC 作为最后一道防线,一旦策略错了,连 root 都受影响。我就曾经因为 SELinux 策略写错,把 systemd 服务干趴了——嗯,从那以后我养成了先 enforce、再改策略的习惯。
上图展示了一次典型 MAC 访问流程:主体带着安全许可发起请求,客体带着安全标签等待裁决,系统策略引擎根据 BLP/Biba 规则比较标签,最终输出允许或拒绝。值得注意的是:这些比较完全在内核态完成,用户态程序碰不到规则本身。
经验之谈:我建议刚开始接触 MAC 时,先在一个隔离的虚拟环境里练手。用 SELinux 在 permissive 模式下运行审计日志,观察哪些访问被拦截,再逐步收紧到 enforcing。切忌一上来就 enforce,否则连 sshd 都可能启动不了。
好了,这一章我们把强制访问控制的核心概念、Bell‑LaPadula 和 Biba 模型、以及实际应用场景都撸了一遍。MAC 虽然学习曲线陡峭,但一旦掌握,它对高安全系统的保护能力是其他模型无法替代的。