GNU/Linux >> LINUX-Kenntnisse >  >> Linux

Ein Leitfaden für Systemadministratoren zu SELinux:42 Antworten auf die großen Fragen

„Es ist eine wichtige und beliebte Tatsache, dass die Dinge nicht immer so sind, wie sie scheinen …“

―Douglas Adams, Per Anhalter durch die Galaxis

Sicherheit. Härten. Konformität. Politik. Die vier Reiter der SysAdmin-Apokalypse. Neben unseren täglichen Aufgaben – Überwachung, Sicherung, Implementierung, Optimierung, Aktualisierung usw. – sind wir auch für die Sicherung unserer Systeme zuständig. Sogar die Systeme, bei denen der Drittanbieter uns anweist, die erweiterte Sicherheit zu deaktivieren. Es scheint ein Job für Mission Impossible zu sein von Ethan Hunt.

Angesichts dieses Dilemmas entscheiden sich einige Systemadministratoren, die blaue Pille zu nehmen, weil sie glauben, dass sie die Antwort auf die große Frage des Lebens, des Universums und allem anderen nie erfahren werden. Und wie wir alle wissen, lautet diese Antwort 42 .

Ganz im Sinne von Per Anhalter durch die Galaxis , hier sind die 42 Antworten auf die großen Fragen zur Verwaltung und Verwendung von SELinux mit Ihren Systemen.

  1. SELinux ist ein LABELING-System, was bedeutet, dass jeder Prozess ein LABEL hat. Jede Datei, jedes Verzeichnis und jedes Systemobjekt hat ein LABEL. Richtlinienregeln steuern den Zugriff zwischen gekennzeichneten Prozessen und gekennzeichneten Objekten. Der Kernel erzwingt diese Regeln.
  1. Die zwei wichtigsten Konzepte sind:Kennzeichnung (Dateien, Prozesse, Ports usw.) und Type Enforcement (die Prozesse basierend auf Typen voneinander isoliert).
  1. Das richtige Bezeichnungsformat ist user:role:type:level (optional ).
  1. Der Zweck der Durchsetzung von Multi-Level Security (MLS) ist die Steuerung von Prozessen (Domänen ) basierend auf der Sicherheitsstufe der Daten, die sie verwenden werden. Beispielsweise kann ein geheimer Prozess keine streng geheimen Daten lesen.
  1. Durchsetzung von Multi-Category Security (MCS) schützt ähnliche Prozesse voreinander (wie virtuelle Maschinen, OpenShift-Getriebe, SELinux-Sandboxen, Container usw.).
  1. Kernel-Parameter zum Ändern der SELinux-Modi beim Booten:
    • autorelabel=1 → zwingt das System zur Umbenennung
    • selinux=0 → Kernel lädt keinen Teil der SELinux-Infrastruktur
    • enforcing=0 → Booten Sie im zulässigen Modus
  1. Wenn Sie das gesamte System neu benennen müssen:
    # touch /.autorelabel
    # reboot

    Wenn die Systemkennzeichnung eine große Anzahl von Fehlern enthält, müssen Sie möglicherweise im zulässigen Modus booten, damit die automatische Neukennzeichnung erfolgreich ist.

  1. So überprüfen Sie, ob SELinux aktiviert ist:

    # getenforce
  1. So aktivieren/deaktivieren Sie SELinux vorübergehend:

    # setenforce [1|0]
  1. SELinux-Statustool:

    # sestatus
  1. Konfigurationsdatei:

    /etc/selinux/config
  1. Wie funktioniert SELinux? Hier ist ein Beispiel für die Bezeichnung eines Apache-Webservers:
    • Binär:/usr/sbin/httpdhttpd_exec_t
    • Konfigurationsverzeichnis:/etc/httpdhttpd_config_t
    • Protokolldateiverzeichnis:/var/log/httpdhttpd_log_t
    • Inhaltsverzeichnis:/var/www/htmlhttpd_sys_content_t
    • Startskript:/usr/lib/systemd/system/httpd.servicehttpd_unit_file_d
    • Prozess:/usr/sbin/httpd -DFOREGROUNDhttpd_t
    • Ports:80/tcp, 443/tcphttpd_t, http_port_t

Ein Prozess, der im httpd_t läuft Kontext kann mit einem Objekt mit dem httpd_something_t interagieren Bezeichnung.

  1. Viele Befehle akzeptieren das Argument -Z Kontext anzeigen, erstellen und ändern:
    • ls -Z
    • id -Z
    • ps -Z
    • netstat -Z
    • cp -Z
    • mkdir -Z

Kontexte werden festgelegt, wenn Dateien basierend auf dem Kontext ihres übergeordneten Verzeichnisses erstellt werden (mit wenigen Ausnahmen). RPMs können Kontexte als Teil der Installation setzen.

  1. Es gibt vier Hauptursachen für SELinux-Fehler, die weiter unten in den Punkten 15-21 erklärt werden:
    • Etikettierungsprobleme
    • Etwas, was SELinux wissen muss
    • Ein Fehler in einer SELinux-Richtlinie/App
    • Ihre Daten könnten kompromittiert sein
  1. Etikettierungsproblem: Wenn Ihre Dateien in /srv/myweb nicht richtig beschriftet 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 der entsprechenden Bezeichnung kennen:

      # semanage fcontext -a -e /srv/myweb /var/www
    • Kontext wiederherstellen (für beide Fälle):

      # restorecon -vR /srv/myweb
  1. Etikettierungsproblem: Wenn Sie eine Datei verschieben, anstatt sie zu kopieren, behält die Datei ihren ursprünglichen Kontext. So beheben Sie diese Probleme:
    • Ändern Sie den Kontextbefehl mit dem Label:

      $ sudo chcon -t httpd_system_content_t /var/www/html/index.html
    • Ändern Sie den Kontextbefehl mit dem Referenzlabel:

      $ sudo chcon --reference /var/www/html/ /var/www/html/index.html
    • Stellen Sie den Kontext wieder her (für beide Fälle):

      $ sudo restorecon -vR /var/www/html/
  1. Wenn SELinux es wissen muss HTTPD lauscht auf Port 8585, sag SELinux:

    $ sudo semanage port -a -t http_port_t -p tcp 8585
  1. SELinux muss es wissen Boolesche Werte ermöglichen das Ändern von Teilen der SELinux-Richtlinie zur Laufzeit ohne Kenntnis des Schreibens der SELinux-Richtlinie. Wenn Sie beispielsweise möchten, dass httpd E-Mails sendet, geben Sie Folgendes ein:

    $ sudo setsebool -P httpd_can_sendmail 1
  1. SELinux muss es wissen Boolesche Werte sind nur Ein-/Aus-Einstellungen für SELinux:
    • Um alle booleschen Werte zu sehen:# getsebool -a
    • Um die Beschreibung von jedem zu sehen:# semanage boolean -l
    • Um einen booleschen Wert festzulegen, führen Sie Folgendes aus:# setsebool [_boolean_] [1|0]
    • Um es dauerhaft zu konfigurieren, fügen Sie -P hinzu . Beispiel:

      # setsebool httpd_enable_ftp_server 1 -P
  1. SELinux-Richtlinien/Apps können Fehler enthalten, einschließlich:
    • Ungewöhnliche Codepfade
    • Konfigurationen
    • Umleitung von stdout
    • Durchgesickerte Dateideskriptoren
    • Ausführbarer Speicher
    • Schlecht gebaute Bibliotheken
  1. Ihre Daten könnten kompromittiert sein Wenn Sie eingeschränkte Domänen haben, versuchen Sie Folgendes:
    • Kernel-Module laden
    • Schalten Sie den Erzwingungsmodus von SELinux aus
    • Schreiben Sie nach etc_t/shadow_t
    • IPtables-Regeln ändern
  1. SELinux-Tools für die Entwicklung von Richtlinienmodulen:
    $ yum -y install setroubleshoot setroubleshoot-server

    auditd neu starten oder neu starten nach der Installation.

  1. Verwenden Sie journalctl zum Auflisten aller Protokolle im Zusammenhang mit setroubleshoot :
    $ sudo journalctl -t setroubleshoot --since=14:20

  1. Verwenden Sie journalctl zum Auflisten aller Protokolle, die sich auf ein bestimmtes SELinux-Label beziehen. Beispiel:
    $ sudo journalctl _SELINUX_CONTEXT=system_u:system_r:policykit_t:s0
  1. Verwenden Sie setroubleshoot protokollieren, wenn ein SELinux-Fehler auftritt, und einige mögliche Lösungen vorschlagen. Zum Beispiel von journalctl :

    Jun 14 19:41:07 web1 setroubleshoot: SELinux is preventing httpd from getattr access on the file /var/www/html/index.html. For complete message run: sealert -l 12fd8b04-0119-4077-a710-2d0e0ee5755e

    # sealert -l 12fd8b04-0119-4077-a710-2d0e0ee5755e
    SELinux is preventing httpd from getattr access on the file /var/www/html/index.html.

    ***** Plugin restorecon (99.5 confidence) suggests ************************

    If you want to fix the label,
    /var/www/html/index.html default label should be httpd_syscontent_t.
    Then you can restorecon.
    Do
    # /sbin/restorecon -v /var/www/html/index.html
  1. Protokollierung:SELinux zeichnet überall Informationen auf:
    • /var/log/messages
    • /var/log/audit/audit.log
    • /var/lib/setroubleshoot/setroubleshoot_database.xml
  1. Protokollierung:Suche nach SELinux-Fehlern im Prüfprotokoll:

    $ sudo ausearch -m AVC,USER_AVC,SELINUX_ERR -ts today
  1. So suchen Sie nach SELinux Access Vector Cache (AVC)-Nachrichten für einen bestimmten Dienst:

    $ sudo ausearch -m avc -c httpd
  1. Der audit2allow sammelt Informationen aus Protokollen verweigerter Operationen und generiert dann SELinux-Richtlinien-Zulassungsregeln. Zum Beispiel:
    • Um eine für Menschen lesbare Beschreibung zu erstellen, warum der Zugriff verweigert wurde:# audit2allow -w -a
    • So zeigen Sie die Art der Erzwingungsregel an, die den verweigerten Zugriff zulässt:# audit2allow -a
    • So erstellen Sie ein benutzerdefiniertes Modul:# audit2allow -a -M mypolicy

      Das -M Option erstellt eine Type Enforcement-Datei (.te) mit dem angegebenen Namen und kompiliert die Regel in ein Richtlinienpaket (.pp):mypolicy.pp mypolicy.te
    • So installieren Sie das benutzerdefinierte Modul:# semodule -i mypolicy.pp
  1. Um einen einzelnen Prozess (Domäne) für die Ausführung permissive zu konfigurieren:# semanage permissive -a httpd_t
  1. Wenn Sie nicht mehr möchten, dass eine Domain permissive ist:# semanage permissive -d httpd_t
  1. So deaktivieren Sie alle zulässigen Domänen:

    $ sudo semodule -d permissivedomains
  1. Aktivieren der SELinux MLS-Richtlinie:

    $ sudo yum install selinux-policy-mls

    In /etc/selinux/config:

    SELINUX=permissive
    SELINUXTYPE=mls

    Stellen Sie sicher, dass SELinux im zulässigen Modus ausgeführt wird:

    $ sudo setenforce 0

    Verwenden Sie die fixfiles Skript, um sicherzustellen, dass Dateien beim nächsten Neustart umbenannt werden:

    $ sudo fixfiles -F onboot
    $ sudo reboot
  1. Erstellen Sie einen Benutzer mit einem bestimmten MLS-Bereich:

    $ sudo useradd -Z staff_u tux

    Mit dem useradd ordnen Sie den neuen Benutzer einem bestehenden SELinux-Benutzer zu (in diesem Fall staff_u ).

  1. So zeigen Sie die Zuordnung zwischen SELinux- und Linux-Benutzern an:

    $ sudo semanage login -l
  1. Definieren Sie einen bestimmten Bereich für einen Benutzer:

    $ sudo semanage login --modify --range s2:c100 tux
  • So korrigieren Sie das Label im Home-Verzeichnis des Benutzers (falls erforderlich):

    $ sudo chcon -R -l s2:c100 /home/tux
    1. So listen Sie die aktuellen Kategorien auf:

      $ sudo chcat -L
    1. Um die Kategorien zu ändern oder eigene zu erstellen, ändern Sie die Datei wie folgt:

      /etc/selinux/_<selinuxtype>_/setrans.conf
    1. So führen Sie einen Befehl oder ein Skript in einer bestimmten Datei, Rolle und im Benutzerkontext aus:

      $ sudo runcon -t initrc_t -r system_r -u user_u yourcommandhere
      • -t ist der Dateikontext
      • -r ist der Rollenkontext
      • -u ist der Benutzerkontext
    1. Container, die mit deaktiviertem SELinux ausgeführt werden:
      • Mit Podman:# podman run --security-opt label=disable …
      • Mit Docker:# docker run --security-opt label=disable …
    1. Wenn Sie einem Container vollen Zugriff auf das System geben müssen:
      • Mit Podman:# podman run --privileged …
      • Mit Docker:# docker run --privileged …

    Und damit kennen Sie bereits die Antwort. Also bitte: Keine Panik und schalten Sie SELinux ein .

    Quellen:

    • SELinux von Dan Walsh
    • Ihre visuelle Anleitung zur Durchsetzung von SELinux-Richtlinien, ebenfalls von Dan Walsh
    • Sicherheitsoptimiertes Linux für Normalsterbliche von Thomas Cameron
    • Das SELinux-Malbuch von Máirín Duffy
    • SELinux Benutzer- und Administratorhandbuch – Red Hat Enterprise Linux 7

    Linux
    1. Einführung in den Leitfaden zur Kommunikation zwischen Prozessen in Linux

    2. Ein praktischer Spickzettel eines Systemadministrators für SELinux

    3. Top 30 Fragen und Antworten zu OpenStack-Interviews

    4. 20 Postfix-Interviewfragen und -antworten

    5. Eine Anleitung für Systemadministratoren zur Konfiguration eines E-Mail-Servers

    Ansible Guide:Das Ad-hoc-Kommando

    Ein Leitfaden für Systemadministratoren zu grundlegenden Kubernetes-Komponenten

    Die ultimative Anleitung zur Bildbearbeitung mit ImageMagick

    Die vollständige Anleitung zur Installation von MySQL auf Ubuntu

    Cronjob - Der vollständige Leitfaden für Cronjobs

    Die 50 am häufigsten gestellten Fragen und Antworten zu Linux-Interviews