SELinux in der Praxis
SELinux-Probleme zeigen sich oft indirekt: Ein Dienst startet nicht, eine Datei ist nicht erreichbar, ein Skript schlägt fehl — obwohl die Unix-Rechte korrekt sind. Der erste Schritt ist immer: ins Audit-Log schauen.
Troubleshooting-Workflow
Abschnitt betitelt „Troubleshooting-Workflow“Dienst funktioniert nicht, obwohl Rechte stimmen │ ▼sudo ausearch -m avc -ts recent │ ├── keine Einträge → kein SELinux-Problem │ └── AVC-Einträge gefunden │ ├── audit2why → verständliche Erklärung ├── audit2allow → Policy-Vorschlag └── sealert → freundliche Diagnose (wenn installiert)Verstöße im Audit-Log finden
Abschnitt betitelt „Verstöße im Audit-Log finden“# Alle SELinux-Verstöße der letzten Zeitsudo ausearch -m avc -ts recent
# Verstöße für einen bestimmten Dienstsudo ausearch -m avc -ts recent -c httpdsudo ausearch -m avc -ts recent -c smbd
# Live beobachtensudo tail -f /var/log/audit/audit.log | grep deniedBeispiel-AVC-Meldung:
type=AVC msg=audit(1234567890.123:456): avc: denied { write } for pid=1234 comm="httpd" name="uploads" dev="sda1" ino=123456 scontext=system_u:system_r:httpd_t:s0 tcontext=system_u:object_r:var_t:s0 tclass=dir permissive=0Zu lesen als: Prozess httpd (Typ httpd_t) wollte schreiben in ein
Verzeichnis mit Typ var_t — das ist nicht erlaubt.
audit2why — Erklärung
Abschnitt betitelt „audit2why — Erklärung“sudo ausearch -m avc -ts recent | audit2whyAusgabe erklärt die Ursache und gibt Hinweise:
type=AVC ... Was it cause by: Missing type enforcement (TE) allow rule. You can use audit2allow to generate a loadable module to allow this access. or Missing boolean: httpd_unified Description: Allow httpd to unified Allow access by executing: setsebool -P httpd_unified 1sealert — freundliche Diagnose
Abschnitt betitelt „sealert — freundliche Diagnose“sealert aus dem Paket setroubleshoot-server liefert die verständlichste
Ausgabe mit konkreten Lösungsvorschlägen:
sudo dnf install setroubleshoot-serversudo sealert -a /var/log/audit/audit.logHäufige Lösungen
Abschnitt betitelt „Häufige Lösungen“1. Falscher Datei-Kontext
Abschnitt betitelt „1. Falscher Datei-Kontext“Der häufigste Fall: Dateien wurden kopiert statt verschoben, oder liegen in einem unerwarteten Verzeichnis — der Kontext passt nicht zur Policy.
# Aktuellen Kontext anzeigenls -Z /var/www/html/wordpress
# Standard-Kontext laut Policy anzeigenmatchpathcon /var/www/html/wordpress
# Kontext auf Standard zurücksetzen (einmalig)sudo restorecon -v /var/www/html/uploadssudo restorecon -Rv /var/www/html/ # rekursivDauerhaft: wenn Dateien in einem Nicht-Standard-Pfad liegen, mit semanage fcontext eine persistente Regel definieren:
# Regel definierensudo semanage fcontext -a \ -t httpd_sys_rw_content_t \ "/var/www/html/wordpress/wp-content(/.*)?"
# Regel anwendensudo restorecon -Rv /var/www/html/wordpress/wp-content
# Alle definierten Regeln anzeigensudo semanage fcontext -l | grep wordpress2. Boolean fehlt
Abschnitt betitelt „2. Boolean fehlt“Policy erlaubt eine Aktion grundsätzlich nicht, aber es gibt einen Boolean:
# audit2why zeigt oft direkt den Boolean:# "Allow access by executing: setsebool -P httpd_can_network_connect 1"
sudo setsebool -P httpd_can_network_connect 13. Port nicht registriert
Abschnitt betitelt „3. Port nicht registriert“Wenn ein Dienst auf einem nicht-standardmäßigen Port lauscht:
# Registrierte Ports anzeigensudo semanage port -l | grep http
# Port hinzufügensudo semanage port -a -t http_port_t -p tcp 8080sudo semanage port -a -t mysqld_port_t -p tcp 3307Kontext manuell setzen
Abschnitt betitelt „Kontext manuell setzen“# Temporär (wird bei restorecon überschrieben)sudo chcon -t httpd_sys_content_t /var/www/html/meine-datei.htmlsudo chcon -R -t samba_share_t /srv/freigabe
# Dauerhaft (nur mit semanage fcontext + restorecon)Permissive Mode für einen Dienst
Abschnitt betitelt „Permissive Mode für einen Dienst“Statt das gesamte System auf permissive zu setzen, kann ein einzelner
Prozesstyp in den permissiven Modus versetzt werden — praktisch zum Debuggen:
# Typ permissive schaltensudo semanage permissive -a httpd_t
# Wieder enforcingsudo semanage permissive -d httpd_t
# Alle permissiven Typen anzeigensudo semanage permissive -lEigene Policy-Module (Notlösung)
Abschnitt betitelt „Eigene Policy-Module (Notlösung)“Wenn kein Boolean hilft und der Kontext korrekt ist, kann audit2allow eine
minimale Policy generieren:
sudo ausearch -m avc -ts recent | audit2allow -M mein-modulsudo semodule -i mein-modul.ppCheatsheet: Die wichtigsten Befehle
Abschnitt betitelt „Cheatsheet: Die wichtigsten Befehle“# Statusgetenforcesestatus
# Modus wechselnsudo setenforce 0 # → permissivesudo setenforce 1 # → enforcing
# Kontextels -Z dateips auxZ | grep prozesssudo restorecon -Rv /pfadsudo semanage fcontext -a -t TYP "/pfad(/.*)?"
# Booleansgetsebool -a | grep httpdsudo setsebool -P boolean_name 1
# Troubleshootingsudo ausearch -m avc -ts recentsudo ausearch -m avc -ts recent | audit2whysudo sealert -a /var/log/audit/audit.log
# Portssudo semanage port -l | grep httpsudo semanage port -a -t http_port_t -p tcp 8080