Linux/SELinux/01 Grundlagen
Linux/SELinux/01 Grundlagen
Beschreibung
DAC und MAC
DAC ist das klassische Unix-/Linux-Berechtigungsmodell. Der Zugriff auf eine Ressource wird im Wesentlichen über Eigentümer, Gruppe und Modusbits wie r, w und x gesteuert.
MAC verfolgt einen anderen Ansatz. Hier entscheidet nicht der Eigentümer eines Objekts, sondern eine zentral definierte Sicherheitsrichtlinie.
- Ein Zugriff ist nur dann erlaubt, wenn sowohl DAC als auch MAC ihn zulassen.
- Ein Prozess darf also nicht allein deshalb auf eine Ressource zugreifen, weil die klassischen Dateirechte dies zulassen.
Architektur
SELinux ist ein Linux Security Module (LSM), das in den Linux-Kernel integriert ist
- Das SELinux-Subsystem im Kernel wird von einer Sicherheitsrichtlinie gesteuert, die vom Administrator kontrolliert und beim Systemstart geladen wird
- Alle sicherheitsrelevanten Zugriffsvorgänge auf Kernel-Ebene im System werden von SELinux abgefangen und im Kontext der geladenen Sicherheitsrichtlinie geprüft
- Wenn die geladene Richtlinie den Vorgang zulässt, wird er fortgesetzt
- Andernfalls wird der Vorgang blockiert und der Prozess erhält eine Fehlermeldung
- Was ist SELinux?
SELinux bietet eine zusätzliche Ebene der Systemsicherheit
- SELinux beantwortet im Wesentlichen die Frage
Darf Subjekt die Aktion an Objekt ausführen?
- Beispiel
- Darf ein Webserver auf Dateien in den Home-Verzeichnissen der Benutzer zugreifen?
- Umfassende und fein abgestufte Sicherheitsrichtlinien
Standardmäßige Zugriffsrichtlinie
- die auf Benutzer-, Gruppen- und anderen Berechtigungen basiert und
- als Discretionary Access Control (DAC) bekannt ist,
ermöglicht es Systemadministratoren nicht,
- umfassende und fein abgestufte Sicherheitsrichtlinien zu erstellen,
- wie bestimmte Anwendungen darauf zu beschränken, Log-Dateien nur anzuzeigen, während anderen Anwendungen erlaubt wird, neue Daten an die Log-Dateien anzuhängen
- SELinux implementiert Mandatory Access Control (MAC)
- Jeder Prozess und jede Systemressource verfügt über eine spezielle Sicherheitskennzeichnung, die als „SELinux-Kontext“ bezeichnet wird
- Ein SELinux-Kontext, manchmal auch als „SELinux-Label“ bezeichnet, ist ein Identifikator, der die Details auf Systemebene abstrahiert und sich auf die Sicherheitseigenschaften der Entität konzentriert
- Dies bietet nicht nur eine konsistente Methode zur Referenzierung von Objekten in der SELinux-Richtlinie, sondern beseitigt auch jegliche Mehrdeutigkeit, die bei anderen Identifizierungsmethoden auftreten kann; beispielsweise kann eine Datei auf einem System, das Bind-Mounts verwendet, mehrere gültige Pfadnamen haben
- Kontexte
Die SELinux-Richtlinie verwendet diese Kontexte in einer Reihe von Regeln, die definieren, wie Prozesse miteinander und mit den verschiedenen Systemressourcen interagieren können
- Standardmäßig erlaubt die Richtlinie keine Interaktion, es sei denn, eine Regel gewährt ausdrücklich Zugriff
- Hinweis
- Es ist wichtig zu beachten, dass SELinux-Richtlinienregeln nach den DAC-Regeln überprüft werden
- SELinux-Richtlinienregeln werden nicht angewendet, wenn DAC-Regeln den Zugriff zuerst verweigern, was bedeutet, dass keine SELinux-Verweigerung protokolliert wird, wenn die herkömmlichen DAC-Regeln den Zugriff verhindern
- Felder
SELinux-Kontexte bestehen aus mehreren Feldern
- Benutzer
- Rolle
- Typ
- Sicherheitsstufe
- Typinformationen
Die SELinux-Typinformationen sind für die SELinux-Richtlinie wohl am wichtigsten, da die gängigste Richtliniendevise, die die zulässigen Interaktionen zwischen Prozessen und Systemressourcen definiert, SELinux-Typen und nicht den vollständigen SELinux-Kontext verwendet
- SELinux-Typen enden in der Regel mit _t
- Der Typname für den Webserver lautet beispielsweise httpd_t
- Der Typkontext für Dateien und Verzeichnisse, die normalerweise unter /var/www/html/ zu finden sind, ist httpd_sys_content_t
- Der Typkontext für Dateien und Verzeichnisse, die sich normalerweise in /tmp und /var/tmp/ befinden, lautet tmp_t
- Der Typkontext für Webserver-Ports lautet http_port_t
- Richtlinienregel
Es gibt etwa eine Richtlinienregel, die Apache (dem als httpd_t ausgeführten Webserver-Prozess) den Zugriff auf Dateien und Verzeichnisse mit einem Kontext erlaubt, der normalerweise in /var/www/html/ und anderen Webserver-Verzeichnissen (httpd_sys_content_t) zu finden ist
- Da die Richtlinie keine Zulassungsregel für Dateien enthält, die sich normalerweise in /tmp und /var/tmp/ befinden, ist der Zugriff nicht erlaubt
- Mit SELinux kann ein bösartiges Skript selbst dann nicht auf das Verzeichnis /tmp zugreifen, wenn Apache kompromittiert wurde und es Zugriff erlangt hat
Abbildung 1.1
- HTTPD
SELinux erlaubt dem als httpd_t laufenden Apache-Prozess den Zugriff auf das Verzeichnis /var/www/html/ und verweigert demselben Prozess den Zugriff auf das Verzeichnis /data/mysql/, da es keine Zulassungsregel für die Kontexte vom Typ httpd_t und mysqld_db_t gibt
- Andererseits kann der als mysqld_t ausgeführte MariaDB-Prozess auf das Verzeichnis /data/mysql/ zugreifen, und SELinux verweigert dem Prozess vom Typ mysqld_t korrekt den Zugriff auf das als httpd_sys_content_t gekennzeichnete Verzeichnis /var/www/html/.‚‘'
Vorteile
SELinux bietet die folgenden Vorteile
Labels
Alle Prozesse und Dateien sind mit Labels versehen
Richtlinienregeln
SELinux-Richtlinienregeln definieren, wie Prozesse mit Dateien interagieren sowie wie Prozesse miteinander interagieren
- Zugriff ist nur dann erlaubt, wenn eine SELinux-Richtlinienregel existiert, die dies ausdrücklich erlaubt
Fein abgestimmte Zugriffskontrolle
Über die traditionellen UNIX-Berechtigungen hinaus, die nach dem Ermessen des Benutzers gesteuert werden und auf Linux-Benutzer- und Gruppen-IDs basieren, basieren SELinux-Zugriffsentscheidungen auf allen verfügbaren Informationen, wie z. B. einem SELinux-Benutzer, einer Rolle, einem Typ und optional einer Sicherheitsstufe
- Die SELinux-Richtlinie wird administrativ definiert und systemweit durchgesetzt
- Verbesserte Abwehr von Angriffen zur Privilegieneskalation
- Prozesse laufen in Domänen und sind daher voneinander getrennt
- SELinux-Richtlinienregeln legen fest, wie Prozesse auf Dateien und andere Prozesse zugreifen
- Wenn ein Prozess kompromittiert wird, hat der Angreifer nur Zugriff auf die normalen Funktionen dieses Prozesses und auf Dateien, für die der Prozess konfiguriert
wurde, darauf zuzugreifen
- Beispiel
Wenn beispielsweise der Apache-HTTP-Server kompromittiert wird, kann ein Angreifer diesen Prozess nicht nutzen, um Dateien in Benutzer-Home-Verzeichnissen zu lesen, es sei denn, eine spezifische SELinux-Richtlinienregel wurde hinzugefügt oder so konfiguriert, dass sie einen solchen Zugriff erlaubt
- SELinux kann eingesetzt werden, um die Vertraulichkeit und Integrität von Daten zu gewährleisten sowie Prozesse vor nicht vertrauenswürdigen Eingaben zu schützen
- SELinux ist nicht
- Antivirensoftware
- Ersatz für Passwörter, Firewalls und andere Sicherheitssysteme
- All-in-One-Sicherheitslösung
SELinux wurde entwickelt, um bestehende Sicherheitslösungen zu ergänzen, nicht um sie zu ersetzen
- Auch bei der Verwendung von SELinux ist es wichtig, weiterhin bewährte Sicherheitspraktiken zu befolgen, wie z. B. die Aktualisierung von Software, die Verwendung schwer zu erratender Passwörter oder den Einsatz von Firewalls
Beispiele
Beispiele für die Erhöhung der Sicherheit durch SELinux
- Standardaktion „verweigern“
Wenn keine SELinux-Richtlinienregel existiert, die den Zugriff erlaubt, beispielsweise für einen Prozess, der eine Datei öffnet, wird der Zugriff verweigert
- Benutzer einschränken
SELinux kann Linux-Benutzer einschränken
- In der SELinux-Richtlinie gibt es eine Reihe von eingeschränkten SELinux-Benutzern
- Linux-Benutzer können eingeschränkten SELinux-Benutzern zugeordnet werden, um die für diese geltenden Sicherheitsregeln und -mechanismen zu nutzen
- Wenn beispielsweise ein Linux-Benutzer dem SELinux-Benutzer ```user_u``` zugeordnet wird, führt dies dazu, dass dieser Linux-Benutzer (sofern nicht anders konfiguriert) keine Set-User-ID-Anwendungen (setuid) wie ```sudo``` und ```su``` ausführen kann
- Weitere Informationen finden Sie in Abschnitt 3.3, „Eingeschränkte und uneingeschränkte Benutzer“
- Verbesserte Prozess- und Datentrennung
Prozesse laufen in ihren eigenen Domänen, wodurch verhindert wird, dass Prozesse auf Dateien zugreifen, die von anderen Prozessen verwendet werden, und dass Prozesse auf andere Prozesse zugreifen
- Wenn beispielsweise SELinux ausgeführt wird, kann ein Angreifer – sofern nicht anders konfiguriert – keinen Samba-Server kompromittieren und diesen Samba-Server dann als Angriffsvektor nutzen, um auf Dateien zu lesen und zu schreiben, die von anderen Prozessen verwendet werden, wie z. B. MariaDB-Datenbanken
- SELinux hilft dabei, den durch Konfigurationsfehler verursachten Schaden zu mindern
Domain Name System (DNS)-Server replizieren häufig Informationen untereinander in einem sogenannten Zonentransfer
- Angreifer können Zonentransfers nutzen, um DNS-Server mit falschen Informationen zu aktualisieren
- Wenn Berkeley Internet Name Domain (BIND) als DNS-Server unter Linux ausgeführt wird, verhindert die Standard-SELinux-Richtlinie – selbst wenn ein Administrator vergisst, einzuschränken, welche Server einen Zonentransfer durchführen dürfen –, dass Zonendateien [1] durch Zonentransfers, durch den BIND-Daemon named selbst oder durch andere Prozesse aktualisiert werden
- Hintergrundinformationen
zu SELinux sowie Informationen zu verschiedenen Exploits, die SELinux verhindert hat, finden Sie im Artikel auf NetworkWorld.com: „A seatbelt for server software: SELinux blocks real-world exploits“[2]
Architektur
SELinux ist ein Linux Security Module (LSM), das in den Linux-Kernel integriert ist
- Das SELinux-Subsystem im Kernel wird von einer Sicherheitsrichtlinie gesteuert, die vom Administrator kontrolliert und beim Systemstart geladen wird
- Alle sicherheitsrelevanten Zugriffsvorgänge auf Kernel-Ebene im System werden von SELinux abgefangen und im Kontext der geladenen Sicherheitsrichtlinie geprüft
- Wenn die geladene Richtlinie den Vorgang zulässt, wird er fortgesetzt
- Andernfalls wird der Vorgang blockiert und der Prozess erhält eine Fehlermeldung
SELinux-Entscheidungen, wie das Zulassen oder Verweigern von Zugriff, werden zwischengespeichert
- Dieser Cache wird als Access Vector Cache (AVC) bezeichnet
- Durch die Verwendung dieser zwischengespeicherten Entscheidungen müssen die SELinux-Richtlinienregeln weniger häufig überprüft werden, was die Leistung erhöht
- Beachten Sie, dass SELinux-Richtlinienregeln keine Wirkung haben, wenn DAC-Regeln den Zugriff zuvor verweigern
Zustände und Modi
SELinux kann in einem von drei Modi ausgeführt werden: deaktiviert, permissiv oder durchgesetzt
Vom deaktivierten Modus wird dringend abgeraten; das System verzichtet nicht nur auf die Durchsetzung der SELinux-Richtlinie, sondern auch auf die Kennzeichnung persistenter Objekte wie Dateien, was eine spätere Aktivierung von SELinux erschwert
Im permissiven Modus verhält sich das System so, als würde SELinux die geladene Sicherheitsrichtlinie durchsetzen, einschließlich der Kennzeichnung von Objekten und der Ausgabe von Zugriffsverweigerungseinträgen in den Protokollen, doch werden tatsächlich keine Operationen verweigert
- Der permissive Modus wird zwar nicht für Produktionssysteme empfohlen, kann jedoch bei der Entwicklung von SELinux-Richtlinien hilfreich sein
Der Durchsetzungsmodus ist der standardmäßige und empfohlene Betriebsmodus; im Durchsetzungsmodus arbeitet SELinux normal und setzt die geladene Sicherheitsrichtlinie im gesamten System durch
Verwenden Sie das Dienstprogramm setenforce, um zwischen dem Durchsetzungs- und dem permissiven Modus zu wechseln
- Mit setenforce vorgenommene Änderungen bleiben nach einem Neustart nicht erhalten
- Um in den Durchsetzungsmodus zu wechseln, geben Sie als Linux-Root-Benutzer den Befehl setenforce 1 ein
- Um in den permissiven Modus zu wechseln, geben Sie den Befehl setenforce 0 ein
- Verwenden Sie das Dienstprogramm getenforce, um den aktuellen SELinux-Modus anzuzeigen:
sudo getenforce Durchsetzungsmodus
sudo setenforce 0 sudo getenforce Erlaubter Modus
sudo setenforce 1 sudo getenforce Durchsetzungsmodus
In Linux können Sie einzelne Domänen in den permissiven Modus versetzen, während das System im Enforcing-Modus läuft
- Um beispielsweise die Domäne httpd_t in den permissiven Modus zu versetzen:
sudo semanage permissive -a httpd_t
Weitere Informationen finden Sie in Abschnitt 11.3.4, „Permissive Domänen“
- Hinweis
- Dauerhafte Änderungen an Zuständen und Modi werden in Abschnitt 4.4, „Dauerhafte Änderungen an SELinux-Zuständen und -Modi“, behandelt
Anhang
Siehe auch
Dokumentation
Links
Projekt
Weblinks