Selinux mit Rocky
SELinux
SELinux (Security-Enhanced Linux) ist ein Sicherheitsmodul im Linux-Kernel das eine zusätzliche Zugriffssteuerung über die klassischen Unix-Rechte hinaus implementiert. Es wurde ursprünglich von der NSA entwickelt und ist unter Rocky Linux standardmäßig aktiv.
Der entscheidende Unterschied zu klassischen Dateiberechtigungen: Selbst wenn ein Prozess die nötigen Unix-Rechte hat, kann SELinux den Zugriff trotzdem verweigern. SELinux entscheidet anhand von Sicherheitskontexten wer auf was zugreifen darf – nicht anhand von Benutzer und Gruppe.
Modi
SELinux kennt drei Betriebsmodi:
| Modus | Beschreibung |
|---|---|
| enforcing | SELinux ist aktiv und blockiert verbotene Zugriffe – Standard unter Rocky Linux |
| permissive | SELinux protokolliert Verstöße aber blockiert nichts – nützlich zur Fehlersuche |
| disabled | SELinux ist komplett deaktiviert – nicht empfohlen |
Aktuellen Modus anzeigen
- getenforce
Enforcing
- sestatus
SELinux status: enabled SELinuxfs mount: /sys/fs/selinux SELinux mount point: /sys/fs/selinux Loaded policy name: targeted Current mode: enforcing Mode from config file: enforcing
Modus temporär wechseln
- Gilt nur bis zum nächsten Reboot – nützlich zur schnellen Fehlersuche
- setenforce 0
# Wechsel zu permissive
- setenforce 1
# Zurück zu enforcing
Modus dauerhaft setzen
- Die dauerhafte Konfiguration liegt in /etc/selinux/config
- vi /etc/selinux/config
SELINUX=enforcing SELINUXTYPE=targeted
- Nach einer Änderung ist ein Reboot nötig
Sicherheitskontexte
Jede Datei, jeder Prozess und jeder Port hat unter SELinux einen Sicherheitskontext. Der Kontext besteht aus vier Teilen:
system_u:object_r:httpd_sys_content_t:s0 │ │ │ │ │ │ │ └── Sensitivity Level │ │ └── Typ – das wichtigste Feld │ └── Rolle └── Benutzer
- Der Typ ist entscheidend – SELinux entscheidet anhand des Typs ob ein Prozess auf eine Datei zugreifen darf. httpd darf nur auf Dateien mit dem Typ httpd_sys_content_t zugreifen.
Kontexte anzeigen
- Dateien
- ls -Z /var/www/html
system_u:object_r:httpd_sys_content_t:s0 index.html
- Prozesse
- ps -eZ | grep httpd
system_u:system_r:httpd_t:s0 httpd
- Ports
- semanage port -l | grep http
http_port_t tcp 80, 443, 8008, 8009, 8443
Kontexte setzen und verwalten
Kontext temporär ändern
- Gilt bis zum nächsten restorecon oder Relabeling
- chcon -t httpd_sys_content_t /var/www/meinseite/index.html
- Rekursiv für ein Verzeichnis
- chcon -Rt httpd_sys_content_t /var/www/meinseite
Kontext dauerhaft setzen
- restorecon setzt den Kontext auf den in der Policy definierten Standardwert zurück
- Damit chcon dauerhaft wirkt muss der Standardkontext in der Policy angepasst werden
- semanage fcontext -a -t httpd_sys_content_t "/var/www/meinseite(/.*)?"
- restorecon -Rv /var/www/meinseite
Kontext wiederherstellen
- Setzt alle Kontexte auf die Policy-Standardwerte zurück
- restorecon -Rv /var/www/html
Gesamtes System neu labeln
- Nach dem Deaktivieren und Wiederaktivieren von SELinux müssen alle Kontexte neu gesetzt werden
- touch /.autorelabel
- reboot
Booleans
Booleans sind Ein/Aus-Schalter in der SELinux-Policy – sie erlauben es bestimmte Verhaltensweisen ohne Änderung der Policy zu aktivieren oder deaktivieren.
Booleans anzeigen
- Alle Booleans
- getsebool -a
- Nur httpd-Booleans
- getsebool -a | grep httpd
Boolean setzen
- Temporär – bis zum nächsten Reboot
- setsebool httpd_can_network_connect on
- Dauerhaft
- setsebool -P httpd_can_network_connect on
Wichtige Booleans
| Boolean | Beschreibung |
|---|---|
| httpd_can_network_connect | Apache darf Netzwerkverbindungen aufbauen (z.B. für Proxying) |
| httpd_can_network_connect_db | Apache darf Datenbankverbindungen aufbauen |
| httpd_use_nfs | Apache darf auf NFS-Shares zugreifen |
| samba_enable_home_dirs | Samba darf Home-Verzeichnisse freigeben |
| ldap_can_access_certs | LDAP darf auf Zertifikate außerhalb seiner Verzeichnisse zugreifen |
| ssh_sysadm_login | SSH erlaubt Login als sysadm_r Rolle |
Ports
- SELinux kontrolliert auch auf welchen Ports Dienste lauschen dürfen – ein Webserver darf standardmäßig nur auf http_port_t lauschen
Erlaubte Ports anzeigen
- semanage port -l | grep http
- semanage port -l | grep ssh
Port hinzufügen
- Apache soll zusätzlich auf Port 8080 lauschen dürfen
- semanage port -a -t http_port_t -p tcp 8080
Port entfernen
- semanage port -d -t http_port_t -p tcp 8080
Fehlersuche
Blockaden anzeigen
- Alle SELinux-Blockaden seit dem letzten Boot
- ausearch -m avc -ts recent
- Live mitverfolgen
- tail -f /var/log/audit/audit.log | grep AVC
sealert
- sealert analysiert AVC-Meldungen und gibt konkrete Lösungsvorschläge
- dnf install -y setroubleshoot-server
- sealert -a /var/log/audit/audit.log
audit2allow
- Generiert eine SELinux-Policy aus AVC-Meldungen – letztes Mittel wenn nichts anderes hilft
- ausearch -m avc -ts recent | audit2allow -M meinmodul
- semodule -i meinmodul.pp
- Vorsicht
- audit2allow erlaubt alles was in den AVC-Meldungen steht – nur verwenden wenn man weiß was man tut
Typische Fehler im Labor
| Situation | Problem | Lösung |
|---|---|---|
| Apache liefert 403 obwohl Rechte stimmen | Falscher SELinux-Kontext auf dem Verzeichnis | chcon -Rt httpd_sys_content_t /var/www/... |
| slapd kann Zertifikat nicht lesen | SELinux blockiert Zugriff auf /etc/ssl/ | setsebool -P ldap_can_access_certs 1 |
| named kann Zone nicht laden | Zonendatei liegt nicht unter /var/named | Datei nach /var/named verschieben |
| SSH lauscht nicht auf neuem Port | Port nicht in SELinux-Policy | semanage port -a -t ssh_port_t -p tcp XXXX |