前言

网上很多教程遇到 SELinux 报错就一句"把它关了"。我一开始也这么干过,后来觉得不对劲:Rocky Linux 默认开着它肯定有道理。这篇是我补课之后的笔记。

SELinux 是什么

普通的文件权限(rwx)管的是"谁能访问",SELinux 管的是"什么程序能访问什么资源"。就算攻击者拿到了 Nginx 进程的控制权,SELinux 也能限制它只能读网站目录,碰不了别的。

三种模式

getenforce          # 查看当前模式
  • Enforcing:强制执行,违规操作直接拦截(推荐)
  • Permissive:只记录不拦截,排查问题时临时用
  • Disabled:完全关闭(不建议)

临时切换到 Permissive 排错:

setenforce 0        # 临时 Permissive,重启恢复
setenforce 1        # 切回 Enforcing

最常遇到的问题:网站目录上下文

把网站文件传到 /var/www/hengjiu 之后 Nginx 返回 403,文件权限明明没问题——这就是 SELinux 上下文不对。查看:

ls -Z /var/www/hengjiu

网站文件需要 httpd_sys_content_t 类型。修复:

semanage fcontext -a -t httpd_sys_content_t "/var/www/hengjiu(/.*)?"
restorecon -Rv /var/www/hengjiu

排错思路

  1. setenforce 0 试一下,问题消失说明确实是 SELinux 拦的
  2. 查日志找原因:ausearch -m avc -ts recent
  3. 修上下文或开对应的布尔开关,而不是关掉整个 SELinux
  4. 修完 setenforce 1 切回来

总结

SELinux 本质就是"给每个文件和进程贴标签,按标签放行"。理解了这一点,403 报错就不再神秘了。个人服务器暴露在公网上,多这一层保护很值。