Hintergrundinformationen zu Linux-Sicherheitsmodulen und SELinux
Security Enhanced Linux ist eine Reihe von Regeln und ein Zugriffsmechanismus, der auf obligatorischen und rollenbasierten Zugriffsmodellen basiert, um Linux-Systeme vor potenziellen Bedrohungen zu schützen und die Fehler von Discretionary Access Control (DAC), dem traditionellen Unix-Sicherheitssystem, zu beheben. Das Projekt entstand im Darm der US National Security Agency, hauptsächlich Auftragnehmer Secure Computing Corporation und MITRE sowie eine Reihe von Forschungslabors waren direkt an der Entwicklung beteiligt.

Linux-Sicherheitsmodule
Linus Torvalds hat eine Reihe von Kommentaren zu neuen NSA-Entwicklungen abgegeben, damit diese in den vorgelagerten Linux-Kernel aufgenommen werden können. Er beschrieb eine allgemeine Umgebung mit einer Reihe von Interceptors zum Verwalten von Operationen mit Objekten und einer Reihe von Schutzfeldern in den Kerneldatenstrukturen zum Speichern der entsprechenden Attribute. Diese Umgebung kann dann von ladbaren Kernelmodulen verwendet werden, um jedes gewünschte Sicherheitsmodell zu implementieren. LSM wurde 2003 vollständig in den Linux v2.6-Kernel integriert.
Das LSM-Framework enthält Schutzfelder in Datenstrukturen und Aufrufe zum Abfangen von Funktionen an kritischen Punkten im Kernelcode, um diese zu verwalten und die Zugriffskontrolle durchzuführen. Außerdem werden Funktionen zum Registrieren von Sicherheitsmodulen hinzugefügt. Die Schnittstelle / sys / kernel / security / lsm enthält eine Liste der aktiven Module im System. LSM-Hooks werden in Listen gespeichert, die in der in CONFIG_LSM angegebenen Reihenfolge aufgerufen werden. Eine ausführliche Hook-Dokumentation finden Sie in der Header-Datei include / linux / lsm_hooks.h.
Das LSM-Subsystem ermöglichte die vollständige SELinux-Integration desselben stabilen Linux-Kernels v2.6. Fast sofort wurde SELinux zum De-facto-Standard für sichere Linux-Umgebungen und wurde Teil der beliebtesten Distributionen: RedHat Enterprise Linux, Fedora, Debian, Ubuntu.
SELinux Glossar
- — SELinux , Unix/Linux user id, , . Linux SELinux. SELinux , , — .
- — SELinux , . . . , . — , . : sysadm_t , user_t, . init init_t, named named_t.
- — , SELinux. , . . Role Based Access Control (RBAC), SELinux.
- — Type Enforcement, , . , , , , , , . .
- — , . : , , ., , , — .
- SELinux — SELinux . SELinux , — — . , . .
LSM SELinux
Trotz des Namens sind LSMs im Allgemeinen keine Linux-ladbaren Module. Genau wie SELinux ist es jedoch direkt in den Kernel integriert. Jede Änderung am LSM-Quellcode erfordert eine neue Kernel-Kompilierung. Die entsprechende Option muss in den Kerneleinstellungen aktiviert sein, sonst wird der LSM-Code nach dem Start nicht aktiviert. Trotzdem kann es mit der Bootloader-Option des Betriebssystems aktiviert werden.

LSM-Prüfstapel
LSM ist mit Hooks in Kernfunktionen ausgestattet, die für Prüfungen relevant sein können. Eines der Hauptmerkmale von LSMs ist, dass sie gestapelt sind. Somit werden die Standardprüfungen weiterhin durchgeführt, und jede LSM-Schicht fügt nur zusätzliche Steuerelemente und Steuerelemente hinzu. Dies bedeutet, dass das Verbot nicht rückgängig gemacht werden kann. Dies ist in der Abbildung dargestellt. Wenn das Ergebnis routinemäßiger DAC-Überprüfungen ein Fehler ist, erreicht es nicht einmal die LSM-Hooks.
SELinux hat die Flask-Sicherheitsarchitektur des Fluke Research-Betriebssystems übernommen, insbesondere das Prinzip der geringsten Privilegien. Wie der Name schon sagt, besteht das Wesentliche dieses Konzepts darin, einem Benutzer nur die Rechte zu gewähren oder zu verarbeiten, die zur Ausführung der beabsichtigten Aktionen erforderlich sind. Dieses Prinzip wird durch erzwungene Typisierung des Zugriffs implementiert, daher basiert die SELinux-Zugangssteuerung auf dem Typmodell domain =>.
Aufgrund der erzwungenen Eingabe des Zugriffs verfügt SELinux über wesentlich wichtigere Zugriffssteuerungsfunktionen als das herkömmliche DAC-Modell, das unter Unix / Linux verwendet wird. Sie können beispielsweise die Netzwerkportnummer einschränken, die dem FTP-Server zugewiesen wird, das Schreiben und Ändern von Dateien in einem bestimmten Ordner zulassen, diese jedoch nicht löschen.
Die Hauptkomponenten von SELinux sind:
- Policy Enforcement Server - Der Hauptmechanismus zum Organisieren der Zugriffskontrolle.
- Datenbank mit Systemsicherheitsrichtlinien.
- Interaktion mit dem LSM-Ereignisabfangjäger.
- Selinuxfs - Pseudo-FS, wie / proc und in / sys / fs / selinux eingebunden. Wird zur Laufzeit dynamisch vom Linux-Kernel gefüllt und enthält Dateien mit SELinux-Statusinformationen.
- Access Vector Cache - Leistungshilfe.
So funktioniert SELinux
All dies funktioniert wie folgt.
- Ein bestimmtes Subjekt führt in SELinux-Begriffen nach einer DAC-Prüfung eine zulässige Aktion für ein Objekt aus, wie im oberen Bild gezeigt. Diese Anforderung zum Ausführen der Operation geht an den LSM-Ereignisabfangjäger.
- Von dort wird die Anforderung zusammen mit dem Subjekt- und Objektsicherheitskontext an das SELinux-Abstraktions- und Hook-Logikmodul übergeben, das für die Interaktion mit dem LSM verantwortlich ist.
- Der Policy Enforcement Server ist die Instanz für die Entscheidung über den Zugriff des Subjekts auf das Objekt, und Daten von SELinux AnHL kommen dazu.
- Um eine Entscheidung über den Zugriff oder die Verweigerung zu treffen, konsultiert der Policy Enforcement Server das Caching-Subsystem der am häufigsten verwendeten AVC-Regeln (Access Vector Cache).
- Wenn im Cache keine Lösung für die entsprechende Regel gefunden wird, wird die Anforderung an die Sicherheitsrichtliniendatenbank weitergeleitet.
- Das Suchergebnis von DB und AVC wird an den Policy Enforcement Server zurückgegeben.
- Wenn die gefundene Richtlinie mit der angeforderten Aktion übereinstimmt, ist die Operation zulässig. Andernfalls ist der Betrieb verboten.
Verwalten der SELinux-Einstellungen
SELinux arbeitet in einem von drei Modi:
- Durchsetzung - Strikte Einhaltung von Sicherheitsrichtlinien.
- Zulässig - Verstöße gegen Beschränkungen sind zulässig, die entsprechende Kennzeichnung erfolgt im Protokoll.
- Deaktiviert - Sicherheitsrichtlinien sind nicht wirksam.
Mit dem folgenden Befehl können Sie sehen, in welchem Modus sich SELinux befindet.
[admin@server ~]$ getenforce
Permissive
Ändern Sie den Modus vor dem Neustart, indem Sie ihn beispielsweise auf Erzwingen oder 1 setzen. Der zulässige Parameter entspricht dem numerischen Code 0.
[admin@server ~]$ setenfoce enforcing
[admin@server ~]$ setenfoce 1 #
Sie können den Modus auch ändern, indem Sie die Datei bearbeiten:
[admin@server ~]$ cat /etc/selinux/config
# 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 three values:
# targeted - Targeted processes are protected,
# minimum - Modification of targeted policy. Only selected processes are protected.
# mls - Multi Level Security protection.
SELINUXTYPE = Ziel
Der Unterschied zu setenfoce besteht darin, dass beim Booten des Betriebssystems der SELinux-Modus entsprechend dem Wert des SELINUX-Parameters der Konfigurationsdatei festgelegt wird. Darüber hinaus werden Änderungen an der Durchsetzung von <=> deaktiviert nur durch Bearbeiten der Datei / etc / selinux / config und nach einem Neustart wirksam.
Anzeigen eines kurzen Statusberichts:
[admin@server ~]$ sestatus
SELinux status: enabled
SELinuxfs mount: /sys/fs/selinux
SELinux root directory: /etc/selinux
Loaded policy name: targeted
Current mode: permissive
Mode from config file: enforcing
Policy MLS status: enabled
Policy deny_unknown status: allowed
Max kernel policy version: 31
Einige der nativen Dienstprogramme verwenden den Parameter -Z, um SELinux-Attribute anzuzeigen.
[admin@server ~]$ ls -lZ /var/log/httpd/
-rw-r--r--. root root system_u:object_r:httpd_log_t:s0 access_log
-rw-r--r--. root root system_u:object_r:httpd_log_t:s0 access_log-20200920
-rw-r--r--. root root system_u:object_r:httpd_log_t:s0 access_log-20200927
-rw-r--r--. root root system_u:object_r:httpd_log_t:s0 access_log-20201004
-rw-r--r--. root root system_u:object_r:httpd_log_t:s0 access_log-20201011
[admin@server ~]$ ps -u apache -Z
LABEL PID TTY TIME CMD
system_u:system_r:httpd_t:s0 2914 ? 00:00:04 httpd
system_u:system_r:httpd_t:s0 2915 ? 00:00:00 httpd
system_u:system_r:httpd_t:s0 2916 ? 00:00:00 httpd
system_u:system_r:httpd_t:s0 2917 ? 00:00:00 httpd
...
system_u:system_r:httpd_t:s0 2918 ? 00:00:00 httpd
Im Vergleich zur üblichen ls-l-Ausgabe gibt es mehrere zusätzliche Felder im folgenden Format:
<user>:<role>:<type>:<level>
Das letzte Feld kennzeichnet so etwas wie einen Geheimhaltungsstempel und besteht aus einer Kombination von zwei Elementen:
- s0 - Signifikanz, auch als Lowlevel-Highlevel-Intervall geschrieben
- c0, c1… c1023 - Kategorie.
Änderung der Zugriffskonfiguration
Verwenden Sie das Semodul, um SELinux-Module zu laden, hinzuzufügen und zu entfernen.
[admin@server ~]$ semodule -l |wc -l #
408
[admin@server ~]$ semodule -e abrt #enable -
[admin@server ~]$ semodule -d accountsd #disable -
[admin@server ~]$ semodule -r avahi #remove -
Der erste Befehl, Semanage Login, bindet den SELinux-Benutzer an den Betriebssystembenutzer, der zweite zeigt die Liste an. Schließlich entfernt der letzte Befehl mit dem Schalter -r die Zuordnung von SELinux-Benutzern zu Betriebssystemkonten. Eine Erläuterung der Syntax für MLS / MCS-Bereichswerte finden Sie im vorherigen Abschnitt.
[admin@server ~]$ semanage login -a -s user_u karol
[admin@server ~]$ semanage login -l
Login Name SELinux User MLS/MCS Range Service
__default__ unconfined_u s0-s0:c0.c1023 *
root unconfined_u s0-s0:c0.c1023 *
system_u system_u s0-s0:c0.c1023 *
[admin@server ~]$ semanage login -d karol
Mit dem Befehl semanage user werden die Zuordnungen zwischen SELinux-Benutzern und Rollen verwaltet.
[admin@server ~]$ semanage user -l
Labeling MLS/ MLS/
SELinux User Prefix MCS Level MCS Range SELinux Roles
guest_u user s0 s0 guest_r
staff_u staff s0 s0-s0:c0.c1023 staff_r sysadm_r
...
user_u user s0 s0 user_r
xguest_u user s0 s0 xguest_r
[admin@server ~]$ semanage user -a -R 'staff_r user_r'
[admin@server ~]$ semanage user -d test_u
Befehlsparameter:
- -a einen benutzerdefinierten Rollenzuordnungseintrag hinzufügen;
- -l Liste der Korrespondenz zwischen Benutzern und Rollen;
- -d Benutzerdefinierten Rollenzuordnungseintrag entfernen;
- -R Liste der dem Benutzer zugewiesenen Rollen;
Dateien, Ports und Boolesche Werte
Jedes SELinux-Modul bietet eine Reihe von Regeln zum Markieren von Dateien. Sie können jedoch bei Bedarf auch eigene Regeln hinzufügen. Beispielsweise möchten wir, dass der Webserver Zugriffsrechte auf den Ordner / srv / www hat.
[admin@server ~]$ semanage fcontext -a -t httpd_sys_content_t "/srv/www(/.*)?
[admin@server ~]$ restorecon -R /srv/www/
Der erste Befehl registriert die neuen Markierungsregeln und der zweite setzt die Dateitypen gemäß den aktuellen Regeln zurück bzw. setzt sie zurück.
Ebenso sind TCP / UDP-Ports so gekennzeichnet, dass nur die entsprechenden Dienste sie abhören können. Damit der Webserver beispielsweise Port 8080 abhören kann, müssen Sie den Befehl ausführen.
[admin@server ~]$ semanage port -m -t http_port_t -p tcp 8080
Eine signifikante Anzahl von SELinux-Modulen verfügt über Parameter, die boolesche Werte annehmen können. Die gesamte Liste solcher Parameter kann mit getsebool -a angezeigt werden. Sie können boolesche Werte mit setsebool ändern.
[admin@server ~]$ getsebool httpd_enable_cgi
httpd_enable_cgi --> on
[admin@server ~]$ setsebool -P httpd_enable_cgi off
[admin@server ~]$ getsebool httpd_enable_cgi
httpd_enable_homedirs --> off
Workshop, Zugriff auf die Pgadmin-Weboberfläche
Betrachten Sie ein Beispiel aus der Praxis, das wir auf RHEL 7.6 pgadmin4-web für die PostgreSQL-Datenbankverwaltung installiert haben. Wir haben eine kleine Quest mit dem Setzen von pg_hba.conf, postgresql.conf und config_local.py durchlaufen, die Rechte für Ordner festgelegt und fehlende Python-Module von pip installiert. Alles ist fertig, führen Sie es aus und erhalten Sie 500 Internal Server Fehler .
Beginnen Sie mit den typischen Verdächtigen und überprüfen Sie / var / log / httpd / error_log. Dort gibt es einige interessante Einträge. Zu diesem Zeitpunkt werden die meisten Linux-Administratoren versucht sein, setencorce 0 auszuführen, und das war's. Ehrlich gesagt, das erste Mal, dass ich es getan habe. Dies ist natürlich auch ein Ausweg, aber alles andere als das Beste.
[timestamp] [core:notice] [pid 23689] SELinux policy enabled; httpd running as context system_u:system_r:httpd_t:s0
...
[timestamp] [wsgi:error] [pid 23690] [Errno 13] Permission denied: '/var/lib/pgadmin'
[timestamp] [wsgi:error] [pid 23690]
[timestamp] [wsgi:error] [pid 23690] HINT : You may need to manually set the permissions on
[timestamp] [wsgi:error] [pid 23690] /var/lib/pgadmin to allow apache to write to it.
Trotz der Sperrigkeit der Konstrukte kann SELinux benutzerfreundlich sein. Es reicht aus, das setroubleshoot-Paket zu installieren und das Systemprotokoll anzuzeigen. Beachten Sie, dass der auditd-Dienst auf diese Weise neu gestartet werden muss und trotz des Vorhandenseins von systemd im Betriebssystem nicht systemctl verwendet. Das Systemprotokoll zeigt nicht nur die Tatsache der Blockierung an, sondern auch den Grund und den Weg, um das Verbot zu überwinden . Wir führen folgende Befehle aus: Wir überprüfen den Zugriff auf die Webseite pgadmin4-web, alles funktioniert.
[admin@server ~]$ yum install setroubleshoot
[admin@server ~]$ journalctl -b -0
[admin@server ~]$ service restart auditd
[admin@server ~]$ setsebool -P httpd_can_network_connect 1
[admin@server ~]$ setsebool -P httpd_can_network_connect_db 1
