事情本身不复杂,线索都在日志里。CentOS 7.9 开了 enforcing,给 /data/www 跑了一次 restorecon -R,原本设好的 httpd_sys_content_t 全部回到 default_t,nginx 立刻 403。

第一反应是「fcontext 的等价规则写成了 -e,路径没有真正注册进去」,验证下来不成立。

排查方向其实有限,先把可能性排一排。restorecon 是按策略里的默认规则打标签,自定义路径没有 fcontext 记录就落回 default_t。另一种情况是之前用 chcon 手工改的标签不属于策略,被覆盖是必然结果。

不容易想到的是,目录上层的父目录标签不对,递归时把子目录一起带偏。

先看当前标签和策略里的记录

ls -Zd /data/www && semanage fcontext -l | grep /data/www

接着把自定义路径写进 fcontext 规则

semanage fcontext -a -t httpd_sys_content_t '/data/www(/.*)?'

再往下重新按规则打标签

restorecon -RFv /data/www | tail -5

剩下的就是确认访问恢复

curl -sI http://127.0.0.1/ | head -1 && ausearch -m avc -ts recent | tail -3

怎么算真的好了,看的是同一批现象。ls -Z 显示 /data/www 及子目录都是 httpd_sys_content_t,nginx 返回 200,ausearch 里不再有新的 AVC 拒绝记录。

补一句。chcon 的改动重启或 restorecon 就会丢,长期有效的做法是写 fcontext 再统一 relabel;改完别忘了检查父目录的标签。改动前把原配置备份一份,出问题能马上回滚,这比任何技巧都实用。

作者 9823189