Absicherung mit firewalld und SELinux in RHEL

Red Hat Enterprise LinuxBeginner
Jetzt üben

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:

  1. Port 8081 in einigen Konfigurationen standardmäßig für HTTP-Dienste erlaubt ist.
  2. Der httpd-Prozess in einem unbeschränkten Kontext läuft.
  3. 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 -a steht für "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 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/tcp gibt den zu öffnenden Port und das Protokoll an.
  • --permanent stellt 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:

  1. Dienststatus und Protokolle prüfen.
  2. SELinux-Verweigerungen im Audit-Log untersuchen.
  3. SELinux-Richtlinien mit semanage korrigieren.
  4. Firewall-Regeln mit firewall-cmd konfigurieren.
  5. 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.