O Apache httpd não pode se conectar ao Tomcat através do soquete de domínio Unix - SELinux negado

O Apache httpd não pode se conectar ao Tomcat através do soquete de domínio Unix - SELinux negado

Eu tenho um Apache httpd v2.4.57 configurado no Rocky9 para conectar-se ao Tomcat9/Java17 por meio de um soquete de domínio unix.

SELinux entra em ação e diz negado, como segue:

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

O que devo alterar explicitamente na configuração do SELinux para que isso funcione?

Defino o contexto no soquete? No momento, o contexto do soquete é o seguinte, mas sem sorte:

[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

Defino um booleano selinux? Se sim, qual e para quê?

Responder1

Com sua mensagem de erro sabemos que o SELinux está bloqueando a conexão do servidor Apache HTTP com o servidor Tomcat, httpd_t(atribuído ao Apache HTTPD) não é permitido usar um soquete UNIX ( unix_stream_socket) para conectar-se ao tomcat_t.

Vamos criar um módulo de política SELinux personalizado para permitir esta operação.

Primeiro usamos a audit2allowferramenta para gerar um Type Enforcement

grep 'comm="httpd"' /var/log/audit/audit.log | audit2allow -M my_httpd_tomcat

então podemos instalar o pacote de políticas

sudo semodule -i my_httpd_tomcat.pp

Outra solução seria usar semanagepara alterar o contexto de tipo do soquete.

sudo semanage fcontext -a -t httpd_unix_stream_connect_t "/run/tomcat-xxx2-yyy/socket"
sudo restorecon -v "/run/tomcat-xxx2-yyy/socket"

Responder2

O ingrediente secreto é o comando audit2why, que interpreta o motivo da negação e sugere a solução, que pode então ser aplicada com pleno conhecimento das ramificações e efeitos colaterais da mudança.

[root@swordfish ~]# cat /var/log/audit/audit.log | audit2why | less

Isso revelou isso:

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

O que, por sua vez, recomendou a resposta a esta pergunta específica, que é fazer o seguinte:

setsebool -P daemons_enable_cluster_mode 1

O modo acima entra em vigor imediatamente.

Defino o contexto no soquete? Não é suficiente fazê-lo. Para um soquete de domínio unix, o contexto do processo (neste caso o Tomcat) também é levado em consideração, bem como o contexto do arquivo do soquete.

O booleano "daemons_enable_cluster_mode" habilita uma política SELinux integrada que permite que daemons se comuniquem entre si.

informação relacionada