SELinux Grundlagen Konfiguration
SELinux Grundlagen und Konfiguration – Linux Mandatory Access Control
Was ist SELinux?
SELinux (Security Enhanced Linux) ist ein Mandatory Access Control (MAC) System, das über die klassische Discretionary Access Control (DAC) hinausgeht. Während DAC-Systeme nur Dateiberechtigungen prüfen, erzwingt SELinux zusätzliche Sicherheitsrichtlinien auf Basis von Sicherheitskontexten und Policies.
DAC vs. MAC
DAC (Discretionary Access Control): Der Dateieigentümer entscheidet über Zugriff. Ein Prozess mit Dateiberechtigungen kann beliebig handeln.
MAC (Mandatory Access Control): Ein zentrales System erzwingt Richtlinien unabhängig von Eigentümerrechten. Selbst der Root-Benutzer muss sich SELinux-Policies unterordnen.
SELinux Modi
SELinux kennt drei Betriebsmodi:
| Modus | Beschreibung | Use-Case |
|---|---|---|
| Enforcing | SELinux ist aktiv und blockiert unerlaubte Zugriffe. Verstöße werden geloggt. | Produktionsumgebungen |
| Permissive | SELinux ist aktiv, blockiert aber nicht. Verstöße werden geloggt zur Diagnose. | Troubleshooting und Konfiguration |
| Disabled | SELinux ist deaktiviert. Keine Sicherheitsüberprüfungen. | Nicht empfohlen |
SELinux Status prüfen
Aktuellen Modus anzeigen
$ getenforce Enforcing
Oder mit ausführlicheren Informationen:
$ sestatus SELinux status: enabled SELinuxfs mount: /sys/fs/selinux SELinux root directory: /etc/selinux Loaded policy name: targeted Policy from config file: targeted Mode from config file: enforcing Current mode: enforcing Mode from command line: Not specified Policy MLS status: enabled Policy deny_unknown status: allowed Memory protection checking: enabled
SELinux Modi ändern
Temporär ändern (bis Neustart)
$ sudo setenforce 0 # Zu Permissive $ sudo setenforce 1 # Zu Enforcing
Persistent ändern (permanent)
Bearbeite die SELinux-Konfigurationsdatei:
$ sudo nano /etc/selinux/config
Ändere die Zeile:
SELINUX=enforcing # auf permissive oder disabled ändern
Nach einem Neustart wird die neue Einstellung aktiv:
$ sudo reboot
SELinux Kontexte verstehen
Was sind Kontexte?
SELinux-Kontexte definieren die Sicherheitsidentität von Dateien und Prozessen. Ein Kontext hat die Form:
user:role:type:level
Beispiel: system_u:object_r:httpd_exec_t:s0
Dateikontexte anzeigen
$ ls -Z /var/www/html/ system_u:object_r:httpd_sys_content_t:s0 index.html system_u:object_r:httpd_sys_content_t:s0 about.html
Prozesskontexte anzeigen
$ ps -Z | grep apache system_u:system_r:httpd_t:s0 1234 ? Ss 0:00 /usr/sbin/httpd
Häufige SELinux Kontexte
| Kontext | Beschreibung |
|---|---|
httpd_t |
Apache/nginx Webserver Prozess |
httpd_sys_content_t |
Webserver-Inhalte (lesbar) |
httpd_sys_rw_content_t |
Webserver-Inhalte (lesbar/schreibbar) |
sshd_t |
SSH-Daemon Prozess |
admin_home_t |
Admin-Home-Verzeichnis |
user_home_t |
Benutzer-Home-Verzeichnis |
Kontexte verwalten
Kontexte mit restorecon zurücksetzen
SELinux hat einen Standard-Kontext für jede Datei basierend auf ihrem Pfad. Mit restorecon wird dieser wiederhergestellt:
$ sudo restorecon -v /var/www/html/
Relabeled /var/www/html from system_u:object_r:admin_home_t:s0
to system_u:object_r:httpd_sys_content_t:s0
Rekursiv für ein ganzes Verzeichnis:
$ sudo restorecon -Rv /var/www/html/
Kontexte mit semanage ändern
semanage erlaubt permanente Kontextänderungen:
$ sudo semanage fcontext -a -t httpd_sys_content_t "/var/www/custom(/.*)?" $ sudo restorecon -Rv /var/www/custom/
SELinux Booleans
Booleans sind Schalter, um SELinux-Policies zu aktivieren/deaktivieren:
Alle Booleans anzeigen
$ getsebool -a allow_execheap --> off allow_execmem --> on httpd_can_network_connect --> off httpd_can_sendmail --> off
Boolean aktivieren/deaktivieren
$ sudo setsebool httpd_can_network_connect on # Temporär $ sudo setsebool -P httpd_can_network_connect on # Persistent (-P)
Fehlerbehandlung mit Audit-Logs
SELinux Denials finden
Wenn SELinux eine Aktion blockiert, wird dies geloggt:
$ sudo ausearch -m avc -ts recent
time->Fri Mar 05 14:32:10 2026
type=AVC msg=audit(1646498530.123:456): avc: denied { getattr }
for pid=1234 comm="httpd" name="upload" dev="dm-0" ino=654321
scontext=system_u:system_r:httpd_t:s0
tcontext=system_u:object_r:admin_home_t:s0 tclass=dir permissive=0
Policy-Vorschläge mit audit2allow
audit2allow generiert Policy-Module basierend auf Denials:
$ sudo audit2allow -a -M httpd_custom $ sudo semodule -i httpd_custom.pp
Praktisches Beispiel: Webserver mit SELinux
Szenario
Du möchtest Apache mit custom Content im Verzeichnis /opt/webapp ausführen. SELinux blockiert den Zugriff.
Schritte
1. Problem diagnostizieren:
$ sudo ausearch -m avc -ts recent | grep -i apache
2. Kontext für Verzeichnis setzen:
$ sudo semanage fcontext -a -t httpd_sys_content_t "/opt/webapp(/.*)?" $ sudo restorecon -Rv /opt/webapp/
3. Wenn Apache Dateien schreiben muss:
$ sudo semanage fcontext -a -t httpd_sys_rw_content_t "/opt/webapp/uploads(/.*)?" $ sudo restorecon -Rv /opt/webapp/uploads/
4. Wenn Apache auf andere Services zugreifen muss:
$ sudo setsebool -P httpd_can_network_connect on
5. Änderungen testen und verifizieren:
$ ls -Z /opt/webapp/ $ getsebool httpd_can_network_connect
Troubleshooting Checkliste
| Problem | Diagnose | Lösung |
|---|---|---|
| Apache kann Dateien nicht lesen | ls -Z zeigt falschen Kontext |
restorecon -Rv oder semanage fcontext |
| Datenbankverbindung fehlgeschlagen | ausearch zeigt denied für Port-Zugriff |
setsebool httpd_can_network_connect on |
| Socket-Zugriff verweigert | ausearch zeigt unix_stream_socket denied |
Custom Policy mit audit2allow |
Wichtige Befehle Zusammenfassung
# Status prüfen getenforce sestatus # Modus ändern setenforce 0|1 # Temporary /etc/selinux/config # Permanent # Kontexte anzeigen und ändern ls -Z /path ps -Z restorecon -Rv /path semanage fcontext -a -t TYPE "/path" # Booleans verwalten getsebool -a setsebool -P NAME on|off # Fehlerbehandlung ausearch -m avc -ts recent audit2allow -a -M MODULNAME semodule -i MODULNAME.pp
Weitere Ressourcen
- 📖 Linux Server Absichern
- 📖 Linux Permissions erklärt
- 📖 AppArmor Profile erstellen
- 🔧 Sichere Server bei Enjyn mieten
- 🔧 Enjyn Crawler – Website auf Sicherheit prüfen