linux-rhel-centos-fedora security selinux context labels

SELinux Contexts: Users, Roles & Types (Artikel 069)

Analyse der SELinux Kontext-Struktur. Erfahren Sie, wie sich Labels aus Benutzern, Rollen und Typen zusammensetzen und wie der Kernel diese zur Zugriffskontrolle nutzt.

# SELinux Contexts: Die Anatomie der Labels

TL;DR / Management Summary Ein SELinux-Kontext ist der “Personalausweis” jedes Objekts (Datei, Verzeichnis, Port) und jedes Subjekts (Prozess) im System. Er besteht aus vier durch Doppelpunkt getrennten Feldern: User, Role, Type und Range. Im Enterprise-Alltag ist der Type das entscheidende Feld. Wenn Typen von Prozess und Datei nicht zusammenpassen, wird der Zugriff verweigert – egal ob man Root ist oder nicht.


# 1. Einführung & Architektur

Die vier Felder.

Wenn Sie ls -Z ausführen, sehen Sie Strings wie system_u:object_r:httpd_sys_content_t:s0.

# Die Felder im Detail

  1. User: Endet meist auf _u (z.B. unconfined_u). Mappt Linux-User auf SELinux-User.
  2. Role: Endet meist auf _r (z.B. object_r für Dateien, system_r für Prozesse). Definiert, was ein User tun darf.
  3. Type (Essenziell!): Endet meist auf _t. Definiert die “Domäne” eines Prozesses oder den Typ einer Datei.
  4. Range / Level: (Optional) Für Multi-Level Security (MLS), z.B. s0.
graph LR
    A[Context String] --> B[User]
    A --> C[Role]
    A --> D[Type]
    A --> E[Range]
    B --- B1[system_u]
    C --- C1[object_r]
    D --- D1[httpd_config_t]
    E --- E1[s0]

# 2. Der Type: Das Herzstück des TE (Type Enforcement)

Warum Typen alles entscheiden.

SELinux nutzt primär Type Enforcement. Eine Regel besagt z.B.: “Prozesse mit dem Typ httpd_t dürfen Dateien mit dem Typ httpd_sys_content_t lesen.”

# Wichtige Standard-Typen

  • bin_t: Ausführbare Dateien in /bin, /usr/bin.
  • etc_t: Konfigurationsdateien in /etc.
  • admin_home_t: Dateien im Home-Verzeichnis von Root.
  • user_home_t: Dateien in normalen Benutzer-Homes.
  • tmp_t: Temporäre Dateien in /tmp.

# 3. Contexts anzeigen und verstehen

Sichtbarkeit schaffen.

Nutzen Sie konsequent das Flag -Z.

# Dateien und Ordner

ls -dZ /var/www/html
# unconfined_u:object_r:httpd_sys_content_t:s0 /var/www/html

# Laufende Prozesse

ps -eZ | grep nginx
# system_u:system_r:httpd_t:s0 1234 ? 00:00:00 nginx

# Netzwerk-Ports

sudo semanage port -l | grep http_port_t
# http_port_t tcp 80, 81, 443, 488, 8008, 8009, 8443, 9000

# 4. Day-2 Operations: Contexts manuell setzen

Wenn die Automatik versagt.

Eigentlich regelt das System die Kontexte über die Policy. Manchmal muss man aber nachhelfen.

# Temporär ändern (chcon)

Vorsicht: Geht nach einem restorecon oder Reboot/Relabel verloren!

chcon -t httpd_sys_content_t /custom/web/file.html

# Permanent ändern (semanage fcontext)

Dies schreibt die Regel in die Policy-Datenbank.

# 1. Regel hinzufügen
sudo semanage fcontext -a -t httpd_sys_content_t "/custom/web(/.*)?"

# 2. Regel auf das Dateisystem anwenden
sudo restorecon -Rv /custom/web

# 5. Troubleshooting & “War Stories”

Wenn der Kontext nicht passt.

# Story 1: “Der Log-Redirect”

Symptom: Nginx soll Logs nach /data/logs/ schreiben. Berechtigungen stimmen, aber Nginx meldet “Permission Denied”. Ursache: /data/logs/ hat den Kontext default_t (oder var_t). Nginx (httpd_t) darf nur in httpd_log_t schreiben. Lösung:

sudo semanage fcontext -a -t httpd_log_t "/data/logs(/.*)?"
sudo restorecon -Rv /data/logs

# Story 2: “SSH-Key wird ignoriert”

Symptom: Login via SSH-Key schlägt fehl, Passwort-Login geht. Ursache: Der Admin hat den .ssh Ordner von einem anderen System kopiert. Die Datei authorized_keys hat den falschen Kontext. sshd darf sie nicht lesen. Lösung: restorecon -Rv ~/.ssh.


# 6. Fazit & Empfehlung

  • Typen: Konzentrieren Sie sich auf das dritte Feld (_t). Es ist der Schlüssel zu 99% aller Probleme.
  • Best Practice: Nutzen Sie niemals chcon. Nutzen Sie immer semanage fcontext gefolgt von restorecon, damit die Änderungen permanent bleiben.
  • Dokumentation: Notieren Sie sich abweichende Pfade und deren Kontexte in Ihrem Deployment-Skript (Ansible/Terraform).

# Anhang: Cheatsheet

Aufgabe Befehl
File Kontext sehen ls -Z <file>
Prozess Kontext sehen ps -eZ
Eigenen Kontext sehen id -Z
Permanenten Typ setzen semanage fcontext -a -t <typ> <pfad>
Default wiederherstellen restorecon -v <pfad>
Port Kontext sehen semanage port -l