SELinux - Linux Security Module

Carsten Strotmann, sys4 AG

Created: 2023-11-22 Wed 08:40

SELinux

SELinux Geschichte

  • SELinux (oder "Security Enhanced Linux") wurde Ende der 1990er Jahren vom amerikanischen Geheimdienst NSA (National Security Agency) entwickelt
  • SELinux wurde im August 2003 in den Linux-Kernel aufgenommen (Kernel Version 2.6.0-test3)
  • Als erste Linux Distribution hat Fedora SELinux eingesetzt
    • SELinux ist heute in allen Mainstream Linux-Distributionen zu finden

SELinux Übersicht

SELinux-overview.png

SELinux und Linux Distributionen

Linux Distribution SELinux Unterstützung
Fedora sehr gut
Red Hat EL sehr gut (+Support)
CentOS/Rocky/Alma/Oracle … gut
Gentoo gut
Debian eingeschränkt
SuSE eingeschränkt
Ubuntu minimal
Arch minimal

Linux Security Module

Abgesichertes Linux

  • Rund um das Jahr 2000 gab es mehrere Initiativen um den neue Sicherheits-Technologien in den Linux-Kernel einzubauen (SELinux, TOMOYO, Immunix …)
  • Diese neuen Technologien waren als untereinander inkompatible Patches für den Linux-Kernel-Quellcode verfügbar
  • Linux/Hauptentwickler Linus Torvals verlangte, das sich die Projekte auf eine gemeinsame Schnittstelle einigen: die Linux-Security-Module (LSM) Schnittstelle

LSM

  • LSM (Linux Security Module) sind Erweiterungen des Linux-Kernels
    • Der Linux-Kernel definiert Schnittstellen, in welche sich die LSMs einklinken:
      • Syscalls
      • Dateizugriffe
      • Prozess-Erstellung
      • Namespaces und cgroups
      • Benutzer-Identität (UID/GID)

LSM

  • Ein LSM Modul kann sich in eine oder mehrere dieser Schnittstellen einklinken
  • Wird diese Kernel-Funktion benutzt, so wird das LSM aktiv und wird die Kernel-Funktion nach Prüfung erlauben oder verbieten

LSM Übersicht

LSM-overview.png

Major LSMs

  • Major LSMs: Mandatory Access Control (MAC) Module - nur eines dieser LSM kann (derzeit) im Linux-Kernel aktiviert sein
    • SELinux
    • AppArmor
    • SMACK (Simplified Mandatory Access Control)
    • TOMOYO

Minor LSMs

  • Minor LSMs: diese LSMs können zusätzlich zu den Major-LSMs und anderen Minor-LSMs aktiviert sein
    • YAMA
    • LoadPin
    • SafeSetID
    • Lockdown
    • Landlock
    • BPF - LSM Sicherheitsrichtlinien können mittels eBPF durchgesetzt und geändert (!) werden
    • Capabilities - Linux capabilities

LSM Unterstützung im Linux Kernel

  • Nicht alle LSMs sind bei den Distributionen im Kernel eingebaut
  • Über das sys Pseudo-Dateisystem können die verfügbaren LSMs eines Linux-Kernels angezeigt werden:

    # cat /sys/kernel/security/lsm
    lockdown,capability,yama,selinux,bpf
    
  • Nicht alle verfügbaren LSMs sind auch aktiviert!

Übersicht der Linux Sicherheit Module

YAMA

  • YAMA sammelt Sicherheitsfunktionen aus Linux-Kernel-Sicherheitspatches, welche nicht in eine der anderen Linux-Sicherheits-Module passen
  • In aktuellen Linux-Kernel bietet mit YAMA einen Schutz gegen ptrace (ptrace_scope), d.h. das ein Prozess den Speicher und die Ausführung eines anderen Prozesses überwachen kann (diese Funktion wird für die Benutzung von Debuggern bei der Programmentwicklung benötigt). Auf Produktions-Serversystemen ist diese Funktion oft nicht benötigt.

YAMA

  • Werte für ptrace_scope

Wert Beschreibung
0 normales Verhalten, jeder Prozess und Benutzer kann andere Prozesse überwachen
1 ein Prozess kann nur einen eigenen Kind-Prozess überwachen
2 nur ein Systemadministrator mit CAP_SYS_PTRACE kann Prozesse überwachen
3 keine Überwachen von Prozessen mittels ptrace möglich, diese Einstellung kann im laufenden System nicht überschrieben werden

YAMA

  • PTRACE_SCOPE wird über die Pseudo-Datei /proc/sys/kernel/yama/ptrace_scope gesteuert. Neue Werte können per echo in diese Datei geschrieben werden

root$ cat /proc/sys/kernel/yama/ptrace_scope
0
root$ echo "3" > /proc/sys/kernel/yama/ptrace_scope
root$ strace -p $(pgrep sshd)
strace: attach: ptrace(PTRACE_ATTACH, 3135): Operation not permitted

LoadPin

  • LoadPin ist seit Kernel 4.7 Bestandteil von Linux
  • LoadPin gewährleistet das alle Kernel-Daten (Module, Firmware-Blobs etc) vom gleichen, read-only Datei-System gelesen werden.
  • LoadPin verhindert Angriffe auf den Kernel durch bösartige Kernel-Module (z.B. Root-Kits)

SafeSetID

  • Das SafeSetID Modul überwacht die Benutzung der SetUID/SetGID Syscalls (UID oder GID eines Prozesses ändern, z.B. via su oder sudo oder per SetUID-Bit in den Dateisystemrechten) und prüft die Benutzung gegen eine systemweite Whitelist
    • Mittels SafeSetID können Prozesse die Capability CAP_SETUID/CAP_SETGID benutzen um von einem unprivilegierten Benutzeraccount in einen anderen zu wechseln (um Rechte abzugeben), ohne das diese Programme die Rechte ausweiten können oder sogar Root- Rechte erlangen können
    • Die Whitelist wird als Text-Datei mit je einer Regel pro Zeile in das securityfs Pseudo-Dateisystem unter dem Pfad safesetid/uid_allowlist_policy (für UID Übergänge) und safesetid/gid_allowlist_policy (für GID Übergänge) geschrieben
    • Das Format jedes Eintrages ist <ausgangs-UID>:<neue-UID>\n

Lockdown

  • Das Lockdown Modul beschränkt bestimmte Funktionen des Linux Kernels (Laden von unsignierten Modulen, PTRACE, eBPF, Hibernation = Speicherinhalte auf Datenträger schreiben, Zugriffe auf spezielle Gerätedateien unter /dev, Kernel perf Schnittstellen, ACPI-Tabellen …)

Lockdown

  • Lockdown kennt zwei Modi
    • integrity - Funktionen sind ausgeschaltet, welche den laufenden Kernel verändern können
    • confidentiality - Funktionen aus dem Modus integrity sind ausgeschaltet, plus Funktionen über welche sensible Daten aus dem Kernel ausgelesen werden können (z.B. Zugriffe auf /dev/mem)

Lockdown

  • Lockdown LSM ist seit Kernel 5.4 verfügbar
  • Lockdown Status ausgeben (hier none, Modi integrity und confidentiality sind möglich)

    # cat /sys/kernel/security/lockdown
    [none] integrity confidentiality
    

Landlock

  • Landlock ist ein LSM welches Prozessen erlaubt, die eigenen Dateisystem-Rechte (und die Rechte von Kind-Prozessen) über die Unix-Dateisystemrechte hinaus einzuschränken.
    • Da die Landlock Rechte-Einschränkungen vererbt werden, können Supervisor Programme (z.B. Systemd) erstellt werden, um Kind-Prozesse zu beschränken, ohne diese Kind-Prozesse im Quellcode ändern zu müssen
    • Landlock ist von der Idee vergleichbar mit dem OpenBSD pledge Mechanismus, wirkt jedoch nur auf Dateisystemrechte (pledge wirkt auf verschiedenen Syscall-Gruppen)
  • Landlock ist seit Linux-Kernel 5.13 verfügbar

TOMOYO

  • TOMOYO LSM kann zur Analyse eines Linux-Systems, oder zur Implementation einer Sicherheitsrichtlinie für das Linux-System verwendet werden
  • TOMOYO beschränkt Linux-Prozesse auf Basis des Dateisystem-Pfads und der Prozess-Hierarchie ("Domain" in der TOMOYO Terminology, hat aber keinen Zusammenhang mit DNS, dem Domain-Name-System)
  • TOMOYO kann alternativ auch als Linux-Kernel-Modul geladen werden (dann ist es kein LSM, sondern kann zusätzlich zu anderen Major-LSMs benutzt werden)

TOMOYO

  • TOMOYO fasst einen oder mehrere Prozesse zu einer Domain zusammen
    • Jede Domain wird über ein Profil reglementiert
    • Es können 255 unterschiedliche Profile im TOMOYO LSM definiert werden

TOMOYO

  • Jedes Profil kann unabhängig von anderen Profilen in einem von 3 Modi verwendet werden
    • Learning: Syscall-Aufrufe und Dateisystem-Interaktionen werden protokolliert und in das Profil aufgenommen (Erstellung eines Baseline-Profil für eine Prozess-Gruppe/Domain)
    • Permissive: Verstöße gegen die Policy werden protokolliert, aber nicht durchgesetzt
    • Enforcing: Verstöße gegen die Policy werden aktiv verhindert und protokolliert

SMACK

  • SMACK ist ein Mandatory Access Control System im Linux Kernel, welches im Vergleich zu SELinux weniger komplex ist
  • SMACK ist seit Kernel 2.6.25 Teil des Linux-Kernels

SMACK

  • SMACK wird heute hauptsächlich in Linux-Systemen von IoT-Geräten und in Automotive-Anwendungen verwendet (z.B. im Tizen OS von Samsung)
    • Wie auch SELinux arbeitet SMACK auch mit Sicherheits-Label auf Basis von erweiterten Attributen in den Linux-Dateisystemen
      • Es ist möglich SMACK in mittels der eingebauten Sicherheitsrichtlinie auch ohne erweiterte Attribute zu betreiben, dann kann die Sicherheitsrichtlinie jedoch nicht angepasst werden

SMACK

  • SMACK bindet Sicherheitslabel beim Empfang an IP-Pakete
    • Die Sicherheitsrichtlinie kann benutzt werden, um die Kommunikation von Anwendungen auf bestimmte IP-Adressen oder Netzwerke zu beschränken
    • Diese Funktion von SMACK kann zu Performance-Verlusten bei der Netzwerkkommunikation führen, wenn SMACK im Kernel aktiv ist

SELinux

  • SELinux (Security-Enhanced Linux; engl. „sicherheitsverbessertes Linux“) ist eine Erweiterung des Linux-Kernels. Es implementiert die Zugriffskontrollen auf Ressourcen im Sinne von Mandatory Access Control. SELinux wurde von der NSA für eigene Bedürfnisse entwickelt und wird von dem Linux-Distributor Red Hat gepflegt.
  • SELinux ist Open-Source-Software und setzt sich aus einem Kernel-Modul, Hilfsprogramme und aus zahlreichen Erweiterungen für Systemprogramme zusammen.
  • Kernbestandteil von SELinux sind die Policies (Richtlinien), welche sehr detailliert beschreiben, welche Zugriffe (Dateisystem, Syscalls, Netzwerk) einem Prozess oder einem Benutzer erlaubt sind.

AppArmor

  • AppArmor ist ein Mandatory Access Control Modul für den Linux Kernel.
  • Im Linux Kernel ist AppArmor seit Version 2.6.36 (Oktober 2010) verfügbar, war jedoch in einigen Linux Distributionen (z.B. SuSE) schon vor diesem Zeitpunkt eingebaut
  • AppArmor wird derzeit von Canonical (der Firma hinter Ubuntu) gepflegt
  • AppArmor wird in den Linux Distributionen Ubuntu, Debian und SuSE verwendet
  • Im Gegensatz zu SELinux definiert AppArmor die Sicherheits-Richtlinien auf Basis von Dateisystem-Pfaden und nicht mittels Dateisystem-Attributen

eBPF

  • eBPF ist die extended Berkeley Packet Filter Infrastruktur im Linux Kernel
  • eBPF ist eine Weiterentwicklung der Berkeley Packet Filter Technologie (classic BPF = cBPF), wie sie z.B. in den Programmen tcpdump oder Wireshark zum Einsatz kommt

eBPF

  • eBPF ist eine Technologie im Linux-Kernel, welche Sandbox-Programme in einem Betriebssystem-Kernel ausführen kann.
    • eBPF wird verwendet, um die Fähigkeiten des Kernels sicher und effizient zu erweitern, ohne dass der Kernel-Quellcode geändert oder Kernel-Module geladen werden müssen.
    • eBPF kann neben Netzwerk-Paketen auch andere Daten aus dem Linux-Kernel überwachen und manipulieren

eBPF

  • Einsatzgebiete:
    • Netzwerksicherheit (erweiterte Firewall-Funktionen)
    • Host-Sicherheit
    • Forensik
    • Fehler-Diagnose
    • Performance-Messungen

eBPF

  • eBPF Programme können über die LSM Schnittstelle LSM Regeln dynamisch (zur Laufzeit) basierend auf den Systemzustand verändern
  • Während die klassischen LSM MAC Systeme (AppArmor, SELinux, TOMOYO, SMACK) statische Regeln laden, kann mit eBPF ein dynamisches Regelwerk realisiert werden

Ende des Kapitel "LSM"