Zum Inhalt springen

Linux/SELinux/11 Fehlerbehebung/Analyse

Aus Foxwiki
Version vom 31. März 2026, 11:35 Uhr von Dirkwagner (Diskussion | Beiträge)
(Unterschied) ← Nächstältere Version | Aktuelle Version (Unterschied) | Nächstjüngere Version → (Unterschied)

Linux/SELinux/11 Fehlerbehebung/Analyse

Beschreibung

Häufige Ursachen für Probleme
  • Probleme mit dem Labeling
  • Konfiguration von Booleans und Ports für Dienste
  • Weiterentwickelnde SELinux-Regeln

Labeling

Probleme mit dem Labeling

Auf Systemen, auf denen SELinux läuft, werden alle Prozesse und Dateien mit einem Label versehen, das sicherheitsrelevante Informationen enthält

  • Diese Informationen werden als SELinux-Kontext bezeichnet
  • Wenn diese Labels falsch sind, kann der Zugriff verweigert werden
  • Eine falsch gekennzeichnete Anwendung kann dazu führen, dass ihrem Prozess ein falsches Label zugewiesen wird
  • Dies kann dazu führen, dass SELinux den Zugriff verweigert und der Prozess falsch gekennzeichnete Dateien erstellt

Eine häufige Ursache für Probleme mit der Kennzeichnung ist die Verwendung eines nicht standardmäßigen Verzeichnisses für einen Dienst

  • Anstatt beispielsweise /var/www/html/ für eine Website zu verwenden, möchte ein Administrator '
/srv/myweb/ verwenden
  • Unter Red Hat Enterprise Linux ist das Verzeichnis /srv mit dem Typ var_t gekennzeichnet
  • In /srv erstellte Dateien und Verzeichnisse erben diesen Typ
  • Außerdem können neu erstellte Objekte in Verzeichnissen der obersten Ebene (wie z
  • B. /myserver) mit dem Typ default_t gekennzeichnet sein
  • SELinux verhindert, dass der Apache-HTTP-Server (httpd) auf beide dieser Typen zugreifen kann

Um den Zugriff zu ermöglichen, muss SELinux wissen, dass die Dateien in /srv/myweb/ für httpd zugänglich sein sollen:

sudo semanage fcontext -a -t httpd_sys_content_t „/srv/myweb(/.*)?“

Dieser semanage Befehl fügt den Kontext für das Verzeichnis /srv/myweb/ (und alle darunter liegenden Dateien und Verzeichnisse) zur SELinux-Dateikontextkonfiguration hinzu[8]

  • Das Dienstprogramm semanage ändert den Kontext nicht

Führen Sie als root das Dienstprogramm restorecon aus, um die Änderungen zu übernehmen:

sudo restorecon -R -v /srv/myweb

Weitere Informationen zum Hinzufügen von Kontexten zur Dateikontextskonfiguration finden Sie im Abschnitt „Persistente Änderungen: semanage fcontext

Was ist der richtige Kontext?

Das Dienstprogramm matchpathcon überprüft den Kontext eines Dateipfads und vergleicht ihn mit der Standard-Label für diesen Pfad

Das folgende Beispiel zeigt die Verwendung von matchpathcon für ein Verzeichnis, das falsch gelabelte Dateien enthält:

matchpathcon -V /var/www/html/*

/var/www/html/index.html hat den Kontext unconfined_u:object_r:user_home_t:s0, sollte system_u:object_r:httpd_sys_content_t:s0 sein

/ var/www/html/page1.html hat den Kontext unconfined_u:object_r:user_home_t:s0, sollte system_u:object_r:httpd_sys_content_t:s0 sein

In diesem Beispiel sind die Dateien index.html und page1.html mit dem Typ user_home_t gekennzeichnet

  • Dieser Typ wird für Dateien in Benutzer-Home-Verzeichnissen verwendet
  • Die Verwendung des Befehls mv zum Verschieben von Dateien aus Ihrem Home-Verzeichnis kann dazu führen, dass Dateien mit dem Typ user_home_t gekennzeichnet werden
  • Dieser Typ sollte außerhalb von Home-Verzeichnissen nicht vorkommen
  • Verwenden Sie das Dienstprogramm restorecon, um solche Dateien wieder auf ihren korrekten Typ zurückzusetzen:
sudo restorecon -v /var/www/html/ index.html
restorecon reset /var/www/html/index.html context unconfined_u:object_r:user_home_t:s0->system_u:object_r:httpd_sys_content_t:s0

Um den Kontext für alle Dateien in einem Verzeichnis wiederherzustellen, verwenden Sie die Option -R

sudo restorecon -R -v /var/www/html/
restorecon reset /var/www/html/page1.html context unconfined_u:object_r:samba_share_t:s0->system_u:object_r:httpd_sys_content_t:s0
restorecon reset /var/www/html/
index.html context unconfined_u:object_r:samba_share_t:s0->system_u:object_r:httpd_sys_content_t:s0

Siehe Abschnitt&nbsp„[[Überprüfen des Standard-SELinux-Kontexts] ]“ für ein detaillierteres Beispiel zu matchpathcon

Wie werden eingeschränkte Dienste ausgeführt?

Dienste können auf verschiedene Arten ausgeführt werden

  • Um dies zu berücksichtigen, müssen Sie angeben, wie Sie Ihre Dienste ausführen
  • Dies kann durch Boolesche Werte erreicht werden, die es ermöglichen, Teile der SELinux-Richtlinie zur Laufzeit zu ändern, ohne Kenntnisse im Schreiben von SELinux-Richtlinien zu benötigen
  • Dies ermöglicht Änderungen, wie das Zulassen des Zugriffs von Diensten auf NFS-Volumes, ohne die SELinux-Richtlinie neu laden oder neu kompilieren zu müssen
  • Auch das Ausführen von Diensten auf nicht standardmäßigen Portnummern erfordert eine Aktualisierung der Richtlinienkonfiguration mithilfe des Befehls semanage

Um beispielsweise dem Apache-HTTP-Server die Kommunikation mit MariaDB zu ermöglichen, aktivieren Sie den Booleschen Wert httpd_can_network_connect_db :

sudo setsebool -P httpd_can_network_connect_db on

Wenn der Zugriff für einen bestimmten Dienst verweigert wird, verwenden Sie die Dienstprogramme getsebool und grep, um zu prüfen, ob Booleane verfügbar sind, die den Zugriff ermöglichen

Verwenden Sie beispielsweise den Befehl getsebool -a | grep ftp, um nach FTP-bezogenen Booleanen zu suchen:

getsebool -a | grep ftp
ftpd_anon_write --> off

ftpd_full_access --> off

ftpd_use_cifs --> off
ftpd_use_nfs --> off
ftpd_connect_db --> off
httpd_enable_ftp_server --> off
tftp_anon_write --> off

Um eine Liste der Booleans und deren Status (aktiv oder inaktiv) anzuzeigen, führen Sie den Befehl getsebool -a aus

  • Um eine Liste der Booleschen Werte, eine Erklärung zu deren Bedeutung sowie Angaben dazu zu erhalten, ob sie aktiviert oder deaktiviert sind, führen Sie als Root den Befehl semanage boolean -l aus
  • Informationen zum Auflisten und Konfigurieren von Booleschen Werten finden Sie in Abschnitt 4.6, „Boolesche Werte“

Portnummern

Je nach Richtlinienkonfiguration dürfen Dienste möglicherweise nur auf bestimmten Portnummern ausgeführt werden

  • Der Versuch, den Port zu ändern, auf dem ein Dienst läuft, ohne die Richtlinie zu ändern, kann dazu führen, dass der Dienst nicht gestartet werden kann

Führen Sie beispielsweise als Root den Befehl semanage port -l | grep http aus, um httpbezogene Ports aufzulisten:

sudo semanage port -l | grep http
http_cache_port_t tcp 3128, 8080, 8118
http_cache_port_t udp 3130
http_port_t tcp 80, 443, 488, 8008, 8009, 8443
pegasus_http_port_t tcp 5988
pegasus_https_port_t tcp 5989

Der Porttyp http_port_t definiert die Ports, auf denen der Apache-HTTP-Server lauschen kann; in diesem Fall sind dies die TCP-Ports 80, 443, 488, 8008, 8009 und 8443

Wenn ein Administrator die Datei httpd.conf so konfiguriert, dass httpd auf Port 9876 (Listen 9876), die Richtlinie jedoch nicht entsprechend aktualisiert wird, schlägt der folgende Befehl fehl:

sudo systemctl start httpd.service
Der Job für httpd.service ist fehlgeschlagen. Siehe ‚systemctl status httpd.service‘ und ‚journalctl -xn‘ für Details
sudo systemctl status httpd.service
httpd.service – Der Apache-HTTP-Server
  Geladen: geladen (/usr/lib/systemd/system/httpd.service; deaktiviert)
  Aktiv: fehlgeschlagen (Ergebnis: Exit-Code) seit Do 15.08.2013 09:57:05 MESZ; vor 59 s
 Prozess: 16874 ExecStop=/usr/sbin/httpd $OPTIONS -k graceful-stop (code=exited, status=0/SUCCESS)
 Prozess: 16870 ExecStart=/usr/sbin/httpd $OPTIONS -DFOREGROUND (code=exited, status=1/FAILURE)

Eine SELinux-Ablehnungsmeldung ähnlich der folgenden wird in /var/log/audit/audit.log protokolliert:

type=AVC msg=audit(1225948455.061:294): avc: denied { name_bind } for pid=4997 comm="httpd" src=9876 scontext=unconfined_u:system_r:httpd_t:s0 tcontext=system_u:object_r:port_t:s0 tclass=tcp_socket

Um httpd zu erlauben, auf einem Port zu lauschen, der nicht für den Porttyp http_port_t aufgeführt ist, geben Sie den Befehl semanage port ein, um einen Port zur Richtlinienkonfiguration hinzuzufügen[9]:

sudo semanage port -a -t http_port_t -p tcp 9876

Die Option -a fügt einen neuen Eintrag hinzu; die Option -t definiert einen Typ; und die Option -p definiert ein Protokoll

  • Das letzte Argument ist die hinzuzufügende Portnummer

Regeln und Anwendungen

Sich weiterentwickelnde Regeln und fehlerhafte Anwendungen

Anwendungen können fehlerhaft sein, was dazu führt, dass SELinux den Zugriff verweigert

  • Außerdem entwickeln sich die SELinux-Regeln weiter – SELinux hat möglicherweise noch nie eine Anwendung gesehen, die auf eine bestimmte Weise läuft, was dazu führen kann, dass der Zugriff verweigert wird, obwohl die Anwendung wie erwartet funktioniert
  • Wenn etwa eine neue Version von PostgreSQL veröffentlicht wird, führt diese möglicherweise Aktionen aus, die die aktuelle Richtlinie noch nicht kennt, was dazu führt, dass der Zugriff verweigert wird, obwohl er eigentlich erlaubt sein sollte

Verwenden Sie in solchen Situationen nach einer Zugriffsverweigerung das Dienstprogramm audit2allow, um ein benutzerdefiniertes Richtlinienmodul zu erstellen, das den Zugriff erlaubt