在 CentOS 上 SELinux 的 context(安全上下文)不生效,一般可以从下面几个方向排查和处理。
getenforce
Enforcing:正常生效Permissive:只记录不拒绝(看起来像“不生效”)Disabled:context 根本不会起作用如果是 Disabled,需要:
vi /etc/selinux/config
改:
SELINUX=enforcing
然后 必须重启系统。
ls -Z /path/to/file
或目录:
ls -Zd /path/to/dir
如果 context 不对,先手动设置:
chcon -t httpd_sys_content_t /var/www/html/index.html
⚠️ 注意:
chcon 只是临时生效,重启或 restorecon 可能覆盖。
semanage fcontext -a -t httpd_sys_content_t "/web(/.*)?"
restorecon -Rv /web
验证:
matchpathcon /web
SELinux context 不会自动继承,需要:
restorecon -Rv /path
cp:会按目标目录 contextmv:保留原 context(常导致不生效)解决:
restorecon -Rv /path
这些文件没有正确 context,需要:
restorecon -Rv /
ausearch -m avc -ts recent
或实时看:
tail -f /var/log/audit/audit.log
如果有 AVC 拒绝,可快速允许(仅调试):
setsebool -P httpd_can_network_connect on
| 场景 | 解决 |
|---|---|
| Web 无法访问文件 | httpd_sys_content_t + restorecon |
| FTP/NFS 文件无 context | public_content_t |
| 脚本不能执行 | bin_t |
| 端口不监听 | semanage port -a -t http_port_t -p tcp 8080 |
如果你能贴一下:
ls -Z 和报错信息我可以直接帮你定位是哪一步没生效。