Sicherheit ist eine der größten Herausforderungen bei der Verwaltung von Containern in Docker. Linux bietet eine Vielzahl von Mechanismen, um Anwendungen abzusichern, darunter die Linux Sicherheits-Module (LSM). LSM sind Frameworks im Linux-Kernel, die eine zusätzliche Sicherheitsebene bereitstellen und dabei helfen, Systemzugriffe zu kontrollieren und zu beschränken.
In diesem Beitrag erfährst du, was Linux Sicherheits-Module sind, wie sie in Docker verwendet werden können und wie du deine Container mit LSM weiter absichern kannst.
Was sind Linux Sicherheits-Module (LSM)?
Linux Sicherheits-Module (LSM) sind ein Framework im Linux-Kernel, das es ermöglicht, Sicherheitsmechanismen zu implementieren, die den Zugriff auf Kernelressourcen einschränken. Durch LSM können Sicherheitsrichtlinien durchgesetzt werden, die es Prozessen erschweren, unautorisierte Aktionen auszuführen. Zu den bekanntesten LSM gehören:
- AppArmor
- SELinux (Security-Enhanced Linux)
- Seccomp
- SMACK (Simplified Mandatory Access Control Kernel)
Jedes dieser Module hat unterschiedliche Ansätze, um die Sicherheit des Systems zu gewährleisten. Docker verwendet diese Module, um Container besser vom Host-System zu isolieren.
AppArmor in Docker
AppArmor ist ein Linux-Sicherheitsmodul, das den Zugriff von Anwendungen auf Systemressourcen durch Profile einschränkt. Es ist in vielen Linux-Distributionen standardmäßig aktiviert und bietet eine einfache Möglichkeit, den Zugriff auf Dateisysteme, Netzwerke und andere Ressourcen zu kontrollieren.
AppArmor-Profile in Docker
Docker nutzt AppArmor, um Container zu isolieren und deren Zugriffsmöglichkeiten auf das Host-System zu beschränken. Standardmäßig wird jedem Container ein AppArmor-Profil zugewiesen. Dieses Profil erlaubt nur die notwendigen Systemaufrufe und blockiert alle anderen.
Um ein AppArmor-Profil auf einen Docker-Container anzuwenden, kannst du den folgenden Befehl verwenden:
docker run --security-opt apparmor=your_profile_name -it ubuntu
Dabei ist your_profile_name
der Name deines AppArmor-Profils. Wenn kein Profil angegeben ist, verwendet Docker ein Standardprofil namens docker-default
.
Anpassung eines AppArmor-Profils
Du kannst auch eigene AppArmor-Profile erstellen, um den Zugriff deines Containers weiter einzuschränken. Hier sind die Schritte, um ein benutzerdefiniertes Profil zu erstellen und zu nutzen:
- Erstelle eine AppArmor-Profil-Datei:
Erstelle eine Datei namens custom-apparmor-profile
mit folgendem Inhalt:
#include <tunables/global>
profile custom-docker-profile flags=(attach_disconnected) {
network,
capability,
file,
# Erlaube Lesezugriff auf /usr/bin
/usr/bin/ r,
# Blockiere alles andere
deny /bin/** w,
deny /sbin/** w,
}
- AppArmor-Profil laden:
Du kannst das Profil mit dem folgenden Befehl laden:
sudo apparmor_parser -r -W /path/to/custom-apparmor-profile
- Container mit dem Profil starten:
Nun kannst du einen Docker-Container mit deinem benutzerdefinierten AppArmor-Profil starten:
docker run --security-opt apparmor=custom-docker-profile -it ubuntu
Dieses Profil erlaubt dem Container nur den Lesezugriff auf /usr/bin
und blockiert Schreibzugriffe auf /bin
und /sbin
.
SELinux in Docker
SELinux (Security-Enhanced Linux) ist ein weiteres weit verbreitetes Sicherheitsmodul, das eine feingranulare Kontrolle über den Zugriff auf Dateien und Ressourcen ermöglicht. SELinux arbeitet auf Basis von Sicherheitsrichtlinien, die bestimmen, welche Prozesse auf welche Dateien und Systemressourcen zugreifen dürfen.
SELinux in Docker aktivieren
SELinux ist auf einigen Linux-Distributionen, wie Fedora und CentOS, standardmäßig aktiviert. Docker unterstützt SELinux, indem es eine erweiterte Zugriffskontrolle für Container bietet. Um Docker-Container mit SELinux zu verwenden, muss SELinux auf dem Host-System aktiviert sein.
Um SELinux zu aktivieren, kannst du den Status mit folgendem Befehl überprüfen:
sestatus
Wenn SELinux aktiviert ist, wird Docker den Containern automatisch SELinux-Kontextlabels zuweisen.
SELinux-Kontext anpassen
Wenn du benutzerdefinierte SELinux-Richtlinien für Docker-Container anwenden möchtest, kannst du dies über die Option --security-opt
tun. Zum Beispiel:
docker run --security-opt label:type:svirt_lxc_net_t -it centos
Hier wird dem Container der SELinux-Typ svirt_lxc_net_t
zugewiesen, der den Zugriff des Containers auf Netzwerkressourcen regelt.
Seccomp in Docker
Seccomp ist ein weiteres Linux-Sicherheitsmodul, das sich auf die Einschränkung von Systemaufrufen (Syscalls) konzentriert, die ein Container verwenden darf. Während AppArmor und SELinux den Zugriff auf Ressourcen wie Dateien und Netzwerke kontrollieren, beschränkt Seccomp die Kommunikation des Containers mit dem Betriebssystem.
Docker verwendet standardmäßig ein Seccomp-Profil, das unsichere Systemaufrufe blockiert und nur die absolut notwendigen zulässt.
Um ein Container mit einem benutzerdefinierten Seccomp-Profil zu starten, kannst du den folgenden Befehl verwenden:
docker run --security-opt seccomp=custom-seccomp.json -it ubuntu
Weitere Informationen zur Verwendung von Seccomp findest du in meinem Seccomp-Tutorial.
SMACK in Docker
SMACK (Simplified Mandatory Access Control Kernel) ist ein weniger verbreitetes LSM, das auf einer vereinfachten Form der Zugriffskontrolle basiert. SMACK funktioniert ähnlich wie SELinux, indem es Sicherheitslabels verwendet, um den Zugriff auf Ressourcen zu steuern. Docker unterstützt SMACK, aber es ist seltener anzutreffen und wird hauptsächlich in spezialisierten Umgebungen verwendet.
Fazit
Linux Sicherheits-Module bieten eine starke und flexible Möglichkeit, die Sicherheit von Docker-Containern zu verbessern. Je nach den Anforderungen deiner Umgebung kannst du unterschiedliche Module wie AppArmor, SELinux und Seccomp verwenden, um sicherzustellen, dass deine Container isoliert und sicher betrieben werden.
AppArmor und SELinux sind die am häufigsten verwendeten LSMs, wobei AppArmor leichter zu konfigurieren ist und SELinux eine feingranularere Kontrolle ermöglicht. Seccomp ist ideal, um die Nutzung von Systemaufrufen zu beschränken und damit potenzielle Angriffsflächen zu reduzieren. Indem du die für deine Anforderungen passenden Sicherheitsmodule verwendest, kannst du die Sicherheit deines Docker-Setups erheblich steigern und deine Container besser vom Host-System isolieren.