SELinux-Dateikontexte für Apache unter Linux verwalten

CompTIACompTIABeginner
Jetzt üben

💡 Dieser Artikel wurde von AI-Assistenten übersetzt. Um die englische Version anzuzeigen, können Sie hier klicken

Einleitung

In diesem Labor lernen Sie, wie Sie SELinux-Dateikontexte verwalten, um sicherzustellen, dass Dienste wie der Apache-Webserver auf notwendige Dateien zugreifen können. Sie werden untersuchen, wie Security-Enhanced Linux (SELinux) Sicherheitslabels, bekannt als Kontexte, auf Dateien anwendet und wie falsch zugeordnete Kontexte zu Zugriffsverweigerungsfehlern führen können, selbst wenn die Standard-Dateiberechtigungen korrekt erscheinen. Diese praktische Übung soll Ihre praktischen Fähigkeiten bei der Fehlerbehebung gängiger Sicherheitsprobleme in einer Linux-Umgebung aufbauen.

In den folgenden Schritten installieren Sie Apache, überprüfen, ob SELinux im enforcing-Modus ist, und beobachten den Standardkontext einer korrekt platzierten Webseite. Anschließend werden Sie absichtlich einen "Forbidden"-Fehler auslösen, indem Sie eine Datei mit einem falschen Kontext in das Web-Root-Verzeichnis verschieben. Zur Behebung dieses Problems verwenden Sie den Befehl chcon, um die Datei neu zu labeln, und demonstrieren damit eine grundlegende Methode zur Behebung von SELinux-Kontext-bezogenen Problemen und zur Wiederherstellung der Servicefunktionalität.

Apache installieren und SELinux auf Enforcing überprü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 enforcing-Modus läuft. Anschließend installieren Sie den Apache-Webserver, der in diesem Labor verwendet wird, um zu demonstrieren, wie SELinux-Kontexte funktionieren.

Zuerst überprüfen wir den Status von SELinux. Dies können Sie mit dem Befehl sestatus tun, der eine detaillierte Übersicht liefert, oder mit dem Befehl getenforce für eine direkte 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

Wenn er Permissive zurückgibt, protokolliert SELinux Warnungen, blockiert aber keine Aktionen. Wenn er Disabled zurückgibt, ist SELinux vollständig deaktiviert. Für dieses Labor muss er Enforcing sein. Ihre Laborumgebung ist vorkonfiguriert, um im Enforcing-Modus zu sein.

Als Nächstes installieren Sie den Apache-Webserver, der auf CentOS/RHEL-Systemen unter dem Paketnamen httpd bekannt ist. Verwenden Sie den Paketmanager yum zur Installation. Das Flag -y beantwortet automatisch alle Bestätigungsaufforderungen mit "yes".

sudo yum -y install httpd

Sie sehen Ausgaben, 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!

Nach Abschluss der Installation müssen Sie den Apache-Dienst starten, damit er läuft. Verwenden Sie systemctl zur Verwaltung des Dienstes.

sudo systemctl start httpd

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

sudo systemctl status httpd

Die Ausgabe sollte anzeigen, 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 für die nächsten Schritte bereit.

Eine Webseite erstellen und ihren Standard-SELinux-Kontext überprüfen

In diesem Schritt erstellen Sie eine einfache Webseite und stellen sie mit dem gerade installierten Apache-Server bereit. Dieser Prozess wird demonstrieren, wie SELinux Dateien, die in bestimmten, durch Richtlinien definierten Verzeichnissen erstellt werden, automatisch den korrekten Sicherheitskontext zuweist, sodass Dienste ohne Probleme darauf zugreifen können.

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

Erstellen wir eine einfache index.html-Datei direkt in /var/www/html. Da dieses Verzeichnis dem root-Benutzer gehört, müssen Sie sudo verwenden, um hineinzuschreiben. Ein normaler sudo echo-Befehl mit Umleitung (>) funktioniert nicht, da die Umleitung von Ihrer aktuellen Shell gehandhabt wird, der die Berechtigung fehlt. Um dies zu lösen, können Sie den Befehl innerhalb einer Root-Shell mit sudo sh -c '...' ausführen.

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 auf diese neue Seite zugreifen und sie bereitstellen kann. Sie können curl, ein Befehlszeilentool für die Datenübertragung mit URLs, verwenden, um die Seite von localhost anzufordern.

curl http://localhost

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

Welcome to Apache on LabEx

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

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

Die Ausgabe wird ähnlich wie folgt aussehen:

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

Der wichtigste Teil dieser Ausgabe ist das Kontextlabel: system_u:object_r:httpd_sys_content_t:s0. Dieses Label besteht aus vier Teilen: user:role:type:level. Für dieses Labor konzentrieren wir uns auf den Typ, der httpd_sys_content_t lautet.

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

Einen SELinux-Denial durch Verschieben einer Datei mit falschem Kontext auslösen

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 verwirrend sein kann, wenn Sie nicht wissen, wie SELinux-Kontexte mit Dateioperationen wie mv funktionieren. Im Gegensatz zur Erstellung einer Datei direkt in einem Verzeichnis (wodurch sie den Standardkontext des übergeordneten Verzeichnisses erbt), behält das Verschieben einer Datei ihren ursprünglichen Kontext bei.

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

echo "This is Page 2" > page2.html

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

ls -Z page2.html

Die Ausgabe zeigt einen Kontexttyp von user_home_t oder etwas Ähnliches 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, dass der Typ user_home_t ist. Dies unterscheidet sich von httpd_sys_content_t, auf das Apache zugreifen darf.

Verschieben Sie diese Datei als Nächstes mit dem Befehl mv in das Apache-Web-Root-Verzeichnis. Sie benötigen sudo, da das Zielverzeichnis /var/www/html 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 überprüfen.

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

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

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

Versuchen Sie nun, auf diese neue Seite mit curl zuzugreifen. SELinux wird den Zugriff aufgrund der Kontextabweichung blockieren.

curl http://localhost/page2.html

Sie erhalten vom Server eine "403 Forbidden"-Fehlermeldung. Dies ist kein traditionelles Problem mit Dateiberechtigungen; es ist SELinux, das seine Sicherheitsrichtlinie durchsetzt und dem httpd-Prozess den Zugriff auf eine Datei mit dem Label user_home_t verweigert.

<!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 demonstriert ein klassisches SELinux-Problem. Im nächsten Schritt lernen Sie, wie Sie dies durch Ändern des Dateikontexts beheben können.

Den Dateikontext mit chcon korrigieren und den Zugriff überprüfen

In diesem Schritt beheben Sie den "403 Forbidden"-Fehler aus dem vorherigen Schritt, indem Sie manuell den SELinux-Kontext der Datei page2.html ändern. Sie verwenden den Befehl chcon (change context), ein leistungsstarkes Werkzeug zur Änderung des Sicherheitskontexts von Dateien und Verzeichnissen.

Der Befehl chcon ermöglicht es Ihnen, den Benutzer, die Rolle, den Typ oder die Ebene eines SELinux-Kontexts direkt zu ändern. Für diese Übung müssen Sie nur den Typ ändern. Der korrekte Typ für Webinhalte, die Apache lesen kann, ist httpd_sys_content_t.

Um das Problem zu beheben, verwenden Sie chcon mit dem Flag -t, um den neuen Typ für page2.html anzugeben. Da sich die Datei in /var/www/html befindet, müssen Sie sudo verwenden, um ihren Kontext zu ändern.

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, überprüfen wir, ob der Kontext aktualisiert wurde. Verwenden Sie erneut ls -Z, um den Sicherheitskontext der Datei zu überprüfen.

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 bereitzustellen. Testen wir dies, indem wir eine weitere Anfrage mit curl stellen.

curl http://localhost/page2.html

Diesmal sollte der Befehl erfolgreich sein, und Sie sehen den Inhalt Ihrer Webseite im Terminal ausgegeben.

This is Page 2

Sie haben ein SELinux-bezogenes Zugriffsproblem erfolgreich diagnostiziert und behoben. Sie haben gelernt, dass das Verschieben von Dateien ihren ursprünglichen Kontext beibehält und dass chcon verwendet werden kann, um den Kontext manuell anzupassen, um ihn an die Sicherheitsrichtlinie anzupassen und so den Zugriff auf Dienste wie Apache zu gewähren. Es ist wichtig zu beachten, dass mit chcon vorgenommene Änderungen bei einer vollständigen Neuzuweisung des Dateisystems möglicherweise nicht bestehen bleiben; der Befehl restorecon wird typischerweise verwendet, um den Standard-Richtlinien-Kontext anzuwenden.

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 Enforcing-Modus war, und dann den httpd-Dienst installiert und gestartet. Sie haben beobachtet, dass Dateien, die direkt im Apache-Web-Root-Verzeichnis (/var/www/html) erstellt werden, automatisch den korrekten httpd_sys_content_t-Kontext erhalten, der für Apache erforderlich ist, um sie ordnungsgemäß abzurufen und bereitzustellen.

Der Kern des Labs demonstrierte die Folgen falscher Dateikontexte. Durch das Verschieben einer Datei aus dem Home-Verzeichnis eines Benutzers (mit einem user_home_t-Kontext) in das Web-Root-Verzeichnis haben Sie eine SELinux-Verweigerung ausgelöst, die zu einem "403 Forbidden"-Fehler führte. Anschließend haben Sie gelernt, dieses Zugriffsproblem zu beheben, indem Sie den Befehl chcon verwendet haben, um den Kontext der Datei manuell auf den korrekten Typ httpd_sys_content_t zu ändern. Dadurch wurde der Zugriff erfolgreich wiederhergestellt und das Prinzip gestärkt, dass korrekte Dateikontexte für das Funktionieren von Diensten unter einer durchsetzenden SELinux-Richtlinie entscheidend sind.