在 CentOS(以及 RHEL 系列)中,SELinux 阻止操作的根本原因是:进程的安全上下文(domain)没有获得对资源(文件、端口、其他进程等)的访问权限。SELinux 是在传统 DAC(文件权限/用户权限)之上的一层强制访问控制(MAC)。
下面从「为什么会被阻止」和「如何确认/处理」两方面说明。
SELinux 给每个:
httpd_t)httpd_sys_content_t)规则只允许特定 domain 访问特定 type。
例子
httpd_t)只能读 httpd_sys_content_t/data/www,文件类型是 default_t即使:
但如果 type 不对,SELinux 仍然会拒绝。
常见场景:
/home 拷贝文件到 /var/wwwmv 而不是 cp(context 不自动修正)很多服务只能绑定“允许的端口”。
例如:
httpd_t 只能 bind 到 80, 443, 8080 等8888 → 被拒绝查看:
semanage port -l | grep http
SELinux 有很多开关,例如:
例如:
setsebool -P httpd_can_network_connect on
比如:
/tmp 中的程序这些在 SELinux 策略中默认禁止。
ausearch -m AVC -ts recent
或
grep AVC /var/log/audit/audit.log
典型信息:
type=AVC msg=audit(...): denied { read } for pid=...
comm="httpd" name="index.html"
scontext=system_u:system_r:httpd_t:s0
tcontext=unconfined_u:object_r:default_t:s0
含义:
comm:哪个进程scontext:进程 contexttcontext:目标 contextdenied:缺什么权限sealert -a /var/log/audit/audit.log
会给出非常友好的建议,例如:
semanage fcontext -a -t httpd_sys_content_t "/data/www(/.*)?"
restorecon -Rv /data/www
setenforce 0
如果问题消失 → 就是 SELinux。
(生产环境不要长期关)
semanage fcontext -a -t httpd_sys_content_t "/data/www(/.*)?"
restorecon -Rv /data/www
setsebool -P httpd_can_network_connect on
semanage port -a -t http_port_t -p tcp 8888
setenforce 0/etc/selinux/config 为 disabledCentOS 中 SELinux 阻止访问,几乎都是因为“进程类型没有权限访问资源类型”或“资源上下文/端口/布尔未配置正确”。
如果你有具体的报错或服务场景(如 Nginx、MySQL、FTP、Docker),可以贴出 AVC 日志,我可以帮你精准给命令。