
Ich beginne damit, RHEL6 als gehärteten Tomcat-Server zu konfigurieren und SELinux-Richtlinien für die Zugriffskontrolle anzuwenden. Nach der Installation von RHEL6 und Tomcat6 (Standalone, kein httpd) bemerkte ich, dass der Tomcat-Prozess als unconfined_java_t lief. Wie kann ich Tomcat auf eine Domäne meiner Wahl beschränken?
Antwort1
Ab RHEL6 lauten die standardmäßigen SELinux-Benutzerzuordnungen wie folgt
# semanage user -l
Labeling MLS/ MLS/
SELinux User Prefix MCS Level MCS Range SELinux Roles
git_shell_u user s0 s0 git_shell_r
guest_u user s0 s0 guest_r
root user s0 s0-s0:c0.c1023 staff_r sysadm_r system_r unconfined_r
staff_u user s0 s0-s0:c0.c1023 staff_r sysadm_r system_r unconfined_r
sysadm_u user s0 s0-s0:c0.c1023 sysadm_r
system_u user s0 s0-s0:c0.c1023 system_r unconfined_r
unconfined_u user s0 s0-s0:c0.c1023 system_r unconfined_r
user_u user s0 s0 user_r
xguest_u user s0 s0 xguest_r
Wenn Sie eine Standardrichtlinie verwenden targeted
(überprüfen Sie sie, /etc/selinux/config
oder führen Sie sie aus, sestatus
um es herauszufinden), wird höchstwahrscheinlich die SELinux-Benutzerzuordnung root
verwendet . as wird es Ihnen sagen.unconfined_u
id -Z
root
Wenn Sie auswählen /etc/init.d/tomcat{6,7}
, finden Sie einen if
Schalter, der angibt, dass in SELinux-fähigen Systemen runuser
anstelle von plain verwendet werden muss su
. Dieser Befehl verhindert jedoch nicht, dass die SELinux-Benutzerzuordnung vom tomcat
Java-Prozess übernommen wird.
Dies ist relevant, wie ich zu zeigen versuchen werde:
Packe dieselinux-policy
SRPM, suchen Sie den java
Quellcode des Moduls (Dateikontexte, Schnittstelle und Typdurchsetzung):
selinux-policy-3.7.19-195.el6_4.6.src/serefpolicy-3.7.19/policy/modules/apps/java.fc
selinux-policy-3.7.19-195.el6_4.6.src/serefpolicy-3.7.19/policy/modules/apps/java.if
selinux-policy-3.7.19-195.el6_4.6.src/serefpolicy-3.7.19/policy/modules/apps/java.te
Der erste ist selbsterklärend. Er enthält die Pfade, die in diesem Fall wie folgt beschriftet werden java_exec_t
: Binärdateien und Bibliotheken sowohl von Standard- als auch von optionalen Speicherorten.
Der zweite ist wahrscheinlich am schwierigsten zu verstehen. Er definiert die zulässigen Domänenübergänge innerhalb dieses Richtlinienmoduls. Ein Ausschnitt ist für Ihre Frage relevant:
template(`java_role_template',`
gen_require(`
type java_exec_t;
')
type $1_java_t;
domain_type($1_java_t)
domain_entry_file($1_java_t, java_exec_t)
role $2 types $1_java_t;
domain_interactive_fd($1_java_t)
userdom_manage_tmpfs_role($2, $1_java_t)
allow $1_java_t self:process { ptrace signal getsched execmem execstack };
dontaudit $1_java_t $3:tcp_socket { read write };
allow $3 $1_java_t:process { getattr ptrace noatsecure signal_perms };
domtrans_pattern($3, java_exec_t, $1_java_t)
corecmd_bin_domtrans($1_java_t, $3)
dev_dontaudit_append_rand($1_java_t)
files_execmod_all_files($1_java_t)
fs_dontaudit_rw_tmpfs_files($1_java_t)
optional_policy(`
xserver_role($2, $1_java_t)
')
')
Wie in der Dokumentation zu dieser Vorlage angegeben, "erstellt diese Vorlage abgeleitete Domänendie für Java-Anwendungen verwendet werden", wobei „das Präfix der Benutzerdomäne (z. B. ist „Benutzer“ das Präfix für „user_t“)“, „die mit der Benutzerdomäne verknüpfte Rolle“ und „der Typ der Benutzerdomäne“ alle vom SELinux-Benutzer übernommen werden, der die Java-Anwendung ausführt.
Schließlich enthält die dritte Datei die Typdurchsetzungsregeln und Booleschen Definitionen.
Wenn Sie nun Java-Anwendungen mit einem eingeschränkten SELinux-Benutzer ausführen möchten, müssen Sie eine benutzerdefinierte Richtlinie schreiben, da die aktuelle Referenzrichtlinie so etwas nicht enthält (weder in RHEL6 noch in Upstream, glaube ich). Sie könnten mit dem Duplizieren der Dateien beginnen und von dort aus experimentieren.
Sicherlich ist dies keine leichte Aufgabe.