SELinux 概述:起源、发展历程、基本设计理念与应用场景
大家好,我是负责这门课的工程师。今天我们来聊聊 SELinux 的根。很多做回归测试的兄弟一听到 SELinux 就头疼——策略文件看不懂,权限拒绝摸不着头脑。但说实话,理解了它的来历和设计思路,很多坑你根本不会踩。
1.1 起源:为什么需要 SELinux?
传统 Linux 用的是「自主访问控制」(DAC)。说白了,文件所有者想怎么设权限就怎么设。root 用户更是无所不能。这在早期还行,但放到互联网环境里,一个缓冲区溢出漏洞就能让攻击者拿到 root,系统直接裸奔。
核心痛点:DAC 无法防止「特权提升」—— root 一失手,全局沦陷。
1990 年代末,美国国家安全局(NSA)开始研究一个叫 Flask 的架构。他们的思路很简单:就算你是 root,也得按我写的规则来。这套逻辑最终演化成了 SELinux,2000 年以 GPL 协议开源,2003 年正式合入 Linux 主线内核。
我记得第一次看到 SELinux 的时,被它的「安全上下文」概念绕晕了。后来项目里被客户的渗透测试怼了一回,才老老实实把原理啃完。
1.2 发展历程:从 NSA 实验品到标配
| 时间 | 里程碑 | 我的感受 |
|---|---|---|
| 2000 | NSA 发布 SELinux 初始版本 | 当时 Linux 内核还 2.2 呢,这玩意儿太超前了 |
| 2003 | 并入 Linux 2.6 主线内核 | Red Hat 率先推荐,我那时还在用 iptables 瞎忙活 |
| 2008 | Fedora 默认启用 SELinux | 好多同事直接关了,说太麻烦——现在看是坑了自己 |
| 2015 | Android 全面引入 SELinux | 移动端安全从此翻篇,连 App 隔离都用它 |
| 现在 | 云原生、容器场景广泛集成 | Docker 的 --security-opt 底层就是 SELinux |
为什么安卓要搞 SELinux?因为传统的 Linux DAC 连「防止 App 读取联系人」这件事都做不好。SELinux 用「强制访问控制」把每个进程框在笼子里。
1.3 基本设计理念:三条铁律
我觉得要理解 SELinux,记住三条就够了,其他全是细节。
- 强制访问控制(MAC):系统管理员写策略,所有用户包括 root 都得遵守。策略决定一切,不取决于文件所有者。
- 最小权限:进程只给完成本职任务所需的最小权限。你想想看,一个 web 服务器凭什么能写 /etc/passwd?
- 类型强制(TE):这是 SELinux 的核心机制。主体(进程)和客体(文件、socket)都有「类型」,策略通过类型间的规则控制交互。
举个例子:
# 允许 httpd 进程读取 /var/www/html 下的文件
allow httpd_t httpd_sys_content_t:file { read getattr open };
这条规则里:httpd_t 是进程类型,httpd_sys_content_t 是文件类型,file 是客体类别,后面花括号里是许可的权限。嗯,这就是 SELinux 的「法律条文」。
我个人习惯:拿到一个新系统,先用 sestatus 看当前模式,再用 ps -eZ 看进程上下文。先摸清楚现状再动手改策略。
1.4 应用场景:你现在就在用
别看 SELinux 配置复杂,实际部署比你想像的广——
- 服务器安全基座:RHEL/CentOS 默认开启,防止 Web 服务、数据库被提权。
- 容器和微服务:OpenShift 直接依赖 SELinux 做多租户隔离;Docker 的
--security-opt seccomp也常配合 SELinux 使用。 - Android 设备:从 5.0 起强制启用,每个应用有专属域。你手机上的 App 想越权?没门。
- 军用、政府、金融:需要多级安全级别的场景,SELinux 是开箱即用的首选。
我曾经遇到过一件真事:某云计算平台内部审计发现,同一个节点上两个租户的进程可以通过共享内存互相访问。最后靠 SELinux 加上 MCS(多类别安全)标签才隔离干净。
1.5 避坑指南:新手最常犯的错
我曾经因为把 SELinux 直接设成 Permissive 后忘了改回来,导致生产环境形同虚设。两个月后安全扫描才发现大量异常进程。你的正确姿势应该是:
- 调试阶段用
setenforce 0临时放行,但记得用audit2allow把日志转成策略。 - 别在 /etc/selinux/config 里直接改
SELINUX=disabled——重启后所有上下文标签全乱了,恢复起来想哭。 - 看AVC拒绝日志:
ausearch -m avc --start recent。这条命令我每天都在用。
警告:生产环境千万不要用 chcon -t 乱改系统关键文件的上下文,优先用 semanage fcontext 持久化修改。磁盘里几十万文件,重启后标签还能自动恢复。
1.6 本章知识结构
下面对本章的核心概念做个可视化梳理:
图中展示了 SELinux 的典型工作路径:用户空间的进程通过系统调用发起请求,内核的安全服务器解析策略,结合 AVC 缓存与安全上下文快速裁决。实际项目中,大部分性能损耗都在 AVC 缓存命中率上——我建议你用 avcstat 监控缓存效果。
好了,SELinux 的「前世今生」就聊到这儿。下节我们会深入类型强制(TE)的语法,那是写回归用例绕不开的硬骨头。