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
- User: Endet meist auf
_u(z.B.unconfined_u). Mappt Linux-User auf SELinux-User. - Role: Endet meist auf
_r(z.B.object_rfür Dateien,system_rfür Prozesse). Definiert, was ein User tun darf. - Type (Essenziell!): Endet meist auf
_t. Definiert die “Domäne” eines Prozesses oder den Typ einer Datei. - 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 immersemanage fcontextgefolgt vonrestorecon, 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 |