修复 SELinux 拒绝(SELinux denied)通常需要先诊断、再合理放行、避免直接关闭 SELinux。下面按「排查 → 解决 → 验证」的流程说明。
查看审计日志:
sudo ausearch -m AVC -ts recent
# 或
sudo grep AVC /var/log/audit/audit.log
常见提示示例:
type=AVC msg=audit(...): avc: denied { read } for pid=... comm="nginx" name="xxx" dev="sda1" scontext=... tcontext=... tclass=file
如果是 denied,就是 SELinux 拦截。
查看 SELinux 状态:
getenforce
Enforcing:正在拦截Permissive:只记录不拦截临时切换(重启失效):
sudo setenforce 0 # Permissive
sudo setenforce 1 # Enforcing
⚠️ 不要直接 disable SELinux,会带来安全隐患。
sudo sealert -a /var/log/audit/audit.log
它会给出具体修复命令,例如:
sudo setsebool -P httpd_can_network_connect on
sudo audit2why < /var/log/audit/audit.log
sudo audit2allow -w -a
生成并加载策略模块(谨慎使用):
sudo audit2allow -a -M myfix
sudo semodule -i myfix.pp
⚠️ audit2allow 容易“过度授权”,只在确认安全时使用。
例如 Web 服务无法读文件:
ls -Z /var/www/html/index.html
修复上下文:
sudo restorecon -Rv /var/www/html
或手动设置:
sudo semanage fcontext -a -t httpd_sys_content_t "/web(/.*)?"
sudo restorecon -Rv /web
# 允许 Apache 连接网络
sudo setsebool -P httpd_can_network_connect on
# 允许 FTP 访问用户目录
sudo setsebool -P ftp_home_dir on
查看可用布尔值:
getsebool -a | grep httpd
例如服务监听非标准端口:
sudo semanage port -a -t http_port_t -p tcp 8080
查看端口标签:
sudo semanage port -l | grep http
sudo ausearch -m AVC -ts recent
sudo restorecon -Rv /path
getenforce
再次触发原操作,确认不再出现 denied。
✅ 可以放行:
❌ 不该强行放行:
/etc/shadow如果你愿意,可以把具体的 AVC 拒绝日志贴出来,我可以直接帮你写对应的修复命令。