
Tengo un Apache httpd v2.4.57 configurado en Rocky9 para conectarme a Tomcat9/Java17 a través de un socket de dominio Unix.
SELinux entra en acción y dice denegado, de la siguiente manera:
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
¿Qué debo cambiar explícitamente en la configuración de SELinux para que esto funcione?
¿Debo configurar el contexto en el socket? En este momento el contexto del socket es el siguiente, pero no hubo suerte:
[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
¿Debo configurar un booleano de Selinux? Si es así, ¿cuál y para qué?
Respuesta1
Con su mensaje de error sabemos que SELinux está bloqueando la conexión del servidor Apache HTTP al servidor Tomcat, httpd_t
(asignado a Apache HTTPD) no tiene permitido usar un socket UNIX ( unix_stream_socket
) para conectarse al tomcat_t
.
Creemos un módulo de política SELinux personalizado para permitir esta operación.
Primero usamos la audit2allow
herramienta para generar una aplicación de tipo.
grep 'comm="httpd"' /var/log/audit/audit.log | audit2allow -M my_httpd_tomcat
entonces podemos instalar el paquete de políticas
sudo semodule -i my_httpd_tomcat.pp
Otra solución sería utilizar semanage
para cambiar el contexto de tipo del socket.
sudo semanage fcontext -a -t httpd_unix_stream_connect_t "/run/tomcat-xxx2-yyy/socket"
sudo restorecon -v "/run/tomcat-xxx2-yyy/socket"
Respuesta2
El ingrediente secreto es el comando audit2why, que interpreta el motivo del rechazo y sugiere la solución, que luego puede aplicarse con pleno conocimiento de las ramificaciones y efectos secundarios del cambio.
[root@swordfish ~]# cat /var/log/audit/audit.log | audit2why | less
Esto reveló esto:
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
Lo cual a su vez recomendó la respuesta a esta pregunta en particular, que es hacer esto:
setsebool -P daemons_enable_cluster_mode 1
El modo anterior entra en vigor inmediatamente.
¿Debo configurar el contexto en el socket? No basta con hacerlo. Para un socket de dominio Unix, también se tiene en cuenta el contexto del proceso (en este caso Tomcat), así como el contexto del archivo del socket.
El booleano "daemons_enable_cluster_mode" habilita una política SELinux integrada que permite a los demonios comunicarse entre sí.