Selinux mit Rocky

Aus Xinux Wiki
Version vom 20. Mai 2026, 11:28 Uhr von Thomas.will (Diskussion | Beiträge) (Die Seite wurde neu angelegt: „= SELinux = SELinux (Security-Enhanced Linux) ist ein Sicherheitsmodul im Linux-Kernel das eine zusätzliche Zugriffssteuerung über die klassischen Unix-Rech…“)
(Unterschied) ← Nächstältere Version | Aktuelle Version (Unterschied) | Nächstjüngere Version → (Unterschied)
Zur Navigation springen Zur Suche springen

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