Zum Inhalt springen

Linux/SELinux/03 Default Policy/Prozesse

Aus Foxwiki

Linux/SELinux/03 Default Policy/Prozesse - Eingeschränkte Prozesse

Eingeschränkte Prozesse

Fast jeder Dienst, der auf einem Netzwerk lauscht, wie sshd oder httpd, ist in Linux eingeschränkt

  • Auch die meisten Prozesse, die als Root-Benutzer laufen und Aufgaben für Benutzer ausführen, wie das Dienstprogramm passwd, sind eingeschränkt
  • Wenn ein Prozess eingeschränkt ist, läuft er in seiner eigenen Domäne, wie der httpd-Prozess, der in der Domäne httpd_t läuft
  • Wenn ein eingeschränkter Prozess von einem Angreifer kompromittiert wird, sind je nach Konfiguration der SELinux-Richtlinie der Zugriff des Angreifers auf Ressourcen und der mögliche Schaden, den er anrichten kann, begrenzt

Führen Sie diesen Vorgang durch, um sicherzustellen, dass SELinux aktiviert und das System für die Durchführung des folgenden Beispiels vorbereitet ist:

Überprüfen des SELinux-Status

1. Überprüfen Sie, ob SELinux aktiviert ist, im Enforcing-Modus läuft und die Targeted-Richtlinie verwendet wird

Die korrekte Ausgabe sollte in etwa wie folgt aussehen

$ sestatus
SELinux-Status: aktiviert
SELinuxfs-Mount: /sys/fs/selinux
SELinux-Stammverzeichnis: /etc/selinux

Name der geladenen Richtlinie: targeted
Aktueller Modus: enforcing
Modus aus Konfigurationsdatei: enforcing
MLS-Status der Richtlinie: aktiviert
Status der Richtlinie deny_unknown: erlaubt
Maximale Kernel-Richtlinienversion: 30

Siehe Abschnitt „Linux/SELinux/04/04 Dauerhafte Änderungen“ für detaillierte Informationen zum Ändern von SELinux-Modi

2. Erstellen Sie als root eine Datei im Verzeichnis /var/www/html/

# touch /var/www/html/testfile

3. Geben Sie den folgenden Befehl ein, um den SELinux-Kontext der neu erstellten Datei anzuzeigen

$ ls -Z /var/www/html/testfile
-rw-r--r-- root root unconfined_u:object_r: httpd_sys_content_t:s0 /var/www/html/testfile 

Standardmäßig laufen Linux-Benutzer unter Linux im unconfined-Modus, weshalb die Datei testfile mit dem SELinux-Benutzer unconfined_u gekennzeichnet ist

  • RBAC wird für Prozesse verwendet, nicht für Dateien
  • Rollen haben für Dateien keine Bedeutung; die Rolle „object_r“ ist eine generische Rolle, die für Dateien (auf persistenten Speichern und Netzwerkdateisystemen) verwendet wird
  • Im Verzeichnis /proc können Dateien, die sich auf Prozesse beziehen, die Rolle „system_r“ verwenden
  • Der Typ „httpd_sys_content_t“ erlaubt dem httpd-Prozess den Zugriff auf diese Datei

Das folgende Beispiel zeigt, wie SELinux den Apache-HTTP-Server (httpd) daran hindert, Dateien zu lesen, die nicht korrekt gekennzeichnet sind, wie Dateien, die für die Verwendung durch Samba vorgesehen sind

  • Dies ist ein Beispiel und sollte nicht in der Produktion verwendet werden
  • Es wird davon ausgegangen, dass die Pakete httpd und wget installiert sind, die SELinux-Targeted-Policy verwendet wird und dass SELinux im Enforcing-Modus läuft
Beispiel für einen eingeschränkten Prozess

1. Starten Sie als Root den httpd-Daemon

# systemctl start httpd.service

Überprüfen Sie, ob der Dienst läuft

  • Die Ausgabe sollte die folgenden Informationen enthalten (nur der Zeitstempel weicht ab):
$ systemctl status httpd.service
httpd.service - The Apache HTTP Server
      Loaded: loaded (/usr/lib/systemd/system/httpd.service; disabled)
      Active: active (running) since Mon 2013-08-05 14:00:55 CEST; 8s ago

2. Wechseln Sie in ein Verzeichnis, auf das Ihr Linux-Benutzer Schreibzugriff hat, und geben Sie den folgenden Befehl ein

Sofern keine Änderungen an der Standardkonfiguration vorgenommen wurden, wird dieser Befehl erfolgreich ausgeführt:

$ wget http://localhost/testfile
--2009-11-06 17:43:01--  http://localhost/testfile
Resolving localhost... 127.0.0.1
Connecting to localhost|127.0.0.1|:80... connected.
HTTP request sent, awaiting response... 200 OK
Length: 0 [text/plain]
Saving to: `testfile'

[ <=>                              ] 0     --.-K/s   in 0s

2009-11-06 17:43:01 (0.00 B/s) - `testfile' saved [0/0]

3. Der Befehl chcon kennzeichnet Dateien neu; solche Kennzeichnungsänderungen bleiben jedoch nicht erhalten, wenn das Dateisystem neu gekennzeichnet wird

  • Für dauerhafte Änderungen, die eine Neukennzeichnung des Dateisystems überstehen, verwenden Sie das Dienstprogramm semanage, das später behandelt wird

Geben Sie als root den folgenden Befehl ein, um den Typ auf einen von Samba verwendeten Typ zu ändern:

# chcon -t samba_share_t /var/www/html/testfile 

Geben Sie den folgenden Befehl ein, um die Änderungen anzuzeigen:

$ ls -Z /var/www/html/testfile
-rw-r--r-- root root unconfined_u:object_r:samba_share_t:s0 /var/www/html/testfile

4. Beachten Sie, dass die aktuellen DAC-Berechtigungen dem httpd-Prozess Zugriff auf testfile gewähren Wechseln Sie in ein Verzeichnis, auf das Ihr Benutzer Schreibzugriff hat, und geben Sie den folgenden Befehl ein

  • Sofern keine Änderungen an der Standardkonfiguration vorgenommen wurden, schlägt dieser Befehl fehl:
$ wget http://localhost/testfile --2009-11-06 14:11:23-- http://localhost/testfile Resolving localhost... 127.0.0.1 Verbindung zu localhost|127.0.0.1|:80 wird hergestellt... verbunden
HTTP-Anfrage gesendet, warte auf Antwort... 403 Forbidden 2009-11-06 14:11:23 ERROR 403: Forbidden

5. Entfernen Sie als root die Datei „testfile“:

# rm -i /var/www/html/testfile

6. Wenn Sie httpd nicht benötigen, geben Sie als root den folgenden Befehl ein, um den Dienst zu beenden:

# systemctl stop httpd.service

Dieses Beispiel veranschaulicht die zusätzliche Sicherheit, die SELinux bietet

  • Obwohl die DAC-Regeln dem httpd-Prozess in Schritt 2 den Zugriff auf testfile erlaubten, verweigerte SELinux den Zugriff, da die Datei mit einem Typ gekennzeichnet war, auf den der httpd-Prozess keinen Zugriff hat

Wenn der auditd-Daemon läuft, wird ein Fehler ähnlich dem folgenden in /var/log/audit/audit.log protokolliert:

type=AVC msg=audit(1220706212.937:70): avc:  denied  { getattr } for  pid=1904 comm="httpd" path="/var/www/html/testfile" dev=sda5 ino=247576 scontext=unconfined_u:system_r:httpd_t:s0 tcontext=unconfined_u:object_r:samba_share_t:s0  tclass=file

type=SYSCALL msg=audit(1220706212.937:70): arch=40000003 syscall=196 success=no exit=-13 a0=b9e21da0 a1=bf9581dc a2=555ff4 a3=2008171 items=0 ppid=1902 pid=1904 auid=500 uid=48 gid=48 euid=48 suid=48 fsuid=48 egid=48 sgid=48 fsgid=48 tty=(none) ses=1 comm="httpd" exe="/usr/sbin/httpd" subj=unconfined_u:system_r:httpd_t:s0 key=(null)

Außerdem wird ein Fehler ähnlich dem folgenden in /var/log/httpd/error_log protokolliert:

[Wed May 06 23:00:54 2009] [error] [client 127.0.0.1] (13)Permission denied: access to /testfile denied

Uneingeschränkte Prozesse

Nicht eingeschränkte Prozesse laufen in nicht eingeschränkten Domänen

Beispielsweise laufen
  • von init ausgeführte nicht eingeschränkte Dienste in der Domäne unconfined_service_t
  • von Kernel ausgeführte nicht eingeschränkte Dienste in der Domäne kernel_t und
  • von nicht eingeschränkten Linux-Benutzern ausgeführte nicht eingeschränkte Dienste in der Domäne unconfined_t

Für nicht eingeschränkte Prozesse gelten SELinux-Richtlinienregeln, es gibt jedoch Richtlinienregeln, die Prozessen, die in nicht eingeschränkten Domänen laufen, fast uneingeschränkten Zugriff gewähren

  • Prozesse, die in nicht eingeschränkten Domänen laufen, greifen ausschließlich auf DAC-Regeln zurück
  • Wenn ein nicht eingeschränkter Prozess kompromittiert wird, verhindert SELinux nicht, dass ein Angreifer Zugriff auf Systemressourcen und Daten erhält, aber natürlich werden weiterhin DAC-Regeln angewendet
  • SELinux ist eine Sicherheitserweiterung zusätzlich zu den DAC-Regeln – es ersetzt diese nicht

Um sicherzustellen, dass SELinux aktiviert und das System für die Ausführung des folgenden Beispiels vorbereitet ist, führen Sie die beschriebene Vorgehensweise „So überprüfen Sie den SELinux-Status“, durch, „Eingeschränkte Prozesse“

Das folgende Beispiel zeigt, wie der Apache-HTTP-Server (httpd) auf Daten zugreifen kann, die für die Verwendung durch Samba vorgesehen sind, wenn er ohne Einschränkungen ausgeführt wird

  • Beachten Sie, dass unter Linux der httpd-Prozess standardmäßig in der eingeschränkten httpd_t-Domäne läuft
  • Dies ist ein Beispiel und sollte nicht in einer Produktionsumgebung verwendet werden
  • Es wird davon ausgegangen, dass die Pakete httpd, wget, dbus und audit installiert sind, dass die SELinux-Targeted-Policy verwendet wird und dass SELinux im Enforcing-Modus läuft
Beispiel für einen nicht eingeschränkten Prozess

1. Der Befehl chcon kennzeichnet Dateien neu; solche Label-Änderungen bleiben jedoch nicht erhalten, wenn das Dateisystem neu gekennzeichnet wird

  • Für dauerhafte Änderungen, die eine Neukennzeichnung des Dateisystems überstehen, verwenden Sie das Dienstprogramm semanage, das später behandelt wird

Geben Sie als Root-Benutzer den folgenden Befehl ein, um den Typ auf einen von Samba verwendeten Typ zu ändern

# chcon -t samba_share_t /var/www/html/testfile

Zeigen Sie die Änderungen an

$ ls -Z /var/www/html/testfile
-rw-r--r-- root root unconfined_u:object_r:samba_share_t:s0 /var/www/html/testfile

2. Geben Sie den folgenden Befehl ein, um zu überprüfen, ob der httpd-Prozess nicht läuft

$  systemctl status httpd.service
httpd.service - The Apache HTTP Server
   Loaded: loaded (/usr/lib/systemd/system/httpd.service; disabled)
   Active: inactive (dead)

Geben Sie den folgenden Befehl als Root ein, um den httpd-Prozess zu stoppen:

# systemctl stop httpd.service

3. Damit der httpd-Prozess uneingeschränkt läuft, geben Sie als root den folgenden Befehl ein, um den Typ der Datei /usr/sbin/httpd so zu ändern, dass sie nicht in eine eingeschränkte Domäne wechselt:

# chcon -t bin_t /usr/sbin/httpd

4. Überprüfen Sie, ob /usr/sbin/httpd mit dem Typ bin_t gekennzeichnet ist

ls -Z /usr/sbin/httpd
-rwxr-xr-x root root system_u:object_r:bin_t:s0 /usr/sbin/httpd

5. Starten Sie als root den httpd-Prozess und überprüfen Sie, ob er erfolgreich gestartet wurde

# systemctl start httpd.service

# systemctl status httpd.service
httpd.service - The Apache HTTP Server
   Loaded: loaded (/usr/lib/systemd/system/httpd.service; disabled)
   Active: active (running) since Thu 2013-08-15 11:17:01 CEST; 5s ago

6. Geben Sie den folgenden Befehl ein, um httpd in der Domäne unconfined_service_t anzuzeigen

$ ps -eZ | grep httpd
system_u:system_r:unconfined_service_t:s0 11884 ? 00:00:00 httpd
system_u:system_r:unconfined_service_t:s0 11885 ? 00:00:00 httpd
system_u:system_r:unconfined_service_t:s0 11886 ? 00:00:00 httpd
system_u:system_r:unconfined_service_t:s0 11887 ? 00:00:00 httpd
system_u:system_r:unconfined_service_t:s0 11888 ? 00:00:00 httpd
system_u:system_r:unconfined_service_t:s0 11889 ? 00:00:00 httpd

7. Wechseln Sie in ein Verzeichnis, auf das Ihr Linux-Benutzer Schreibzugriff hat, und geben Sie den folgenden Befehl ein Sofern keine Änderungen an der Standardkonfiguration vorgenommen wurden, wird dieser Befehl erfolgreich ausgeführt

$  wget http://localhost/testfile
--2009-05-07 01:41:10--  http://localhost/testfile
Resolving localhost... 127.0.0.1
Connecting to localhost|127.0.0.1|:80... connected.
HTTP request sent, awaiting response... 200 OK
Length: 0 [text/plain]
Saving to: `testfile'
[ <=>                            ]--.-K/s   in 0s
2009-05-07 01:41:10 (0.00 B/s) - `testfile' saved [0/0]

Obwohl der httpd-Prozess keinen Zugriff auf Dateien hat, die mit dem Typ samba_share_t gekennzeichnet sind, läuft httpd in der uneingeschränkten Domäne unconfined_service_t und greift auf DAC-Regeln zurück, sodass der Befehl wget erfolgreich ist

  • Wäre httpd in der eingeschränkten Domäne httpd_t gelaufen, wäre der Befehl wget fehlgeschlagen

8. Das Dienstprogramm restorecon stellt den Standard-SELinux-Kontext für Dateien wieder her

  • Geben Sie als root den folgenden Befehl ein, um den Standard-SELinux-Kontext für /usr/sbin/httpd wiederherzustellen:
# restorecon -v /usr/sbin/httpd
restorecon reset /usr/sbin/httpd context system_u:object_r:unconfined_exec_t:s0->system_u:object_r:httpd_exec_t:s0

Vergewissern Sie sich, dass /usr/sbin/httpd mit dem Typ httpd_exec_t gekennzeichnet ist:

$ ls -Z /usr/sbin/httpd
-rwxr-xr-x  root root system_u:object_r:httpd_exec_t:s0 /usr/sbin/httpd

9. Geben Sie als root den folgenden Befehl ein, um httpd neu zu starten

Vergewissern Sie sich nach dem Neustart, dass httpd in der eingeschränkten httpd_t-Domäne läuft:

# systemctl restart httpd.service
$ ps -eZ | grep httpd
system_u:system_r:httpd_t:s0    8883 ?        00:00:00 httpd
system_u:system_r:httpd_t:s0    8884 ?        00:00:00 httpd
system_u:system_r:httpd_t:s0    8885 ?        00:00:00 httpd
system_u:system_r:httpd_t:s0    8886 ?        00:00:00 httpd
system_u:system_r:httpd_t:s0    8887 ?        00:00:00 httpd
system_u:system_r:httpd_t:s0    8888 ?        00:00:00 httpd
system_u:system_r:httpd_t:s0    8889 ?        00:00:00 httpd 

10. Entfernen Sie als root die Datei „testfile“

# rm -i /var/www/html/testfile
rm: remove regular empty file `/var/www/html/testfile'? y

11. Wenn httpd nicht laufen muss, geben Sie als root den folgenden Befehl ein, um httpd zu stoppen

# systemctl stop httpd.service

Die Beispiele in diesen Abschnitten zeigen, wie Daten vor einem kompromittierten eingeschränkten Prozess (durch SELinux geschützt) geschützt werden können, sowie wie Daten für einen Angreifer aus einem kompromittierten uneingeschränkten Prozess (nicht durch SELinux geschützt)