![Apache httpd 无法通过 Unix 域套接字连接到 Tomcat - SELinux 被拒绝](https://linux22.com/image/786386/Apache%20httpd%20%E6%97%A0%E6%B3%95%E9%80%9A%E8%BF%87%20Unix%20%E5%9F%9F%E5%A5%97%E6%8E%A5%E5%AD%97%E8%BF%9E%E6%8E%A5%E5%88%B0%20Tomcat%20-%20SELinux%20%E8%A2%AB%E6%8B%92%E7%BB%9D.png)
我在 Rocky9 上配置了 Apache httpd v2.4.57,以通过 unix 域套接字连接到 Tomcat9 / Java17。
SELinux 启动并显示拒绝,如下所示:
type=AVC msg=audit(1685376249.480:134): avc: denied { connectto } for pid=1769 comm="httpd" path="/run/tomcat-xxx2-yyy/socket" scontext=system_u:system_r:httpd_t:s0 tcontext=system_u:system_r:tomcat_t:s0 tclass=unix_stream_socket permissive=0
type=SYSCALL msg=audit(1685376249.480:134): arch=c000003e syscall=42 success=no exit=-13 a0=12 a1=7faa3403a050 a2=27 a3=727461702d746163 items=0 ppid=1767 pid=1769 auid=4294967295 uid=48 gid=48 euid=48 suid=48 fsuid=48 egid=48 sgid=48 fsgid=48 tty=(none) ses=4294967295 comm="httpd" exe="/usr/sbin/httpd" subj=system_u:system_r:httpd_t:s0 key=(null)^]ARCH=x86_64 SYSCALL=connect AUID="unset" UID="apache" GID="apache" EUID="apache" SUID="apache" FSUID="apache" EGID="apache" SGID="apache" FSGID="apache"
type=PROCTITLE msg=audit(1685376249.480:134): proctitle=2F7573722F7362696E2F6874747064002D44464F524547524F554E44002D6600636F6E662F6465766963652D6D61696E2E636F6E66
明确地说,我必须在 SELinux 配置中更改什么才能使其正常工作?
我是否在套接字上设置上下文?目前套接字上下文如下,但没有运气:
[root@swordfish ~]# ls -alZ /run/tomcat-xxx2-yyy/socket
srw-rw----. 1 fma fma system_u:object_r:httpd_var_run_t:s0 0 May 29 17:56 /run/tomcat-xxx2-yyy/socket
我需要设置 selinux 布尔值吗?如果要设置,设置哪一个?设置成什么?
答案1
通过您的错误消息,我们知道 SELinux 正在阻止从 Apache HTTP 服务器到 Tomcat 服务器的连接,httpd_t
(分配给 Apache HTTPD)不允许使用 UNIX 套接字(unix_stream_socket
)连接到tomcat_t
。
让我们创建一个自定义的 SELinux 策略模块来允许此操作。
首先我们使用该audit2allow
工具生成类型强制
grep 'comm="httpd"' /var/log/audit/audit.log | audit2allow -M my_httpd_tomcat
然后我们可以安装策略包
sudo semodule -i my_httpd_tomcat.pp
另一个解决方案是使用semanage
来改变套接字的类型上下文。
sudo semanage fcontext -a -t httpd_unix_stream_connect_t "/run/tomcat-xxx2-yyy/socket"
sudo restorecon -v "/run/tomcat-xxx2-yyy/socket"
答案2
秘密成分是 audit2why 命令,它解释拒绝的原因并提出解决方案,然后可以在充分了解变更的后果和副作用的情况下应用该解决方案。
[root@swordfish ~]# cat /var/log/audit/audit.log | audit2why | less
这揭示了这一点:
type=AVC msg=audit(1685362712.138:110): avc: denied { connectto } for pid=1804 comm="httpd" path="/run/tomcat-xxx2-yyy/so
cket" scontext=system_u:system_r:httpd_t:s0 tcontext=system_u:system_r:tomcat_t:s0 tclass=unix_stream_socket permissive=0
Was caused by:
The boolean daemons_enable_cluster_mode was set incorrectly.
Description:
Allow daemons to enable cluster mode
Allow access by executing:
# setsebool -P daemons_enable_cluster_mode 1
这反过来又推荐了针对这个特定问题的答案,即这样做:
setsebool -P daemons_enable_cluster_mode 1
以上模式立即生效。
我是否在套接字上设置上下文?这样做是不够的。对于 unix 域套接字,还会考虑进程(在本例中为 tomcat)的上下文以及套接字文件的上下文。
布尔值“daemons_enable_cluster_mode”启用内置的 SELinux 策略,允许守护进程相互通信。