In diesem Schritt lernen Sie, wie Sie Apache so konfigurieren, dass Webinhalte aus einem nicht standardmäßigen Verzeichnis bereitgestellt werden, und wie Sie dessen SELinux-Dateikontexte verwalten. Standardmäßig beschränken SELinux-Richtlinien Apache (httpd) auf die Bereitstellung von Dateien nur aus bestimmten Verzeichnissen, hauptsächlich /var/www/html
. Wenn Sie Webinhalte an einem anderen Ort ablegen, verhindert SELinux den Zugriff von Apache darauf, selbst wenn die Dateisystemberechtigungen korrekt sind. Hier kommen SELinux-Dateikontexte ins Spiel.
Ein SELinux-Dateikontext ist eine Bezeichnung, die einer Datei oder einem Verzeichnis zugewiesen wird und deren Sicherheitsattribute definiert. Damit Apache Inhalte von einem benutzerdefinierten Speicherort bereitstellen kann, müssen dieser Speicherort und seine Inhalte den richtigen SELinux-Kontext haben, typischerweise httpd_sys_content_t
. Sie verwenden semanage fcontext
, um eine persistente Regel zu definieren, und restorecon
, um sie anzuwenden.
Zuerst müssen Sie den Apache HTTP-Server installieren.
-
Installieren Sie den Apache HTTP-Server.
Verwenden Sie den Paketmanager dnf
, um das Paket httpd
zu installieren.
sudo dnf install -y httpd
Sie sollten eine Ausgabe sehen, die die erfolgreiche Installation des Pakets httpd
und seiner Abhängigkeiten anzeigt.
-
Erstellen Sie ein benutzerdefiniertes Verzeichnis für Webinhalte und eine index.html
-Datei.
Sie erstellen ein neues Verzeichnis namens /custom
und legen eine einfache index.html
-Datei darin ab. Dies ist Ihr nicht standardmäßiges Webdokument-Root.
sudo mkdir /custom
echo 'This is custom web content.' | sudo tee /custom/index.html
Überprüfen Sie den Inhalt der Datei index.html
.
cat /custom/index.html
This is custom web content.
-
Konfigurieren Sie Apache so, dass das neue Dokument-Root verwendet wird.
Die Hauptkonfigurationsdatei von Apache ist /etc/httpd/conf/httpd.conf
. Sie müssen diese Datei bearbeiten, um Apache auf Ihr neues Verzeichnis /custom
anstelle des Standardverzeichnisses /var/www/html
zu verweisen.
Öffnen Sie die Konfigurationsdatei mit nano
.
sudo nano /etc/httpd/conf/httpd.conf
Suchen Sie im Editor die Zeilen DocumentRoot "/var/www/html"
und <Directory "/var/www/html">
. Ändern Sie beide Vorkommnisse von /var/www/html
in /custom
.
Die relevanten Abschnitte sollten nach der Änderung so aussehen:
#
## DocumentRoot: The directory out of which you will serve your
## documents. By default, all requests are taken from this directory, but
## symbolic links and aliases may be used to point to other locations.
#
DocumentRoot "/custom"
#
## Relax access to content within /var/www.
#
<Directory "/custom">
AllowOverride None
## Allow open access:
Require all granted
</Directory>
Speichern und beenden Sie die Datei (Ctrl+X
, Y
, Enter
).
-
Starten und aktivieren Sie den Apache-Webdienst.
Nachdem Sie die Konfiguration geändert haben, müssen Sie den Dienst httpd
starten. Da Sie sich in einer Containerumgebung befinden, ist systemctl
nicht verfügbar. Sie starten httpd
direkt.
sudo /usr/sbin/httpd -DFOREGROUND &
Das Symbol &
führt den Befehl im Hintergrund aus, sodass Sie das Terminal weiterhin verwenden können. Sie sollten eine Ausgabe ähnlich dieser sehen, die anzeigt, dass Apache gestartet wird.
[1] 5094
AH00558: httpd: Could not reliably determine the server's fully qualified domain name, using fe80::216:3eff:fe00:63b%eth0. Set the 'ServerName' directive globally to suppress this message
Hinweis: Die Warnmeldung über den vollqualifizierten Domänennamen des Servers ist in dieser Lab-Umgebung normal und kann ignoriert werden.
Um zu überprüfen, ob Apache ausgeführt wird, können Sie nach dem Prozess httpd
suchen.
ps aux | grep httpd
Sie sollten mehrere httpd
-Prozesse sehen, die ausgeführt werden.
root ... /usr/sbin/httpd -DFOREGROUND
apache ... /usr/sbin/httpd -DFOREGROUND
...output omitted...
-
Versuchen Sie, auf die Webseite zuzugreifen.
Versuchen Sie nun, mit curl
auf Ihre Webseite zuzugreifen. Da Sie sich auf demselben Rechner befinden, können Sie localhost
verwenden.
curl http://localhost/index.html
Hinweis: In dieser speziellen Umgebung stellen Sie möglicherweise fest, dass die Webseite auch mit dem Kontext root_t
zugänglich ist. Dies zeigt, dass der Kontext root_t
, während SELinux durchgesetzt wird, möglicherweise breitere Berechtigungen hat als erwartet. Für bewährte Sicherheitsverfahren und eine ordnungsgemäße SELinux-Konfiguration sollten Webinhalte jedoch weiterhin den entsprechenden Kontext httpd_sys_content_t
verwenden.
This is custom web content.
-
Überprüfen Sie den aktuellen SELinux-Kontext des benutzerdefinierten Verzeichnisses.
Verwenden Sie den Befehl ls -Z
, um den SELinux-Kontext Ihres Verzeichnisses /custom
und der Datei index.html
anzuzeigen.
ls -Zd /custom /custom/index.html
Sie werden feststellen, dass sie den Kontext root_t
haben, was nicht der empfohlene Kontext für Apache-Webinhalte ist.
system_u:object_r:root_t:s0 /custom
system_u:object_r:root_t:s0 /custom/index.html
Vergleichen Sie dies mit dem Standard-Apache-Dokument-Root:
ls -Zd /var/www/html
Sie werden sehen, dass /var/www/html
den Kontext httpd_sys_content_t
hat. Dies ist der Kontext, den Sie auf Ihr benutzerdefiniertes Verzeichnis anwenden müssen.
system_u:object_r:httpd_sys_content_t:s0 /var/www/html
-
Definieren Sie eine persistente SELinux-Dateikontextregel für /custom
.
Der Befehl semanage fcontext
wird verwendet, um SELinux-Dateikontext-Zuordnungsregeln zu verwalten. Die Option -a
fügt eine neue Regel hinzu, -t
gibt den Zieltyp an, und der reguläre Ausdruck '/custom(/.*)?'
stimmt mit dem Verzeichnis /custom
selbst und allen Dateien und Unterverzeichnissen darin überein.
sudo semanage fcontext -a -t httpd_sys_content_t '/custom(/.*)?'
Dieser Befehl fügt die Regel zur SELinux-Richtlinie hinzu, ändert aber nicht sofort die Kontexte vorhandener Dateien.
-
Wenden Sie die neuen SELinux-Kontexte auf die Dateien an.
Der Befehl restorecon
wird verwendet, um die SELinux-Kontexte von Dateien und Verzeichnissen auf ihre Standardwerte zurückzusetzen, wie sie von der Richtlinie definiert werden. Die Option -R
wendet die Änderung rekursiv an, und -v
liefert eine ausführliche Ausgabe.
sudo restorecon -Rv /custom
Sie sollten eine Ausgabe sehen, die anzeigt, dass die Kontexte von /custom
und /custom/index.html
neu beschriftet wurden.
Relabeled /custom from system_u:object_r:root_t:s0 to system_u:object_r:httpd_sys_content_t:s0
Relabeled /custom/index.html from system_u:object_r:root_t:s0 to system_u:object_r:httpd_sys_content_t:s0
Überprüfen Sie die Kontexte erneut mit ls -Z
.
ls -Zd /custom /custom/index.html
Sie sollten jetzt den Kontext httpd_sys_content_t
haben.
system_u:object_r:httpd_sys_content_t:s0 /custom
system_u:object_r:httpd_sys_content_t:s0 /custom/index.html
-
Greifen Sie erneut auf die Webseite zu.
Da die SELinux-Kontexte jetzt korrekt sind, versuchen Sie erneut, mit curl
auf die Webseite zuzugreifen.
curl http://localhost/index.html
Sie sollten jetzt den Inhalt Ihrer Datei index.html
sehen.
This is custom web content.
Beenden Sie abschließend den Apache HTTP-Serverprozess.
sudo pkill httpd
Überprüfen Sie, ob keine httpd
-Prozesse ausgeführt werden.
ps aux | grep httpd
Sie sollten nur den grep
-Prozess selbst sehen.
labex ... grep httpd