Apache httpd 無法透過 Unix 網域套接字連接到 Tomcat - SELinux 被拒絕

Apache httpd 無法透過 Unix 網域套接字連接到 Tomcat - SELinux 被拒絕

我在 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工具產生一個 Type Enforcement

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 策略,允許守護程式相互通訊。

相關內容