在 CentOS 里排查 SELinux 故障,一般可以按下面一套“由浅入深”的流程来做。
getenforce
sestatus
Enforcing:会真正拦截Permissive:只记录不拦截Disabled:和 SELinux 无关setenforce 0
如果服务恢复正常,基本可以确定是 SELinux 问题。
⚠️ 生产环境不要长期关,排查完要恢复:
setenforce 1
ausearch(推荐)ausearch -m AVC -ts recent
常见输出示例:
type=AVC msg=audit(...): denied { read } for pid=... comm="nginx"
name="index.html" dev=sda1 scontext=system_u:system_r:httpd_t
tcontext=unconfined_u:object_r:default_t tclass=file
关键信息:
/var/log/audit/audit.logtail -f /var/log/audit/audit.log
grep AVC /var/log/audit/audit.log
如果没装 audit:
yum install -y audit
systemctl enable --now auditd
sealert(新手友好)sealert -a /var/log/audit/audit.log
会直接给出:
setroubleshoot 辅助分析安装:
yum install -y setroubleshoot-server
然后:
sealert -l *
ls -Z /var/www/html/index.html
ps -Z | grep nginx
比如网页打不开:
restorecon -Rv /var/www/html
或手动改:
semanage fcontext -a -t httpd_sys_content_t "/web(/.*)?"
restorecon -Rv /web
查看相关布尔值:
getsebool -a | grep httpd
示例:
setsebool -P httpd_can_network_connect on
常见场景:
httpd_can_network_connect(连数据库/代理)ftp_home_dirsamba_enable_home_dirsaudit2why < /var/log/audit/audit.log
audit2allow -a
生成模块:
audit2allow -a -M myfix
semodule -i myfix.pp
⚠️ 不要无脑 allow,优先改上下文或布尔值。
| 现象 | 可能原因 |
|---|---|
| Web 403 | 文件上下文不对 |
| 服务起不来 | 端口无许可 |
| 连不上数据库 | 布尔值未开 |
| 脚本不能执行 | 文件类型不对 |
查看端口许可:
semanage port -l | grep http
getenforce 确认状态setenforce 0 排除法ausearch / sealert 看 AVCls -Z / ps -Z 看上下文restorecon / setsebool 修复如果你有具体的报错或服务(如 Nginx / MySQL / FTP),可以把 AVC 日志贴出来,我可以直接帮你定位。