Einer der GrĂŒnde fĂŒr den grandiosen Erfolg des Linux-Betriebssystems auf Embedded-, MobilgerĂ€ten und Servern liegt in der relativ hohen Sicherheit des Kernels, der zugehörigen Dienste und Anwendungen. Aber wenn man architektur des Linux-Kernels, findet man kein Quadrat, das fĂŒr die Sicherheit verantwortlich ist, wie man es erwarten wĂŒrde. Wo versteckt sich also das Sicherheitssystem von Linux und woraus besteht es?
Hintergrund zu Linux Security Modules und SELinux
Security Enhanced Linux ist ein Regel- und Zugriffssystem, das auf den Modellen der obligatorischen und rollenbasierten Zugriffskontrolle basiert, um Linux-Systeme vor potenziellen Bedrohungen zu schĂŒtzen und die MĂ€ngel der Discretionary Access Control (DAC) â dem traditionellen Sicherheitssystem von Unix â zu beheben. Das Projekt entstand im US National Security Agency, hauptsĂ€chlich entwickelt von Auftragnehmern der Secure Computing Corporation und MITRE sowie mehreren Forschungslabors.

Linux Security Modules
Linus Torvalds hat einige Anmerkungen zu den neuen Entwicklungen der NSA gemacht, um diese in den Hauptzweig des Linux-Kernels einzufĂŒgen. Er beschrieb eine allgemeine Umgebung mit einer Reihe von Interceptoren zur Verwaltung von Operationen mit Objekten und einer Reihe von Schutzfeldern in den Datenstrukturen des Kernels zur Speicherung entsprechender Attribute. Diese Umgebung kann dann von ladbaren Modulen des Kernels genutzt werden, um jedes gewĂŒnschte Sicherheitsmodell zu implementieren. LSM wurde 2003 vollstĂ€ndig in den Linux-Kernel v2.6 integriert.
Das LSM-Framework umfasst Schutzfelder in den Datenstrukturen und Funktionsaufrufe an kritischen Stellen im Kernel-Code, um diese zu verwalten und Zugriffskontrolle durchzufĂŒhren. Es fĂŒgt auch Funktionen zur Registrierung von Sicherheitsmodulen hinzu. Die Schnittstelle /sys/kernel/security/lsm enthĂ€lt eine Liste aktiver Module im System. Die LSM-Hooks werden in Listen gespeichert, die in der Reihenfolge aufgerufen werden, die in CONFIG_LSM angegeben ist. Eine detaillierte Dokumentation zu den Hooks ist in der Header-Datei include/linux/lsm_hooks.h enthalten.
Das LSM-System ermöglichte eine vollstĂ€ndige Integration von SELinux in dieselbe Version des stabilen Linux-Kernels v2.6. Praktisch sofort wurde SELinux zum De-facto-Standard fĂŒr eine sichere Linux-Umgebung und in die beliebtesten Distributionen aufgenommen: RedHat Enterprise Linux, Fedora, Debian, Ubuntu.
Glossar SELinux
- IdentitÀt Der SELinux-Benutzer ist nicht dasselbe wie die vertraute Unix/Linux-Benutzer-ID; sie können auf demselben System coexistieren, sind aber in ihrer Natur völlig verschieden. Jedes Standard-Linux-Konto kann einem oder mehreren BENUTZERN in SELinux entsprechen. Die IdentitÀt von SELinux ist ein grundlegender Bestandteil des allgemeinen Sicherheitskontexts, der bestimmt, in welche DomÀnen man ein- und in welche nicht eingreifen kann.
- Domains In SELinux ist eine DomĂ€ne der AusfĂŒhrungskontext eines Subjekts, d. h. eines Prozesses. Die DomĂ€ne bestimmt unmittelbar den Zugriff, den der Prozess hat. Eine DomĂ€ne ist im Wesentlichen eine Liste dessen, was Prozesse machen dĂŒrfen, oder welche Aktionen ein Prozess mit verschiedenen Typen ausfĂŒhren kann. Einige Beispiele fĂŒr DomĂ€nen: sysadm_t fĂŒr Systemadministration und user_t, das eine gewöhnliche nicht privilegierte Benutzer-DomĂ€ne ist. Das Init-System init lĂ€uft in der DomĂ€ne init_t, wĂ€hrend der Prozess named in der DomĂ€ne named_t lĂ€uft.
- Rollen Das, was als Vermittler zwischen DomÀnen und Benutzern von SELinux dient. Rollen bestimmen, in welchen DomÀnen ein Benutzer sich befinden kann und auf welche Objekttypen er Zugriff haben kann. Ein solcher Zugriffsschrankenmechanismus verhindert die Bedrohung durch Privilegienausweitung. Rollen sind in das Sicherheitsmodell Role Based Access Control (RBAC) integriert, das in SELinux verwendet wird.
- Typen Ein Attribut der Typen Durchsetzung, das einem Objekt zugewiesen wird und definiert, wer darauf zugreifen kann. Ăhnlich wie die Definition einer DomĂ€ne, mit dem Unterschied, dass eine DomĂ€ne auf einen Prozess angewendet wird, wĂ€hrend ein Typ auf Objekte wie Verzeichnisse, Dateien, Sockets usw. angewendet wird.
- Subjekte und Objekte Prozesse sind Subjekte und werden in einem bestimmten Kontext oder Sicherheitbereich gestartet. Die Ressourcen des Betriebssystems: Dateien, Verzeichnisse, Sockets usw., sind Objekte, die einem bestimmten Typ zugeordnet sind, anders gesagt â einem Geheimhaltungsgrad.
- SELinux-Richtlinien Um das System zu schĂŒtzen, verwendet SELinux eine Vielzahl von Richtlinien. Die SELinux-Richtlinie definiert den Zugriff der Benutzer auf Rollen, den Zugriff der Rollen auf DomĂ€nen und den Zugriff der DomĂ€nen auf Typen. Zu Beginn wird der Benutzer autorisiert, eine Rolle zu erhalten, dann wird die Rolle autorisiert, um auf DomĂ€nen zuzugreifen. SchlieĂlich kann eine DomĂ€ne nur auf einige Objekttypen zugreifen.
LSM und die Architektur von SELinux
Trotz des Namens sind LSM im Grunde keine ladbaren Module von Linux. Dennoch ist es Ă€hnlich wie bei SELinux direkt in den Kernel integriert. Jede Ănderung des Quellcodes von LSM erfordert eine erneute Kompilierung des Kernels. Die entsprechende Option muss in den Kernel-Einstellungen aktiviert werden, sonst wird der LSM-Code nach dem Booten nicht aktiviert. Selbst dann kann er jedoch ĂŒber eine Option des Betriebssystem-Bootloaders aktiviert werden.

LSM-PrĂŒfstapel
LSM verfĂŒgt ĂŒber Hooks in den wichtigsten Funktionen des Kernels, die fĂŒr die ĂberprĂŒfungen relevant sein können. Eine der Hauptmerkmale von LSM besteht darin, dass sie nach dem Stapelprinzip organisiert sind. Dadurch werden die StandardĂŒberprĂŒfungen weiterhin durchgefĂŒhrt, und jede LSM-Schicht fĂŒgt lediglich zusĂ€tzliche Kontroll- und Steuerungselemente hinzu. Das bedeutet, dass das Verbot nicht rĂŒckgĂ€ngig gemacht werden kann. Dies wird in der Abbildung dargestellt: Wenn das Ergebnis der routinemĂ€Ăigen DAC-ĂberprĂŒfungen eine Ablehnung ergibt, gelangt der Prozess nicht einmal zu den LSM-Hooks.
SELinux hat die Sicherheitsarchitektur von Flask, dem Forschungssystem Fluke, ĂŒbernommen, insbesondere das Prinzip der geringsten Privilegien. Der Kern dieses Konzepts besteht, wie der Name schon sagt, darin, dem Benutzer oder Prozess nur die Rechte zu gewĂ€hren, die fĂŒr die beabsichtigten Aktionen erforderlich sind. Dieses Prinzip wird durch erzwungene Zugriffstypisierung umgesetzt, sodass die Berechtigungssteuerung in SELinux auf dem Modell DomĂ€ne => Typ basiert.
Dank der erzwungenen Zugriffstypisierung bietet SELinux deutlich ausgefeiltere Möglichkeiten zur Zugriffskontrolle als das traditionelle DAC-Modell, das in Unix/Linux-Betriebssystemen verwendet wird. Zum Beispiel kann die Nummer des Netzwerkports, der vom FTP-Server verwendet wird, eingeschrĂ€nkt werden, und das Schreiben und Ăndern von Dateien in einem bestimmten Ordner kann erlaubt, deren Löschung jedoch untersagt werden.
Die wichtigsten Komponenten von SELinux sind:
- Policy Enforcement Server â Der Hauptmechanismus zur Durchsetzung der Zugriffskontrolle.
- Datenbank der Sicherheitspolitiken des Systems.
- Interaktion mit dem LSM-Ereignishandler.
- Selinuxfs â Ein Pseudo-Dateisystem, Ă€hnlich wie /proc, und eingehĂ€ngt in /sys/fs/selinux. Es wird wĂ€hrend der Laufzeit dynamisch vom Linux-Kernel befĂŒllt und enthĂ€lt Dateien, die Informationen ĂŒber den Status von SELinux geben.
- Access Vector Cache â Ein unterstĂŒtzender Mechanismus zur Leistungssteigerung.

Funktionsweise von SELinux
Das Ganze funktioniert folgendermaĂen.
- Ein gewisses Subjekt, in den Begriffen von SELinux, fĂŒhrt eine erlaubte Handlung an einem Objekt nach der DAC-PrĂŒfung aus, wie auf dem oberen Bild dargestellt. Diese Anforderung zur DurchfĂŒhrung einer Operation gelangt zum LSM-Ereignis-Handler.
- Von dort wird die Anfrage zusammen mit dem Sicherheitskontext des Subjekts und des Objekts an das SELinux Abstraction and Hook Logic-Modul weitergeleitet, das fĂŒr die Interaktion mit dem LSM verantwortlich ist.
- Die Instanz, die ĂŒber den Zugriff des Subjekts auf das Objekt entscheidet, ist der Policy Enforcement Server, der Daten von SELinux AnHL erhĂ€lt.
- Um ĂŒber den Zugriff oder das Verbot zu entscheiden, wendet sich der Policy Enforcement Server an das Caching-System der am hĂ€ufigsten verwendeten Regeln, den Access Vector Cache (AVC).
- Wenn die Entscheidung fĂŒr die entsprechende Regel nicht im Cache gefunden wird, wird die Anfrage weiter an die Sicherheitsrichtlinien-Datenbank weitergegeben.
- Das Suchergebnis aus der Datenbank und AVC wird an den Policy Enforcement Server zurĂŒckgegeben.
- Wenn die gefundene Richtlinie mit der angeforderten Handlung ĂŒbereinstimmt, wird die Operation genehmigt. Andernfalls wird die Operation verweigert.
Verwaltung der SELinux-Einstellungen
SELinux arbeitet in einem von drei Modi:
- Enforcing â Strikte Einhaltung der Sicherheitsrichtlinien.
- Permissive â VerstöĂe gegen die BeschrĂ€nkungen sind erlaubt, dies wird im Protokoll vermerkt.
- Disabled â Sicherheitsrichtlinien sind nicht aktiv.
Der aktuelle Modus von SELinux kann mit dem folgenden Befehl eingesehen werden.
[admin@server ~]$ getenforce
PermissiveĂnderung des Modus vor einem Neustart, zum Beispiel auf enforcing setzen, oder 1. Dem Parameter permissive entspricht der Code 0.
[admin@server ~]$ setenforce enforcing
[admin@server ~]$ setenforce 1 # das gleiche
Der Modus kann auch durch Bearbeitung der Datei geÀndert werden:
[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=erzwungene
# 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=targeted
Der Unterschied zu setenforce besteht darin, dass beim Booten des Betriebssystems der SELinux-Modus gemÀà dem Wert des SELINUX-Parameters in der Konfigurationsdatei festgelegt wird. DarĂŒber hinaus treten die Ănderungen enforcing disabled nur nach einer Bearbeitung der Datei /etc/selinux/config und nach einem Neustart in Kraft.
Kurze StatusĂŒbersicht anzeigen:
[admin@server ~]$ sestatus SELinux-Status: aktiviert
SELinuxfs-Mount: /sys/fs/selinux
SELinux-Stammverzeichnis: /etc/selinux
Geladene Richtlinienname: targeted
Aktueller Modus: permissive
Modus aus der Konfigurationsdatei: enforcing
Policy-MLS-Status: aktiviert
Policy deny_unknown Status: erlaubt
Maximale Kernel-Richtlinienversion: 31
Um die SELinux-Attribute anzuzeigen, verwenden einige Standard-Utilities den Parameter -Z.
[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 httpdIm Vergleich zur normalen Ausgabe von ls -l gibt es hier einige zusÀtzliche Felder im folgenden Format:
:::
Das letzte Feld steht fĂŒr eine Art Geheimhaltungsstufe und besteht aus einer Kombination von zwei Elementen:
- s0 â Bedeutung, wird auch als Bereich lowlevel-highlevel aufgezeichnet.
- c0, c1⊠c1023 â Kategorie.
Ănderung der Zugriffs-Konfiguration
Verwenden Sie semodule, um SELinux-Module zu laden, hinzuzufĂŒgen und zu entfernen.
[admin@server ~]$ semodule -l |wc -l #Liste aller Module
408
[admin@server ~]$ semodule -e abrt #enable - Modul aktivieren
[admin@server ~]$ semodule -d accountsd #disable - Modul deaktivieren
[admin@server ~]$ semodule -r avahi #remove - Modul entfernenDer erste Befehl semanage login verknĂŒpft den SELinux-Benutzer mit dem Betriebssystem-Benutzer, der zweite gibt eine Liste aus. SchlieĂlich entfernt der letzte Befehl mit dem SchlĂŒssel -r die VerknĂŒpfung zwischen den SELinux-Benutzern und den OS-Konten. Eine ErklĂ€rung der Syntaxwerte des MLS/MCS-Bereichs befindet sich im vorherigen Abschnitt.
[admin@server ~]$ semanage login -a -s user_u karol
[admin@server ~]$ semanage login -l Anmeldename SELinux-Benutzer MLS/MCS-Bereich Dienst
__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
Team semanage user wird verwendet, um die Zuordnungen zwischen Benutzern und Rollen in SELinux zu verwalten.
[admin@server ~]$ semanage user -l
Labeling MLS/ MLS/
SELinux Benutzer Prefix MCS Level MCS Range SELinux Rollen
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_uBefehlsparameter:
- -a Benutzerzuordnung hinzufĂŒgen;
- -l Liste der Benutzer- und Rollen-Zuordnungen;
- -d Benutzerzuordnung löschen;
- -R Liste der Rollen, die dem Benutzer zugewiesen sind;
Dateien, Ports und boolesche Werte
J-modul von SELinux stellt eine Reihe von Datei-Labeling-Regeln bereit, aber es ist auch möglich, bei Bedarf eigene Regeln hinzuzufĂŒgen. Zum Beispiel möchten wir dem Webserver Zugriffsrechte fĂŒr das Verzeichnis /srv/www gewĂ€hren.
[admin@server ~]$ semanage fcontext -a -t httpd_sys_content_t "/srv/www(/.*)?
[admin@server ~]$ restorecon -R /srv/www/Der erste Befehl registriert neue Labeling-Regeln, wĂ€hrend der zweite die Dateitypen gemÀà den aktuellen Regeln zurĂŒcksetzt bzw. festlegt.
Ăhnlich sind TCP/UDP-Ports so gekennzeichnet, dass nur die entsprechenden Dienste sie abhören können. Um beispielsweise dem Webserver das Abhören von Port 8080 zu ermöglichen, muss der folgende Befehl ausgefĂŒhrt werden.
[admin@server ~]$ semanage port -m -t http_port_t -p tcp 8080Eine betrÀchtliche Anzahl von SELinux-Modulen hat Parameter, die boolesche Werte annehmen können. Die gesamte Liste dieser Parameter kann mit getsebool -a angezeigt werden. Boolesche Werte können mit setsebool geÀndert werden.
[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
Praktikum, Zugang zur Pgadmin-WeboberflÀche erhalten.
Betrachten wir ein praktisches Beispiel: Wir haben auf RHEL 7.6 pgadmin4-web installiert, um die PostgreSQL-Datenbank zu verwalten. Wir haben ein kleines mit der Konfiguration von pg_hba.conf, postgresql.conf und config_local.py durchgefĂŒhrt, die Berechtigungen fĂŒr die Verzeichnisse festgelegt und die fehlenden Python-Module mit pip installiert. Alles ist bereit, wir starten und erhalten 500 Internal Server Error.

Wir beginnen mit den typischen VerdĂ€chtigen und ĂŒberprĂŒfen /var/log/httpd/error_log. Dort finden sich einige interessante EintrĂ€ge.
[timestamp] [core:notice] [pid 23689] SELinux-Policy aktiviert; httpd lÀuft im Kontext system_u:system_r:httpd_t:s0
...
[timestamp] [wsgi:error] [pid 23690] [Errno 13] Berechtigung verweigert: '/var/lib/pgadmin'
[timestamp] [wsgi:error] [pid 23690]
[timestamp] [wsgi:error] [pid 23690] HINWEIS: Möglicherweise mĂŒssen Sie die Berechtigungen manuell festlegen auf
[timestamp] [wsgi:error] [pid 23690] /var/lib/pgadmin, um Apache das Schreiben zu ermöglichen.
An dieser Stelle haben die meisten Linux-Administratoren die starke Versuchung, setenforce 0 auszufĂŒhren und damit das Problem zu lösen. Um ehrlich zu sein, habe ich das beim ersten Mal so gemacht. Das ist natĂŒrlich auch eine Lösung, aber bei weitem nicht die beste.
Trotz der KomplexitĂ€t kann SELinux benutzerfreundlich sein. Es genĂŒgt, das Paket setroubleshoot zu installieren und das Systemprotokoll zu ĂŒberprĂŒfen.
[admin@server ~]$ yum install setroubleshoot
[admin@server ~]$ journalctl -b -0
[admin@server ~]$ service restart auditd
Bitte beachten Sie, dass der Dienst auditd genau so neu gestartet werden muss, und nicht mit systemctl, trotz der Anwesenheit von systemd im Betriebssystem. Im Systemprotokoll wird sowohl der Fakt der Blockierung als auch der Grund angegeben sowie der Weg, um die Sperre zu ĂŒberwinden. FĂŒhren Sie diese Befehle aus:.

ĂberprĂŒfen Sie den Zugriff auf die Webseite pgadmin4-web, alles funktioniert.
[admin@server ~]$ setsebool -P httpd_can_network_connect 1
[admin@server ~]$ setsebool -P httpd_can_network_connect_db 1
ĂberprĂŒfen Sie den Zugriff auf die Webseite pgadmin4-web, alles funktioniert.
Quelle: habr.com
