SELinux 是 Security-Enhanced Linux(安全增强型 Linux) 的缩写,是 Linux 内核里的一套强制访问控制(MAC)安全机制 。它的核心作用是:
👉 即使某个程序被攻破,也尽量限制它能干什么,防止"横向扩散"造成更大破坏。
下面用好理解的方式给你讲清楚。
一、为什么需要 SELinux?
传统 Linux 权限的问题(DAC)
Linux 原本只有自主访问控制(DAC):
- 文件权限:
rwx - 用户 / 组 / root
问题在于:
- root 权限太大
- 程序一旦被提权,就几乎"为所欲为"
例如:
- Web 服务被入侵
- 攻击者拿到
apache用户 - 再提权到 root → 整个系统沦陷
二、SELinux 在做什么?
SELinux 在传统权限之上,再加一层强制规则:
谁(进程)
→ 能对什么(文件/端口/资源)
→ 做什么操作
即使你是 root,只要策略不允许,也不能做。
三、一个直观的例子 🌰
没有 SELinux
text
httpd 进程 → 可以读 /etc/shadow(如果权限给了)
有 SELinux
text
httpd_t 类型 → 只能访问 httpd_sys_content_t
即使:
- 文件权限是 777
- httpd 是 root 启动的
👉 SELinux 不允许,就访问不了
四、SELinux 的核心概念(重点)
1️⃣ 安全上下文(Security Context)
每个对象都有标签:
bash
ls -Z
示例:
text
system_u:object_r:httpd_sys_content_t:s0
组成:
用户 : 角色 : 类型 : 级别
最重要的是:类型(Type)
2️⃣ 类型强制(Type Enforcement,TE)
这是 SELinux 的核心机制:
-
进程有类型(如
httpd_t) -
文件有类型(如
httpd_sys_content_t) -
策略决定:
httpd_t 能否访问 httpd_sys_content_t
3️⃣ 三种工作模式
查看方式:
bash
getenforce
| 模式 | 说明 |
|---|---|
| Enforcing | 强制执行策略(真正生效) |
| Permissive | 只记录违规,不阻止 |
| Disabled | 完全关闭 |
五、SELinux 常见"坑"(你可能遇到的)
1️⃣ 服务起不来,但权限都对
bash
Permission denied
但:
- 文件权限没问题
- 用户也对
👉 90% 是 SELinux 拦了
2️⃣ PXE / 安装 / 启动进紧急模式
- 根文件系统或关键目录标签不对
- SELinux 无法访问 → 启动失败 → 紧急模式
3️⃣ 拷贝文件导致服务异常
bash
cp xxx /var/www/html/
标签变了 ❌
正确做法:
bash
cp --preserve=context
# 或
restorecon -Rv /var/www/html
六、如何排查 SELinux 问题(实用)
1️⃣ 看日志
bash
ausearch -m avc
或:
bash
/var/log/audit/audit.log
2️⃣ 临时验证是不是 SELinux 问题
bash
setenforce 0
如果问题立刻消失 👉 就是 SELinux
七、什么时候该关 SELinux?
❌ 不推荐长期关闭
✔ 推荐做法:
- 学会 Permissive 排错
- 正确设置上下文或策略
永久关闭(不推荐,仅测试)
bash
vim /etc/selinux/config
SELINUX=disabled
八、一句话总结
SELinux 是 Linux 的"安全警察"
权限对了还不够,策略说了才算
如果你愿意,我可以:
- 结合 PXE / RedHat 9.x 具体说明 SELinux 导致紧急模式的真实案例
- 教你 最少命令快速判断是不是 SELinux 的锅
你可以直接告诉我你现在卡在什么错误提示。