SELinux-Dateikontexte für Apache unter Linux verwalten

CompTIABeginner
Jetzt üben

Einführung

In diesem Lab lernen Sie, wie Sie SELinux-Dateikontexte verwalten, um sicherzustellen, dass Dienste wie der Apache-Webserver auf die erforderlichen Dateien zugreifen können. Sie werden untersuchen, wie Security-Enhanced Linux (SELinux) Sicherheitslabels, sogenannte Kontexte, auf Dateien anwendet und wie falsch zugewiesene Kontexte zu Zugriffsfehlern führen können – selbst wenn die Standard-Dateiberechtigungen korrekt erscheinen. Diese praxisorientierte Erfahrung soll Ihre Fähigkeiten bei der Fehlerbehebung gängiger Sicherheitsprobleme in einer Linux-Umgebung stärken.

Im Laufe der Schritte werden Sie Apache installieren, sicherstellen, dass SELinux im Modus enforcing ausgeführt wird, und den Standardkontext einer korrekt platzierten Webseite untersuchen. Anschließend werden Sie absichtlich einen „Forbidden“-Fehler auslösen, indem Sie eine Datei mit einem falschen Kontext in das Web-Stammverzeichnis verschieben. Um dieses Problem zu lösen, verwenden Sie den Befehl chcon, um die Datei neu zu labeln. Dies demonstriert eine grundlegende Methode zur Behebung von SELinux-kontextbezogenen Problemen und zur Wiederherstellung der Dienstfunktionalität.

Apache installieren und SELinux-Status prüfen

In diesem Schritt stellen Sie zunächst sicher, dass Ihre Umgebung korrekt konfiguriert ist. Dazu gehört die Überprüfung, ob Security-Enhanced Linux (SELinux), ein kritisches Sicherheitsmodul im Linux-Kernel, im Modus enforcing läuft. Danach installieren Sie den Apache-Webserver, der in diesem Lab dazu dient, die Funktionsweise von SELinux-Kontexten zu demonstrieren.

Prüfen wir zuerst den Status von SELinux. Dies können Sie mit dem Befehl sestatus tun, der eine detaillierte Übersicht liefert, oder mit getenforce für eine kurze Antwort.

Führen Sie getenforce aus, um den aktuellen Modus anzuzeigen:

getenforce

Der Befehl sollte Enforcing zurückgeben, was bedeutet, dass SELinux Ihr System aktiv schützt.

Enforcing

Falls Permissive ausgegeben wird, protokolliert SELinux zwar Warnungen, blockiert aber keine Aktionen. Bei Disabled ist SELinux komplett ausgeschaltet. Für dieses Lab muss der Modus zwingend auf Enforcing stehen. Ihre Lab-Umgebung ist bereits entsprechend vorkonfiguriert.

Als Nächstes installieren Sie den Apache-Webserver, der auf CentOS/RHEL-Systemen unter dem Paketnamen httpd bekannt ist. Verwenden Sie den Paketmanager yum für die Installation. Das Flag -y beantwortet alle Bestätigungsfragen automatisch mit „Ja“.

sudo yum -y install httpd

Sie sehen die Ausgabe, während yum Abhängigkeiten auflöst und die Pakete installiert. Eine erfolgreiche Installation endet mit der Meldung „Complete!“.

...
Installed:
  httpd-2.4.x-xx.el8.x86_64
  ...
Complete!

Nachdem die Installation abgeschlossen ist, müssen Sie den Apache-Dienst starten. Verwenden Sie systemctl, um den Dienst zu verwalten.

sudo systemctl start httpd

Um zu bestätigen, dass der Apache-Dienst ordnungsgemäß läuft, überprüfen Sie seinen Status:

sudo systemctl status httpd

Die Ausgabe sollte zeigen, dass der Dienst active (running) ist.

● httpd.service - The Apache HTTP Server
   Loaded: loaded (/usr/lib/systemd/system/httpd.service; disabled; vendor preset: disabled)
   Active: active (running) since ...
   ...

Drücken Sie q, um die Statusansicht zu verlassen und zur Eingabeaufforderung zurückzukehren. Ihre Umgebung ist nun bereit für die nächsten Schritte.

Webseite erstellen und Standard-SELinux-Kontext prüfen

In diesem Schritt erstellen Sie eine einfache Webseite und stellen diese über den soeben installierten Apache-Server bereit. Dieser Vorgang verdeutlicht, wie SELinux Dateien, die in bestimmten, durch Richtlinien definierten Verzeichnissen erstellt werden, automatisch den korrekten Sicherheitskontext zuweist, sodass Dienste problemlos darauf zugreifen können.

Das Standardverzeichnis für Webinhalte unter Apache ist /var/www/html. Jede Datei, die hier abgelegt wird, sollte über einen Webbrowser zugänglich sein, sofern die Berechtigungen und der SELinux-Kontext korrekt sind.

Erstellen wir eine einfache index.html direkt in /var/www/html. Da dieses Verzeichnis dem Benutzer root gehört, müssen Sie sudo verwenden. Ein normaler sudo echo-Befehl mit Umleitung (>) funktioniert hier nicht, da die Umleitung von Ihrer aktuellen Shell verarbeitet wird, die keine Schreibrechte für dieses Verzeichnis hat. Um dies zu umgehen, führen wir den Befehl in einer Root-Shell mit sudo sh -c '...' aus.

Führen Sie den folgenden Befehl aus, um die Datei zu erstellen:

sudo sh -c 'echo "Welcome to Apache on LabEx" > /var/www/html/index.html'

Überprüfen wir nun, ob der Webserver diese neue Seite aufrufen und ausliefern kann. Dazu nutzen wir curl, ein Befehlszeilenwerkzeug zum Übertragen von Daten via URLs, um die Seite von localhost abzurufen.

curl http://localhost

Sie sollten den Inhalt Ihrer index.html im Terminal sehen, was bestätigt, dass Apache läuft und die Datei lesen kann.

Welcome to Apache on LabEx

Warum hat das so reibungslos funktioniert? Die Antwort liegt im SELinux-Kontext der Datei. Wenn Sie eine Datei erstellen, weist SELinux ihr basierend auf der Richtlinie des übergeordneten Verzeichnisses einen Kontext zu. Lassen Sie uns den Kontext der soeben erstellten index.html mit dem Befehl ls -Z untersuchen. Die Option -Z zeigt den SELinux-Sicherheitskontext an.

ls -Z /var/www/html/index.html

Die Ausgabe wird in etwa so aussehen:

system_u:object_r:httpd_sys_content_t:s0 /var/www/html/index.html

Der wichtigste Teil dieser Ausgabe ist das Kontext-Label: system_u:object_r:httpd_sys_content_t:s0. Dieses Label besteht aus vier Teilen: User:Role:Type:Level. In diesem Lab konzentrieren wir uns auf den Typ (Type), nämlich httpd_sys_content_t.

Die SELinux-Richtlinie für Apache (httpd) erlaubt Prozessen, die mit dem Typ httpd_t laufen, explizit den Zugriff auf Dateien mit dem Label httpd_sys_content_t. Da Sie die Datei direkt in /var/www/html erstellt haben, hat sie den korrekten Standardkontext geerbt, und alles funktionierte wie erwartet.

SELinux-Zugriffssperre durch Verschieben einer Datei provozieren

In diesem Schritt sehen Sie, was passiert, wenn eine Datei mit einem falschen SELinux-Kontext in das Apache-Webverzeichnis verschoben wird. Dies ist ein häufiges Szenario, das oft für Verwirrung sorgt, wenn man nicht weiß, wie SELinux-Kontexte bei Verschiebeoperationen (mv) reagieren. Im Gegensatz zum direkten Erstellen einer Datei in einem Verzeichnis (wobei der Kontext des Elternverzeichnisses geerbt wird), bleibt beim Verschieben einer Datei ihr ursprünglicher Kontext erhalten.

Erstellen wir zunächst eine neue Webseite namens page2.html in Ihrem aktuellen Arbeitsverzeichnis ~/project.

echo "This is Page 2" > page2.html

Prüfen Sie nun den SELinux-Kontext dieser neuen Datei. Da sie in Ihrem Home-Projektverzeichnis erstellt wurde, erhält sie einen Standardkontext für Benutzerdateien.

ls -Z page2.html

Die Ausgabe zeigt einen Kontext-Typ wie user_home_t oder ähnlich an, was der Standard für Dateien im Home-Verzeichnis eines Benutzers ist.

system_u:object_r:user_home_t:s0 page2.html

Beachten Sie den Typ user_home_t. Dieser unterscheidet sich von httpd_sys_content_t, auf den Apache zugreifen darf.

Verschieben Sie diese Datei nun mit dem Befehl mv in das Web-Stammverzeichnis von Apache. Sie benötigen dafür sudo, da das Zielverzeichnis /var/www/html dem Benutzer root gehört.

sudo mv page2.html /var/www/html/

Der Befehl mv behält den SELinux-Kontext der Quelldatei bei. Überprüfen wir dies, indem wir den Kontext der Datei an ihrem neuen Speicherort kontrollieren.

ls -Z /var/www/html/page2.html

Wie Sie sehen können, hat sich der Kontext nicht geändert. Er lautet immer noch user_home_t, obwohl sich die Datei jetzt im Verzeichnis /var/www/html befindet.

system_u:object_r:user_home_t:s0 /var/www/html/page2.html

Versuchen Sie nun, mit curl auf diese neue Seite zuzugreifen. SELinux wird den Zugriff aufgrund des falschen Kontexts blockieren.

curl http://localhost/page2.html

Sie erhalten vom Server die Fehlermeldung „403 Forbidden“. Dies ist kein herkömmliches Problem mit Dateiberechtigungen; es ist SELinux, das seine Sicherheitsrichtlinie durchsetzt und dem httpd-Prozess verbietet, eine Datei mit dem Label user_home_t zu lesen.

<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
<html><head>
<title>403 Forbidden</title>
</head><body>
<h1>Forbidden</h1>
<p>You don't have permission to access /page2.html
on this server.</p>
</body></html>

Dies verdeutlicht ein klassisches SELinux-Problem. Im nächsten Schritt lernen Sie, wie Sie dies beheben, indem Sie den Kontext der Datei ändern.

Dateikontext mit chcon korrigieren und Zugriff prüfen

In diesem Schritt beheben Sie den „403 Forbidden“-Fehler aus dem vorherigen Schritt, indem Sie den SELinux-Kontext der Datei page2.html manuell ändern. Dazu verwenden Sie den Befehl chcon (change context), ein mächtiges Werkzeug zum Modifizieren des Sicherheitskontexts von Dateien und Verzeichnissen.

Mit dem Befehl chcon können Sie User, Role, Type oder Level eines SELinux-Kontexts direkt ändern. Für diese Übung müssen wir nur den Typ anpassen. Der korrekte Typ für Webinhalte, die Apache lesen darf, ist httpd_sys_content_t.

Um das Problem zu lösen, verwenden Sie chcon mit dem Flag -t, um den neuen Typ für page2.html festzulegen. Da sich die Datei in /var/www/html befindet, müssen Sie sudo verwenden.

Führen Sie den folgenden Befehl aus, um den SELinux-Typ von page2.html zu aktualisieren:

sudo chcon -t httpd_sys_content_t /var/www/html/page2.html

Nachdem Sie den Befehl ausgeführt haben, prüfen wir, ob der Kontext aktualisiert wurde. Nutzen Sie erneut ls -Z, um den Sicherheitskontext der Datei zu inspizieren.

ls -Z /var/www/html/page2.html

Die Ausgabe sollte nun zeigen, dass der Typ von user_home_t zu httpd_sys_content_t geändert wurde.

system_u:object_r:httpd_sys_content_t:s0 /var/www/html/page2.html

Mit dem korrekten SELinux-Kontext sollte Apache nun in der Lage sein, auf die Datei zuzugreifen und sie auszuliefern. Testen wir dies mit einem erneuten Aufruf über curl.

curl http://localhost/page2.html

Diesmal sollte der Befehl erfolgreich sein, und der Inhalt Ihrer Webseite wird im Terminal ausgegeben.

This is Page 2

Sie haben erfolgreich ein SELinux-bezogenes Zugriffsproblem diagnostiziert und behoben. Sie haben gelernt, dass das Verschieben von Dateien deren ursprünglichen Kontext beibehält und dass chcon verwendet werden kann, um den Kontext manuell an die Sicherheitsrichtlinie anzupassen, wodurch Diensten wie Apache der Zugriff gewährt wird. Wichtig zu wissen: Änderungen mit chcon bleiben bei einer vollständigen Neu-Labelung des Dateisystems (Relabeling) eventuell nicht erhalten; normalerweise wird der Befehl restorecon verwendet, um den in der Richtlinie definierten Standardkontext wiederherzustellen.

Zusammenfassung

In diesem Lab haben Sie gelernt, wie Sie SELinux-Dateikontexte für den Apache-Webserver verwalten. Sie haben zunächst überprüft, ob SELinux im Modus Enforcing läuft, und anschließend den httpd-Dienst installiert und gestartet. Sie konnten beobachten, dass Dateien, die direkt im Web-Stammverzeichnis von Apache (/var/www/html) erstellt werden, automatisch den korrekten Kontext httpd_sys_content_t erhalten, der für den ordnungsgemäßen Zugriff durch Apache erforderlich ist.

Der Kern des Labs verdeutlichte die Folgen falscher Dateikontexte. Durch das Verschieben einer Datei aus einem Benutzer-Home-Verzeichnis (mit dem Kontext user_home_t) in das Web-Stammverzeichnis haben Sie eine SELinux-Zugriffssperre ausgelöst, die zu einem „403 Forbidden“-Fehler führte. Anschließend haben Sie gelernt, dieses Problem zu lösen, indem Sie mit dem Befehl chcon den Kontext der Datei manuell auf den korrekten Typ httpd_sys_content_t geändert haben. Dies stellte den Zugriff erfolgreich wieder her und unterstrich das Prinzip, dass korrekte Dateikontexte unter einer aktiven SELinux-Richtlinie für das Funktionieren von Diensten unerlässlich sind.