SELinux访问拒绝的常见原因是目录上下文类型错误,需用restorecon恢复默认上下文或chcon手动设置,再通过ls -Z和ausearch验证修复效果。

SELinux 处于 Enforcing 模式,但访问某个目录(比如 /var/www/html/mysite)仍被拒绝,常见原因是该目录及其内容的 SELinux 上下文(type)不正确,即使权限、用户、组都对,也会被策略拦住。仅靠 chmod 或 chown 无法解决 —— 必须修复上下文。
先确认是否真因 SELinux 上下文导致拒绝
查看系统日志中 SELinux 拒绝记录:
- 运行
sudo ausearch -m avc -ts recent | audit2why(需安装setools-console) - 或直接查
sudo dmesg | grep -i avc - 若输出含
avc: denied { read } for ... scontext=... tcontext=unconfined_u:object_r:default_t:s0,说明目标文件类型(tcontext)是default_t,而非 Web 服务所需的httpd_sys_content_t等,这就是根源
用 restorecon 一键恢复默认上下文
restorecon 会根据 SELinux 策略中的文件上下文规则(file contexts),把路径重置为系统预设的正确 type:
- 修复单个目录(不含子目录):
sudo restorecon -v /var/www/html/mysite - 递归修复整个目录树:
sudo restorecon -Rv /var/www/html/mysite -
-v显示变更详情,-R表示递归;首次修复后建议加-n(dry-run)验证是否还有变化:sudo restorecon -Rvn /var/www/html/mysite
用 chcon 手动设置临时或特殊上下文
当 restorecon 不适用(比如需要自定义 type,或策略未覆盖该路径),可用 chcon 直接修改:
- 给目录设 Web 可读类型:
sudo chcon -t httpd_sys_content_t /var/www/html/mysite - 递归设置(慎用,避免误改配置文件等):
sudo chcon -R -t httpd_sys_content_t /var/www/html/mysite - 注意:
chcon的修改在下次restorecon或系统重标签(如touch /.autorelabel && reboot)时会被覆盖,如需持久化,应通过semanage fcontext添加规则再 runrestorecon
验证修复是否生效
不要只看命令是否报错,要实测访问行为:
- 检查当前上下文:
ls -Z /var/www/html/mysite,确认 type 列显示为httpd_sys_content_t(静态页)、httpd_sys_rw_content_t(需写入)等 - 重启服务(如
sudo systemctl restart httpd),再尝试访问网页或执行相关操作 - 再次运行
ausearch -m avc -ts recent,确认无新拒绝日志










