在 CentOS(以及 RHEL 系列)中,SELinux 的 context(安全上下文)被“拒绝”,通常不是“context 本身拒绝”,而是 SELinux 策略根据 context 判断访问不合法,于是 AVC 拒绝(denied)。下面分场景说明常见原因和排查方法。
SELinux 通过三元组控制访问:
subject(进程 context) -> object(文件/端口 context) -> 动作(read/write/connect)
当 主体 context 与客体 context 不匹配策略 时,就会出现:
type=AVC msg=audit(...): denied { read } for pid=...
comm="xxx" scontext=unconfined_u:system_r:httpd_t:s0
tcontext=unconfined_u:object_r:default_t:s0 tclass=file
例如:
/data/www,但 context 是 default_thttpd_t)无权访问 default_t✅ 解决:
semanage fcontext -a -t httpd_sys_content_t "/data/www(/.*)?"
restorecon -Rv /data/www
如:
88888888 的 context 不是 http_port_t查看:
semanage port -l | grep http
✅ 解决:
semanage port -a -t http_port_t -p tcp 8888
例如:
./myservice 启动unconfined_t✅ 解决:
runcon 指定 context(不推荐长期使用)很多访问被拒是因为布尔没开,例如:
getsebool -a | grep httpd
常见:
setsebool -P httpd_can_network_connect on
SELinux 没有对应 policy,默认拒绝。
✅ 解决方式:
audit2allow 生成模块(仅调试用)ausearch -m avc -ts recent
或
grep AVC /var/log/audit/audit.log
setenforce 0
如果问题解决 → 就是 SELinux context / policy 问题
ausearch -m avc -ts recent | audit2why
ausearch -m avc -ts recent | audit2allow -M myfix
semodule -i myfix.pp
CentOS 中“context 被拒绝”本质是:SELinux 发现进程 context 与文件/端口 context 不符合安全策略,于是拒绝访问。
如果你能贴出:
AVC denied)我可以帮你精确给出修复命令。