SELinux Booleans: Policy Tuning (Artikel 071)
Anpassung des SELinux-Verhaltens ohne Neukompilierung der Policy. Einsatz von Booleans zur Freischaltung von Funktionen wie Netzwerkzugriff für Webserver oder Home-Directories.
# SELinux Booleans: Den Wächter flexibel konfigurieren
TL;DR / Management Summary Viele Admins schalten SELinux ab, wenn eine Applikation blockiert wird. Das ist fatal. Oft reicht es, einen Boolean umzulegen. Booleans sind “Lichtschalter” in der SELinux-Policy, die zur Laufzeit Funktionen ein- oder ausschalten (z.B. “Darf der Webserver Mails senden?”). In diesem Modul lernen wir, wie man Booleans findet, setzt und permanent speichert.
# 1. Einführung & Konzepte
Logikschalter statt Code-Änderung.
Eine SELinux-Policy ist komplex. Um sie nicht für jede Kleinigkeit neu schreiben zu müssen, haben Entwickler Variablen eingebaut.
Beispiel: Der Typ httpd_t darf standardmäßig keine Netzwerkverbindungen zu Datenbanken aufbauen (Sicherheitsrisiko bei SQL-Injection). Wenn Ihre PHP-App aber eine Datenbank braucht, legen Sie einfach den Schalter httpd_can_network_connect_db um.
graph LR
A[Apache Process] --> B{SELinux Policy}
B -->|Check Boolean: httpd_can_network_connect| C{Value: ON?}
C -->|Yes| D[Allow Network Access]
C -->|No| E[Deny & Log AVC]
# 2. Booleans finden und anzeigen
Was ist möglich?
Es gibt hunderte Booleans im System.
# Alle Booleans auflisten
getsebool -a
# Nach bestimmten Diensten suchen
getsebool -a | grep httpd
# Beschreibungen anzeigen (Sehr hilfreich!)
sudo semanage boolean -l | grep httpd
Dies zeigt Ihnen zusätzlich zum Status eine kurze Erklärung, was der Schalter bewirkt.
# 3. Booleans setzen
Den Schalter umlegen.
# Temporär (bis zum Reboot)
sudo setsebool httpd_can_network_connect on
# Permanent (Übersteht Reboot)
Nutzen Sie das Flag -P.
sudo setsebool -P httpd_can_network_connect on
Performance: Das Setzen mit -P kann einige Sekunden dauern, da die Policy-Datenbank auf der Disk neu geschrieben werden muss.
# 4. Wichtige Booleans für SysAdmins
Die “Must-Knows” im RZ.
| Boolean | Zweck |
|---|---|
httpd_can_network_connect |
Erlaubt Webservern (Nginx/Apache), TCP-Verbindungen (Proxy/DB) aufzubauen. |
httpd_enable_homedirs |
Erlaubt Zugriff auf /home/user/public_html. |
ftp_home_dir |
Erlaubt FTP-Usern Zugriff auf ihre Home-Verzeichnisse. |
virt_use_nfs |
Erlaubt KVM/QEMU das Speichern von VM-Images auf NFS-Shares. |
ssh_sysadm_login |
Erlaubt SSH-Logins direkt in die System-Admin-Rolle. |
# 5. Troubleshooting & “War Stories”
Wenn die Logik hinkt.
# Story 1: “Der Reverse Proxy Fail”
Symptom: Nginx als Reverse Proxy liefert “502 Bad Gateway”. In den Nginx-Logs steht “Permission Denied” beim Verbinden zum Upstream-Socket. SELinux ist auf Enforcing.
Ursache: Der Boolean httpd_can_network_connect ist off.
Lösung: sudo setsebool -P httpd_can_network_connect on.
# Story 2: “Mails werden nicht versendet”
Symptom: Eine PHP-Applikation kann keine Bestätigungs-Mails via sendmail verschicken.
Ursache: Aus Sicherheitsgründen darf der Webserver-Kontext keine Mail-Binaries ausführen.
Lösung: sudo setsebool -P httpd_can_sendmail on.
# 6. Fazit & Empfehlung
- Reihenfolge: Bei Fehlern immer erst prüfen: Stimmen die Labels (
ls -Z)? Wenn ja, gibt es einen passenden Boolean (getsebool -a)? - Dokumentation: Dokumentieren Sie gesetzte Booleans in Ihrem Setup-Script. Es gibt nichts ärgerlicheres als einen manuell gesetzten Boolean, der beim nächsten Server-Setup fehlt.
- Minimalismus: Aktivieren Sie nur die Booleans, die absolut notwendig sind. Jeder aktivierte Schalter weicht die Isolation ein kleines Stück auf.
# Anhang: Cheatsheet
| Aufgabe | Befehl |
|---|---|
| Liste aller Booleans | getsebool -a |
| Boolean permanent an | setsebool -P <name> on |
| Boolean permanent aus | setsebool -P <name> off |
| Beschreibung suchen | `semanage boolean -l |
| Nur geänderte Booleans sehen | semanage boolean -l -C |
| Status eines Booleans | getsebool <name> |