Linux/SELinux/11 Fehlerbehebung/Analyse
Analyse
- 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 „[[Ü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
- Informationen zur Verwendung von audit2allow finden Sie in Abschnitt „Zugriff zulassen: audit2allow“