第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)核心概念图 主 体 用户 / 进程 安全许可(Clearance) 客 体 文件 / 数据库 安全分类(Classification) 系统策略引擎 BLP / Biba / MLS 允许 / 拒绝 标签比较: 主体级别 ≥ 客体级别? 规则不可由用户修改 全局生效

上图展示了一次典型 MAC 访问流程:主体带着安全许可发起请求,客体带着安全标签等待裁决,系统策略引擎根据 BLP/Biba 规则比较标签,最终输出允许或拒绝。值得注意的是:这些比较完全在内核态完成,用户态程序碰不到规则本身。

经验之谈:我建议刚开始接触 MAC 时,先在一个隔离的虚拟环境里练手。用 SELinux 在 permissive 模式下运行审计日志,观察哪些访问被拦截,再逐步收紧到 enforcing。切忌一上来就 enforce,否则连 sshd 都可能启动不了。

好了,这一章我们把强制访问控制的核心概念、Bell‑LaPadula 和 Biba 模型、以及实际应用场景都撸了一遍。MAC 虽然学习曲线陡峭,但一旦掌握,它对高安全系统的保护能力是其他模型无法替代的。