RHCSA-Serie: Mandatory Access Control Essentials mit SELinux in RHEL 7 – Teil 13

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

RHCSA Exam: SELinux Essentials and Control FileSystem Access

Obwohl sie als Berechtigungen der ersten Ebene und Zugriffssteuerungsmechanismen notwendig sind, haben sie einige Einschränkungen, die von Security Enhanced Linux (auch bekannt als SELinux) behoben werden.

Eine solche Einschränkung besteht darin, dass ein Benutzer durch einen schlecht ausgearbeiteten chmod-Befehl eine Datei oder ein Verzeichnis einem Sicherheitsrisiko aussetzen und so eine unerwartete Ausbreitung von Zugriffsrechten verursachen kann. Als Ergebnis kann jeder Prozess, der von diesem Benutzer gestartet wird, nach Belieben mit den Dateien des Benutzers umgehen, wodurch schließlich eine bösartige oder anderweitig kompromittierte Software Root-Zugriff auf das gesamte System erlangen kann.

Mit diesen Einschränkungen im Hinterkopf hat die United States National Security Agency (NSA) zuerst SELinux entwickelt, eine flexible obligatorische Zugriffskontrollmethode, um die Fähigkeit von Prozessen einzuschränken, auf Systemobjekte (wie Dateien, Verzeichnisse, Netzwerkports usw.) zuzugreifen oder andere Operationen durchzuführen, auf das Modell mit den geringsten Berechtigungen, das später bei Bedarf geändert werden kann. Kurz gesagt erhält jedes Element des Systems nur den für seine Funktion erforderlichen Zugriff.

In RHEL 7, SELinux ist in den Kernel selbst integriert und standardmäßig im Enforcing-Modus aktiviert. In diesem Artikel werden wir kurz die grundlegenden Konzepte von SELinux und dessen Funktionsweise erläutern.

SELinux-Modi

SELinux kann auf drei verschiedene Arten betrieben werden:

  1. Enforcing: SELinux verweigert den Zugriff basierend auf SELinux-Richtlinien, einem Satz von Richtlinien, die den Sicherheitsmechanismus steuern.
  2. Permissive: SELinux verweigert den Zugriff nicht, aber Verweigerungen werden protokolliert für Aktionen, die verweigert worden wären, wenn der Modus im Erzwingungsmodus ausgeführt würde.
  3. Disabled (selbsterklärend).

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

Um Persistenz über Abmeldungen und Neustarts zu erreichen, müssen Sie die Datei /etc/selinux/config bearbeiten und die SELINUX-Variable auf enforcing, permissive oder disabled setzen:

# getenforce
# setenforce 0
# getenforce
# setenforce 1
# getenforce
# cat /etc/selinux/config
Set SELinux Mode

In der Regel verwenden Sie setenforce, um zwischen SELinux-Modi zu wechseln (von enforcing zu permissive und zurück) als ersten Schritt zur Fehlerbehebung. Wenn SELinux derzeit auf enforcing eingestellt ist, während Sie ein bestimmtes Problem haben, und das Problem verschwindet, wenn Sie es auf permissive setzen, können Sie sicher sein, dass es sich um ein SELinux-Berechtigungsproblem handelt.

SELinux-Kontexte

A SELinux context consists of an access control environment where decisions are made based on SELinux user, role, and type (and optionally a level):

  1. A SELinux user complements a regular Linux user account by mapping it to a SELinux user account, which in turn is used in the SELinux context for processes in that session, in order to explicitly define their allowed roles and levels.
  2. Das Konzept der Rolle fungiert als Vermittler zwischen Domänen und SELinux-Benutzern, da es definiert, auf welche Prozessdomänen und Dateitypen zugegriffen werden kann. Dies schützt Ihr System vor Anfälligkeit für Angriffe zur Privilegierungserhöhung.
  3. A type defines an SELinux file type or an SELinux process domain. Under normal circumstances, processes are prevented from accessing files that other processes use, and and from accessing other processes, thus access is only allowed if a specific SELinux policy rule exists that allows it.

Lassen Sie uns sehen, wie das alles anhand der folgenden Beispiele funktioniert.

BEISPIEL 1: Ändern des Standardports für den sshd-Dämon

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

Port 9999

Speichern Sie die Änderungen und starten Sie sshd neu:

# systemctl restart sshd
# systemctl status sshd
Restart SSH Service

Wie Sie sehen können, ist es sshd nicht gelungen zu starten. Aber was ist passiert?

A quick inspection of /var/log/audit/audit.log indicates that sshd has been denied permissions to start on port 9999 (SELinux log messages include the word “AVC” so that they might be easily identified from other messages) because that is a reserved port for the JBoss Management service:

# cat /var/log/audit/audit.log | grep AVC | tail -1
Inspect SSH Logs

An dieser Stelle könnten Sie SELinux deaktivieren (aber nicht!), wie zuvor erklärt, und versuchen, sshd erneut zu starten, und es sollte funktionieren. Allerdings kann uns das Dienstprogramm semanage sagen, was wir ändern müssen, damit wir sshd in einem beliebigen Port starten können, ohne Probleme zu haben.

Führen Sie,

# semanage port -l | grep ssh

aus, um eine Liste der Ports zu erhalten, auf denen SELinux sshd lauschen darf.

Semanage Tool

Also ändern wir den Port in /etc/ssh/sshd_config auf Port 9998, fügen den Port dem 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
Semanage Add Port

Wie Sie sehen können, wurde der Dienst dieses Mal erfolgreich gestartet. Dieses Beispiel verdeutlicht die Tatsache, dass SELinux die TCP-Portnummer gemäß seinen eigenen internen Porttypdefinitionen kontrolliert.

BEISPIEL 2: Zulassen, dass httpd Zugriff auf sendmail sendet

Dies ist ein Beispiel dafür, wie SELinux einen Prozess steuert, der auf einen anderen Prozess zugreift. Wenn Sie mod_security und mod_evasive zusammen mit Apache in Ihrem RHEL 7-Server implementieren möchten, müssen Sie httpd den Zugriff auf sendmail erlauben, um im Falle eines (D)DoS-Angriffs eine Benachrichtigungsmail senden zu können. In folgendem Befehl lassen Sie die -P-Flagge weg, wenn Sie möchten, dass die Änderung nicht ü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
Allow Apache to Send Mails

Wie Sie aus dem obigen Beispiel erkennen können, sind SELinux-Boolesche Einstellungen (oder einfach Boolesche) wahre / falsche Regeln, die in SELinux-Richtlinien eingebettet sind. Sie können alle Booleschen mit semanage boolean -l auflisten und alternativ den Output filtern, indem Sie ihn an grep weiterleiten.

BEISPIEL 3: Bereitstellen einer statischen Website aus einem anderen Verzeichnis als dem Standardverzeichnis

Angenommen, Sie stellen eine statische Website aus einem anderen Verzeichnis als dem Standardverzeichnis (/var/www/html) bereit, sagen wir /websites (dies könnte der Fall sein, wenn Sie Ihre Webdateien beispielsweise in einem gemeinsam genutzten Netzlaufwerk speichern und es unter /websites einbinden müssen).

a). Create an index.html file inside /websites with the following contents:

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

Wenn Sie das tun,

# ls -lZ /websites/index.html

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

Check SELinux File Permission

b). Change the DocumentRoot directive in /etc/httpd/conf/httpd.conf to /websites and don’t forget to update the corresponding Directory block. Then, restart Apache.

c). Browse to http://<web server IP address>, and you should get a 503 Forbidden HTTP response.

d). Next, change the label of /websites, recursively, to the httpd_sys_content_t type in order to grant Apache read-only access to that directory and its contents:

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

e). Finally, apply the SELinux policy created in d):

# restorecon -R -v /websites

Starten Sie nun Apache neu und rufen Sie erneut http://<Webserver-IP-Adresse> auf, um die HTML-Datei korrekt angezeigt zu sehen:

Verify Apache Page

Zusammenfassung

In diesem Artikel haben wir die Grundlagen von SELinux durchgearbeitet. Beachten Sie, dass aufgrund der Vielfalt des Themas eine ausführliche Erklärung in einem einzigen Artikel nicht möglich ist, aber wir glauben, dass die in diesem Leitfaden skizzierten Prinzipien Ihnen helfen werden, sich bei Bedarf mit fortgeschritteneren Themen zu befassen.

Dürfte ich Ihnen zwei wesentliche Ressourcen empfehlen, mit denen Sie beginnen können: die NSA SELinux-Seite und das RHEL 7 SELinux Benutzer- und Administratorenhandbuch.

Zögern Sie nicht, uns bei Fragen oder Kommentaren zu kontaktieren.

Source:
https://www.tecmint.com/selinux-essentials-and-control-filesystem-access/