RHEL6: Tomcat läuft als uneingeschränkter Java-Benutzer

RHEL6: Tomcat läuft als uneingeschränkter Java-Benutzer

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/configoder führen Sie sie aus, sestatusum es herauszufinden), wird höchstwahrscheinlich die SELinux-Benutzerzuordnung rootverwendet . as wird es Ihnen sagen.unconfined_uid -Zroot

Wenn Sie auswählen /etc/init.d/tomcat{6,7}, finden Sie einen ifSchalter, der angibt, dass in SELinux-fähigen Systemen runuseranstelle von plain verwendet werden muss su. Dieser Befehl verhindert jedoch nicht, dass die SELinux-Benutzerzuordnung vom tomcatJava-Prozess übernommen wird.

Dies ist relevant, wie ich zu zeigen versuchen werde:

Packe dieselinux-policySRPM, suchen Sie den javaQuellcode 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.

verwandte Informationen