前言
网上很多教程遇到 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
排错思路
- 先
setenforce 0试一下,问题消失说明确实是 SELinux 拦的 - 查日志找原因:
ausearch -m avc -ts recent - 修上下文或开对应的布尔开关,而不是关掉整个 SELinux
- 修完
setenforce 1切回来
总结
SELinux 本质就是"给每个文件和进程贴标签,按标签放行"。理解了这一点,403 报错就不再神秘了。个人服务器暴露在公网上,多这一层保护很值。