Linux-Schutzsysteme

Ein Grund fĂŒr den beeindruckenden Erfolg des Linux-Betriebssystems auf eingebetteten, mobilen GerĂ€ten und Servern ist die relativ hohe Sicherheit des Kernels sowie der begleitenden Dienste und Anwendungen. Doch wenn man genau hinschaut , findet man in der Architektur des Linux-Kernels kein separates Element, das ausschließlich fĂŒr die Sicherheit verantwortlich ist. Wo versteckt sich also das Sicherheitssystem von Linux und aus welchen Komponenten besteht es?

Die Vorgeschichte der Linux-Sicherheitsmodule und SELinux

Security Enhanced Linux ist ein Regelwerk und ein Zugriffssystem, das auf den Modellen des mandatorischen und rollenspezifischen Zugriffs basiert, um Linux-Systeme vor potenziellen Bedrohungen zu schĂŒtzen und SchwĂ€chen des Discretionary Access Control (DAC) — dem traditionellen Sicherheitssystem von Unix — zu beheben. Das Projekt entstand im Rahmen des National Security Agency der USA, die Entwicklung wurde hauptsĂ€chlich von der Secure Computing Corporation und MITRE sowie von verschiedenen Forschungsinstituten vorangetrieben.

Linux-Schutzsysteme
Linux-Sicherheitsmodule

Linus Torvalds hat eine Reihe von Anmerkungen zu den neuen Entwicklungen der NSA gemacht, um sicherzustellen, dass sie in den Hauptzweig des Linux-Kernels integriert werden können. Er beschrieb eine allgemeine Umgebung mit einer Sammlung von Interceptoren zur Verwaltung von Objektoperationen sowie einem Set an Schutzfeldern in den Datenstrukturen des Kernels zur Speicherung entsprechender Attribute. Diese Umgebung kann dann von ladbaren Kernel-Modulen genutzt werden, um beliebige Sicherheitsmodelle zu implementieren. LSM wurde 2003 vollstÀndig in den Linux-Kernel v2.6 integriert.

Das LSM-Framework umfasst Schutzfelder in den Datenstrukturen und Funktionsaufrufe zur Abfangung an kritischen Stellen im Kernel-Code, um sie zu verwalten und Zugriffssteuerungen durchzufĂŒhren. Es bietet auch Funktionen zur Registrierung von Sicherheitsmodulen. Das Interface /sys/kernel/security/lsm enthĂ€lt eine Liste aktiver Module im System. 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-Modul hat eine vollstĂ€ndige Integration von SELinux in dieselbe Version des stabilen Linux-Kernels v2.6 ermöglicht. SELinux ist fast sofort zum De-facto-Standard fĂŒr eine sichere Linux-Umgebung geworden und wurde in die beliebtesten Distributionen aufgenommen: RedHat Enterprise Linux, Fedora, Debian, Ubuntu.

Glossar zu SELinux

  • IdentitĂ€t — Ein SELinux-Benutzer ist nicht dasselbe wie eine herkömmliche Unix/Linux-Benutzer-ID; sie können zwar auf demselben System koexistieren, unterscheiden sich jedoch grundlegend. Jeder Standard-Linux-Account kann einem oder mehreren SELinux-IdentitĂ€ten entsprechen. Die SELinux-IdentitĂ€t ist ein integraler Bestandteil des ĂŒbergreifenden Sicherheitskontexts, der definiert, in welche Domains man eintreten darf und in welche nicht.
  • Domains — In SELinux ist ein Domain ein AusfĂŒhrungskontext eines Subjekts, d.h. eines Prozesses. Die Domain bestimmt direkt den Zugriff, den der Prozess hat. Eine Domain ist im Wesentlichen eine Liste dessen, was Prozesse tun können oder welche Aktionen ein Prozess mit verschiedenen Typen ausfĂŒhren kann. Einige Beispiele fĂŒr Domains sind: sysadm_t fĂŒr Systemadministration und user_t, was die normale nicht privilegierte Benutzer-Domain ist. Das Initialisierungssystem init lĂ€uft im Domain init_t, und der Prozess named lĂ€uft in der Domain named_t.
  • Rollen — Etwas, das als Vermittler zwischen Domains und Benutzern in SELinux fungiert. Rollen bestimmen, in welchen Domains ein Benutzer sich befinden kann und auf welche Arten von Objekten er zugreifen kann. Ein Ă€hnlicher Mechanismus zur Zugriffskontrolle verhindert die Gefahr eines Angriffs zur Erhöhung von Rechten. Rollen sind in das Sicherheitsmodell der rollenbasierten Zugriffskontrolle (RBAC) integriert, das in SELinux verwendet wird.
  • Typen — Ein Typ Enforcement-Attribut, das einem Objekt zugewiesen wird und definiert, wer darauf zugreifen kann. Ähnlich wie eine Domain-Definition, mit dem Unterschied, dass die Domain fĂŒr den Prozess 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 Sicherheitsbereich ausgefĂŒhrt. Betriebssystemressourcen: Dateien, Verzeichnisse, Sockets usw. sind Objekte, die einem bestimmten Typ zugeordnet werden, mit anderen Worten — einer Geheimhaltungsstufe.
  • SELinux-Richtlinien — Zum Schutz des Systems verwendet SELinux verschiedene Richtlinien. Die SELinux-Richtlinie definiert den Zugriff von Benutzern auf Rollen, Rollen auf Domains und Domains auf Typen. ZunĂ€chst wird der Benutzer autorisiert, um eine Rolle zu erhalten, dann wird die Rolle autorisiert, um auf Domains zuzugreifen. Schließlich kann eine Domain nur auf bestimmte Objekttypen zugreifen.

LSM und SELinux-Architektur

Obwohl der Name LSM im Allgemeinen keine ladbaren Linux-Module bezeichnet, ist es Ă€hnlich wie bei SELinux direkt in den Kernel integriert. Jede Änderung des LSM-Quellcodes erfordert eine neue Kernel-Kompilation. Die entsprechende Option muss in den Kernel-Einstellungen aktiviert werden, andernfalls wird der LSM-Code nach dem Booten nicht aktiviert. Selbst dann kann er jedoch ĂŒber die Bootloader-Option aktiviert werden.

Linux-Schutzsysteme
LSM-PrĂŒfstapel

LSM verfĂŒgt ĂŒber Hooks in zentralen Kernel-Funktionen, die fĂŒr PrĂŒfungen relevant sein können. Eine der Hauptmerkmale von LSM ist, dass sie auf einem Stapelprinzip basieren. Dadurch werden die standardmĂ€ĂŸigen PrĂŒfungen weiterhin durchgefĂŒhrt, und jede LSM-Ebene fĂŒgt lediglich zusĂ€tzliche Kontroll- und Verwaltungselemente hinzu. Dies bedeutet, dass ein Verbot nicht zurĂŒckgenommen werden kann. Dies wird in der Abbildung gezeigt: Wenn das Ergebnis der routinemĂ€ĂŸigen DAC-PrĂŒfungen eine Ablehnung ist, erreichen die Anfragen nicht einmal die LSM-Hooks.

SELinux ĂŒbernahm die Sicherheitsarchitektur des Flask-Betriebssystems von Fluke, insbesondere das Prinzip der minimalen Privilegien. Der Kern dieses Konzepts besteht, wie der Name schon sagt, darin, einem Benutzer oder Prozess nur die Rechte zu gewĂ€hren, die fĂŒr die AusfĂŒhrung der beabsichtigten Aktionen erforderlich sind. Dieses Prinzip wird durch eine erzwungene Access Control Typisierung umgesetzt, sodass die Zugriffskontrolle in SELinux auf einem Modell von DomĂ€ne => Typ basiert.

Dank der erzwungenen Access Control Typisierung hat SELinux weitaus grĂ¶ĂŸere Möglichkeiten zur Zugriffskontrolle als das traditionelle DAC-Modell, das in Unix/Linux-Betriebssystemen verwendet wird. Beispielsweise kann die Nummer des Netzwerkports, den der FTP-Server verwenden wird, eingeschrĂ€nkt werden, und es kann das Recht zum Schreiben und Ändern von Dateien in einem bestimmten Ordner, jedoch nicht deren Löschung, gewĂ€hrt werden.

Die Hauptkomponenten von SELinux sind:

  • Policy Enforcement Server — Der Hauptmechanismus zur Organisation der Zugriffskontrolle.
  • Datenbank der Sicherheitspolitiken des Systems.
  • Interaktion mit dem Ereignisinterceptor LSM.
  • Selinuxfs — Pseudo-Dateisystem, Ă€hnlich wie /proc und eingehĂ€ngt in /sys/fs/selinux. Wird dynamisch vom Linux-Kernel wĂ€hrend der AusfĂŒhrung gefĂŒllt und enthĂ€lt Dateien mit Informationen ĂŒber den Status von SELinux.
  • Access Vector Cache — Hilfsmechanismus zur Leistungssteigerung.

Linux-Schutzsysteme
Funktionsschema von SELinux

So funktioniert das alles.

  1. Ein Subjekt, in den Begriffen von SELinux, fĂŒhrt eine erlaubte Handlung an einem Objekt nach einer DAC-PrĂŒfung aus, wie in der oberen Abbildung dargestellt. Diese Anfrage zur DurchfĂŒhrung einer Aktion gelangt zu dem LSM-Ereignisinterceptor.
  2. Von dort wird die Anfrage zusammen mit dem Sicherheitskontext des Subjekts und des Objekts an das SELinux Abstraktions- und Hook-Logikmodul weitergeleitet, das fĂŒr die Interaktion mit LSM verantwortlich ist.
  3. Die Instanz, die darĂŒber entscheidet, ob das Subjekt auf das Objekt zugreifen kann, ist der Policy Enforcement Server, der Daten von SELinux AnHL erhĂ€lt.
  4. Um eine Entscheidung ĂŒber den Zugriff oder die Verweigerung zu treffen, greift der Policy Enforcement Server auf das Subsystem des Caches der am hĂ€ufigsten verwendeten Regeln, den Access Vector Cache (AVC), zurĂŒck.
  5. Wenn fĂŒr die betreffende Regel keine Entscheidung im Cache gefunden wird, wird die Anfrage weiter an die Datenbank der Sicherheitsrichtlinien weitergeleitet.
  6. Das Suchergebnis aus der Datenbank und dem AVC wird an den Policy Enforcement Server zurĂŒckgegeben.
  7. Wenn die gefundene Richtlinie mit der angeforderten Aktion ĂŒbereinstimmt, wird die Operation genehmigt. Andernfalls wird die Operation verweigert.

Verwaltung der SELinux-Einstellungen

SELinux arbeitet in einem der drei Modi:

  • Enforcing — Strikte Durchsetzung 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 folgendem Befehl ĂŒberprĂŒft werden.

[admin@server ~]$ getenforce
Permissive

Änderung des Modus bis zum nĂ€chsten Neustart, z. B. auf enforcing oder 1. Der Parameter permissive entspricht dem numerischen Code 0.

[admin@server ~]$ setenfoce enforcing
[admin@server ~]$ setenfoce 1 # gleiches Ergebnis

Der Modus kann auch durch Bearbeiten 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=erzwungen
# 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=targete

Der Unterschied zu setenfoce besteht darin, dass beim Starten des Betriebssystems der SELinux-Modus gemĂ€ĂŸ dem Wert des SELINUX-Parameters in der Konfigurationsdatei festgelegt wird. DarĂŒber hinaus treten Änderungen von enforcing disabled nur durch 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-Stammdirectory: /etc/selinux
Geladene Richtlinienbezeichnung: targeted
Aktueller Modus: permissive
Modus aus der Konfigurationsdatei: enforcing
Policy-MLS-Status: aktiviert
Policy deny_unknown-Status: erlaubt
Maximale Kernel-Richtlinienversion: 31

Einige Standardwerkzeuge verwenden den Parameter -Z, um die 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 regulÀren Ausgabe von ls -l gibt es hier einige zusÀtzliche Felder im folgenden Format:

:::

Das letzte Feld bezeichnet eine Art Geheimhaltungsstufe und besteht aus einer Kombination von zwei Elementen:

  • s0 — Bedeutung, auch als Bereich lowlevel-highlevel angegeben.
  • c0, c1
 c1023 — Kategorie.

Ändern 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 #aktivieren - Modul aktivieren
[admin@server ~]$ semodule -d accountsd #deaktivieren - Modul deaktivieren
[admin@server ~]$ semodule -r avahi #entfernen - Modul entfernen

Erster Befehl semanage login verbindet den SELinux-Benutzer mit dem Benutzer des Betriebssystems, der zweite Befehl gibt eine Liste aus. Schließlich entfernt der letzte Befehl mit dem SchlĂŒssel -r die Verbindung zwischen SELinux-Benutzern und OS-Konten. Eine ErklĂ€rung der Syntax fĂŒr die Werte MLS/MCS Range findet 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

Der Befehl semanage user wird verwendet, um die Zuordnungen zwischen Benutzern und Rollen in SELinux zu verwalten.

[admin@server ~]$ semanage user -l
                Kennzeichnung   MLS/       MLS/                          
SELinux-Benutzer    PrÀfix     MCS-Stufe  MCS-Bereich             SELinux-Rollen
guest_u         Benutzer       s0         s0                    guest_r
staff_u         staff      s0         s0-s0:c0.c1023        staff_r sysadm_r
...
user_u          Benutzer       s0         s0                    user_r
xguest_u        Benutzer       s0         s0                    xguest_r
[admin@server ~]$ semanage user -a -R 'staff_r user_r'
[admin@server ~]$ semanage user -d test_u

Befehlsparameter:

  • -a fĂŒgt einen benutzerdefinierten Rollenzuordnungsdatensatz hinzu;
  • -l listet die Zuordnungen zwischen Benutzern und Rollen auf;
  • -d entfernt einen benutzerdefinierten Rollenzuordnungsdatensatz;
  • -R Rollenliste, die dem Benutzer zugewiesen ist;

Dateien, Ports und boolesche Werte

Jedes SELinux-Modul bietet eine Reihe von Dateimarkierungsregeln, die auch durch eigene Regeln ergÀnzt werden können, falls erforderlich. Beispielsweise möchten wir dem Webserver Zugriffsrechte auf den Ordner /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 Markierungsregeln, wĂ€hrend der zweite die Dateitypen gemĂ€ĂŸ den aktuellen Regeln zurĂŒcksetzt oder festlegt.

In Ă€hnlicher Weise sind TCP/UDP-Ports so markiert, dass nur die entsprechenden Dienste sie abhören können. Um beispielsweise sicherzustellen, dass der Webserver den Port 8080 abhören kann, muss der folgende Befehl ausgefĂŒhrt werden.

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

Eine erhebliche Anzahl von SELinux-Modulen verfĂŒgt ĂŒber Parameter, die boolesche Werte annehmen können. Die vollstĂ€ndige Liste dieser Parameter kann mit getsebool -a angezeigt werden. Boolesche Werte lassen sich 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

Praktikum, Zugriff auf das Interface Pgadmin-web erhalten

Lassen Sie uns ein praktisches Beispiel betrachten: Wir haben pgadmin4-web auf RHEL 7.6 fĂŒr die Verwaltung von PostgreSQL-Datenbanken installiert. Wir durchliefen einige Schritte, um die Konfiguration von pg_hba.conf, postgresql.conf und config_local.py einzurichten, ordneten die Berechtigungen fĂŒr die Ordner zu und installierten die fehlenden Python-Module ĂŒber pip. Alles ist bereit, wir starten und erhalten eine 500 Internal Server Error.

Linux-Schutzsysteme

Wir beginnen mit den typischen VerdĂ€chtigen und prĂŒfen /var/log/httpd/error_log. Dort sind interessante EintrĂ€ge zu finden.

[timestamp] [core:notice] [pid 23689] SELinux-Richtlinie 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 fĂŒr
[timestamp] [wsgi:error] [pid 23690] /var/lib/pgadmin manuell festlegen, damit Apache darauf schreiben kann.

An dieser Stelle haben die meisten Linux-Administratoren den starken Drang, setenforce 0 auszufĂŒhren und die Sache damit zu erledigen. Um ehrlich zu sein, habe ich das beim ersten Mal auch gemacht. Das ist natĂŒrlich auch ein Ausweg, aber ganz sicher nicht die beste Lösung.

Trotz der KomplexitĂ€t kann SELinux benutzerfreundlich sein. Es genĂŒgt, das Paket setroubleshoot zu installieren und das Systemprotokoll einzusehen.

[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, auch wenn systemd im Betriebssystem vorhanden ist. Im Systemprotokoll wird angegeben nicht nur die Tatsache der Blockierung, sondern auch der Grund und die Möglichkeit, die Sperrung zu ĂŒberwinden..

Linux-Schutzsysteme

FĂŒhren Sie diese Befehle aus:

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

Wir ĂŒberprĂŒfen den Zugriff auf die Webseite pgadmin4-web, alles funktioniert.

Linux-Schutzsysteme

Linux-Schutzsysteme

Quelle: habr.com

ZuverlĂ€ssiges Webhosting mit DDoS-Schutz, VPS- und VDS-Server kaufen đŸ”„ ZuverlĂ€ssiges Webhosting mit DDoS-Schutz, VPS- und VDS-Server kaufen | ProHoster