在 CentOS(以及 RHEL 系列)中,SELinux 拦截操作的根本原因是:进程的安全上下文(Domain)没有权限访问目标资源的安全上下文(Type)。SELinux 是在传统的 DAC(文件权限/属主)之外,再做一层强制访问控制(MAC)。
下面从「为什么会被拦截」和「常见拦截场景」两方面说明。
每个进程和文件都有 SELinux 上下文,例如:
httpd_thttpd_sys_content_t如果 httpd_t 进程去访问一个类型是 user_home_t 的文件,SELinux 就会直接拒绝。
查看上下文:
ls -Z /var/www/html/index.html
ps -Z | grep httpd
CentOS 默认只允许服务访问规定目录:
| 服务 | 允许目录 |
|---|---|
| Apache | /var/www |
| Nginx | /usr/share/nginx |
| MySQL | /var/lib/mysql |
例如:
/home/user/web/data/mysqlSELinux 会认为这是越权。
SELinux 对端口也有标签。
例如:
http_port_t 默认包含 80、443、8080查看:
semanage port -l | grep http
很多功能需要显式开启,例如:
示例:
getsebool -a | grep http
setsebool -P httpd_can_network_connect on
用 cp / mv 从其他目录复制文件,可能导致上下文错误。
修复:
restorecon -Rv /var/www/html
tail -f /var/log/audit/audit.log
或
ausearch -m avc -ts recent
典型记录:
type=AVC msg=audit(...): denied { read } for pid=... comm="httpd"
name="index.html" dev="sda1" scontext=system_u:system_r:httpd_t:s0
tcontext=unconfined_u:object_r:user_home_t:s0 tclass=file
setenforce 0
如果问题消失 → 确认是 SELinux 拦截
✅ 不要直接关闭 SELinux
semanage fcontext -a -t httpd_sys_content_t "/data/web(/.*)?"
restorecon -Rv /data/web
semanage port -a -t http_port_t -p tcp 8888
setsebool -P httpd_can_network_connect on
yum install policycoreutils-python
audit2allow -a
CentOS 中 SELinux 拦截,是因为“进程类型”没有权限访问“资源类型”,而不是文件权限不够。
如果你有具体报错或服务场景(如 Nginx / MySQL / FTP / SSH),我可以给你精确命令。