Sicherheit mit firewalld und SELinux in RHEL

Red Hat Enterprise LinuxRed Hat Enterprise LinuxBeginner
Jetzt üben

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

Einführung

In diesem Lab lernen Sie, wie Sie einen Apache-Webserver (httpd) unter Red Hat Enterprise Linux (RHEL) sichern, indem Sie SELinux-Richtlinien und Firewall-Regeln verwalten. Sie werden ein praktisches Szenario durcharbeiten, in dem Sie httpd so konfigurieren, dass er 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 Erfahrung mit gängigen Sicherheitsadministrationsaufgaben in einer RHEL-Umgebung.

Sie beginnen damit, den httpd-Dienst so zu konfigurieren, dass er auf einem benutzerdefinierten Port ausgeführt wird, und beobachten, wie er sich unter SELinux-Durchsetzung verhält. Sie verwenden den Befehl semanage, um SELinux-Port-Labels zu verstehen und zu verwalten und so die Einhaltung der Sicherheitsrichtlinien sicherzustellen. Anschließend verwenden Sie firewall-cmd, um diesen benutzerdefinierten Port in der Firewall des Systems zu öffnen. Schließlich überprüfen Sie, ob der Webserver erreichbar ist, und bestätigen so, dass Ihre Sicherheitskonfigurationen korrekt angewendet wurden.

Konfigurieren von httpd auf einem benutzerdefinierten Port und Verstehen des SELinux-Kontexts

In diesem Schritt lernen Sie, wie Sie den Apache-Webserver (httpd) so konfigurieren, dass er auf einem nicht standardmäßigen Port ausgeführt wird, und wie SELinux den Portzugriff verwaltet. Wir werden mit Port 8081 arbeiten und die SELinux-Portverwaltung untersuchen, auch wenn der Dienst in einigen Konfigurationen erfolgreich startet.

Die erforderlichen Pakete (httpd, policycoreutils-python-utils und firewalld) wurden bereits in der Setup-Phase 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 einem nicht standardmäßigen Port, 8081, lauscht. Die Hauptkonfigurationsdatei für httpd befindet sich unter /etc/httpd/conf/httpd.conf. Wir verwenden den Editor nano, um den Listening-Port zu ändern.

sudo nano /etc/httpd/conf/httpd.conf

Verwenden Sie im Editor nano die Pfeiltasten, um nach unten zu scrollen und die Zeile Listen 80 zu finden. Ändern Sie diese Zeile in:

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 in die Datei zu schreiben.

Nachdem die Konfiguration geändert wurde, versuchen wir, den httpd-Dienst zu starten. In dieser containerisierten Umgebung ist systemctl nicht verfügbar. Wir starten den httpd-Daemon direkt.

sudo /usr/sbin/httpd

Möglicherweise wird eine Warnmeldung über den vollqualifizierten Domänennamen des Servers angezeigt, 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 ausgeführt wird, indem wir nach httpd-Prozessen suchen.

ps aux | grep httpd

Sie sollten mehrere httpd-Prozesse sehen, was darauf hindeutet, 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 beim Start passiert ist.

sudo tail /var/log/httpd/error_log

Sie sollten normale Startmeldungen sehen, die darauf hindeuten, dass der Server ordnungsgemäß ausgeführt wird.

[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 Probleme mit SELinux. Überprüfen wir, ob es im Audit-Protokoll SELinux-Verweigerungen gab.

sudo grep AVC /var/log/audit/audit.log | grep httpd

Wenn keine Ergebnisse vorliegen, bedeutet dies, dass SELinux den httpd-Dienst nicht daran gehindert hat, sich an Port 8081 zu binden. Dies könnte folgende Gründe haben:

  1. Port 8081 ist möglicherweise in einigen Konfigurationen standardmäßig für HTTP-Dienste zugelassen.
  2. Der httpd-Prozess wird möglicherweise in einem unbeschränkten Kontext ausgeführt.
  3. Port 8081 ist möglicherweise bereits in der SELinux-Richtlinie definiert.

Überprüfen wir den aktuellen SELinux-Modus:

getenforce

Sie sollten sehen, dass sich SELinux im Modus "Enforcing" befindet, was bedeutet, dass es Richtlinien aktiv durchsetzt. Die Tatsache, dass httpd erfolgreich gestartet wurde, deutet darauf hin, dass Port 8081 möglicherweise bereits eine ordnungsgemäße SELinux-Kennzeichnung hat oder der Dienst in einem unbeschränkten Kontext ausgeführt wird, wie in den Protokollmeldungen gezeigt. Für diese Übung fahren wir mit dem nächsten Schritt fort, in dem wir die SELinux-Portverwaltung untersuchen und eine ordnungsgemäße Konfiguration sicherstellen.

Verstehen und Verwalten von SELinux-Port-Labels mit semanage

In diesem Schritt lernen Sie, wie Sie SELinux-Port-Labels mit dem Befehl semanage verwalten. Obwohl der httpd-Dienst derzeit auf Port 8081 ausgeführt wird, ist es wichtig zu verstehen, wie Sie SELinux-Port-Richtlinien richtig konfigurieren, um Sicherheit und Compliance zu gewährleisten. Sie werden die aktuelle Portkonfiguration untersuchen 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 Portdefinitionen 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 Porttypen. 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 können, wird http_port_t Standard-HTTP/HTTPS-Ports wie 80 und 443 zugewiesen. Die SELinux-Richtlinie erlaubt Prozessen mit dem Typ httpd_t (unser Webserver), sich an jeden Port zu binden, der mit http_port_t gekennzeichnet ist. Überprü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 die ordnungsgemäße SELinux-Compliance mit dem Befehl semanage port -a hinzuzufügen.

  • Die Option -a bedeutet "add" (hinzufügen).
  • Die Option -t http_port_t gibt den zuzuweisenden Typ an.
  • Die Option -p tcp gibt das Protokoll an.
sudo semanage port -a -t http_port_t -p tcp 8081

Möglicherweise wird eine Meldung angezeigt, die besagt "Port tcp/8081 already defined, modifying instead" (Port tcp/8081 bereits definiert, wird stattdessen geändert), was bedeutet, dass der Port bereits konfiguriert war. Dies erklärt, warum httpd im vorherigen Schritt erfolgreich gestartet wurde. 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 jetzt 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 formell als HTTP-Port erkannt. Der httpd-Dienst sollte weiterhin ohne Probleme ausgeführt werden, 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 hindeutet, dass der Webserver erfolgreich mit der korrekten SELinux-Port-Kennzeichnung ausgeführt wird.

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 ausgeführt werden darf, wodurch die ordnungsgemäße Sicherheitskonformität gewährleistet wird.

Öffnen eines benutzerdefinierten Ports in der Firewall mit firewall-cmd

In diesem Schritt konfigurieren Sie die Firewall des Systems, um externe Verbindungen zu Ihrem Webserver auf dem benutzerdefinierten Port 8081 zuzulassen. Obwohl der httpd-Dienst dank der SELinux-Richtlinienänderung jetzt korrekt ausgeführt wird, blockiert der firewalld-Dienst, der Netzwerkverkehrsregeln verwaltet, wahrscheinlich standardmäßig eingehende Anfragen auf diesem nicht standardmäßigen Port.

Das Paket firewalld wurde bereits in der Setup-Phase installiert. Wir müssen jedoch zuerst den firewalld-Dienst starten. Überprü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 Containerumgebung 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 wurde, und überprüfen Sie dann, ob er ausgeführt wird:

sudo firewall-cmd --list-all

Jetzt 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, sich auf Port 8081 mit localhost zu verbinden.

curl http://localhost:8081

Sie sollten den HTML-Inhalt Ihrer Testseite sehen, was bedeutet, dass der Webserver lokal zugänglich ist. Dies ist zu erwarten, da firewalld standardmäßig in der Regel den Datenverkehr von localhost zulässt.

Für den externen Zugriff und die ordnungsgemäße Sicherheitskonfiguration müssen wir die Firewall jedoch noch richtig für unseren benutzerdefinierten Port konfigurieren. Während localhost-Verbindungen in der Regel unabhängig von den Firewall-Regeln funktionieren, würden externe Verbindungen von anderen Maschinen ohne die richtige Firewall-Konfiguration blockiert werden.

Untersuchen wir zunächst 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-Datenverkehr auf Port 8081 zuzulassen. Stellen Sie sicher, dass firewalld ausgeführt wird, bevor Sie diesen Befehl ausführen.

  • --add-port=8081/tcp gibt den zu öffnenden Port und das Protokoll an.
  • --permanent stellt sicher, dass die Regel nach einem Neustart oder einem Firewall-Neuladen erhalten 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 wurde.

Der Befehl sollte success zurückgeben, wenn firewalld ordnungsgemäß ausgeführt wird.

success

Permanente Regeln werden erst auf die aktive Firewall-Konfiguration angewendet, wenn sie 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 jetzt geöffnet ist, indem wir die Regeln erneut auflisten.

sudo firewall-cmd --list-all

Sie sollten jetzt 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 ist zu testen, ob Sie auf den Webserver zugreifen können.

Überprüfen des Zugriffs auf Standard- und benutzerdefinierte Webserver-Ports

In diesem letzten Schritt überprüfen Sie, ob alle vorgenommenen Änderungen sicherstellen, dass Ihr Webserver sowohl für den lokalen als auch für den externen Zugriff richtig konfiguriert ist. Sie haben die SELinux-Richtlinie konfiguriert und den erforderlichen Port in der Firewall geöffnet. Nun führen Sie umfassende Tests durch, um die Konfiguration zu bestätigen.

Zuerst erstellen wir eine einfache Testseite, damit wir beim Verbinden eine benutzerdefinierte Nachricht erhalten. Das Standard-Document-Root 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 Datei index.html. Der Befehl tee wird hier verwendet, da er uns erlaubt, in eine Datei zu schreiben, die sudo-Rechte erfordert, während eine Pipe verwendet wird. Sie sollten die Nachricht als Bestätigung im Terminal sehen.

Success! Web server on custom port 8081 is working.

Um die Übung abzuschließen, wollen wir den Kontrast demonstrieren, 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 ausgeführt wird. Durch dieses Lab haben Sie einen kritischen Troubleshooting-Workflow für Dienste unter RHEL gelernt:

  1. Überprüfen Sie den Dienststatus und die Protokolle.
  2. Untersuchen Sie SELinux-Verweigerungen im Audit-Protokoll.
  3. Korrigieren Sie SELinux-Richtlinien mit semanage.
  4. Konfigurieren Sie Firewall-Regeln mit firewall-cmd.
  5. Überprüfen Sie die Konnektivität.

Zusammenfassung

In diesem Lab haben Sie gelernt, wie man einen Webserver auf einem benutzerdefinierten Port konfiguriert und SELinux-Sicherheitsrichtlinien verwaltet. Mit dem Apache-Webserver (httpd), den Paketen policycoreutils-python-utils und firewalld, die bereits vorinstalliert waren, konzentrierten Sie sich auf das Verständnis der SELinux-Portverwaltung und der Firewall-Konfiguration. Sie haben die Datei httpd.conf geändert, um den Listening-Port des Webservers auf einen nicht standardmäßigen Port, 8081, zu ändern.

Sie haben festgestellt, dass der httpd-Dienst auf dem benutzerdefinierten Port erfolgreich gestartet wurde, da Port 8081 bereits in der SELinux-Richtlinie richtig konfiguriert war. Dies bot die Gelegenheit, die SELinux-Portverwaltung zu erkunden und zu verstehen, wie semanage funktioniert, um die korrekte Port-Kennzeichnung beizubehalten. Sie haben auch gelernt, firewall-cmd zu verwenden, um Firewall-Regeln zu verwalten und so sowohl die Einhaltung der Sicherheitsbestimmungen als auch die Zugänglichkeit sicherzustellen. Obwohl httpd in einem unconfined Kontext lief, demonstrierte dieses Lab die Bedeutung einer korrekten SELinux- und Firewall-Konfiguration für Produktionsumgebungen.