SELinux 挡住了什么
传统权限模型是自主访问控制:只看属主与权限位,进程一旦拿到 root 就等于畅通无阻。SELinux 在进程和资源上打安全上下文标签,由策略决定“哪个进程能访问哪类资源”,构成强制访问控制(MAC)。它的价值在失陷之后:Web 进程即使被攻破,也读不到 /etc/shadow、改不了系统二进制、连不到不该连的端口。基线要求运行时与配置文件两处都处于 Enforcing。
基本信息
| 加固项 | 强制访问控制开启 |
|---|---|
| 适用平台 | Linux(RHEL/CentOS/Fedora、AlmaLinux、Rocky 等 SELinux 系) |
| 权限要求 | root |
| 达标判据 | getenforce 输出 Enforcing,且 /etc/selinux/config 中 SELINUX=enforcing |
| 注意 | setenforce 只改运行时,重启后回到配置文件的值 |
典型使用场景
- 等保与 CIS 基线核查“强制访问控制”条款
- 公网 Web 服务器失陷后的横向移动阻隔
- 排查“服务明明配置正确却报权限拒绝”的问题
- 从 Permissive 切到 Enforcing 前的策略收敛评估
- 容器宿主机上限制容器逃逸后的越权范围
核查与切换
核查与切换
getenforce # 当前运行模式
sestatus | head -8 # 模式、配置文件值、策略版本与挂载点概览
setenforce 1 # 临时切 Enforcing,仅本次运行有效
sed -i 's/^SELINUX=.*/SELINUX=enforcing/' /etc/selinux/config
grep '^SELINUX=' /etc/selinux/config # 持久化确认三种模式对照
| 模式 | 行为 | 适用阶段 |
|---|---|---|
| Enforcing | 拒绝违规访问并记录 AVC 日志 | 生产达标状态 |
| Permissive | 只记录不拒绝,等于观察模式 | 切换前评估与排障期,不可长期停留 |
| Disabled | 完全关闭,标签机制不生效 | 不达标,也失去事后审计线索 |
| 配置文件 vs 运行时 | 配置文件决定重启后的值 | 两者不一致会导致“重启后变回去了”的困惑 |
从 Permissive 切 Enforcing 前先审 AVC 记录(/var/log/audit/audit.log 或 journalctl -t setroubleshoot),直接切换可能让业务立刻中断。正确顺序是先在 Enforcing 下小流量验证、处理策略拒绝(调整文件上下文或用 audit2allow 生成策略),确认干净后再全量切换。
常见的“关掉 SELinux 就好了”其实多数是上下文问题:手工 cp 文件、挂载到非标准目录、或修改了端口配置,都会让标签与策略不匹配。先用 ls -Z、restorecon -Rv 修复上下文,必要时再补策略;把 disabled 当万能手段会永久丢掉一层防护。