当我在运行 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
感谢大家的回答和帮助!最终,我没能让它在当前套接字设置下工作,但多亏了另一篇文章,我才让它工作了:
这篇文章中的答案显示不是使用套接字而是使用 HTTP 进行设置,效果很好。只需设置:
setsebool httpd_can_network_connect 1 -P