
Ich habe einen Apache httpd v2.4.57 auf Rocky9 konfiguriert, um über einen Unix-Domain-Socket eine Verbindung zu Tomcat9/Java17 herzustellen.
SELinux greift ein und meldet „Abgelehnt“ wie folgt:
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
Was muss ich konkret an der SELinux-Konfiguration ändern, damit dies funktioniert?
Soll ich den Kontext auf dem Socket festlegen? Momentan ist der Socket-Kontext wie folgt, aber ohne Erfolg:
[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
Soll ich einen Selinux-Booleschen Wert festlegen? Wenn ja, welchen und worauf?
Antwort1
Aus Ihrer Fehlermeldung wissen wir, dass SELinux die Verbindung vom Apache-HTTP-Server zum Tomcat-Server (zugewiesen an Apache HTTPD) blockiert und keinen UNIX-Socket ( ) für die Verbindung httpd_t
verwenden darf .unix_stream_socket
tomcat_t
Erstellen wir ein benutzerdefiniertes SELinux-Richtlinienmodul, um diesen Vorgang zu ermöglichen.
Zunächst audit2allow
generieren wir mit dem Tool eine Type Enforcement
grep 'comm="httpd"' /var/log/audit/audit.log | audit2allow -M my_httpd_tomcat
dann können wir das Richtlinienpaket installieren
sudo semodule -i my_httpd_tomcat.pp
Eine andere Lösung wäre, semanage
den Typkontext des Sockets zu ändern.
sudo semanage fcontext -a -t httpd_unix_stream_connect_t "/run/tomcat-xxx2-yyy/socket"
sudo restorecon -v "/run/tomcat-xxx2-yyy/socket"
Antwort2
Die geheime Zutat ist der Befehl „audit2why“, der den Grund für die Ablehnung interpretiert und eine Lösung vorschlägt, die dann im vollen Bewusstsein der Auswirkungen und Nebenwirkungen der Änderung angewendet werden kann.
[root@swordfish ~]# cat /var/log/audit/audit.log | audit2why | less
Dabei kam Folgendes zum Vorschein:
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
Dies wiederum empfiehlt die Antwort auf diese spezielle Frage, und zwar Folgendes:
setsebool -P daemons_enable_cluster_mode 1
Der obige Modus wird sofort wirksam.
Soll ich den Kontext auf dem Socket festlegen? Das reicht nicht. Bei einem Unix-Domain-Socket wird neben dem Kontext der Socket-Datei auch der Kontext des Prozesses (in diesem Fall Tomcat) berücksichtigt.
Der Boolesche Wert „daemons_enable_cluster_mode“ aktiviert eine integrierte SELinux-Richtlinie, die es Daemons ermöglicht, miteinander zu kommunizieren.