在 CentOS 里提到 “Context 错误”,通常是指 SELinux 安全上下文(Security Context) 相关的问题,比如:
ls -Z、ps -Z、id -Z 显示异常avc: denied下面按 排查思路 + 常用命令 + 常见场景 给你一套完整方法。
getenforce
可能结果:
Enforcing ✅(SELinux 生效,最可能出 context 问题)Permissive(只记录,不拦截)Disabled(完全关闭)如果是 Disabled,不存在 context 错误。
ausearch -m avc -ts recent
或:
journalctl -t setroubleshoot
journalctl -t audit
常见错误示例:
avc: denied { read } for pid=xxx comm="httpd"
说明:
ls -Z /path/to/file
示例:
ls -Z /var/www/html/index.html
正常 Web 文件应为:
httpd_sys_content_t
ps -eZ | grep httpd
semanage port -l
sealert(最直观)sealert -a /var/log/audit/audit.log
它会直接告诉你:
audit2why < /var/log/audit/audit.log
audit2allow -a
audit2allow -a -M mypolicy
semodule -i mypolicy.pp
⚠ 不建议直接生成策略,优先修复 context
restorecon -Rv /path
示例:
restorecon -Rv /var/www/html
chcon -t httpd_sys_content_t /var/www/html/index.html
⚠ chcon 重启后可能失效
semanage fcontext -a -t httpd_sys_content_t "/data(/.*)?"
restorecon -Rv /data
| 场景 | 正确 Context |
|---|---|
| Apache/Nginx 静态目录 | httpd_sys_content_t |
| SSH 密钥 | ssh_home_t |
| MySQL 数据目录 | mysqld_db_t |
| 自定义服务 | bin_t / usr_t |
| 端口绑定 | semanage port |
setenforce 0
如果恢复正常: ✅ 一定是 SELinux / Context 问题
⚠ 生产环境不要长期 Permissive
getenforce
ausearch -m avc -ts recent
sealert -a /var/log/audit/audit.log
ls -Z /path
restorecon -Rv /path
你可以直接贴出:
avc denied 日志ls -Z 输出我可以 直接告诉你该执行哪几条命令修复 ✅