SELinux限制导致Nginx无法写入套接字文件的问题求助
我在启用了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
我查了不少资料,看到大家普遍推荐用这两个命令修改SELinux上下文来解决:
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;
但当我尝试创建自定义模块的时候,整个系统都卡壳了——而且我每次部署都要做这个操作,用这种方式解决实在是小题大做,有点杀鸡用牛刀的感觉😂
补充说明:
- 关闭SELinux(执行
setenforce 0)后服务就能正常运行,所以可以100%确定这就是SELinux的权限问题 - 环境信息:Amazon Linux 2023系统,Nginx版本1.24.0,通过systemd服务管理,问题核心就出在套接字文件的SELinux权限上
我进一步调试发现,修改不同的SELinux上下文会触发不同的报错:
如果执行:
semanage fcontext -m -t httpd_sys_rw_content_t /opt/run/xxx.sock
(包括把路径改成正则/opt/run/.*的情况),audit.log里会出现{ connectto }的拒绝错误:
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
试过把套接字的SELinux上下文改成httpd_var_run_t,结果也是一样的connectto错误。
备注:内容来源于stack exchange,提问作者Wealot

