Linux-Sicherheitssysteme

Einer der Gründe für den enormen Erfolg des Linux-Betriebssystems auf eingebetteten, mobilen Geräten und Servern ist das relativ hohe Maß an Sicherheit des Kernels, der zugehörigen Dienste und Anwendungen. Aber falls Schau genauer hin zur Architektur des Linux-Kernels, dann ist es unmöglich, darin einen Platz zu finden, der für die Sicherheit als solche verantwortlich ist. Wo versteckt sich das Linux-Sicherheitssubsystem und woraus besteht es?

Hintergrundinformationen zu Linux-Sicherheitsmodulen und SELinux

Security Enhanced Linux ist eine Reihe von Regeln und Zugriffsmechanismen, die auf obligatorischen und rollenbasierten Zugriffsmodellen basieren, um Linux-Systeme vor potenziellen Bedrohungen zu schützen und die Mängel der Discretionary Access Control (DAC), dem traditionellen Unix-Sicherheitssystem, zu beheben. Das Projekt entstand in den Eingeweiden der US-amerikanischen National Security Agency und wurde hauptsächlich von den Vertragspartnern Secure Computing Corporation und MITRE sowie einer Reihe von Forschungslabors direkt entwickelt.

Linux-Sicherheitssysteme
Linux-Sicherheitsmodule

Linus Torvalds machte eine Reihe von Kommentaren zu neuen NSA-Entwicklungen, damit diese in den Haupt-Linux-Kernel aufgenommen werden konnten. Er beschrieb eine allgemeine Umgebung mit einer Reihe von Interceptoren zur Steuerung von Operationen mit Objekten und einer Reihe bestimmter Schutzfelder in Kernel-Datenstrukturen zur Speicherung der entsprechenden Attribute. Diese Umgebung kann dann von ladbaren Kernelmodulen genutzt werden, um jedes gewünschte Sicherheitsmodell zu implementieren. LSM wurde 2.6 vollständig in den Linux-Kernel v2003 integriert.

Das LSM-Framework umfasst Schutzfelder in Datenstrukturen und Aufrufe von Abfangfunktionen an kritischen Punkten im Kernel-Code, um diese zu manipulieren und eine 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 auf dem System. LSM-Hooks werden in Listen gespeichert, die in der in CONFIG_LSM angegebenen Reihenfolge aufgerufen werden. Eine ausführliche Dokumentation zu Hooks ist in der Header-Datei include/linux/lsm_hooks.h enthalten.

Das LSM-Subsystem ermöglichte die vollständige Integration von SELinux mit derselben Version des stabilen Linux-Kernels v2.6. Fast sofort wurde SELinux zum De-facto-Standard für eine sichere Linux-Umgebung und war in den beliebtesten Distributionen enthalten: RedHat Enterprise Linux, Fedora, Debian, Ubuntu.

SELinux-Glossar

  • Identität — Der SELinux-Benutzer ist nicht mit der üblichen Unix/Linux-Benutzer-ID identisch; sie können auf demselben System koexistieren, sind aber im Wesentlichen völlig unterschiedlich. Jedes Standard-Linux-Konto kann einem oder mehreren in SELinux entsprechen. Die SELinux-Identität ist Teil des gesamten Sicherheitskontexts, der bestimmt, welchen Domänen Sie beitreten können und welchen nicht.
  • Domains - In SELinux ist eine Domäne der Ausführungskontext eines Subjekts, also eines Prozesses. Die Domäne bestimmt direkt den Zugriff, den ein Prozess hat. Eine Domäne ist im Grunde eine Liste dessen, was Prozesse tun können oder was ein Prozess mit verschiedenen Typen tun kann. Einige Beispiele für Domänen sind sysadm_t für die Systemverwaltung und user_t, eine normale nichtprivilegierte Benutzerdomäne. Das Init-System wird in der Domäne „init_t“ ausgeführt, und der benannte Prozess wird in der Domäne „named_t“ ausgeführt.
  • Rollen – Was als Vermittler zwischen Domänen und SELinux-Benutzern dient. Rollen bestimmen, zu welchen Domänen ein Benutzer gehören kann und auf welche Objekttypen er zugreifen kann. Dieser Zugriffskontrollmechanismus verhindert die Gefahr von Privilegieneskalationsangriffen. Rollen werden in das in SELinux verwendete Sicherheitsmodell Role Based Access Control (RBAC) geschrieben.
  • Typen – Ein Typ-Enforcement-Listenattribut, das einem Objekt zugewiesen wird und bestimmt, wer darauf zugreifen kann. Ähnlich der Domänendefinition, mit der Ausnahme, dass die Domäne für einen Prozess gilt und der Typ für Objekte wie Verzeichnisse, Dateien, Sockets usw. gilt.
  • Subjekte und Objekte – Prozesse sind Subjekte und werden in einem bestimmten Kontext oder einer bestimmten Sicherheitsdomäne ausgeführt. Betriebssystemressourcen: Dateien, Verzeichnisse, Sockets usw. sind Objekte, denen ein bestimmter Typ, also eine Datenschutzstufe, zugewiesen ist.
  • SELinux-Richtlinien — SELinux verwendet eine Vielzahl von Richtlinien, um das System zu schützen. Die SELinux-Richtlinie definiert den Zugriff von Benutzern auf Rollen, Rollen auf Domänen und Domänen auf Typen. Zuerst ist der Benutzer berechtigt, eine Rolle zu erhalten, dann ist die Rolle berechtigt, auf Domänen zuzugreifen. Schließlich kann eine Domäne nur auf bestimmte Objekttypen zugreifen.

LSM- und SELinux-Architektur

Trotz des Namens sind LSMs im Allgemeinen keine ladbaren Linux-Module. Allerdings ist es wie SELinux direkt in den Kernel integriert. Jede Änderung am LSM-Quellcode erfordert eine neue Kernel-Kompilierung. Die entsprechende Option muss in den Kernel-Einstellungen aktiviert sein, sonst wird der LSM-Code nach dem Booten nicht aktiviert. Aber auch in diesem Fall kann es über die Bootloader-Option des Betriebssystems aktiviert werden.

Linux-Sicherheitssysteme
LSM-Prüfstapel

LSM ist mit Hooks in Kernel-Funktionen ausgestattet, die für Prüfungen relevant sein können. Eines der Hauptmerkmale von LSMs ist, dass sie gestapelt sind. Somit werden weiterhin die Standardprüfungen durchgeführt, und jede Schicht von LSM fügt lediglich zusätzliche Kontrollen und Kontrollen hinzu. Das bedeutet, dass das Verbot nicht rückgängig gemacht werden kann. Dies ist in der Abbildung dargestellt: Wenn das Ergebnis routinemäßiger DAC-Prüfungen ein Fehler ist, wird die Angelegenheit nicht einmal die LSM-Hooks erreichen.

SELinux übernimmt die Flask-Sicherheitsarchitektur des Forschungsbetriebssystems Fluke, insbesondere das Prinzip der geringsten Rechte. Der Kern dieses Konzepts besteht, wie der Name schon sagt, darin, dem Benutzer oder Prozess nur die Rechte zu gewähren, die zur Ausführung der beabsichtigten Aktionen erforderlich sind. Dieses Prinzip wird durch erzwungene Zugriffstypisierung implementiert, daher basiert die Zugriffskontrolle in SELinux auf dem Modell domain => type.

Dank der erzwungenen Zugriffstypisierung verfügt SELinux über viel größere Zugriffskontrollfunktionen als das herkömmliche DAC-Modell, das in Unix/Linux-Betriebssystemen verwendet wird. Sie können beispielsweise die Nummer des Netzwerkports begrenzen, zu dem der FTP-Server eine Verbindung herstellt, das Schreiben und Ändern von Dateien in einem bestimmten Ordner zulassen, sie jedoch nicht löschen.

Die Hauptkomponenten von SELinux sind:

  • Richtliniendurchsetzungsserver — Der Hauptmechanismus zur Organisation der Zugangskontrolle.
  • Datenbank für Systemsicherheitsrichtlinien.
  • Interaktion mit dem LSM-Ereignis-Interceptor.
  • Selinuxfs - Pseudo-FS, dasselbe wie /proc und in /sys/fs/selinux gemountet. Wird zur Laufzeit vom Linux-Kernel dynamisch gefüllt und enthält Dateien mit SELinux-Statusinformationen.
  • Zugriff auf den Vektor-Cache — Ein Hilfsmechanismus zur Steigerung der Produktivität.

Linux-Sicherheitssysteme
So funktioniert SELinux

Es funktioniert alles so.

  1. Ein bestimmtes Subjekt führt, in SELinux-Begriffen, nach einer DAC-Prüfung eine zulässige Aktion an einem Objekt aus, wie im oberen Bild dargestellt. Diese Anforderung zur Durchführung einer Operation geht an den LSM-Ereignis-Interceptor.
  2. Von dort wird die Anfrage zusammen mit dem Subjekt- und Objektsicherheitskontext an das SELinux-Abstraktions- und Hook-Logic-Modul weitergeleitet, das für die Interaktion mit dem LSM verantwortlich ist.
  3. Die Entscheidungsinstanz über den Zugriff eines Subjekts auf ein Objekt ist der Policy Enforcement Server und er empfängt Daten von SELinux AnHL.
  4. Um Entscheidungen über Zugriff oder Verweigerung zu treffen, greift der Policy Enforcement Server für die am häufigsten verwendeten Regeln auf das Caching-Subsystem Access Vector Cache (AVC) zurück.
  5. Wenn im Cache keine Lösung für die entsprechende Regel gefunden wird, wird die Anfrage an die Sicherheitsrichtliniendatenbank weitergeleitet.
  6. Das Suchergebnis aus der Datenbank und AVC wird an den Policy Enforcement Server zurückgegeben.
  7. Wenn die gefundene Richtlinie mit der angeforderten Aktion übereinstimmt, ist der Vorgang zulässig. Andernfalls ist der Betrieb verboten.

Verwalten der SELinux-Einstellungen

SELinux arbeitet in einem von drei Modi:

  • Durchsetzung – Strikte Einhaltung von Sicherheitsrichtlinien.
  • Freizügig – Verstöße gegen Beschränkungen sind erlaubt; ein entsprechender Vermerk wird im Journal vermerkt.
  • Deaktiviert: Sicherheitsrichtlinien sind nicht wirksam.

Mit dem folgenden Befehl können Sie sehen, in welchem ​​Modus sich SELinux befindet.

[admin@server ~]$ getenforce
Permissive

Ändern des Modus vor dem Neustart, z. B. Einstellen auf Erzwingen oder 1. 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 in der Konfigurationsdatei eingestellt wird. Darüber hinaus werden Änderungen an der Erzwingung von <=> deaktiviert nur wirksam, wenn die Datei /etc/selinux/config bearbeitet wird und nach einem Neustart.

Sehen Sie sich einen kurzen Statusbericht an:

[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

Um SELinux-Attribute anzuzeigen, verwenden einige Standarddienstprogramme 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 mehrere zusätzliche Felder im folgenden Format:

<user>:<role>:<type>:<level>

Das letzte Feld bezeichnet so etwas wie eine Sicherheitsklassifizierung und besteht aus einer Kombination zweier Elemente:

  • s0 – Signifikanz, auch als Lowlevel-Highlevel-Intervall geschrieben
  • c0, c1… c1023 – Kategorie.

Zugriffskonfiguration ändern

Verwenden Sie semodule, 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 - удалить модуль

Erste Mannschaft Semanage-Login verbindet den SELinux-Benutzer mit dem Betriebssystembenutzer, der zweite zeigt eine 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-Range-Werte 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

Team Semanage-Benutzer Wird zum Verwalten von Zuordnungen zwischen SELinux-Benutzern und -Rollen verwendet.

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

  • -ein benutzerdefinierten Rollenzuordnungseintrag hinzufügen;
  • -l Liste übereinstimmender Benutzer und Rollen;
  • -d Eintrag zur Benutzerrollenzuordnung löschen;
  • -R Liste der dem Benutzer zugeordneten Rollen;

Dateien, Ports und boolesche Werte

Jedes SELinux-Modul stellt eine Reihe von Datei-Tagging-Regeln bereit, Sie können jedoch bei Bedarf auch eigene Regeln hinzufügen. Wir möchten beispielsweise, 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 neue Markierungsregeln und der zweite Befehl setzt die Dateitypen gemäß den aktuellen Regeln zurück bzw. stellt sie ein.

Ebenso sind TCP/UDP-Ports so gekennzeichnet, dass nur die entsprechenden Dienste auf ihnen lauschen können. Damit der Webserver beispielsweise Port 8080 abhört, müssen Sie den Befehl ausführen.

[admin@server ~]$ semanage port -m -t http_port_t -p tcp 8080

Eine beträchtliche Anzahl von SELinux-Modulen verfügt über Parameter, die boolesche Werte annehmen können. Die gesamte Liste solcher Parameter kann mit getsebool -a eingesehen 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, erhalten Sie Zugriff auf die Pgadmin-Weboberfläche

Schauen wir uns ein praktisches Beispiel an: Wir haben pgadmin7.6-web auf RHEL 4 installiert, um die PostgreSQL-Datenbank zu verwalten. Wir gingen ein wenig spazieren Suche Mit den Einstellungen von pg_hba.conf, postgresql.conf und config_local.py Ordnerberechtigungen festlegen und die fehlenden Python-Module von pip installieren. Alles ist bereit, wir starten und empfangen 500 Interner Serverfehler.

Linux-Sicherheitssysteme

Wir beginnen mit den typischen Verdächtigen und überprüfen /var/log/httpd/error_log. Da gibt es einige interessante Einträge.

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

An diesem Punkt werden die meisten Linux-Administratoren stark versucht sein, setencorce 0 auszuführen, und dann ist die Sache erledigt. Ehrlich gesagt habe ich genau das beim ersten Mal getan. Das ist natürlich auch ein Ausweg, aber bei weitem nicht der beste.

Trotz der umständlichen Designs kann SELinux benutzerfreundlich sein. Installieren Sie einfach das Paket „setroubleshoot“ und sehen Sie sich das Systemprotokoll an.

[admin@server ~]$ yum install setroubleshoot
[admin@server ~]$ journalctl -b -0
[admin@server ~]$ service restart auditd

Bitte beachten Sie, dass der auditd-Dienst auf diese Weise und nicht mit systemctl neu gestartet werden muss, obwohl systemd im Betriebssystem vorhanden ist. Im Systemprotokoll wird angezeigt nicht nur die Tatsache der Sperrung, sondern auch der Grund und Weg, das Verbot zu überwinden.

Linux-Sicherheitssysteme

Wir führen diese Befehle aus:

[admin@server ~]$ setsebool -P httpd_can_network_connect 1
[admin@server ~]$ setsebool -P httpd_can_network_connect_db 1

Wir prüfen den Zugriff auf die pgadmin4-web-Webseite, alles funktioniert.

Linux-Sicherheitssysteme

Linux-Sicherheitssysteme

Source: habr.com

Kommentar hinzufügen