Erste Schritte und SELinux Befehle

Sobald Sie ein funktionstüchtiges Linux-System mit aktivierten SELinux besitzen, sollten Sie sich als root anmelden[*].

Wenn Sie nicht über ein entsprechendes System verfügen, befindet sich auf der CD ein Fedora Core 6 System mit installierter SELinux-Reference-Policy als VMWare-Image. Dieses können Sie in einer VMWare-Workstation oder mit dem beigelegten VMWare-Player betreiben. Die Anmeldung ist als Benutzer root mit dem Kennwort ``kennwort'' möglich.

Zunächst sieht direkt nach der Anmeldung alles normal aus. Möglicherweise erhalten Sie aber auch direkt Protokollmeldungen von SELinux auf der Konsole (siehe 19.1)

Abbildung: Bei der Anmeldung protokolliert SELinux möglicherweise direkt Verletzungen der Richtlinie.
Image selinux-login

Ihre erste Frage sollte nun sein: Wer bin ich? Dies beantwortet der Befehl id. Mit der Option -Z erhalten Sie nur die SELinux-Identität:

[root@supergrobi ~]# id
uid=0(root) gid=0(root) Gruppen=0(root),1(bin),2(daemon),3(sys),4(adm),6(disk),10(wheel) context=root:staff_r:staff_t:SystemLow-SystemHigh

Ihr Benutzer verfügt nun über die Rolle staff_r. Diese Rolle ist Personen vorbehalten, die administrative Tätigkeiten wahrnehmen. In dieser Rolle sind diese administrativen Tätigkeiten diesen Personen aber nicht gestattet. Das können Sie sogar recht leicht erkennen.

Hierfür müssen Sie sich aber zunächst weitere Informationen über die SELinux-Konfiguration beschaffen. Der Befehl getenforce teilt Ihnen den aktuellen Zustand des SELinux-Systems mit:

[root@supergrobi ~]# getenforce
Permissive
Mögliche Rückgabewerte des Befehls sind:
Disabled
SELinux ist abgeschaltet.
Permissive
SELinux ist angeschaltet und wertet die Policy aus. Verletzungen werden aber nur protokolliert und nicht verhindert. Jede Aktion ist erlaubt, als ob SELinux abgeschaltet wäre.
Enforcing
SELinux ist angeschaltet und erzwingt die Einhaltung der Policy.
Der Befehl sestatus liefert Ihnen die gleichen Informationen ein wenig ausführlicher:
[root@supergrobi ~]# sestatus
SELinux status:                 enabled
SELinuxfs mount:                /selinux
Current mode:                   permissive
Mode from config file:          permissive
Policy version:                 20
Policy from config file:        strict
Hier erkennen Sie, dass SELinux angeschaltet ist und wo das SELinux-Dateisystem gemountet wird. Wir werden das SELinux-Dateisystem später noch kennenlernen. Die hier vorgestellten Befehle kommunizieren mit SELinux im Kernel über dieses Dateisystem. Es handelt sich um ein virtuelles Dateisystem ähnlich /proc und /sys. Sie erkennen den aktuellen Modus (Permissive) und den in der Konfigurationsdatei hinterlegten Modus. Die angegebene Version bezeichnet die SELinux-Version im Kernel und ist ein Anhaltspunkt für die verfügbaren Sprachelemente. Schließlich erkennen Sie noch, dass es sich bei mir um die Strict-Policy handelt.

Die hier angesprochene Konfigurationsdatei ist /etc/selinux/config. Diese Datei definiert den SELinux-Modus:

# This file controls the state of SELinux on the system.
# SELINUX= can take one of these three values:
#       enforcing - SELinux security policy is enforced.
#       permissive - SELinux prints warnings instead of enforcing.
#       disabled - SELinux is fully disabled.
SELINUX=permissive
# SELINUXTYPE= type of policy in use. Possible values are:
#       targeted - Only targeted network daemons are protected.
#       strict - Full SELinux protection.
SELINUXTYPE=strict

# SETLOCALDEFS= Check local definition changes
SETLOCALDEFS=0
Diese Datei wird bei dem Boot des Systems ausgewertet. Nach einer Änderung in der Datei genügt daher ein Reboot. Wenn Sie jedoch die Policy ändern möchten (strict oder targeted) genügt kein einfacher Reboot, da diese Policies unterschiedliche Security-Contexte verwenden. Zusätzlich ist ein Relabeling des Dateisystems erforderlich[*]. Wir werden diesen Punkt noch ansprechen.

Kommen wir zurück zu unserem Ausgangspunkt. Der Benutzer root verfügt über die Rolle staff_r, die keine administrativen Arbeiten erlaubt. Testen Sie das zum Beispiel mit dem Befehl ps -ef. Dieser Befehl zeigt sämtliche Prozesse auf dem System an. Auf dem hier vorgestellten System funktioniert das zunächst, da es sich im Permissive-Mode befindet:

[root@supergrobi ~]# ps -ef
UID        PID  PPID  C STIME TTY          TIME CMD
root         1     0  0 12:37 ?        00:00:01 init [5]
root         2     1  0 12:37 ?        00:00:00 [migration/0]
root         3     1  0 12:37 ?        00:00:00 [ksoftirqd/0]
root         4     1  0 12:37 ?        00:00:00 [watchdog/0]
root         5     1  0 12:37 ?        00:00:00 [migration/1]
root         6     1  0 12:37 ?        00:00:00 [ksoftirqd/1]
...
root      4122  2239  0 18:23 tty1     00:00:00 -bash
root      4297  4092  0 18:57 pts/2    00:00:00 ps -ef

Wechseln Sie nun auf dem System in den Enforcing-Mode. Hierzu müssen Sie nicht rebooten. Es genügt den Befehl setenforce zu verwenden:

[root@supergrobi ~]# setenforce 1
[root@supergrobi ~]# getenforce
Enforcing
[root@supergrobi ~]# ps -ef
UID        PID  PPID  C STIME TTY          TIME CMD
root      4092  4089  0 18:21 pts/2    00:00:00 -bash
root      4122  2239  0 18:23 tty1     00:00:00 -bash
root      4305  4092  0 18:58 pts/2    00:00:00 ps -ef
Nun sehen Sie nur noch eine kleine Auswahl der laufenden Prozesse. SELinux verhindert den Zugriff auf alle Prozesse, die nicht von Ihnen gestartet wurden! Dies gilt auch für andere Prozesse, die den Benutzer root verwenden. Versuchen Sie auf die Heimatverzeichnisse anderer Benutzer oder auf das Proc-Dateisystem zuzugreifen:
[root@supergrobi ~]# ls -l /home/
insgesamt 8
?--------- ? ?    ?       ?             ? /home/lost+found
?--------- ? ?    ?       ?             ? /home/student
[root@supergrobi ~]# ls -l /proc/kcore
ls: /proc/kcore: Keine Berechtigung
Nebenbei: In den Permissive-Modus wechselt SELinux ebenfalls mit dem Befehl setenforce:
[root@supergrobi ~]# setenforce 0
setenforce:  setenforce() failed
Leider darf dies nur ein Benutzer mit der Rolle sysadm_r.

Sie sollten bis jetzt bereits einen Eindruck gewonnen haben, wie SELinux die Sicherheit eines Linux-System gewährleisten kann. Natürlich ist dafür eine fehlerfreie und umfangreiche Policy erforderlich. Diese wird jedoch bei den meisten Distributionen bereits mitgeliefert. Auch setzt dieses Beispiel die Strict-Policy voraus. Wir werden in diesem Buch uns in erster Linie mit der Targeted-Policy beschäftigen, da diese häufiger zum Einsatz kommt.

Wie wird nun das System administriert? Der Benutzer root hat auch Zugriff auf die Rolle sysadm_r, die über die notwendigen Privilegien verfügt. Um in die Rolle zu wechseln, verwendet er den Befehl newrole:

[root@supergrobi ~]# newrole -r sysadm_r
Authentifiziere root.
Passwort:
[root@supergrobi ~]# ls -l /proc/kcore
-r-------- 1 root root 527896576 23. Aug 19:06 /proc/kcore
Anschließend kann er auch wieder auf alle Dateien zugreifen.

Weitere wichtige Befehle auf der Kommandozeile sind:

chcon
Hiermit können Sie den Kontext einer Datei ändern (siehe 26.6).
restorecon
Dieser Befehl stellt den Security-Context einer Datei entsprechend der Policy wieder her (siehe 26.16).
selinuxenabled
Dieser Befehl kann in Skripten eingesetzt werden, um den Status von SELinux zu prüfen (siehe 26.24).
getsebool/setsebool
Hiermit können Sie boolsche Variablen lesen und setzen (siehe 21 und 26.34).
audit2allow/audit2why
Diese Befehle erlauben die Analyse der SELinux-Protokollmeldungen und die Anpassung der Richtlinie (siehe 22 und 26.3).

Dies soll als erste Einführung in SELinux genügen. Zunächst werden Sie das System genauso verwenden können, wie bisher. Jedoch werden einige Funktionen nicht mehr zur Verfügung stehen. Dann müssen Sie die Protokollmeldungen analysieren (siehe 20) und können die Richtlinie über boolsche Variablen (siehe 21) oder über die Erweiterung der Richtlinien anpassen (siehe 22). Eine typische Zusammenfassung der täglichen Aufgaben und ihre Lösung ist im Kapitel 27 zu finden. Wenn Sie aber tiefer einsteigen möchten und vielleicht sogar für komplett neue Dienste die Richtlinien entwickeln möchten, müssen Sie sich mehr mit der Sprache und ihren Bestandteilen beschäftigen. Dann sollten Sie den Teil IV durcharbeiten.

Ralf Spenneberg 2007-11-13