强制访问控制(MAC)原理与多级安全

聊到强制访问控制,很多人第一反应就是“政府、军队才用的东西”。其实没那么玄乎。说白了,MAC 的核心就一句话:权限不由你说了算,系统说了算。

我在做金融合规项目时遇到过这么个场景:某银行的核心交易系统,运维人员居然能自己修改数据库访问权限。审计一查,直接亮红灯。后来我们把 DAC 换成 MAC,所有标签由安全管理员统一配置,运维只能操作自己敏感层级以内的数据。嗯,这才符合等保三级的要求。

你想想看,在 DAC 模式下,文件所有者想给谁读就给谁读——这就像你家大门钥匙自己复制。但 MAC 不一样,每个人进门必须刷身份证,系统自动判断你够不够级别。这个判断依据,就是今天要讲的核心:多级安全(MLS)。

1. MAC 与 DAC 的本质区别

我用一个对比表格帮你快速理清思路:

特性 DAC(自主访问控制) MAC(强制访问控制)
权限决策者 资源所有者(用户) 系统(安全策略)
标签机制 无,直接授权 主体/客体绑定安全标签
灵活性 高,用户可传递权限 低,策略统一不可绕过
安全强度 中,易被钓鱼利用 高,对抗内部威胁
典型场景 个人文件共享、OA系统 军事系统、金融核心、政务平台

从表里你能看出:MAC 的“强制”二字,体现在管理员制定的规则比用户权限高。用户就算是大领导,也没法把自己文件的密级降下来分享给低级别的人——系统会直接拦截。

2. 多级安全模型:Bell-LaPadula(BLP)

谈到 MAC 就绕不开 Bell-LaPadula 模型。这是 70 年代美国军方搞出来的东西,专门用来防止信息从高密级向低密级泄露。核心规则就两条:向上读、向下写。

别着急,我用一张图把它讲清楚:

Bell-LaPadula 模型:上读下写规则 绝密 机密 秘密 公开 主体 S 密级:机密 客体 O 密级:绝密 读(允许) 写(禁止) ■ 主体密级≦客体密级:只能读,不能写 ■ 写操作要求主体密级≧客体密级(反向比较)

看到这个“向上读、向下写”了吗?我刚开始学的时候总搞反。记住:读的方向是从低到高,写的方向是从高到低。为什么这样设计?因为读高密级文件属于“知情”,只要你的级别够高就行;但写入操作如果允许低密级主体写高密级客体,就可能把病毒塞进绝密文档——系统必须防住这种事。

核心公式:
允许读:主体安全级 ≥ 客体安全级 且 主体范畴 ⊆ 客体范畴
允许写:主体安全级 ≤ 客体安全级 且 主体范畴 ⊇ 客体范畴

其实不光有密级(Classification),还有范畴(Category)。密级是高低,范畴是部门。比如“绝密-工程部”与“秘密-财务部”,即使你的密级高,如果范畴不匹配,依然无法访问。我遇到过客户只配了密级忘了配范畴,结果高密级人员连自己项目文件都打不开——这就是“只知其一,不知其二”。

3. Biba 完整性模型

BLP 管的是保密性,完整性怎么办?这就得请出 Biba 模型了。Biba 与 BLP 正好相反:向下读、向上写。

特性 Bell-LaPadula(保密性) Biba(完整性)
核心原则 上读下写 下读上写
防什么 信息泄露 信息篡改
写方向 只能写同/低密级 只能写同/高密级
读方向 只能读同/高密级 只能读同/低密级
适用场景 机密文档流转 生产系统数据完整性

这里有个关键点:实际项目中常常把 MAC 策略拆成“机密性 MAC”和“完整性 MAC”两条线。比如银行核心交易系统,既要防泄密(BLP),又要防止数据被低完整性程序污染(Biba)。两条线可以在不同层次叠加,但别混在一起配——我曾经在同一个安全标签上同时启用 BLP 和 Biba,结果配成了“既不能读也不能写”的死锁。那叫一个惨。

4. 实际部署中的坑

避坑指南(我踩过的)
1. 标签变更后未刷新缓存:SELinux 策略改完必须 restorecon 或触发重新标记,否则系统还在用旧标签,你以为防住了其实没防住。
2. 范畴设计过于复杂:某甲方把范畴细到了科室+项目+年份,结果一个有十几年运维经验的老工程师要填 30 多个范畴,最后走审批流程走了两周。建议范畴不超过 10 个。
3. 忘记给系统进程打标签:系统服务(如 sshd)如果没有 MLS 标签,会落到最低密级,结果连高密级文件日志都打不开,业务直接瘫痪。

记得有一次,我帮一个政务云做 MAC 加固。负责的领导问:“我们所有服务器用了 SELinux 是不是就安全了?”我告诉他:SELinux 只是实现 MAC 的一种机制,真正起作用的是你配的安全策略——标签、规则、默认 deny 原则。否则默认 permissive 模式开了,等于没开。

5. 多级安全归纳总结

收拢一下今天的内容:

  • MAC 的核心是系统决策,不依赖用户自主操作。
  • 多级安全(MLS)用标签+规则实现信息流控制。
  • Bell-LaPadula 管保密,上读下写;Biba 管完整,下读上写。
  • 实际落地必须同时考虑密级、范畴、进程标签和刷新机制。
个人习惯
我每次设计 MAC 策略之前,一定会先把业务的数据流图画出来——哪些数据要保密,哪些数据要完整,哪些是主体、哪些是客体。然后才去配标签,配完后必须做一次“端点穿透测试”:让不同级别的主体尝试读写越界,看系统是否真正拦截。这个测试我建议你也做,别怕麻烦。

好了,课后你可以把自己公司的某个系统拿出来,试着画一份 MLS 标签矩阵。看看如果按照 BLP 模型,哪些访问应该被禁止,哪些应该被允许。你会发现,很多你以前觉得“理所当然”的权限,其实都是 MAC 漏洞。