Gernot Krautberger - stock.adobe
Der Rootless-Modus von Docker schließt Sicherheitslücken
Docker-Container haben standardmäßig Root-Rechte – ein seit Jahren bekanntes Sicherheitsproblem. Seit dem Update im Dezember 2020 lassen sich Container besser isolieren.
Als Docker auf den Markt kam, hatte es ein schwerwiegendes Architekturproblem. Docker-Container sind leichtgewichtig, weil sie sich ein zugrunde liegendes Betriebssystem teilen, im Gegensatz zu virtuellen Maschinen, die jeweils ihr eigenes enthalten.
Um auf dieses Betriebssystem und seine verschiedenen Funktionen und Dienste zugreifen zu können, mussten Docker-Container ursprünglich einen Daemon – einen Teil der Docker-Engine – verwenden, der Root-Rechte benötigte. Daraus resultierte eine massive Sicherheitsschwachstelle: Wenn ein böswilliger Akteur einen schlecht konstruierten Container kompromittiert, könnte er diesen Root-Zugang nutzen, um die Sicherheitsüberprüfungsfunktion zu umgehen. Er könnte außerdem die direkte Kontrolle über den Daemon selbst übernehmen, mit ähnlich katastrophalen Folgen.
Mittlerweile hat Docker nachgelegt und versucht, dem Problem mit dem Rootless-Modus entgegenzuwirken. Wir erklären, wie Sie ihn benutzen und was er bewirkt.
Infrastruktur und Container voneinander isolieren
Docker Engine führte in Version 19.03 einen Rootless-Modus als experimentelle Funktion ein, die im Dezember 2020 als Teil von Version 20.10 allgemein verfügbar wurde. Der Rootless-Modus – der einen großen Fortschritt für die Sicherheit von Docker-Containern darstellt – erzeugt einen weniger privilegierten, nicht-root-fähigen Daemon. Dieser kann eine vollständige Docker-Engine und einen Container-Stack ohne Root-Rechte aufbauen und so eine sicherere Umgebung schaffen.
Der Rootless-Modus von Docker eignet sich gut für IT-Administratoren, die gängige Container mit allgemeinen Zugriffsrechten betreiben, insbesondere wenn auch Benutzer außerhalb des Unternehmens die Container nutzen. Dieser externe Zugriff erhöht die Wahrscheinlichkeit eines Angriffs.
Das Ausführen von Docker im Rootless-Modus erfordert zusätzlichen Aufwand. Zum Beispiel ist der Internetzugang in einer Rootless-Umgebung nicht direkt verfügbar. IT-Administratoren müssen diese Verbindung über ein Mapping herstellen, was sich geringfügig auf die Gesamtleistung auswirkt.
Der Root-Modus bringt eine Reihe von Sicherheitsproblemen mit sich, von denen Sie viele durch eine gute Code-Hygiene beim Einrichten der Docker-Umgebung auflösen können. Da sich der Rootless-Modus noch in der Entwicklung befindet, ist er nicht für alle Szenarien verfügbar – zum Beispiel unterstützt Docker Swarm derzeit nicht den Rootless-Modus.
Im Rootless-Modus laufen sowohl der Docker-Container als auch der Daemon innerhalb eines definierten Benutzernamensraums. Dadurch kann der Daemon ohne Root-Rechte funktionieren, anders als im Modus userns-remap. Der Modus userns-remap ermöglicht es, dass bestimmte Teile des Containers im nicht privilegierten Modus laufen, zwingt aber andere dazu, Root-Rechte zu verwenden. Im Gegensatz dazu entfernt der Rootless-Modus alle Root-Privilegien.
Nicht alle Docker-Container sind für den Betrieb im Rootless-Modus geeignet oder bereit. So gibt es beispielsweise für alle Container mit Binärdateien, die SETUID-Bits oder Dateifähigkeiten enthalten – mit wenigen Ausnahmen – keinen Rootless-Modus. Diese Ausnahmen sind newuidmap und newgidmap, die beide notwendig sind, um sowohl mehrere Benutzer-IDs (UIDs) als auch Gruppen-IDs (GIDs) einzurichten.
Der Rootless-Modus erfordert mindestens 65.536 untergeordnete UIDs oder GIDs, um zu funktionieren. Diese UIDs und GIDs ordnen Aufrufe und Antworten zwischen dem Docker-Daemon und Containern neu zu.
Bei einer Standard-Docker-Instanz spricht der Daemon direkt mit dem Stamm des Kernels. Im userns-remap-Modus führt der Daemon einige Funktionen mit Root-Rechten aus, aber die Container werden über UIDs und GIDs innerhalb eines bestimmten Namensraums neu zugeordnet, um mit ihm zu interagieren. Im Rootless-Modus interagieren der Daemon und die Container komplett über UIDs und GIDs innerhalb desselben Namensraumes.
Andere Bereiche funktionieren nur, wenn der Container mit Root-Rechten gestartet wird, zum Beispiel wenn ein Azure Databricks Cluster mit einem benutzerdefinierten Docker-Container arbeiten soll. Container, die direkten Zugriff auf netzwerkgebundene Geräte benötigen, müssen in der Regel mit Root-Zugriff ausgestattet sein, idealerweise im Privileged-Modus, einem besonders leistungsfähigen und potenziell gefährlichen Modus, der dem Container vollen Zugriff auf den zugrundeliegenden Kernel gewährt.
Bestimmte Aktionen unterstützt der Rootless-Modus nicht: Nur eine Teilmenge der Speicherebenen ist verfügbar; für das Pinging, das TCP- und UDP-Ports unter 1024 offenlegt, müssen Sie einen anderen Ansatz finden; auch auf die IP-Adresse des Systems können Sie nicht ohne zusätzlichen Code zugreifen.
Eine weitere Einschränkung ist, dass Sie sich aus Sicherheitsgründen auf cgroup Version 2 beschränken müssen – jeder Container, der cgroup Version 1 verwendet, funktioniert nicht im Rootless-Modus.
Das Docker-Ökosystem fügt immer mehr Möglichkeiten für den Rootless-Modus hinzu. Seit Version 1.22 funktioniert er für Kubernetes, das selbst in einem nicht-privilegierten Modus läuft.
Podman – ein alternativer Ansatz zur Containerisierung, der Teil von Red Hat Linux ist – verfolgt einen daemonlosen Ansatz, dessen Container standardmäßig Rootless sind. Podman ist neben Red Hat auch mit anderen Linux-Distributionen und der Open Container Initiative kompatibel, so dass es als Ersatz für die Docker-Laufzeitumgebung dienen kann.
Für diejenigen, die Docker-Container noch im Root-Modus betreiben, ist es an der Zeit, so viele wie möglich auf Rootless umzustellen. Das ist ganz einfach und bietet viel mehr Sicherheit und Ruhe.