Einführung
In diesem Lab erhalten Sie praktische Erfahrung in der Verwaltung der SELinux-Sicherheit in RHEL. Sie lernen, die SELinux-Durchsetzungsmodi sowohl temporär als auch dauerhaft zu ändern und Apache mit benutzerdefinierten SELinux-Dateikontexten zu konfigurieren. Das Lab behandelt auch die Anpassung der SELinux-Richtlinie für Benutzer-Home-Verzeichnisse mithilfe von Booleans und bietet praktische Schritte zur Fehlerbehebung und Behebung von SELinux-Verweigerungen für Apache-Webserver und benutzerdefinierte Webinhalte.
SELinux-Durchsetzungsmodus ändern
In diesem Schritt lernen Sie, wie Sie SELinux-Modi sowohl temporär als auch dauerhaft verwalten. SELinux (Security-Enhanced Linux) ist ein Sicherheitsmechanismus, der eine obligatorische Zugriffskontrolle (MAC) für den Linux-Kernel bereitstellt. Es definiert die Zugriffsrechte für Prozesse, Dateien und andere Systemressourcen.
SELinux arbeitet in drei Hauptmodi:
- Enforcing (Durchsetzen): Die SELinux-Richtlinie wird durchgesetzt. Zugriffe, die von der Richtlinie verweigert werden, werden blockiert und protokolliert. Dies ist der Standard- und sicherste Modus.
- Permissive (Zulässig): Die SELinux-Richtlinie wird nicht durchgesetzt. Zugriffe, die von der Richtlinie verweigert werden, werden protokolliert, aber nicht blockiert. Dieser Modus ist nützlich für die Fehlerbehebung und das Testen neuer Richtlinien.
- Disabled (Deaktiviert): SELinux ist ausgeschaltet. Es wird keine Richtlinie geladen oder durchgesetzt. Dieser Modus wird im Allgemeinen nicht für Produktionssysteme empfohlen.
Sie werden üben, den SELinux-Modus mithilfe von Befehlszeilentools und durch Ändern von Konfigurationsdateien zu ändern.
Zuerst wollen wir den aktuellen SELinux-Durchsetzungsmodus überprüfen.
Überprüfen Sie den aktuellen SELinux-Durchsetzungsmodus.
Sie können den Befehl
getenforceverwenden, um schnell den aktuellen SELinux-Modus anzuzeigen.getenforceSie sollten
Enforcingals Ausgabe sehen, was darauf hindeutet, dass SELinux derzeit seine Richtlinien durchsetzt.EnforcingÄndern Sie den SELinux-Modus vorübergehend in
permissive.Mit dem Befehl
setenforcekönnen Sie den SELinux-Modus zur Laufzeit ändern. Ein Wert von0setzt den Modus aufpermissive, und1setzt ihn aufenforcing. Diese Änderung ist temporär und bleibt nicht über Neustarts hinweg erhalten.sudo setenforce 0Überprüfen Sie nun die Änderung erneut mit
getenforce.getenforceDie Ausgabe sollte jetzt
Permissivesein.PermissiveÄndern Sie den SELinux-Modus vorübergehend zurück in
enforcing.Um die temporäre Änderung rückgängig zu machen, verwenden Sie
setenforce 1.sudo setenforce 1Überprüfen Sie den Modus noch einmal.
getenforceDie Ausgabe sollte wieder
Enforcingsein.EnforcingÄndern Sie den Standard-SELinux-Modus dauerhaft in
permissive.Um SELinux-Modusänderungen über Neustarts hinweg persistent zu machen, müssen Sie die Datei
/etc/selinux/configändern. Diese Datei definiert den Standard-SELinux-Modus für das System.Öffnen Sie die Konfigurationsdatei mit
nano.sudo nano /etc/selinux/configSuchen Sie im
nano-Editor die Zeile, die mitSELINUX=beginnt, und ändern Sie ihren Wert vonenforcinginpermissive.## This file controls the state of SELinux on the system. ## SELINUX= can take one of these three values: ## enforcing - SELinux security policy is enforced. ## permissive - SELinux prints warnings instead of enforcing. ## disabled - No SELinux policy is loaded. SELINUX=permissive ## SELINUXTYPE= can take one of these three values: ## targeted - Targeted processes are protected, ## for the majority of users. ## minimum - Modification of targeted policy ## uses current settings and adds to it. ## mls - Multi Level Security protection. SELINUXTYPE=targetedDrücken Sie
Ctrl+Xzum Beenden, dannYzum Bestätigen des Speicherns undEnter, um in dieselbe Datei zu schreiben.Nach dem Speichern der Datei können Sie die Änderung in der Konfigurationsdatei mit
grepbestätigen.grep '^SELINUX' /etc/selinux/configDie Ausgabe sollte
SELINUX=permissiveanzeigen.SELINUX=permissive SELINUXTYPE=targetedWichtiger Hinweis: Das Ändern von
/etc/selinux/configändert nicht sofort den aktiven SELinux-Modus. Es legt nur den Modus fest, der nach dem nächsten Systemneustart angewendet wird. Um den aktuellen aktiven Modus anzuzeigen, müssen Sie weiterhingetenforceverwenden.getenforceEs sollte immer noch
Enforcinganzeigen, da das System noch nicht neu gestartet wurde.EnforcingÄndern Sie den Standard-SELinux-Modus in der Konfigurationsdatei wieder in
enforcing.Ändern wir nun den persistenten Modus wieder in
enforcing. Dies ist die empfohlene und sicherste Einstellung für SELinux.Öffnen Sie die Konfigurationsdatei erneut.
sudo nano /etc/selinux/configÄndern Sie den Parameter
SELINUX=wieder inenforcing.## This file controls the state of SELinux on the system. ## SELINUX= can take one of these three values: ## enforcing - SELinux security policy is enforced. ## permissive - SELinux prints warnings instead of enforcing. ## disabled - No SELinux policy is loaded. SELINUX=enforcing ## SELINUXTYPE= can take one of these three values: ## targeted - Targeted processes are protected, ## for the majority of users. ## minimum - Modification of targeted policy ## uses current settings and adds to it. ## mls - Multi Level Security protection. SELINUXTYPE=targetedSpeichern und beenden Sie die Datei (
Ctrl+X,Y,Enter).Bestätigen Sie die Änderung in der Konfigurationsdatei.
grep '^SELINUX' /etc/selinux/configDie Ausgabe sollte jetzt
SELINUX=enforcinganzeigen.SELINUX=enforcing SELINUXTYPE=targetedZu diesem Zeitpunkt ist der aktive SELinux-Modus des Systems immer noch
Enforcing(wenn Sie nach Schritt 4 nicht neu gestartet haben), und die persistente Einstellung ist ebenfallsEnforcing.
Apache mit benutzerdefinierten SELinux-Dateikontexten konfigurieren
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 Pakethttpdzu installieren.sudo dnf install -y httpdSie sollten eine Ausgabe sehen, die die erfolgreiche Installation des Pakets
httpdund seiner Abhängigkeiten anzeigt.Erstellen Sie ein benutzerdefiniertes Verzeichnis für Webinhalte und eine
index.html-Datei.Sie erstellen ein neues Verzeichnis namens
/customund legen eine einfacheindex.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.htmlThis 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/customanstelle des Standardverzeichnisses/var/www/htmlzu verweisen.Öffnen Sie die Konfigurationsdatei mit
nano.sudo nano /etc/httpd/conf/httpd.confSuchen Sie im Editor die Zeilen
DocumentRoot "/var/www/html"und<Directory "/var/www/html">. Ändern Sie beide Vorkommnisse von/var/www/htmlin/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
httpdstarten. Da Sie sich in einer Containerumgebung befinden, istsystemctlnicht verfügbar. Sie startenhttpddirekt.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 messageHinweis: 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
httpdsuchen.ps aux | grep httpdSie 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
curlauf Ihre Webseite zuzugreifen. Da Sie sich auf demselben Rechner befinden, können Sielocalhostverwenden.curl http://localhost/index.htmlHinweis: In dieser speziellen Umgebung stellen Sie möglicherweise fest, dass die Webseite auch mit dem Kontext
root_tzugänglich ist. Dies zeigt, dass der Kontextroot_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 Kontexthttpd_sys_content_tverwenden.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/customund der Dateiindex.htmlanzuzeigen.ls -Zd /custom /custom/index.htmlSie werden feststellen, dass sie den Kontext
root_thaben, 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.htmlVergleichen Sie dies mit dem Standard-Apache-Dokument-Root:
ls -Zd /var/www/htmlSie werden sehen, dass
/var/www/htmlden Kontexthttpd_sys_content_that. Dies ist der Kontext, den Sie auf Ihr benutzerdefiniertes Verzeichnis anwenden müssen.system_u:object_r:httpd_sys_content_t:s0 /var/www/htmlDefinieren Sie eine persistente SELinux-Dateikontextregel für
/custom.Der Befehl
semanage fcontextwird verwendet, um SELinux-Dateikontext-Zuordnungsregeln zu verwalten. Die Option-afügt eine neue Regel hinzu,-tgibt den Zieltyp an, und der reguläre Ausdruck'/custom(/.*)?'stimmt mit dem Verzeichnis/customselbst 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
restoreconwird verwendet, um die SELinux-Kontexte von Dateien und Verzeichnissen auf ihre Standardwerte zurückzusetzen, wie sie von der Richtlinie definiert werden. Die Option-Rwendet die Änderung rekursiv an, und-vliefert eine ausführliche Ausgabe.sudo restorecon -Rv /customSie sollten eine Ausgabe sehen, die anzeigt, dass die Kontexte von
/customund/custom/index.htmlneu 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.htmlSie sollten jetzt den Kontext
httpd_sys_content_thaben.system_u:object_r:httpd_sys_content_t:s0 /custom system_u:object_r:httpd_sys_content_t:s0 /custom/index.htmlGreifen Sie erneut auf die Webseite zu.
Da die SELinux-Kontexte jetzt korrekt sind, versuchen Sie erneut, mit
curlauf die Webseite zuzugreifen.curl http://localhost/index.htmlSie sollten jetzt den Inhalt Ihrer Datei
index.htmlsehen.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 httpdSie sollten nur den
grep-Prozess selbst sehen.labex ... grep httpd
SELinux-Richtlinie für Benutzer-Home-Verzeichnisse mit Booleans anpassen
In diesem Schritt lernen Sie, wie Sie die SELinux-Richtlinie mithilfe von Booleans anpassen, um Apache zu erlauben, Webinhalte aus den Home-Verzeichnissen der Benutzer bereitzustellen. Standardmäßig verhindert SELinux aus Sicherheitsgründen, dass Dienste wie Apache auf Dateien in den Home-Verzeichnissen der Benutzer zugreifen. Es gibt jedoch bestimmte Szenarien, wie z. B. persönliche Webseiten, in denen diese Funktionalität gewünscht ist.
SELinux-Booleans sind True/False-Einstellungen, mit denen Administratoren das Verhalten der SELinux-Richtlinie ändern können, ohne komplexe benutzerdefinierte Richtlinien schreiben zu müssen. Sie bieten eine flexible Möglichkeit, bestimmte Sicherheitsfunktionen zu aktivieren oder zu deaktivieren. Zum Beispiel gibt es ein Boolean speziell dafür, Apache den Zugriff auf Benutzer-Home-Verzeichnisse zu erlauben.
Aktivieren Sie die Benutzerverzeichnisfunktion von Apache.
Apache hat ein Modul namens
mod_userdir, das es Benutzern ermöglicht, Webinhalte aus einempublic_html-Verzeichnis innerhalb ihres Home-Verzeichnisses zu veröffentlichen (z. B.~/public_html). Diese Funktion wird typischerweise in/etc/httpd/conf.d/userdir.confkonfiguriert. Standardmäßig ist diese Funktion oft deaktiviert.Öffnen Sie die Konfigurationsdatei mit
nano.sudo nano /etc/httpd/conf.d/userdir.confIm Editor finden Sie Zeilen, die sich auf
UserDirbeziehen. Sie müssen die Zeile, dieUserDirdeaktiviert, auskommentieren und die Zeile, die sie fürpublic_htmlaktiviert, einkommentieren.Ändern Sie:
UserDir disabled #UserDir public_htmlIn:
#UserDir disabled UserDir public_htmlSpeichern und beenden Sie die Datei (
Ctrl+X,Y,Enter).Erstellen Sie ein
public_html-Verzeichnis und eineindex.html-Datei in Ihrem Home-Verzeichnis.Sie erstellen das Verzeichnis
public_htmlund eineindex.html-Datei darin. Hier befinden sich Ihre persönlichen Webinhalte.mkdir ~/public_html echo 'This is labex user content.' > ~/public_html/index.htmlÜberprüfen Sie den Inhalt der Datei
index.html.cat ~/public_html/index.htmlThis is labex user content.Information: Als Sie das Verzeichnis
~/public_htmlerstellten, wurde es automatisch mit den SELinux-Kontextenuser_home_tund~/(Ihr Home-Verzeichnis) mithome_dir_tkonfiguriert. Der Apache-Webserverprozess (httpd_t) kann standardmäßig keine Dateien lesen, die mituser_home_toderhome_dir_tgekennzeichnet sind, aufgrund der SELinux-Richtlinie.Starten Sie den Apache-Webdienst.
Starten Sie den Dienst
httpd. Denken Sie daran, dasssystemctlin dieser Containerumgebung nicht verfügbar ist, also starten Siehttpddirekt.sudo /usr/sbin/httpd -DFOREGROUND &Möglicherweise wird eine Warnmeldung über den vollqualifizierten Domänennamen des Servers angezeigt, die in dieser Lab-Umgebung ignoriert werden kann.
Überprüfen Sie, ob Apache ausgeführt wird.
ps aux | grep httpdroot ... /usr/sbin/httpd -DFOREGROUND apache ... /usr/sbin/httpd -DFOREGROUND ...output omitted...Versuchen Sie, auf die Webseite des Benutzers zuzugreifen, und beobachten Sie die SELinux-Verweigerung.
Versuchen Sie nun, mit
curlauf Ihre persönliche Webseite zuzugreifen. Die URL für Benutzerverzeichnisse hat typischerweise das Formathttp://localhost/~username/.curl http://localhost/~labex/index.htmlSie erhalten wahrscheinlich einen "Forbidden"-Fehler, der anzeigt, dass Apache aufgrund von SELinux immer noch nicht auf den Inhalt zugreifen kann.
<!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 /~labex/index.html on this server.<br /> </p> </body></html>Überprüfen Sie die SELinux-Booleans, die sich auf Home-Verzeichnisse für
httpdbeziehen.Mit dem Befehl
getseboolkönnen Sie den aktuellen Zustand der SELinux-Booleans anzeigen. Sie können die Ausgabe mitgrepfiltern, um Booleans zu finden, die sich aufhttpdund Home-Verzeichnisse beziehen.sudo getsebool -a | grep httpd | grep homeSie sollten
httpd_enable_homedirs --> offsehen, was anzeigt, dass dieses Boolean derzeit deaktiviert ist.httpd_enable_homedirs --> offAktivieren Sie das Boolean
httpd_enable_homedirsdauerhaft.Der Befehl
setseboolwird verwendet, um den Zustand der SELinux-Booleans zu ändern. Die Option-Pmacht die Änderung über Neustarts hinweg persistent.sudo setsebool -P httpd_enable_homedirs onÜberprüfen Sie, ob das Boolean jetzt
onist.sudo getsebool -a | grep httpd | grep homehttpd_enable_homedirs --> onLegen Sie die korrekten Dateiberechtigungen für das Home-Verzeichnis fest.
Auch wenn das SELinux-Boolean aktiviert ist, benötigt Apache die richtigen Dateisystemberechtigungen, um auf Ihr Home-Verzeichnis und das Verzeichnis
public_htmlzuzugreifen. Standardmäßig sind Benutzer-Home-Verzeichnisse für den Apache-Benutzer nicht zugänglich.chmod 711 ~ chmod 755 ~/public_html chmod 644 ~/public_html/index.htmlGreifen Sie erneut auf die Webseite zu.
Nachdem sowohl das Boolean
httpd_enable_homedirsaktiviert als auch die Dateiberechtigungen korrekt sind, versuchen Sie erneut, mitcurlauf Ihre persönliche Webseite zuzugreifen.curl http://localhost/~labex/index.htmlSie sollten jetzt den Inhalt Ihrer Datei
index.htmlsehen.This is labex user content.Fehlerbehebung: Wenn Sie auch nach dem Aktivieren des Booleans und dem Festlegen der Dateiberechtigungen weiterhin auf Zugriffsprobleme stoßen, zeigt dies die mehrschichtige Natur der Linux-Sicherheit. In einigen Umgebungen können zusätzliche Faktoren wie:
- Apache-Konfigurationsdirektiven in
/etc/httpd/conf.d/userdir.conf - SELinux-Dateikontexte auf der Home-Verzeichnisstruktur
- Zusätzliche Apache-Module oder Sicherheitseinstellungen
möglicherweise berücksichtigt werden müssen. Der wichtigste Lernpunkt ist das Verständnis, wie SELinux-Booleans in Verbindung mit herkömmlichen Dateiberechtigungen und anwendungsspezifischen Konfigurationen funktionieren.
- Apache-Konfigurationsdirektiven in
Beenden Sie den Apache HTTP-Serverprozess.
Beenden Sie abschließend den Apache HTTP-Serverprozess.
sudo pkill httpdÜberprüfen Sie, ob keine
httpd-Prozesse ausgeführt werden.ps aux | grep httpdlabex ... grep httpd
Fehlerbehebung bei SELinux-Verweigerungen für den Apache Webserver
In diesem Schritt lernen Sie, wie Sie SELinux-Sicherheitsverweigerungen identifizieren und beheben, wobei der Schwerpunkt auf Problemen liegt, die den Apache-Webserver daran hindern könnten, ordnungsgemäß zu funktionieren. Wenn SELinux eine Operation blockiert, protokolliert es eine "Access Vector Cache" (AVC)-Verweigerungsnachricht. Diese Nachrichten sind entscheidend, um zu verstehen, warum eine Operation fehlgeschlagen ist und wie sie behoben werden kann.
Sie verwenden Tools wie auditd (der Linux Auditing System-Daemon) und sealert, um diese Verweigerungsnachrichten zu analysieren. auditd sammelt Systemaufrufe und Ereignisse, einschließlich SELinux-Verweigerungen, und speichert sie in /var/log/audit/audit.log. Das Tool sealert, Teil des Pakets setroubleshoot-server, kann diese Protokolle parsen und für SELinux-Verweigerungen für Menschen lesbare Erklärungen und Lösungsvorschläge liefern.
Zuerst müssen Sie sicherstellen, dass auditd und setroubleshoot-server installiert sind.
Installieren Sie
auditdundsetroubleshoot-server.sudo dnf install -y audit setroubleshoot-serverSie sollten eine Ausgabe sehen, die die erfolgreiche Installation dieser Pakete anzeigt.
Starten Sie den Apache-Webserver und erstellen Sie eine problematische Datei.
Um eine SELinux-Verweigerung zu simulieren, erstellen Sie eine Datei mit einem falschen SELinux-Kontext und versuchen Sie, sie mit Apache bereitzustellen.
Stellen Sie zuerst sicher, dass Apache ausgeführt wird.
sudo /usr/sbin/httpd -DFOREGROUND &Erstellen Sie nun ein neues Verzeichnis und eine
index.html-Datei darin. Dieses Mal legen Sie absichtlich einen falschen SELinux-Kontext für diese Datei fest, um eine Verweigerung auszulösen.sudo mkdir /testweb echo 'This is a test page.' | sudo tee /testweb/index.htmlStandardmäßig hat
/testweb/index.htmlwahrscheinlich den Kontextroot_t. Bestätigen wir das.ls -Z /testweb/index.htmlsystem_u:object_r:root_t:s0 /testweb/index.htmlKonfigurieren wir nun Apache so, dass er von
/testwebaus bereitstellt. Öffnen Sie/etc/httpd/conf/httpd.conf.sudo nano /etc/httpd/conf/httpd.confÄndern Sie
DocumentRootund die Direktive<Directory>in/testweb.DocumentRoot "/testweb" <Directory "/testweb"> AllowOverride None Require all granted </Directory>Speichern und beenden Sie (
Ctrl+X,Y,Enter).Starten Sie Apache neu, um die Konfigurationsänderungen zu übernehmen. Da Sie sich in einem Container befinden, müssen Sie den alten Prozess beenden und einen neuen starten.
sudo pkill httpd sudo /usr/sbin/httpd -DFOREGROUND &Versuchen Sie, auf die Webseite zuzugreifen.
Versuchen Sie, mit
curlauf die Webseite zuzugreifen.curl http://localhost/index.htmlWichtiger Hinweis: In dieser Umgebung stellen Sie möglicherweise fest, dass die Webseite auch mit dem Kontext
root_tzugänglich ist, ähnlich wie in Schritt 2 beobachtet. Dies zeigt, dass der Kontextroot_t, während SELinux durchgesetzt wird, breitere Berechtigungen hat als restriktivere Kontexte.This is a test page.Zum Zweck des Lernens von SELinux-Fehlerbehebungstechniken werden wir jedoch so vorgehen, als gäbe es eine Verweigerung. In restriktiveren SELinux-Umgebungen oder mit unterschiedlichen Richtlinienkonfigurationen würde der Zugriff auf Dateien mit ungeeigneten Kontexten tatsächlich Verweigerungen erzeugen.
Erfahren Sie mehr über die Untersuchung von SELinux-Verweigerungen mit
ausearch.Der Befehl
ausearchwird verwendet, um die Audit-Protokolle abzufragen. Sie können nach SELinux-AVC-Verweigerungen (-m AVC) suchen, die heute aufgetreten sind (-ts today).sudo ausearch -m AVC -ts todayHinweis: Da die Webseite in unserer Umgebung zugänglich war, sehen Sie möglicherweise keine aktuellen AVC-Verweigerungen, die sich auf diesen speziellen Test beziehen. Dieser Befehl würde jedoch normalerweise detaillierte Audit-Protokolleinträge ausgeben, wenn es Verweigerungen gäbe. In einem typischen Verweigerungsszenario würden Sie nach Einträgen suchen, die sich auf
httpdund/testweb/index.htmlbeziehen.Ein typischer AVC-Verweigerungseintrag würde so aussehen:
---- time->... type=AVC msg=audit(...): avc: denied { getattr } for pid=... comm="httpd" path="/testweb/index.html" dev="overlay" ino=... scontext=system_u:system_r:httpd_t:s0 tcontext=system_u:object_r:root_t:s0 tclass=file permissive=0 ...output omitted...Die wichtigsten Teile in einer AVC-Verweigerung wären:
denied { getattr }: Die Operation, die verweigert wurde (Abrufen von Attributen der Datei).comm="httpd": Der Prozess, dem die Verweigerung erteilt wurde (Apache HTTP-Server).path="/testweb/index.html": Die Datei, auf die zugegriffen wurde.scontext=system_u:system_r:httpd_t:s0: Der SELinux-Kontext der Quelle (Apache).tcontext=system_u:object_r:root_t:s0: Der SELinux-Kontext des Ziels (Ihre Dateiindex.html).tclass=file: Der Typ des Ziels (eine Datei).
Diese Ausgabe zeigt deutlich, dass
httpd_t(Apache) dergetattr-Zugriff auf eine Datei mit dem Kontextdefault_tverweigert wurde.Erfahren Sie mehr über die Verwendung von
sealertfür die SELinux-Analyse.sealertkann die Audit-Protokolle parsen und benutzerfreundlichere Informationen liefern. Sie können entwedersealert -aausführen, um alle aktuellen Verweigerungen zu analysieren, odersealert -l <UUID>verwenden, wenn Sie eine bestimmte UUID aus einersetroubleshoot-Nachricht in/var/log/messageshaben.sudo sealert -a /var/log/audit/audit.logHinweis: Da wir in dieser Umgebung keine tatsächlichen Verweigerungen festgestellt haben, zeigt die Ausführung von
sealertmöglicherweise keine Ergebnisse an, die sich auf unser/testweb-Beispiel beziehen. In einem Szenario, in dem SELinux-Verweigerungen auftreten, würdesealertjedoch das Audit-Protokoll analysieren und eine Zusammenfassung präsentieren.Eine typische
sealert-Ausgabe für ein httpd-Kontextproblem würde so aussehen:SELinux is preventing /usr/sbin/httpd from getattr access on the file /testweb/index.html. ***** Plugin catchall_labels (83.8 confidence) suggests ******************* If you want to allow httpd to have getattr access on the index.html file Then you need to change the label on /testweb/index.html Do ## semanage fcontext -a -t FILE_TYPE '/testweb/index.html' where FILE_TYPE is one of the following: httpd_sys_content_t, httpd_sys_script_exec_t, httpd_unconfined_script_exec_t, ... ***** Plugin httpd_can_network_connect (93.8 confidence) suggests ********* If you want to allow httpd to connect to the network (for example, to a database) Then you must set the httpd_can_network_connect boolean to on. Do ## setsebool -P httpd_can_network_connect on ...output omitted...Die
sealert-Ausgabe wäre in realen Verweigerungsszenarien sehr hilfreich. Sie würde das Problem explizit angeben und Lösungen vorschlagen, z. B. das Ändern der Bezeichnung mitsemanage fcontext -a -t FILE_TYPE '/testweb/index.html'und das Auflisten vonhttpd_sys_content_tals geeignetenFILE_TYPE.Beenden Sie abschließend den Apache HTTP-Serverprozess.
sudo pkill httpdÜberprüfen Sie, ob keine
httpd-Prozesse ausgeführt werden.ps aux | grep httpdlabex ... grep httpd
Behebung von SELinux-Problemen für benutzerdefinierte Webinhalte
In diesem letzten Schritt wenden Sie das Wissen aus der vorherigen Fehlerbehebung an, um die SELinux-Verweigerung zu beheben, die Apache daran hinderte, Inhalte aus dem Verzeichnis /testweb bereitzustellen. Sie verwenden semanage fcontext, um den korrekten SELinux-Kontext für Ihre benutzerdefinierten Webinhalte zu definieren, und restorecon, um ihn anzuwenden.
Dieser Prozess festigt das Verständnis, wie SELinux-Kontexte funktionieren und wie man sie für Dienste wie Apache korrekt konfiguriert.
Stellen Sie sicher, dass Apache ausgeführt wird und die Konfiguration vorhanden ist.
Stellen Sie zunächst sicher, dass Apache so konfiguriert ist, dass er von
/testwebaus bereitstellt, und dass er ausgeführt wird. Wenn Sie Apache im vorherigen Schritt gestoppt haben, starten Sie ihn erneut.sudo /usr/sbin/httpd -DFOREGROUND &Überprüfen Sie, ob
DocumentRootin/etc/httpd/conf/httpd.confauf/testwebgesetzt ist. Wenn nicht, ändern Sie es wie im vorherigen Schritt.grep "DocumentRoot" /etc/httpd/conf/httpd.confDocumentRoot "/testweb"Bestätigen Sie außerdem, dass
/testweb/index.htmlexistiert und den Kontextroot_that.ls -Z /testweb/index.htmlsystem_u:object_r:root_t:s0 /testweb/index.htmlGreifen Sie auf die Webseite zu, um das aktuelle Verhalten zu bestätigen.
Überprüfen wir, ob die Webseite derzeit mit dem Kontext
root_tzugänglich ist.curl http://localhost/index.htmlWie wir bereits gesehen haben, ist die Seite auch mit dem Kontext
root_tzugänglich.This is a test page.Obwohl dies funktioniert, werden wir fortfahren, um die richtige SELinux-Konfiguration für Webinhalte zu demonstrieren.
Definieren Sie den korrekten SELinux-Dateikontext für
/testweb.Der korrekte SELinux-Kontext für Webinhalte, die von Apache bereitgestellt werden, ist
httpd_sys_content_t. Sie müssen eine persistente Regel mitsemanage fcontexthinzufügen.sudo semanage fcontext -a -t httpd_sys_content_t '/testweb(/.*)?'Dieser Befehl weist SELinux an, alle Dateien oder Verzeichnisse innerhalb von
/testweb(einschließlich/testwebselbst) mithttpd_sys_content_tzu kennzeichnen.Wenden Sie die neuen SELinux-Kontexte auf die Dateien an.
Nachdem Sie die Regel definiert haben, müssen Sie sie mit
restoreconauf die vorhandenen Dateien anwenden.sudo restorecon -Rv /testwebSie sollten eine Ausgabe sehen, die anzeigt, dass die Kontexte neu bezeichnet wurden.
Relabeled /testweb from system_u:object_r:root_t:s0 to system_u:object_r:httpd_sys_content_t:s0 Relabeled /testweb/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 -Z /testweb/index.htmlsystem_u:object_r:httpd_sys_content_t:s0 /testweb/index.htmlGreifen Sie erneut auf die Webseite zu, um die korrekte Konfiguration zu bestätigen.
Nachdem die SELinux-Kontexte nun gemäß den Best Practices korrekt angewendet wurden, versuchen Sie, die Webseite ein weiteres Mal mit
curlaufzurufen.curl http://localhost/index.htmlDer Inhalt sollte weiterhin zugänglich sein, und jetzt ist er ordnungsgemäß mit dem empfohlenen SELinux-Kontext konfiguriert.
This is a test page.Dies zeigt, dass die Verwendung des richtigen Kontexts
httpd_sys_content_tden SELinux-Best Practices folgt und die Kompatibilität über verschiedene Sicherheitskonfigurationen hinweg sicherstellt, auch wenn der Kontextroot_tin dieser Umgebung funktionieren mag.Beenden Sie abschließend den Apache HTTP-Serverprozess.
sudo pkill httpdÜberprüfen Sie, ob keine
httpd-Prozesse ausgeführt werden.ps aux | grep httpdlabex ... grep httpd
Zusammenfassung
In diesem Lab haben Sie gelernt, die SELinux-Sicherheit in RHEL zu verwalten. Sie begannen damit, zu verstehen und zu üben, wie man die SELinux-Durchsetzungsmodi ändert, sowohl temporär mit setenforce als auch dauerhaft durch Ändern von /etc/selinux/config. Dies beinhaltete die Überprüfung des aktuellen Modus mit getenforce und das Verständnis der Auswirkungen der Modi Enforcing, Permissive und Disabled.
Darüber hinaus haben Sie praktische Erfahrung in der Konfiguration von Apache mit benutzerdefinierten SELinux-Dateikontexten unter Verwendung von semanage fcontext und restorecon gesammelt, um einen ordnungsgemäßen Webserverbetrieb sicherzustellen. Sie haben auch gelernt, die SELinux-Richtlinie für Benutzer-Home-Verzeichnisse anzupassen, indem Sie bestimmte SELinux-Booleans mit setsebool aktivieren. Schließlich behandelte das Lab wesentliche Fehlerbehebungstechniken für SELinux-Verweigerungen, insbesondere für den Apache-Webserver, indem Audit-Protokolle mit ausearch und audit2allow analysiert wurden, um Zugriffsprobleme für benutzerdefinierte Webinhalte zu identifizieren und zu beheben.



