SELinux auf Debian
SELinux statt AppArmor auf Debian
Diese Seite dokumentiert die Migration von AppArmor zu SELinux auf it2XX und die anschließende Evaluierung für sshd, Apache2 und nginx.
Hintergrund
Im Rahmen der Kursvorbereitung wurde AppArmor auf Basis eines Praxistests mit dem sshd-Profil aus apparmor-profiles-extra evaluiert. Dabei zeigten sich mehrere strukturelle Schwächen:
- Das mitgelieferte sshd-Profil ist laut Debian-Paketbeschreibung explizit als experimentell gekennzeichnet und nicht für den enforce-Mode vorgesehen
- Nach dem OpenSSH-Split (Version 9.8, sshd-session als separater Prozess) war das Profil nicht mehr aktuell und musste manuell über mehrere
aa-logprof-Durchläufe nachgezogen werden aa-logprofkann journald nicht nativ lesen; ohne zusätzlich installiertes rsyslog schlägt die Log-Auswertung fehl- Die generierten Vorschläge waren teils unpassend (z. B. Vorschlag von
abstractions/apache2-commonfür einen SSH-Prozess)
Daraus folgt die Entscheidung, AppArmor zu entfernen und SELinux als MAC-System auf Debian einzusetzen und für sshd, Apache2 und optional nginx zu evaluieren.
AppArmor entfernen
- Dienst stoppen und deaktivieren
- systemctl stop apparmor
- systemctl disable apparmor
- Pakete entfernen
- apt purge apparmor apparmor-utils apparmor-profiles apparmor-profiles-extra python3-apparmor python3-libapparmor
- apt autoremove
- AppArmor im Kernel deaktivieren
Bootparameter prüfen:
- cat /proc/cmdline | grep -i apparmor
Falls kein expliziter Parameter gesetzt ist, in /etc/default/grub ergänzen:
GRUB_CMDLINE_LINUX_DEFAULT="... apparmor=0"
- GRUB-Konfiguration neu erstellen und neu starten
- update-grub
- reboot
SELinux installieren
- Pakete installieren
- apt install selinux-basics selinux-policy-default auditd
- SELinux aktivieren
- selinux-activate
- reboot
Beim ersten Boot nach der Aktivierung wird das komplette Dateisystem relabelt. Dieser Vorgang kann je nach Systemgröße mehrere Minuten dauern.
- Zunächst im permissive Mode testen
- setenforce 0
- getenforce
Erst nach erfolgreicher Prüfung aller Dienste auf enforcing umstellen, in /etc/selinux/config:
SELINUX=enforcing
Evaluierung: sshd
Das ssh-Policy-Modul wird von der Standard-Policy automatisch anhand des installierten Pakets geladen.
- Paket sicherstellen
- apt install openssh-server
- Kontext prüfen
- ps -eZ | grep sshd
- ls -Z /usr/sbin/sshd
Erwarteter Typ: sshd_t für den Prozess, sshd_exec_t für die Binary.
- Denials nach Testlogin auswerten
- ausearch -m avc -c sshd
- Port ändern
- cat /etc/ssh/sshd_config
Port 2222 ...
- systemctl restart ssh
- Checken
- ausearch -m avc -ts recent
- Welcher Port ist zugelassen
- semanage port -l | grep ssh_port_t
- Port hinzufügen
- semanage port -a -t ssh_port_t -p tcp 2222
- Neustarten
- systemctl restart ssh
Evaluierung: Apache2
Das httpd-Policy-Modul deckt Apache2 unter Debian standardmäßig ab.
- Paket installieren
- apt install apache2
- systemctl restart apache2
- Kontext prüfen
- ps -eZ | grep apache2
- Vorhandene Port-Labels prüfen
- semanage port -l | grep http_port_t
- Custom Webroot freischalten (Beispiel /srv/kurswebsite)
Niemals chcon verwenden, sondern dauerhaft über semanage fcontext:
- semanage fcontext -a -t httpd_sys_content_t "/srv/kurswebsite(/.*)?"
- restorecon -Rv /srv/kurswebsite
- Boolean für Schreibzugriff (z. B. Upload-Verzeichnis)
- setsebool -P httpd_unified off
- semanage fcontext -a -t httpd_sys_rw_content_t "/srv/kurswebsite/uploads(/.*)?"
- restorecon -Rv /srv/kurswebsite/uploads
Evaluierung: nginx
Für nginx existiert kein natives Policy-Modul in Debians selinux-policy-default. Zwei Optionen stehen zur Wahl:
- Community-Modul (z. B. simple10/selinux-nginx von GitHub) kompilieren und einspielen
- nginx unter dem bestehenden
httpd_t-Kontext laufen lassen
- Ist-Zustand nach Installation prüfen
- apt install nginx
- ps -eZ | grep nginx
Falls der Prozess als unconfined_t läuft oder Denials auftreten, ist das die erwartete Lücke, die dokumentiert werden soll.
- Denials auswerten, falls vorhanden
- ausearch -m avc -c nginx
- audit2why -a
Vergleichstabelle (auszufüllen nach Testlauf)
| Dienst | Natives Policy-Modul | Setup-Aufwand | Ergebnis |
|---|---|---|---|
| sshd | ja, automatisch | niedrig | |
| Apache2 | ja, automatisch | niedrig | |
| nginx | nein, nur Community | mittel-hoch |
Offene Punkte
- nginx-Community-Modul testen und Ergebnis dokumentieren
- Empfehlung für den Kurs formulieren, sobald alle drei Dienste durchgetestet sind
- Vergleich mit dem AppArmor-Verhalten aus dem ursprünglichen Test (siehe Hintergrund) im Fazit gegenüberstellen