Ngnix 因 SELinux 无法写入套接字文件

Ngnix 因 SELinux 无法写入套接字文件

当我在运行 SELinux 的新环境中使用套接字设置 nginx 时,出现以下错误:

AVC avc:  denied  { write } for  pid=23704 comm="nginx" name="xxx.sock" dev="nvme0n1p1" ino=17219797 scontext=system_u:system_r:httpd_t:s0 tcontext=system_u:object_r:httpd_sys_content_t:s0 tclass=sock_file permissive=0

我在 Google 上搜索并找到了多个可以解决这个问题的方法,如果我理解正确的话,主要以下方法可以解决这个问题:

semanage fcontext -a -t httpd_sys_rw_content_t /opt/run/xxx.sock
restorecon -v /opt/run/xxx.sock

但这仍然不起作用,我得到了同样的错误。我找不到任何其他解决方案,并尝试使用 audit2allow,结果显示以下内容:

allow httpd_t httpd_sys_content_t:sock_file write;

但是,当尝试创建一个模块时,整个系统就会冻结(由于我每次部署都需要这样做,所以这不是一个选择,因为解决这个问题的火箭太大了:D)

编辑:当关闭 selinux(setenforce 0)时,它可以工作,所以这是一个 SELinux 问题

在 Amazon Linux 2023 上使用 nginx 版本:1.24.0,使用套接字文件从 systemd 服务运行它(存在问题)。

进一步调试后,我发现根据设置的不同,会出现两个不同的错误。如果我设置了, semanage fcontext -m -t httpd_sys_rw_content_t /opt/run/xxx.sock 则会在 audit.log 中收到 { connectto } 错误(如果我在 /run 后使用正则表达式 (/.*)? 执行此操作,也会收到同样的错误)

type=AVC msg=audit(1700228218.821:1725): avc:  denied  { connectto } for  pid=15047 comm="nginx" path="/opt/run/xxx.sock" scontext=system_u:system_r:httpd_t:s0 tcontext=system_u:system_r:initrc_t:s0 tclass=unix_stream_socket permissive=0

还尝试使用 httpd_var_run_t,结果相同

答案1

要创建 /opt/run/xxx.sock 文件,请连续运行以下命令。

semanage fcontext -a -t var_run_t -s system_u '/opt/(/.*)?'

restorecon -vF /opt

cd /var

ln -s ../opt opt

semanage fcontext -a -t var_run_t -s system_u opt

然后重新启动 nginx 服务,这应该可以解决您的问题。

答案2

尝试运行以下命令。

chcon -t httpd_var_run_t xxx.sock

如果不起作用,请ls -Z xxx.sock与我们分享输出。

答案3

检查文件权限:

确认套接字文件上的文件权限允许 Nginx 进程对其进行写入。

chmod +w xxx.sock

答案4

感谢大家的回答和帮助!最终,我没能让它在当前套接字设置下工作,但多亏了另一篇文章,我才让它工作了:

https://stackoverflow.com/questions/44857223/how-do-i-run-flasknginxuwsgi-with-selinux-in-enforcing-mode

这篇文章中的答案显示不是使用套接字而是使用 HTTP 进行设置,效果很好。只需设置:

setsebool httpd_can_network_connect 1 -P

相关内容