CentOS 7.9 上为了临时跑通业务执行了 setenforce 0,当天一切正常,第二天重启后 nginx 又报 Permission denied,getenforce 显示 Enforcing,配置文件里还是 SELINUX=enforcing。
一开始怀疑是「grub 里的 selinux=0 和配置文件冲突,以后者之外的优先级生效」,查了一圈,方向不对。
这类报错背后常见的原因有几处,逐个排除就行。setenforce 只改运行时状态,不写配置文件,重启就丢。也可能是改的是 /etc/selinux/config 但内核启动参数里带了 enforcing=1。
不容易想到的是,镜像或云初始化脚本在开机时把配置改回去了。
动手时先确认运行时和配置文件的差异
getenforce && grep '^SELINUX=' /etc/selinux/config
随后看内核命令行有没有覆盖
tr ' ' '\n' < /proc/cmdline | grep -i selinux
再往下按需持久化模式
sed -i 's/^SELINUX=.*/SELINUX=permissive/' /etc/selinux/config
等前面都确认过,再用布尔值放行服务需要的权限
setsebool -P httpd_can_network_connect 1 && semanage boolean -l | grep httpd_can_network
改完先别撤,确认这几项。重启后 getenforce 返回 Permissive,nginx 不再报 Permission denied,audit 日志里没有新的 avc denied。
容易忽略的是,关闭 SELinux 只是绕开问题,生产环境更该用 setsebool 和自定义策略放行;改成 permissive 前先把 avc 日志留存,后面写策略要用。线上能稳定复现的问题都不算难,难的是只在大流量下才出现的那种。
