Einführung
In diesem Lab lernen Sie, wie Sie einen Apache-Webserver (httpd) unter Red Hat Enterprise Linux (RHEL) durch die Verwaltung von SELinux-Richtlinien und Firewall-Regeln absichern. Sie arbeiten an einem praktischen Szenario, in dem Sie httpd so konfigurieren, dass es auf einem nicht standardmäßigen Port lauscht, und untersuchen, wie SELinux und Firewall-Systeme die Sicherheit für solche Konfigurationen verwalten. Diese Übung bietet praktische Erfahrungen mit gängigen Sicherheitsverwaltungsaufgaben in einer RHEL-Umgebung.
Sie beginnen damit, den httpd-Dienst für einen benutzerdefinierten Port zu konfigurieren und beobachten dessen Verhalten unter der SELinux-Durchsetzung. Sie verwenden den Befehl semanage, um SELinux-Port-Labels zu verstehen und zu verwalten, um die Einhaltung der Sicherheitsvorgaben sicherzustellen. Anschließend verwenden Sie firewall-cmd, um diesen benutzerdefinierten Port in der System-Firewall zu öffnen. Abschließend überprüfen Sie, ob der Webserver erreichbar ist, um zu bestätigen, dass Ihre Sicherheitskonfigurationen korrekt angewendet wurden.
httpd auf einem benutzerdefinierten Port konfigurieren und SELinux-Kontext verstehen
In diesem Schritt lernen Sie, wie Sie den Apache-Webserver (httpd) so konfigurieren, dass er auf einem nicht standardmäßigen Port läuft, und wie SELinux den Portzugriff verwaltet. Wir arbeiten mit Port 8081 und untersuchen die SELinux-Portverwaltung, auch wenn der Dienst in einigen Konfigurationen erfolgreich startet.
Die notwendigen Pakete (httpd, policycoreutils-python-utils und firewalld) wurden bereits in der Einrichtungsphase installiert. Das Paket policycoreutils-python-utils stellt den Befehl semanage bereit, den Sie in einem späteren Schritt verwenden werden.
Beginnen wir damit, die Standardkonfiguration von httpd so zu ändern, dass sie auf dem benutzerdefinierten Port 8081 lauscht. Die Hauptkonfigurationsdatei für httpd befindet sich unter /etc/httpd/conf/httpd.conf. Wir verwenden den Editor nano, um den Port zu ändern.
sudo nano /etc/httpd/conf/httpd.conf
Scrollen Sie im nano-Editor mit den Pfeiltasten nach unten, bis Sie die Zeile Listen 80 finden. Ändern Sie diese Zeile wie folgt:
Listen 8081
Um die Datei zu speichern und nano zu beenden, drücken Sie Ctrl+X, dann Y, um die Änderungen zu bestätigen, und schließlich Enter, um die Datei zu schreiben.
Nachdem die Konfiguration geändert wurde, versuchen wir nun, den httpd-Dienst zu starten. In dieser containerisierten Umgebung ist systemctl nicht verfügbar. Wir starten den httpd-Daemon daher direkt.
Die Einrichtungsphase deaktiviert bereits den Standard-SSL-Virtual-Host, damit dieses einfache HTTP-Lab ohne Fehlermeldungen zu fehlenden Zertifikatsdateien starten kann.
sudo /usr/sbin/httpd
Möglicherweise sehen Sie eine Warnmeldung über den vollqualifizierten Domänennamen des Servers, aber dies ist normal und kann ignoriert werden.
AH00558: httpd: Could not reliably determine the server's fully qualified domain name, using fe80::216:3eff:fe02:1a1e%eth0. Set the 'ServerName' directive globally to suppress this message
Überprüfen wir, ob der Dienst läuft, indem wir nach httpd-Prozessen suchen.
ps aux | grep httpd
Sie sollten mehrere laufende httpd-Prozesse sehen, was darauf hinweist, dass der Webserver erfolgreich gestartet wurde.
root 4813 0.0 0.2 23364 7736 ? Ss 09:32 0:00 /usr/sbin/httpd
apache 4814 0.0 0.1 23020 5092 ? S 09:32 0:00 /usr/sbin/httpd
apache 4815 0.0 0.4 1441064 14620 ? Sl 09:32 0:00 /usr/sbin/httpd
apache 4816 0.0 0.5 1441064 18736 ? Sl 09:32 0:00 /usr/sbin/httpd
apache 4837 0.0 0.4 1572200 16872 ? Sl 09:32 0:00 /usr/sbin/httpd
labex 4996 0.0 0.0 6408 2176 pts/3 S+ 09:32 0:00 grep --color=auto httpd
Überprüfen wir auch die httpd-Fehlerprotokolle, um zu sehen, was während des Starts passiert ist.
sudo tail /var/log/httpd/error_log
Sie sollten normale Startmeldungen sehen, die darauf hinweisen, dass der Server ordnungsgemäß läuft.
[Tue Jun 17 09:32:46.374275 2025] [core:notice] [pid 4812:tid 4812] SELinux policy enabled; httpd running as context system_u:system_r:unconfined_service_t:s0
[Tue Jun 17 09:32:46.377265 2025] [suexec:notice] [pid 4812:tid 4812] AH01232: suEXEC mechanism enabled (wrapper: /usr/sbin/suexec)
[Tue Jun 17 09:32:46.394284 2025] [lbmethod_heartbeat:notice] [pid 4813:tid 4813] AH02282: No slotmem from mod_heartmonitor
[Tue Jun 17 09:32:46.399433 2025] [mpm_event:notice] [pid 4813:tid 4813] AH00489: Apache/2.4.62 (Red Hat Enterprise Linux) configured -- resuming normal operations
[Tue Jun 17 09:32:46.399458 2025] [core:notice] [pid 4813:tid 4813] AH00094: Command line: '/usr/sbin/httpd'
Interessanterweise startete der httpd-Dienst ohne SELinux-Probleme. Prüfen wir, ob es SELinux-Verweigerungen im Audit-Log gab.
sudo grep AVC /var/log/audit/audit.log | grep httpd
Wenn es keine Ergebnisse gibt, bedeutet dies, dass SELinux den httpd-Dienst nicht daran gehindert hat, an Port 8081 zu binden. Dies könnte daran liegen, dass:
- Port 8081 in einigen Konfigurationen standardmäßig für HTTP-Dienste erlaubt ist.
- Der httpd-Prozess in einem unbeschränkten Kontext läuft.
- Port 8081 bereits in der SELinux-Richtlinie definiert ist.
Prüfen wir den aktuellen SELinux-Modus:
getenforce
Sie sollten sehen, dass sich SELinux im Modus "Enforcing" befindet, was bedeutet, dass Richtlinien aktiv durchgesetzt werden. Die Tatsache, dass httpd erfolgreich gestartet ist, deutet darauf hin, dass Port 8081 möglicherweise bereits über die richtige SELinux-Kennzeichnung verfügt oder der Dienst in einem unbeschränkten Kontext läuft, wie in den Protokollmeldungen zu sehen ist. Für diese Übung fahren wir mit dem nächsten Schritt fort, in dem wir die SELinux-Portverwaltung erkunden und eine ordnungsgemäße Konfiguration sicherstellen.
SELinux-Port-Labels mit semanage verstehen und verwalten
In diesem Schritt lernen Sie, wie Sie SELinux-Port-Labels mit dem Befehl semanage verwalten. Auch wenn der httpd-Dienst derzeit auf Port 8081 läuft, ist es wichtig zu verstehen, wie SELinux-Port-Richtlinien korrekt konfiguriert werden, um Sicherheit und Compliance zu gewährleisten. Sie untersuchen die aktuelle Port-Konfiguration und lernen, wie Sie benutzerdefinierten Ports explizit den richtigen SELinux-Typ zuweisen.
Zuerst müssen Sie den richtigen SELinux-Typ für Webserver-Ports finden. Der Befehl semanage port -l listet alle SELinux bekannten Port-Definitionen auf. Wir können diese Ausgabe an grep weiterleiten, um Typen zu finden, die sich auf http beziehen.
sudo semanage port -l | grep http
Die Ausgabe zeigt mehrere Port-Typen. Der relevanteste für einen Standard-Webserver ist http_port_t.
http_cache_port_t tcp 8080, 8118, 8123, 10001-10010
http_cache_port_t udp 3130
http_port_t tcp 80, 81, 443, 488, 8008, 8009, 8443, 9000
pegasus_http_port_t tcp 5988
pegasus_https_port_t tcp 5989
Wie Sie sehen, ist http_port_t den Standard-HTTP/HTTPS-Ports wie 80 und 443 zugewiesen. Die SELinux-Richtlinie erlaubt Prozessen mit dem Typ httpd_t (unser Webserver), an jeden Port zu binden, der als http_port_t gekennzeichnet ist. Prüfen wir, ob Port 8081 bereits in dieser Liste enthalten ist.
Beachten Sie, dass Port 8081 derzeit nicht unter http_port_t aufgeführt ist. In einigen RHEL-Konfigurationen kann dieser Port jedoch bereits in der SELinux-Richtlinie definiert sein. Versuchen wir, ihn explizit für eine ordnungsgemäße SELinux-Compliance mit dem Befehl semanage port -a hinzuzufügen.
- Die Option
-asteht für "add" (hinzufügen). - Die Option
-t http_port_tgibt den zuzuweisenden Typ an. - Die Option
-p tcpgibt das Protokoll an.
sudo semanage port -a -t http_port_t -p tcp 8081
Möglicherweise sehen Sie eine Meldung wie "Port tcp/8081 already defined, modifying instead", was bedeutet, dass der Port bereits konfiguriert war. Dies erklärt, warum httpd im vorherigen Schritt erfolgreich gestartet ist. Um die aktuelle Konfiguration zu überprüfen, listen Sie die http_port_t-Definitionen erneut auf.
sudo semanage port -l | grep '^http_port_t'
Sie sollten nun Port 8081 in der Liste sehen.
http_port_t tcp 8081, 80, 81, 443, 488, 8008, 8009, 8443, 9000
Mit der explizit aktualisierten SELinux-Richtlinie wird Port 8081 nun offiziell als HTTP-Port anerkannt. Der httpd-Dienst sollte weiterhin problemlos laufen, und Sie haben die ordnungsgemäße SELinux-Compliance sichergestellt.
Überprüfen wir, ob der Prozess noch läuft:
ps aux | grep httpd
Sie sollten weiterhin mehrere httpd-Prozesse sehen, was darauf hinweist, dass der Webserver mit der korrekten SELinux-Port-Kennzeichnung erfolgreich läuft.
root 4813 0.0 0.2 23364 7736 ? Ss 09:32 0:00 /usr/sbin/httpd
apache 4814 0.0 0.1 23020 5092 ? S 09:32 0:00 /usr/sbin/httpd
apache 4815 0.0 0.4 1441064 14620 ? Sl 09:32 0:00 /usr/sbin/httpd
apache 4816 0.0 0.5 1441064 18736 ? Sl 09:32 0:00 /usr/sbin/httpd
apache 4837 0.0 0.4 1572200 16872 ? Sl 09:32 0:00 /usr/sbin/httpd
labex 5215 0.0 0.0 6408 2176 pts/3 S+ 09:33 0:00 grep --color=auto httpd
Sie haben die SELinux-Richtlinie erfolgreich so konfiguriert, dass der httpd-Dienst explizit auf Port 8081 laufen darf, wodurch die ordnungsgemäße Sicherheits-Compliance gewährleistet ist.
Einen benutzerdefinierten Port in der Firewall mit firewall-cmd öffnen
In diesem Schritt konfigurieren Sie die System-Firewall so, dass externe Verbindungen zu Ihrem Webserver auf dem benutzerdefinierten Port 8081 zugelassen werden. Obwohl der httpd-Dienst dank der SELinux-Richtlinienänderung nun korrekt läuft, blockiert der firewalld-Dienst, der die Netzwerkverkehrsregeln verwaltet, standardmäßig wahrscheinlich eingehende Anfragen auf diesem nicht standardmäßigen Port.
Das Paket firewalld wurde bereits in der Einrichtungsphase installiert. Wir müssen jedoch zuerst den firewalld-Dienst starten. Prüfen wir den aktuellen Status und starten ihn bei Bedarf.
sudo firewall-cmd --list-all
Wenn Sie "FirewallD is not running" sehen, müssen wir den firewalld-Daemon starten. In dieser Container-Umgebung starten wir den firewalld-Daemon direkt. Das & am Ende führt den Prozess im Hintergrund aus.
sudo /usr/sbin/firewalld &
Warten Sie einen Moment, bis der Dienst initialisiert ist, und überprüfen Sie dann, ob er läuft:
sudo firewall-cmd --list-all
Nun sollten Sie die aktuelle Firewall-Konfiguration für die Standardzone (public) sehen.
Testen wir den Zugriff auf den Webserver über die Befehlszeile mit curl. Dieser Befehl versucht, eine Verbindung zu localhost auf Port 8081 herzustellen.
curl http://localhost:8081
Sie sollten den HTML-Inhalt Ihrer Testseite sehen, was bedeutet, dass der Webserver lokal erreichbar ist. Dies ist zu erwarten, da firewalld den localhost-Verkehr normalerweise standardmäßig zulässt.
Für externen Zugriff und eine ordnungsgemäße Sicherheitskonfiguration müssen wir die Firewall jedoch korrekt für unseren benutzerdefinierten Port konfigurieren. Während localhost-Verbindungen normalerweise unabhängig von Firewall-Regeln funktionieren, würden externe Verbindungen von anderen Maschinen ohne die richtige Firewall-Konfiguration blockiert werden.
Untersuchen wir zuerst die aktuellen Regeln für die Standardzone (public):
public (active)
target: default
icmp-block-inversion: no
interfaces: eth0 eth1
sources:
services: cockpit dhcpv6-client ssh
ports:
protocols:
forward: yes
masquerade: no
forward-ports:
source-ports:
icmp-blocks:
rich rules:
Fügen Sie nun eine neue Regel hinzu, um TCP-Verkehr auf Port 8081 zuzulassen. Stellen Sie sicher, dass firewalld läuft, bevor Sie diesen Befehl ausführen.
--add-port=8081/tcpgibt den zu öffnenden Port und das Protokoll an.--permanentstellt sicher, dass die Regel nach einem Neustart oder einem Neuladen der Firewall bestehen bleibt.
sudo firewall-cmd --permanent --add-port=8081/tcp
Wenn Sie "FirewallD is not running" sehen, stellen Sie sicher, dass Sie den firewalld-Daemon im vorherigen Schritt gestartet haben, und warten Sie einen Moment, bis er initialisiert ist.
Der Befehl sollte success zurückgeben, wenn firewalld ordnungsgemäß läuft.
success
Permanente Regeln werden erst auf die aktive Firewall-Konfiguration angewendet, wenn diese neu geladen wird. Laden wir die Firewall neu, um unsere neue Regel anzuwenden.
sudo firewall-cmd --reload
Dieser Befehl sollte ebenfalls success zurückgeben.
success
Überprüfen wir, ob der Port nun offen ist, indem wir die Regeln erneut auflisten.
sudo firewall-cmd --list-all
Sie sollten nun 8081/tcp im Abschnitt ports: sehen.
public (active)
target: default
icmp-block-inversion: no
interfaces: eth0 eth1
sources:
services: cockpit dhcpv6-client ssh
ports: 8081/tcp
protocols:
forward: yes
masquerade: no
forward-ports:
source-ports:
icmp-blocks:
rich rules:
Sie haben die Firewall erfolgreich konfiguriert. Der letzte Schritt besteht darin, zu testen, ob Sie auf den Webserver zugreifen können.
Zugriff auf Standard- und benutzerdefinierte Webserver-Ports überprüfen
In diesem letzten Schritt überprüfen Sie, ob alle von Ihnen vorgenommenen Änderungen sicherstellen, dass Ihr Webserver sowohl für den lokalen als auch für den externen Zugriff korrekt konfiguriert ist. Sie haben die SELinux-Richtlinie konfiguriert und den notwendigen Port in der Firewall geöffnet. Nun führen Sie umfassende Tests durch, um die Konfiguration zu bestätigen.
Erstellen wir zuerst eine einfache Testseite, damit wir beim Verbinden eine benutzerdefinierte Nachricht erhalten. Das Standard-Dokumentenstammverzeichnis für httpd ist /var/www/html. Wir erstellen eine index.html-Datei in diesem Verzeichnis. Sie benötigen sudo-Rechte, um an diesen Ort zu schreiben.
echo "Success! Web server on custom port 8081 is working." | sudo tee /var/www/html/index.html
Dieser Befehl platziert die Erfolgsmeldung in die index.html-Datei. Der tee-Befehl wird hier verwendet, da er es uns ermöglicht, in eine Datei zu schreiben, die sudo-Rechte erfordert, während wir eine Pipe verwenden. Sie sollten die Nachricht zur Bestätigung im Terminal sehen.
Success! Web server on custom port 8081 is working.
Um die Übung abzuschließen, demonstrieren wir den Kontrast, indem wir versuchen, auf den Standard-HTTP-Port 80 zuzugreifen. Da unser Server so konfiguriert ist, dass er nur auf 8081 lauscht, sollte diese Anfrage fehlschlagen.
curl http://localhost:80
Wie erwartet wird die Verbindung verweigert, da kein Dienst auf diesem Port lauscht.
curl: (7) Failed to connect to localhost port 80: Connection refused
Dies bestätigt, dass Ihr Server ausschließlich auf dem von Ihnen konfigurierten benutzerdefinierten Port läuft. Durch dieses Lab haben Sie einen kritischen Workflow zur Fehlerbehebung für Dienste unter RHEL kennengelernt:
- Dienststatus und Protokolle prüfen.
- SELinux-Verweigerungen im Audit-Log untersuchen.
- SELinux-Richtlinien mit
semanagekorrigieren. - Firewall-Regeln mit
firewall-cmdkonfigurieren. - Konnektivität überprüfen.
Zusammenfassung
In diesem Lab haben Sie gelernt, wie Sie einen Webserver auf einem benutzerdefinierten Port konfigurieren und SELinux-Sicherheitsrichtlinien verwalten. Mit den vorinstallierten Paketen Apache-Webserver (httpd), policycoreutils-python-utils und firewalld haben Sie sich auf das Verständnis der SELinux-Portverwaltung und der Firewall-Konfiguration konzentriert. Sie haben die Datei httpd.conf geändert, um den Port des Webservers auf einen nicht standardmäßigen Port, 8081, zu ändern.
Sie haben festgestellt, dass der httpd-Dienst erfolgreich auf dem benutzerdefinierten Port startete, da Port 8081 bereits korrekt in der SELinux-Richtlinie konfiguriert war. Dies bot die Gelegenheit, die SELinux-Portverwaltung zu erkunden und zu verstehen, wie semanage funktioniert, um eine ordnungsgemäße Port-Kennzeichnung aufrechtzuerhalten. Sie haben auch gelernt, firewall-cmd zur Verwaltung von Firewall-Regeln zu verwenden, um sowohl Sicherheits-Compliance als auch Erreichbarkeit sicherzustellen. Auch wenn httpd in einem unbeschränkten Kontext lief, hat dieses Lab die Bedeutung einer korrekten SELinux- und Firewall-Konfiguration für Produktionsumgebungen demonstriert.



