Spickzettel fĂŒr Systemadministratoren zu SELinux: 42 Antworten auf wichtige Fragen

Die Übersetzung des Artikels wurde speziell fĂŒr die Studierenden des Kurses erstellt „Linux-Administrator“.

Spickzettel fĂŒr Systemadministratoren zu SELinux: 42 Antworten auf wichtige Fragen

Hier erhalten Sie Antworten auf wichtige Fragen ĂŒber das Leben, das Universum und alles andere in Linux mit verbesserter Sicherheit.

„Eine wichtige Wahrheit ist, dass die Dinge nicht immer das sind, was sie scheinen, ist allgemein bekannt
“

―Douglas Adams, Per Anhalter durch die Galaxis

Sicherheit. Erhöhung der ZuverlĂ€ssigkeit. Compliance. Richtlinien. Die vier Reiter der Apokalypse fĂŒr Systemadministratoren. Neben unseren tĂ€glichen Aufgaben — Überwachung, Backup, Implementierung, Konfiguration, Aktualisierung usw. — sind wir auch fĂŒr die Sicherheit unserer Systeme verantwortlich. Sogar fĂŒr Systeme, bei denen ein externer Anbieter empfiehlt, die verstĂ€rkte Sicherheit zu deaktivieren. Es Ă€hnelt der Arbeit Ethan Hunts aus „Mission: Impossible“.

Angesichts dieses Dilemmas entscheiden sich einige Systemadministratoren fĂŒr die blaue Pille, weil sie denken, dass sie die Antwort auf die große Frage des Lebens, des Universums und allem niemals erfahren werden. Und, wie wir alle wissen, lautet diese Antwort 42.

Im Geiste von „Per Anhalter durch die Galaxis“ sind hier 42 Antworten auf wichtige Fragen zum Management und zur Nutzung SELinux in Ihren Systemen.

1. SELinux ist ein System zur erzwungenen Zugriffskontrolle, was bedeutet, dass jeder Prozess ein Label (label) hat. Jede Datei, jedes Verzeichnis und jedes Systemobjekt hat ebenfalls Labels. Die Richtlinienregeln steuern den Zugriff zwischen markierten Prozessen und Objekten. Der Kernel sorgt dafĂŒr, dass diese Regeln eingehalten werden.

2. Die beiden wichtigsten Konzepte sind: Labeling — Labeling (Dateien, Prozesse, Ports usw.) und Typenzwang (der Prozesse aufgrund von Typen voneinander isoliert).

3. Das richtige Label-Format user:role:type:level (optional).

4. Das Ziel der Bereitstellung von Mehrschichtigkeits-Sicherheit (Multi-Level Security — MLS) besteht darin, Prozesse (DomĂ€nen) basierend auf dem Sicherheitslevel der Daten, die sie verwenden werden, zu verwalten. Beispielsweise kann ein geheimer Prozess keine streng geheimen Daten lesen.

5. Die GewĂ€hrleistung von Mehrkategorischer Sicherheit (Multi-Category Security — MCS) schĂŒtzt Ă€hnliche Prozesse voreinander (z. B. virtuelle Maschinen, OpenShift-Mechanismen, SELinux-Sandboxen, Container usw.).

6. Kernel-Parameter zur Änderung der SELinux-Modi beim Booten:

  • autorelabel=1 → zwingt das System, die Neuauszeichnung durchzufĂŒhren
  • selinux=0 → das Kernel lĂ€dt keine SELinux-Infrastruktur
  • enforcing=0 → startet im permissiven Modus

7. Wenn Sie das gesamte System neu kennzeichnen mĂŒssen:

# touch /.autorelabel
#reboot

Wenn die systemweite Kennzeichnung zahlreiche Fehler enthĂ€lt, mĂŒssen Sie möglicherweise im permissiven Modus starten, damit die Neubezeichnung erfolgreich ist.

8. Um zu ĂŒberprĂŒfen, ob SELinux aktiviert ist: # getenforce

9. Um SELinux vorĂŒbergehend zu aktivieren/deaktivieren: # setenforce [1|0]

10. ÜberprĂŒfung des SELinux-Status: # sestatus

11. Konfigurationsdatei: /etc/selinux/config

12. Wie funktioniert SELinux? Hier ist ein Beispiel fĂŒr die Kennzeichnung eines Webservers Apache:

  • BinĂ€re Darstellung: /usr/sbin/httpd→httpd_exec_t
  • Konfigurationsverzeichnis: /etc/httpd→httpd_config_t
  • Verzeichnis der Protokolldateien: /var/log/httpd → httpd_log_t
  • Inhaltsverzeichnis: /var/www/html → httpd_sys_content_t
  • Startskript: /usr/lib/systemd/system/httpd.service → httpd_unit_file_d
  • Prozess: /usr/sbin/httpd -DFOREGROUND → httpd_t
  • Ports: 80/tcp, 443/tcp → httpd_t, http_port_t

Ein Prozess, der im Kontext httpd_t, lÀuft, kann mit einem Objekt mit dem Label httpd_something_t.

13. interagieren. Viele Befehle akzeptieren das Argument -Z um den Kontext anzuzeigen, zu erstellen und zu Àndern:

  • ls -Z
  • id -Z
  • ps -Z
  • netstat -Z
  • cp -Z
  • mkdir -Z

Kontexte werden gesetzt, wenn Dateien unter BerĂŒcksichtigung des Kontexts ihres ĂŒbergeordneten Verzeichnisses erstellt werden (mit einigen Ausnahmen). RPM kann Kontexte sowohl wĂ€hrend der Installation setzen.

14. Es gibt vier HauptgrĂŒnde fĂŒr SELinux-Fehler, die in den Punkten 15-21 unten ausfĂŒhrlicher beschrieben sind:

  • Kennzeichnungsprobleme
  • Wegen etwas, das SELinux wissen sollte
  • Fehler in der SELinux-Richtlinie/Anwendung
  • Ihre Informationen könnten gefĂ€hrdet sein

15. Kennzeichnungsproblem: Wenn Ihre Dateien in /srv/myweb falsch gekennzeichnet sind, kann der Zugriff verweigert werden. Hier sind einige Möglichkeiten, dies zu beheben:

  • Wenn Sie das Label kennen:
    # semanage fcontext -a -t httpd_sys_content_t '/srv/myweb(/.*)?'
  • Wenn Sie die Datei mit dem entsprechenden Label kennen:
    # semanage fcontext -a -e /srv/myweb /var/www
  • Stellen Sie den Kontext wieder her (in beiden FĂ€llen):
    # restorecon -vR /srv/myweb

16. Kennzeichnungsproblem: Wenn Sie die Datei verschieben, anstatt sie zu kopieren, behĂ€lt die Datei ihren ursprĂŒnglichen Kontext. Um dieses Problem zu beheben:

  • Ändern Sie den Kontextbefehl mit dem Label:
    # chcon -t httpd_system_content_t /var/www/html/index.html
  • Ändern Sie den Kontextbefehl mit dem Verweis-Label:
    # chcon --reference /var/www/html/ /var/www/html/index.html
  • Stellen Sie den Kontext wieder her (in beiden FĂ€llen): # restorecon -vR /var/www/html/

17. Wenn SELinux muss wissen, dass HTTPD den Port 8585 abhört, informieren Sie SELinux:

# semanage port -a -t http_port_t -p tcp 8585

18. SELinux muss wissen logische Werte, die es ermöglichen, Teile der SELinux-Richtlinie zur Laufzeit ohne Kenntnisse ĂŒber das Überschreiben der SELinux-Richtlinie zu Ă€ndern. Wenn Sie möchten, dass httpd E-Mails sendet, geben Sie ein: # setsebool -P httpd_can_sendmail 1

19. SELinux muss wissen logische Werte zum Aktivieren/Deaktivieren von SELinux-Einstellungen:

  • Um alle logischen Werte anzuzeigen: # getsebool -a
  • Um die Beschreibung jedes Wertes anzuzeigen: # semanage boolean -l
  • Um einen logischen Wert festzulegen: # setsebool [_boolean_] [1|0]
  • FĂŒr eine dauerhafte Einstellung fĂŒgen Sie hinzu -P. Zum Beispiel: # setsebool httpd_enable_ftp_server 1 -P

20. Politiken/App SELinux können Fehler enthalten, darunter:

  • Ungewöhnliche Code-Pfade
  • Konfigurationen
  • Umleitung von stdout
  • Dateideskriptor-Lecks
  • AusfĂŒhrbarer Speicher
  • Schlecht gestaltete Bibliotheken

Erstellen Sie Tickets (senden Sie keinen Bericht an Bugzilla; in Bugzilla gibt es kein SLA).

21. Ihre Informationen könnten gefÀhrdet sein, wenn Sie eingeschrÀnkte Domains haben, die versuchen:

  • Kernmodule zu laden
  • Den enforced Modus von SELinux zu deaktivieren
  • In etc_t/shadow_t
  • iptables-Regeln zu Ă€ndern

22. SELinux-Tools zur Entwicklung von Politikmodulen:

# yum -y install setroubleshoot setroubleshoot-server

Starten Sie neu oder starten Sie auditd nach der Installation.

23. Verwenden Sie

journalctl

zum Ausgeben einer Liste aller Protokolle, die mit setroubleshoot:

# journalctl -t setroubleshoot --since=14:20

24. Verwenden Sie journalctl zum Ausgeben einer Liste aller Protokolle, die mit einem bestimmten SELinux-Label verbunden sind. Zum Beispiel:

# journalctl _SELINUX_CONTEXT=system_u:system_r:policykit_t:s0

25. Bei einem SELinux-Fehler verwenden Sie das Protokoll setroubleshoot mit dem Vorschlag mehrerer möglicher Lösungen.
Zum Beispiel aus journalctl:

Jun 14 19:41:07 web1 setroubleshoot: SELinux verhindert, dass httpd auf die Datei /var/www/html/index.html zugreift. FĂŒr vollstĂ€ndige Nachrichten fĂŒhren Sie aus: sealert -l 12fd8b04-0119-4077-a710-2d0e0ee5755e

# sealert -l 12fd8b04-0119-4077-a710-2d0e0ee5755e
SELinux verhindert, dass httpd auf die Datei /var/www/html/index.html zugreift.

***** Plugin restorecon (99,5 % Vertrauen) schlÀgt vor ************************

Wenn Sie das Label reparieren möchten,
Das Standardlabel von /var/www/html/index.html sollte httpd_syscontent_t sein.
Dann können Sie restorecon ausfĂŒhren.
Tun Sie
# /sbin/restorecon -v /var/www/html/index.html

26. Protokollierung: SELinux speichert Informationen an vielen Orten:

  • /var/log/messages
  • /var/log/audit/audit.log
  • /var/lib/setroubleshoot/setroubleshoot_database.xml

27. Protokollierung: Suche nach SELinux-Fehlern im Audit-Protokoll:

# ausearch -m AVC,USER_AVC,SELINUX_ERR -ts today

28. Um SELinux Access Vector Cache (AVC) Nachrichten fĂŒr einen bestimmten Dienst zu finden:

# ausearch -m avc -c httpd

29. Das Tool audit2allow sammelt Informationen aus Protokollen ĂŒber verbotene Operationen und generiert dann SELinux-Berechtigungsregeln. Zum Beispiel:

  • Um eine lesbare Beschreibung des Zugriffsverweigerungsgrundes zu erstellen: # audit2allow -w -a
  • Um die Regel zur Durchsetzung von Typen, die den verbotenen Zugriff erlauben, anzuzeigen: # audit2allow -a
  • Um ein benutzerdefiniertes Modul zu erstellen: # audit2allow -a -M mypolicy
  • Option -M erstellt eine Datei zur Durchsetzung des Typs (.te) mit dem angegebenen Namen und kompiliert die Regel in ein Politikpaket (.pp): mypolicy.pp mypolicy.te
  • Um ein benutzerdefiniertes Modul zu installieren: # semodule -i mypolicy.pp

30. Um einen einzelnen Prozess (Domain) im permissive Modus auszufĂŒhren: # semanage permissive -a httpd_t

31. Wenn Sie nicht mehr möchten, dass die Domain permissive ist: # semanage permissive -d httpd_t

32. Um alle permissiven Domains zu deaktivieren: # semodule -d permissivedomains

33. Aktivierung der MLS-Politik von SELinux: # yum install selinux-policy-mls
in /etc/selinux/config:

SELINUX=permissive
SELINUXTYPE=mls

Stellen Sie sicher, dass SELinux im permissiven Modus funktioniert: # setenforce 0
Verwenden Sie das Skript fixfiles, um sicherzustellen, dass die Dateien beim nÀchsten Neustart neu markiert werden:

# fixfiles -F onboot # reboot

34. Erstellen Sie einen Benutzer mit einem bestimmten MLS-Bereich: # useradd -Z staff_u john

Verwenden Sie den Befehl useradd, ordnen Sie den neuen Benutzer einem vorhandenen SELinux-Benutzer zu (in diesem Fall, staff_u).

35. Um die Übereinstimmung zwischen SELinux- und Linux-Benutzern anzuzeigen: # semanage login -l

36. Bestimmen Sie einen bestimmten Bereich fĂŒr den Benutzer: # semanage login --modify --range s2:c100 john

37. Um das Label im Heimatverzeichnis des Benutzers zu korrigieren (falls erforderlich): # chcon -R -l s2:c100 /home/john

38. Um die aktuellen Kategorien anzuzeigen: # chcat -L

39. Um Kategorien zu Àndern oder eigene zu erstellen, Àndern Sie die Datei wie folgt:

/etc/selinux/_<selinuxtype>_/setrans.conf

40. Um einen Befehl oder ein Skript in einer bestimmten Datei, Rolle und Benutzerkontext auszufĂŒhren:

# runcon -t initrc_t -r system_r -u user_u yourcommandhere

  • -t Dateikontext
  • -r Rollenkontext
  • -u Benutzerkontext

41. Container, die mit deaktiviertem SELinux arbeiten:

  • Podman: # podman run --security-opt label=disable 

  • Docker: # docker run --security-opt label=disable 


42. Wenn Sie dem Container vollen Zugriff auf das System gewĂ€hren mĂŒssen:

  • Podman: # podman run --privileged 

  • Docker: # docker run --privileged 


Und jetzt wissen Sie bereits die Antwort. Also bitte: keine Panik und aktivieren Sie SELinux.

Links:

Quelle: habr.com

60GB SSD 8Gb DDR4