Website-Suche

Implementierung der obligatorischen Zugriffskontrolle mit SELinux oder AppArmor unter Linux


Um die Einschränkungen der standardmäßigen ugo/rwx-Berechtigungen und Zugriffskontrolllisten zu überwinden und die Sicherheitsmechanismen zu erhöhen, hat die United States National Security Agency (NSA) ein flexibles < entwickelt Eine starke>Mandatory Access Control (MAC)-Methode, bekannt als SELinux (kurz für Security Enhanced Linux), um unter anderem die Fähigkeit von Prozessen einzuschränken Zugriff auf Systemobjekte (z. B. Dateien, Verzeichnisse, Netzwerkports usw.) oder Ausführen anderer Vorgänge an ihnen mit der geringstmöglichen Berechtigung, während spätere Änderungen an diesem Modell dennoch möglich sind.

Ein weiterer beliebter und weit verbreiteter MAC ist AppArmor, der zusätzlich zu den von SELinux bereitgestellten Funktionen einen Lernmodus enthält, der es dem System ermöglicht, „zu lernen. ”wie sich eine bestimmte Anwendung verhält und Grenzen durch die Konfiguration von Profilen für eine sichere Anwendungsnutzung festgelegt werden.

In CentOS 7 ist SELinux in den Kernel selbst integriert und standardmäßig im Enforcing-Modus aktiviert (mehr dazu im nächsten Abschnitt). im Gegensatz zu openSUSE und Ubuntu, die AppArmor verwenden.

In diesem Artikel erklären wir die Grundlagen von SELinux und AppArmor und wie Sie eines dieser Tools je nach gewählter Distribution zu Ihrem Vorteil nutzen können.

Einführung in SELinux und seine Verwendung unter CentOS 7

Security Enhanced Linux kann auf zwei 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.

SELinux kann auch deaktiviert werden. Obwohl es sich hierbei nicht um einen Betriebsmodus selbst handelt, handelt es sich dennoch um eine Option. Allerdings ist es besser, den Umgang mit diesem Tool zu erlernen, als es einfach zu ignorieren. Denk daran!

Um den aktuellen Modus von SELinux anzuzeigen, verwenden Sie getenforce. Wenn Sie den Betriebsmodus umschalten möchten, verwenden Sie setenforce 0 (um ihn auf Permissiv festzulegen) oder setenforce 1 (Erzwingen).).

Da diese Änderung einen Neustart nicht übersteht, müssen Sie die Datei /etc/selinux/config bearbeiten und die Variable SELINUX auf einen der beiden Werte setzen enforcing, permissive oder disabled, um Persistenz über Neustarts hinweg zu erreichen:

Nebenbei bemerkt: Wenn getenforce „Deaktiviert“ zurückgibt, müssen Sie /etc/selinux/config mit dem gewünschten Betriebsmodus bearbeiten und neu starten. Andernfalls können Sie den Betriebsmodus nicht mit setenforce festlegen (oder umschalten).

Eine der typischen Anwendungen von setenforce besteht darin, zwischen SELinux-Modi umzuschalten (von erzwingend zu permissiv oder umgekehrt), um Fehler bei einer Anwendung zu beheben verhält sich schlecht oder funktioniert nicht wie erwartet. Wenn es funktioniert, nachdem Sie SELinux auf den Permissive-Modus eingestellt haben, können Sie sicher sein, dass es sich um ein SELinux-Berechtigungsproblem handelt.

Zwei klassische Fälle, in denen wir es höchstwahrscheinlich mit SELinux zu tun haben werden, sind:

  1. Ändern des Standardports, an dem ein Daemon lauscht.
  2. Festlegen der DocumentRoot-Direktive für einen virtuellen Host außerhalb von /var/www/html.

Schauen wir uns diese beiden Fälle anhand der folgenden Beispiele an.

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

Eines der ersten Dinge, die die meisten Systemadministratoren tun, um ihre Server zu sichern, besteht darin, den Port zu ändern, auf dem der SSH-Daemon lauscht, hauptsächlich um Port-Scanner und externe Angreifer abzuschrecken. Dazu verwenden wir die Port-Direktive in /etc/ssh/sshd_config, gefolgt von der neuen Portnummer wie folgt (in diesem Fall verwenden wir Port 9999):


Port 9999

Nachdem wir versucht haben, den Dienst neu zu starten und seinen Status überprüft haben, werden wir feststellen, dass der Start fehlgeschlagen ist:


systemctl restart sshd
systemctl status sshd

Wenn wir einen Blick auf /var/log/audit/audit.log werfen, sehen wir, dass der Start von sshd auf Port 9999 verhindert wurde von SELinux, da dies ein reservierter Port für den JBoss Management-Dienst ist (SELinux-Protokollnachrichten enthalten das Wort „AVC“, damit sie leicht zu erkennen sind aus anderen Nachrichten identifiziert):


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

Zu diesem Zeitpunkt würden die meisten Leute wahrscheinlich SELinux deaktivieren, wir jedoch nicht. Wir werden sehen, dass es eine Möglichkeit gibt, dass SELinux und sshd, das auf einem anderen Port lauscht, harmonisch zusammenleben können. Stellen Sie sicher, dass Sie das Paket policycoreutils-python installiert haben und führen Sie Folgendes aus:


yum install policycoreutils-python

Um eine Liste der Ports anzuzeigen, an denen SELinux sshd zum Abhören zulässt. Im folgenden Bild sehen wir auch, dass Port 9999 für einen anderen Dienst reserviert war und wir ihn daher vorerst nicht zum Ausführen eines anderen Dienstes verwenden können:


semanage port -l | grep ssh

Natürlich könnten wir einen anderen Port für SSH wählen, aber wenn wir sicher sind, dass wir diese spezielle Maschine nicht für JBoss-bezogene Dienste verwenden müssen, können wir die bestehende SELinux-Regel ändern und diesen Port stattdessen SSH zuweisen:


semanage port -m -t ssh_port_t -p tcp 9999

Danach können wir mit dem ersten semanage-Befehl überprüfen, ob der Port korrekt zugewiesen wurde, oder mit den -lC-Optionen (kurz für list custom):


semanage port -lC
semanage port -l | grep ssh

Wir können jetzt SSH neu starten und über Port 9999 eine Verbindung zum Dienst herstellen. Beachten Sie, dass diese Änderung einen Neustart überdauert.

BEISPIEL 2: Auswählen eines DocumentRoot außerhalb von /var/www/html für einen virtuellen Host

Wenn Sie einen virtuellen Apache-Host mit einem anderen Verzeichnis als /var/www/html als DocumentRoot einrichten müssen (z. B. /websrv/sites /gabriel/public_html):


DocumentRoot “/websrv/sites/gabriel/public_html”

Apache weigert sich, den Inhalt bereitzustellen, da die index.html mit dem Typ default_t SELinux gekennzeichnet wurde, auf den Apache nicht zugreifen kann:


wget http://localhost/index.html
ls -lZ /websrv/sites/gabriel/public_html/index.html

Wie im vorherigen Beispiel können Sie mit dem folgenden Befehl überprüfen, ob es sich tatsächlich um ein SELinux-Problem handelt:


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

Um die Bezeichnung von /websrv/sites/gabriel/public_html rekursiv in httpd_sys_content_t zu ändern, gehen Sie wie folgt vor:


semanage fcontext -a -t httpd_sys_content_t "/websrv/sites/gabriel/public_html(/.*)?"

Der obige Befehl gewährt Apache schreibgeschützten Zugriff auf dieses Verzeichnis und seinen Inhalt.

Um die Richtlinie schließlich anzuwenden (und die Etikettenänderung sofort wirksam zu machen), gehen Sie wie folgt vor:


restorecon -R -v /websrv/sites/gabriel/public_html

Jetzt sollten Sie auf das Verzeichnis zugreifen können:


wget http://localhost/index.html

Weitere Informationen zu SELinux finden Sie im Fedora 22 SELinux- und Administratorhandbuch.