Zugriffskontrolle im Kernel

Was ist SELinux?

Security-Enhanced Linux

SELinux (Security-Enhanced Linux) ist eine im Linux-Kernel verankerte Zugriffskontrolle nach dem Prinzip Mandatory Access Control: Jeder Prozess und jede Datei trägt ein Label, und eine zentrale Policy entscheidet anhand dieser Labels, wer worauf zugreifen darf. Die Regeln gelten zusätzlich zu den normalen Dateirechten und binden auch root.

Wenn ein Dienst unter Red Hat oder Rocky Linux eine Datei nicht öffnen kann, obwohl die Dateirechte eindeutig stimmen, steht meist die Regelmenge im Kernel im Weg.

KI-generiertDieses Bild wurde mit KI erzeugt · Yves Hoppe / KI / cmt
Gilt zusätzlich
Zu den Dateirechten, auch für root
Drei Modi
Enforcing, Permissive, Disabled
Erste Wahl
Boolean setzen statt eigener Regel
Verwechselt mit
AppArmor

Labels und Kontexte statt Benutzerrechte

Jedes Objekt im System trägt einen Kontext aus vier Teilen: SELinux-Benutzer, Rolle, Typ und Sicherheitsstufe. Sichtbar wird er mit ls -Z für Dateien und ps -Z für Prozesse:

$ ls -Z /var/www/html/index.html
system_u:object_r:httpd_sys_content_t:s0 /var/www/html/index.html

$ ps -eZ | grep httpd
system_u:system_r:httpd_t:s0    1234 ?  00:00:01 httpd

Entscheidend ist im Alltag der Typ, die dritte Stelle. Der Webserver läuft als httpd_t und darf laut Policy auf Dateien vom Typ httpd_sys_content_t zugreifen, auf den Kontext der Benutzerverzeichnisse dagegen nicht. Ob der Dateieigentümer den Zugriff erlauben würde, spielt keine Rolle. Dieses Prinzip heißt Type Enforcement und trägt fast die gesamte Policy der gängigen Distributionen.

Daraus folgt der Fehler, den fast jeder einmal macht: Eine Datei wird mit mv aus dem Home-Verzeichnis nach /var/www verschoben und behält dabei ihren alten Kontext, während cp den Kontext des Zielverzeichnisses erbt. Die Rechte sehen richtig aus, der Zugriff scheitert trotzdem. restorecon setzt den Kontext auf den Wert zurück, den die Policy für diesen Pfad vorsieht.

Die drei Modi

Im Modus enforcing werden Verstöße blockiert und protokolliert, in permissive nur protokolliert, und disabled schaltet den Mechanismus ganz ab. getenforce zeigt den aktuellen Modus, setenforce wechselt bis zum nächsten Neustart zwischen enforcing und permissive. Für die Fehlersuche ist permissive das richtige Werkzeug, weil du in einem Durchlauf alle Blockaden siehst statt immer nur die erste.

Zwischen permissive und disabled liegt ein Unterschied, der oft übersehen wird. Läuft ein System längere Zeit mit abgeschaltetem SELinux, bekommen neue Dateien keine Labels mehr. Beim Wiedereinschalten passt dann nichts mehr zusammen, und es braucht ein vollständiges Neulabeln des Dateisystems mit Neustart. Ab RHEL 9 reicht der Eintrag in /etc/selinux/config zum Abschalten ohnehin nicht mehr, dafür ist der Kernel-Parameter selinux=0 nötig, von dem Red Hat im Produktivbetrieb ausdrücklich abrät.

Kontexte, Ports und Booleans anpassen

Für fast alle Sonderfälle sieht SELinux einen Verwaltungsweg vor, ohne dass du eigene Regeln schreibst. Die drei häufigsten Fälle sind ein Webverzeichnis außerhalb von /var/www, ein Dienst auf einem ungewöhnlichen Port und ein Webserver, der selbst Verbindungen zu einer Datenbank oder API aufbauen soll:

# Kontext für ein eigenes Verzeichnis dauerhaft festlegen und anwenden
semanage fcontext -a -t httpd_sys_content_t "/srv/web(/.*)?"
restorecon -Rv /srv/web

# zusätzlichen Port für den Webserver freigeben
semanage port -a -t http_port_t -p tcp 8081

# Boolean dauerhaft setzen
setsebool -P httpd_can_network_connect on

getsebool -a listet alle Booleans. Bleibt trotzdem eine Lücke, erzeugt audit2allow aus den protokollierten Verweigerungen ein Policy-Modul. Das ist bequem und genau deshalb heikel: Wer die Ausgabe ungeprüft einspielt, erlaubt unter Umständen genau den Zugriff, den ein Angriff gerade versucht hat. Lies die Regel, bevor du sie lädst, und beschränke sie auf den Typ, um den es geht.

Denials lesen

Verweigerungen landen als AVC-Meldungen (Access Vector Cache) im Audit-Log. ausearch -m avc -ts recent holt die letzten heraus, und sealert aus dem Paket setroubleshoot übersetzt sie in eine Erklärung samt Vorschlag. Wer die Meldung selbst liest, achtet auf scontext, tcontext und tclass: Welcher Prozess wollte auf welches Objekt welcher Art zugreifen?

Nicht jede Blockade taucht auf. Für bekannte, unkritische Fälle enthält die Policy dontaudit-Regeln, die die Protokollierung unterdrücken. Wenn ein Problem unerklärlich wirkt, schaltet semodule -DB diese Unterdrückung vorübergehend ab, semodule -B stellt sie wieder her.

KI-generiertDieses Bild wurde mit KI erzeugt · Yves Hoppe / KI / cmt
Nicht verwechseln

SELinux und was oft damit gleichgesetzt wird

SELinux gegen Dateirechte und ACLs

Die klassischen Rechte (Discretionary Access Control) kann der Eigentümer selbst vergeben. SELinux entscheidet darüber hinaus anhand einer zentral gepflegten Policy, die kein Benutzer eigenmächtig aufweichen kann, auch root nicht ohne Weiteres.

SELinux gegen AppArmor

AppArmor ist ebenfalls ein Linux Security Module, arbeitet aber mit Profilen über Dateipfade und ist schneller eingerichtet. SELinux hängt die Regel am Label des Objekts, wirkt dadurch auch bei Umbenennungen und Hardlinks, verlangt aber mehr Einarbeitung.

SELinux gegen Firewall

Eine Firewall wie firewalld entscheidet, welche Netzverbindungen überhaupt den Rechner erreichen. SELinux regelt, was ein Prozess auf dem Rechner tun darf, also auch, auf welchem Port ein Dienst lauschen oder welche Verbindung er selbst öffnen darf.

KI-generiertDieses Bild wurde mit KI erzeugt · Yves Hoppe / KI / cmt
In der Praxis

Abschalten löst dein Problem und schafft ein größeres

Der erste Reflex ist, mit setenforce 0 in den erlaubenden Modus zu schalten, und danach läuft der Dienst. Die Ursache bleibt, und bei einer Distribution, die ihre Absicherung genau darauf aufbaut, fehlt damit eine ganze Schutzschicht. Nicht selten bleibt der Server so, weil der nächste Neustart erst Monate später kommt.

Die typischen Auslöser sind fast immer dieselben: Das Webverzeichnis ist auf eine größere Partition gewandert, ein Dienst lauscht auf einem ungewöhnlichen Port, oder eine Datei wurde verschoben statt kopiert. Wer diese drei Muster kennt, findet die Ursache meist in wenigen Minuten, statt sich durch Foren zu lesen, deren Antwort „SELinux ausschalten“ lautet.

In gemischten Teams hilft eine einfache Regel: Keine eigene Policy-Regel ohne zweite Person, die sie gelesen hat. Ein ungeprüftes audit2allow-Modul ist schwerer zu entdecken als ein abgeschaltetes SELinux, weil der Status weiter enforcing zeigt.

SELinux lernen

Wie du Kontexte setzt, Booleans findest und Verweigerungen liest, ohne den Schutz abzuschalten, vermitteln die Kurse zu Red Hat Enterprise Linux an eigenen Übungssystemen.

Wissen prüfen

Sitzt SELinux schon?

Lesen fühlt sich schnell nach Können an. Ein kurzer Test zeigt dir, was davon schon sitzt und wo sich ein Kurs lohnt. Kostenlos, ohne Anmeldung, mit einer Erklärung zu jeder Antwort.

Der passende Lernpfad

Wenn du nicht nur ein Thema abhaken, sondern eine Rolle ausfüllen willst, zeigt dir der Lernpfad die Kurse in der Reihenfolge, in der sie aufeinander aufbauen.

Karrierepfad

Dein Weg zum Linux Junior Administrator (LPIC-1)

Du willst Linux im Arbeitsalltag sicher bedienen, Systeme zuverlässig verwalten und dich gezielt auf die LPIC-1 Prüfung vorbereiten? In diesem Lernpfad baust du Schritt für Schritt das Wissen auf, das du als Linux Junior Administrator brauchst: von der Kommandozeile über Benutzer- und Rechteverwaltung bis zu Netzwerkgrundlagen und Systemdiensten.

Häufige Fragen

Wer hat SELinux entwickelt und wo ist es aktiv?
SELinux stammt ursprünglich von der US-amerikanischen National Security Agency, wurde im Jahr 2000 als Open Source veröffentlicht und ist seit Kernel 2.6 Teil des offiziellen Linux-Kernels. Standardmäßig aktiv ist es auf Red Hat Enterprise Linux, Fedora, Rocky Linux und AlmaLinux sowie auf Android. Ubuntu und Debian setzen in der Voreinstellung auf AppArmor.
Soll ich SELinux abschalten, wenn ein Dienst nicht startet?
Nein, und es ist auch selten nötig. Setz das System kurz auf permissive, sammle die AVC-Meldungen, korrigiere Kontexte oder setze das passende Boolean und geh zurück auf enforcing. Abschalten löst den Einzelfall und entfernt den Schutz für alles andere.
Woran erkenne ich, dass wirklich SELinux blockiert?
Wenn die Dateirechte stimmen und der Zugriff trotzdem scheitert, schau ins Audit-Log nach AVC-Meldungen mit passendem Zeitstempel. Ein Gegentest in permissive bestätigt es endgültig, sollte aber nicht der Dauerzustand bleiben.
Schützt SELinux auch Container?
Ja. Unter Podman und Docker auf RHEL-Systemen laufen Container mit dem Typ container_t und bekommen zusätzlich eigene Kategorien, sodass sich zwei Container gegenseitig nicht in die Dateien schauen können. Wer ein Host-Verzeichnis einbindet, braucht deshalb oft die Option :Z oder :z, damit der Container es lesen darf.

Passt thematisch dazu

Wenn ein Dienst gerade nicht startet, zeigt dir eine Anleitung, wie du eine SELinux-Blockade Schritt für Schritt auflöst, ohne den Schutz abzuschalten.

Wer einen neuen Server aufsetzt, sollte wissen, welchen Platz SELinux in der Härtung eines Servers hat.

Persönlich für dich da

Deine Ansprechpartner

Du willst das Thema nicht nur nachschlagen, sondern anwenden können? Wir beraten dich persönlich und kostenlos.

Yves Hoppe

Yves Hoppe

Weiterbildung & Beratung

Ordnet mit dir ein, welcher Kurs zu deinem Vorwissen passt.

Norbert Jansen

Norbert Jansen

Beratung & Inhouse

Plant Inhouse-Trainings, die an euren eigenen Daten und Abläufen ansetzen.

SELinux im Kurs statt im Lexikon

Nachschlagen bringt dich bis zum Verstehen. Anwenden lernst du an echten Aufgaben.