Website-Suche

RHCSA-Reihe: Obligatorische Grundlagen der Zugriffskontrolle mit SELinux in RHEL 7 – Teil 13


In dieser Serie haben wir mindestens zwei Zugriffskontrollmethoden im Detail untersucht: Standard-ugo/rwx-Berechtigungen (Benutzer und Gruppen verwalten – Teil 3) und Zugriffskontrolllisten (ACLs konfigurieren). zu Dateisystemen – Teil 7).

Obwohl sie als Berechtigungen und Zugriffskontrollmechanismen der ersten Ebene notwendig sind, weisen sie einige Einschränkungen auf, die durch Security Enhanced Linux (kurz SELinux) behoben werden.

Eine dieser Einschränkungen besteht darin, dass ein Benutzer eine Datei oder ein Verzeichnis durch einen schlecht ausgearbeiteten chmod-Befehl einer Sicherheitsverletzung aussetzen und so eine unerwartete Weitergabe von Zugriffsrechten verursachen kann. Infolgedessen kann jeder von diesem Benutzer gestartete Prozess mit den Dateien, die ihm gehören, tun, was er will, und schließlich kann eine bösartige oder anderweitig kompromittierte Software Root-Zugriff auf das gesamte System erlangen.

Unter Berücksichtigung dieser Einschränkungen hat die United States National Security Agency (NSA) zunächst SELinux entwickelt, eine flexible Methode zur obligatorischen Zugriffskontrolle, um den Zugriff einzuschränken Fähigkeit von Prozessen, auf Systemobjekte (z. B. Dateien, Verzeichnisse, Netzwerkports usw.) zuzugreifen oder andere Vorgänge an ihnen auszuführen, auf das Modell mit der geringsten Berechtigung, das später bei Bedarf geändert werden kann. Kurz gesagt: Jedes Element des Systems erhält nur den Zugriff, der zum Funktionieren erforderlich ist.

In RHEL 7 ist SELinux in den Kernel selbst integriert und standardmäßig im Enforcing-Modus aktiviert. In diesem Artikel erklären wir kurz die Grundkonzepte von SELinux und seine Funktionsweise.

SELinux-Modi

SELinux kann auf drei verschiedene Arten funktionieren:

  1. Durchsetzung: SELinux verweigert den Zugriff auf der Grundlage von SELinux-Richtlinienregeln, einer Reihe von Richtlinien, die die Sicherheits-Engine steuern.
  2. Permissiv: SELinux verweigert den Zugriff nicht, es werden jedoch Verweigerungen für Aktionen protokolliert, die bei Ausführung im erzwingenden Modus verweigert worden wären.
  3. Deaktiviert (selbsterklärend).

Der Befehl getenforce zeigt den aktuellen Modus von SELinux an, wohingegen setenforce (gefolgt von einer 1 oder einer 0) angezeigt wird Wird verwendet, um den Modus nur während der aktuellen Sitzung auf Erzwingend bzw. Permissiv zu ändern.

Um eine Persistenz über Abmeldungen und Neustarts hinweg zu erreichen, müssen Sie die Datei /etc/selinux/config bearbeiten und die SELINUX-Variable entweder auf erzwingend oder permissiv“ setzen oder deaktiviert:

getenforce
setenforce 0
getenforce
setenforce 1
getenforce
cat /etc/selinux/config

Normalerweise verwenden Sie setenforce, um als ersten Schritt zur Fehlerbehebung zwischen den SELinux-Modi (erzwingend zu freizügig und zurück) umzuschalten. Wenn SELinux derzeit auf erzwingend eingestellt ist, während bei Ihnen ein bestimmtes Problem auftritt, und das Gleiche verschwindet, wenn Sie es auf permissiv setzen, können Sie sicher sein, dass Sie es suchen bei einem SELinux-Berechtigungsproblem.

SELinux-Kontexte

Ein SELinux-Kontext besteht aus einer Zugriffskontrollumgebung, in der Entscheidungen basierend auf SELinux-Benutzer, Rolle und Typ (und optional einer Ebene) getroffen werden:

  1. Ein SELinux-Benutzer ergänzt ein reguläres Linux-Benutzerkonto, indem er es einem SELinux-Benutzerkonto zuordnet, das wiederum im SELinux-Kontext für Prozesse in dieser Sitzung verwendet wird, um deren zulässige Rollen und Ebenen explizit zu definieren.
  2. Das Rollenkonzept fungiert als Vermittler zwischen Domänen und SELinux-Benutzern, indem es definiert, auf welche Prozessdomänen und Dateitypen zugegriffen werden kann. Dadurch wird Ihr System vor der Anfälligkeit für Privilege-Escalation-Angriffe geschützt.
  3. Ein Typ definiert einen SELinux-Dateityp oder eine SELinux-Prozessdomäne. Unter normalen Umständen wird verhindert, dass Prozesse auf Dateien zugreifen, die andere Prozesse verwenden, und auf andere Prozesse zugreifen. Daher ist der Zugriff nur dann zulässig, wenn eine bestimmte SELinux-Richtlinienregel vorhanden ist, die dies zulässt.

Sehen wir uns anhand der folgenden Beispiele an, wie das alles funktioniert.

BEISPIEL 1: Ändern des Standardports für den SSHD-Daemon

In „SSH sichern – Teil 8“ haben wir erklärt, dass die Änderung des Standardports, an dem sshd lauscht, eine der ersten Sicherheitsmaßnahmen ist, um Ihren Server vor externen Angriffen zu schützen. Bearbeiten wir die Datei /etc/ssh/sshd_config und setzen den Port auf 9999:

Port 9999

Speichern Sie die Änderungen und starten Sie sshd neu:

systemctl restart sshd
systemctl status sshd

Wie Sie sehen, konnte SSHD nicht gestartet werden. Aber was ist passiert?

Eine kurze Überprüfung von /var/log/audit/audit.log zeigt, dass sshd die Erlaubnis zum Starten auf Port 9999 verweigert wurde (SELinux-Protokollmeldungen enthalten das Wort „AVC“, damit sie anhand anderer Nachrichten leicht identifiziert werden können), da dies ein reservierter Port für den JBoss Management-Dienst ist:

cat /var/log/audit/audit.log | grep AVC | tail -1

An dieser Stelle könnten Sie SELinux deaktivieren (aber nicht!), wie zuvor erklärt, und versuchen, sshd erneut zu starten, und es sollte funktionieren. Das Dienstprogramm semanage kann uns jedoch sagen, was wir ändern müssen, damit wir sshd ohne Probleme an jedem von uns gewählten Port starten können.

Laufen,

semanage port -l | grep ssh

um eine Liste der Ports zu erhalten, an denen SELinux sshd zum Abhören zulässt.

Ändern wir also den Port in /etc/ssh/sshd_config in Port 9998, fügen den Port zum ssh_port_t-Kontext hinzu und starten dann den Dienst neu :

semanage port -a -t ssh_port_t -p tcp 9998
systemctl restart sshd
systemctl is-active sshd

Wie Sie sehen, wurde der Dienst dieses Mal erfolgreich gestartet. Dieses Beispiel veranschaulicht die Tatsache, dass SELinux die TCP-Portnummer anhand seiner eigenen internen Porttypdefinitionen steuert.

BEISPIEL 2: Zulassen, dass httpd Zugriff auf sendmail sendet

Dies ist ein Beispiel dafür, wie SELinux einen Prozess verwaltet, der auf einen anderen Prozess zugreift. Wenn Sie mod_security und mod_evasive zusammen mit Apache auf Ihrem RHEL 7-Server implementieren, müssen Sie httpd den Zugriff auf sendmail erlauben, um im Anschluss daran eine E-Mail-Benachrichtigung zu senden ein (D)DoS-Angriff. Lassen Sie im folgenden Befehl das Flag -P weg, wenn Sie nicht möchten, dass die Änderung über Neustarts hinweg bestehen bleibt.

semanage boolean -1 | grep httpd_can_sendmail
setsebool -P httpd_can_sendmail 1
semanage boolean -1 | grep httpd_can_sendmail

Wie Sie dem obigen Beispiel entnehmen können, sind SELinux-Boolesche-Einstellungen (oder einfach nur Boolesche Werte) Wahr/Falsch-Regeln, die in SELinux-Richtlinien eingebettet sind. Sie können alle booleschen Werte mit semanage boolean -l auflisten und sie alternativ an grep weiterleiten, um die Ausgabe zu filtern.

BEISPIEL 3: Bereitstellung einer statischen Site aus einem anderen Verzeichnis als dem Standardverzeichnis

Angenommen, Sie stellen eine statische Website unter Verwendung eines anderen Verzeichnisses als des Standardverzeichnisses (/var/www/html) bereit, beispielsweise /websites (dies könnte der Fall sein, wenn Sie Sie speichern Ihre Webdateien beispielsweise auf einem freigegebenen Netzlaufwerk und müssen sie unter /websites bereitstellen).

a). Erstellen Sie eine index.html-Datei in /websites mit folgendem Inhalt:

<html>
<h2>SELinux test</h2>
</html>

Wenn Sie tun,

ls -lZ /websites/index.html

Sie werden sehen, dass die Datei index.html mit dem Typ default_t SELinux gekennzeichnet wurde, auf den Apache nicht zugreifen kann:

b). Ändern Sie die DocumentRoot-Direktive in /etc/httpd/conf/httpd.conf in /websites und Vergessen Sie nicht, den entsprechenden Verzeichnisblock zu aktualisieren. Starten Sie dann Apache neu.

c). Navigieren Sie zu http://, und Sie sollten eine 503 Forbidden HTTP-Antwort erhalten.

d). Als nächstes ändern Sie die Bezeichnung von /websites rekursiv in den Typ httpd_sys_content_t, um Apache schreibgeschützten Zugriff darauf zu gewähren Verzeichnis und dessen Inhalt:

semanage fcontext -a -t httpd_sys_content_t "/websites(/.*)?"

e). Wenden Sie abschließend die in d): erstellte SELinux-Richtlinie an

restorecon -R -v /websites

Starten Sie nun Apache neu und navigieren Sie erneut zu http://. Sie werden sehen, dass die HTML-Datei korrekt angezeigt wird:

Zusammenfassung

In diesem Artikel haben wir die Grundlagen von SELinux besprochen. Bitte beachten Sie, dass aufgrund der Weitläufigkeit des Themas eine ausführliche Erläuterung in einem einzelnen Artikel nicht möglich ist. Wir glauben jedoch, dass die in diesem Leitfaden dargelegten Grundsätze Ihnen dabei helfen werden, zu fortgeschritteneren Themen überzugehen, falls Sie dies wünschen.

Wenn ich darf, möchte ich zunächst zwei wichtige Ressourcen empfehlen: die NSA SELinux-Seite und das RHEL 7 SELinux-Benutzer- und Administratorhandbuch.

Zögern Sie nicht, uns mitzuteilen, wenn Sie Fragen oder Kommentare haben.