Schutzsysteme fĂŒr Linux

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 genau hinschaut 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.

Schutzsysteme fĂŒr Linux
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.

Schutzsysteme fĂŒr Linux
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.

Schutzsysteme fĂŒr Linux
Funktionsweise von SELinux

Das Ganze funktioniert folgendermaßen.

  1. 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.
  2. 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.
  3. Die Instanz, die ĂŒber den Zugriff des Subjekts auf das Objekt entscheidet, ist der Policy Enforcement Server, der Daten von SELinux AnHL erhĂ€lt.
  4. 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).
  5. Wenn die Entscheidung fĂŒr die entsprechende Regel nicht im Cache gefunden wird, wird die Anfrage weiter an die Sicherheitsrichtlinien-Datenbank weitergegeben.
  6. Das Suchergebnis aus der Datenbank und AVC wird an den Policy Enforcement Server zurĂŒckgegeben.
  7. 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 httpd

Im 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 entfernen

Der 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_u

Befehlsparameter:

  • -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 8080

Eine 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 Quest 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.

Schutzsysteme fĂŒr Linux

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:.

Schutzsysteme fĂŒr Linux

Ü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.

Schutzsysteme fĂŒr Linux

Schutzsysteme fĂŒr Linux

Quelle: habr.com

60GB SSD 8Gb DDR4