CentOS 启用 SELinux 失败的常见根因
-
配置项误改:将 /etc/selinux/config 中的 SELINUXTYPE=disabled(错误)当作 SELINUX=enforcing/permissive/disabled(正确)修改,导致内核无法加载策略,启动卡死并提示 “Failed to load SELinux policy. Freezing”。这是最常见且最致命的错误之一。正确做法是仅调整 SELINUX 的取值,SELINUXTYPE 一般保持 targeted 不变。
-
拼写或取值错误:把 SELINUX=disabled 误写成 disable,或写入了不被识别的值,系统同样会在策略加载阶段失败。严格使用 enforcing / permissive / disabled 三个合法取值。
-
配置文件缺失或被覆盖:/etc/sysconfig/selinux 应当是 /etc/selinux/config 的符号链接;若该链接被删除或被普通文件替代,重启时读取的可能不是预期配置,从而出现启用失败或策略未生效的情况。应确保两者一致且为正确的链接关系。
-
策略包缺失或损坏:系统缺少 selinux-policy 包、策略文件损坏,或在不兼容状态下切换模式,都会触发 “unable to load selinux policy / halting now” 等错误。此时需要修复或重装策略包后再尝试启用。
-
启动参数冲突:内核命令行手动加入了 selinux=0 或 enforcing=0,会强制以 Permissive/Disabled 启动,表现为“启用失败”。排查时应检查 /proc/cmdline 是否残留上述参数。
快速自检与修复步骤
- 临时恢复启动
- 重启,在 GRUB 菜单按 e,在 linux16/linux 行末尾追加 selinux=0 或 enforcing=0,按 Ctrl+X 启动进入系统。该操作仅本次生效,用于“先救活系统”。
- 校正配置文件
- 核对并修正:/etc/selinux/config 与 /etc/sysconfig/selinux(应为指向同一配置的符号链接)。示例:
SELINUX=enforcing(或 permissive)
SELINUXTYPE=targeted
- 若发现 /etc/sysconfig/selinux 不是链接,执行:
ln -sfn /etc/selinux/config /etc/sysconfig/selinux
- 同步检查当前运行模式:getenforce;必要时 setenforce 0/1 做临时切换验证。
- 修复或重装策略包
- 当怀疑策略包异常时:
yum remove -y selinux-policy*
yum install -y selinux-policy-targeted
然后重启验证。
- 清理内核启动参数
- 确认 /proc/cmdline 不再包含 selinux=0 / enforcing=0;如有残留,需在 GRUB 默认项里删除,避免下次启动继续被强制降级。
安全启用建议
- 先用 SELINUX=permissive 验证业务是否能正常启动(只告警不阻断),观察 /var/log/audit/audit.log 中的 AVC 拒绝日志,按需补齐策略或调整服务配置,再切换为 SELINUX=enforcing。
- 变更前备份 /etc/selinux/config 与 /boot/grub2/grub.cfg,变更后在救援/单用户环境下保留一条可用的回退方案。
- 避免在生产环境直接编辑正在运行系统的 SELinux 策略,优先通过“permissive 验证 + 日志修复”的路径平滑启用。