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

Zuverlässiges Hosting für Websites mit DDoS-Schutz kaufen, VPS VDS Server 🔥 Zuverlässiges Hosting für Websites mit DDoS-Schutz kaufen, VPS VDS Server - ProHoster