在 CentOS 中,**SELinux 拒绝访问(Permission denied)**通常并不是因为文件权限(chmod/chown)不对,而是因为 SELinux 的安全上下文(Security Context)或策略不允许该操作。下面从原因、排查、解决方法三个层面说明。
SELinux 在 Linux 传统 DAC(文件权限)之外,增加了一层 MAC(强制访问控制):
常见被拒绝场景:
/data/wwwcp / mv 导致 type 不对sudo ausearch -m avc -ts recent
或
sudo tail -f /var/log/audit/audit.log
典型拒绝示例:
type=AVC msg=audit(...): denied { read } for pid=...
comm="nginx" name="index.html"
scontext=system_u:system_r:httpd_t:s0
tcontext=unconfined_u:object_r:default_t:s0
tclass=file
说明:
scontext:进程上下文(nginx = httpd_t)tcontext:文件上下文(default_t ❌)tclass:资源类型(file / dir)sudo setenforce 0
如果此时访问正常 → 100% 是 SELinux 问题
⚠️ 生产环境不要长期关闭
查看上下文:
ls -Z /data/www
修复为 Web 目录类型:
sudo semanage fcontext -a -t httpd_sys_content_t "/data/www(/.*)?"
sudo restorecon -Rv /data/www
sudo semanage fcontext -a -t httpd_sys_rw_content_t "/data/www/uploads(/.*)?"
sudo restorecon -Rv /data/www/uploads
查看允许的端口:
sudo semanage port -l | grep ssh
添加端口:
sudo semanage port -a -t ssh_port_t -p tcp 2222
例如:
sudo setsebool -P httpd_can_network_connect on
查看可用布尔:
sudo getsebool -a | grep httpd
sudo ausearch -m avc | audit2why
生成策略模块(谨慎使用):
sudo ausearch -m avc | audit2allow -M myfix
sudo semodule -i myfix.pp
⚠️ 不建议盲目 allow,应先理解拒绝原因
getenforce 是否为 Enforcingausearch -m avc 是否有拒绝记录ls -Z 文件上下文是否正确如果你愿意,可以把 具体的错误日志或场景(如 Nginx / FTP / MySQL / 自定义服务)贴出来,我可以直接帮你给出精确修复命令。