Auf meinem Debian-Server laufen mittlerweile zahlreiche Dienste in Docker-Containern. Darunter Nextcloud, Datenbanken und verschiedene selbst gehostete Anwendungen. Da ich meinen Server möglichst gut absichern möchte, beschäftige ich mich regelmäßig mit zusätzlichen Sicherheitsmaßnahmen.
So bin ich auch beim Thema Rootless Docker gelandet. Die Idee dahinter fand ich interessant: Docker betreiben, ohne dass der Docker-Daemon mit Root-Rechten auf dem Hostsystem läuft.
Also habe ich mich an die Einrichtung gemacht. Irgendwann habe ich das Vorhaben allerdings wieder aufgegeben. Nicht, weil Rootless Docker schlecht wäre, sondern weil die Umstellung meiner bestehenden Docker-Umgebung doch aufwendiger wurde, als ich ursprünglich gedacht hatte. Ich würde das Ganze nur auf einem frischen System noch einmal ausprobieren, auf dem bisher kein Docker läuft. Sonst gibt es schnell hausgemachte Verwirrung auf dem Server. :-)
Was unterscheidet Rootless von Rootful Docker?
Bei einer gewöhnlichen Docker-Installation läuft der Docker-Daemon mit Root-Rechten. Bei Rootless Docker werden dagegen sowohl der Daemon als auch die Container innerhalb eines User-Namespace ohne Root-Rechte auf dem Host betrieben.
Damit lassen sich die möglichen Auswirkungen bestimmter Sicherheitslücken reduzieren.
Bereits im Dezember 2024 erschien auf diesem Blog der Beitrag Docker rootless auf Fedora Silverblue. Dort wird beschrieben, wie sich die Mitgliedschaft in der Docker-Gruppe unter Fedora Silverblue einrichten lässt.
Hier gibt es allerdings einen wichtigen Unterschied: Wer Mitglied der Docker-Gruppe ist, kann Docker zwar ohne sudo bedienen, verwendet dadurch aber noch keinen echten Rootless-Daemon. Der gewöhnliche Docker-Daemon läuft weiterhin mit Root-Rechten und gewährt Mitgliedern dieser Gruppe praktisch Root-äquivalenten Zugriff.
Rootless Docker unter Debian und Ubuntu einrichten
Die Einrichtung ist grundsätzlich recht überschaubar. Voraussetzung ist eine bereits installierte Docker Engine aus dem offiziellen Docker-Repository.
Zunächst installieren wir die benötigten Pakete:
sudo apt update
sudo apt install -y \
uidmap \
dbus-user-session \
slirp4netns \
fuse-overlayfs \
docker-ce-rootless-extras
Anschließend prüfen wir, ob unserem Benutzer mindestens 65.536 zusätzliche Benutzer- und Gruppenkennungen zugewiesen wurden:
grep "^$(whoami):" /etc/subuid
grep "^$(whoami):" /etc/subgid
Fehlen diese Einträge, müssen entsprechende freie Bereiche eingerichtet werden. Diese dürfen sich nicht mit bereits vergebenen Bereichen überschneiden.
Jetzt starten wir die eigentliche Installation als normaler Benutzer, also ohne sudo:
dockerd-rootless-setuptool.sh install
Wer bereits einen laufenden Rootful-Daemon betreibt und diesen für einen ersten Test nicht abschalten möchte, kann Rootless Docker zunächst parallel installieren:
dockerd-rootless-setuptool.sh install --force
Beide Installationen verwenden getrennte Container, Images und Volumes.
Damit der Rootless-Dienst auch ohne aktive Benutzeranmeldung weiterläuft, aktivieren wir den systemd-Benutzerdienst:
systemctl --user enable --now docker
sudo loginctl enable-linger "$(whoami)"
Anschließend wechseln wir in den Rootless-Kontext und kontrollieren die Installation:
docker context use rootless
docker info
Unter Security Options sollte jetzt rootless erscheinen.
Zum Abschluss können wir einen Testcontainer starten:
docker run --rm hello-world
Funktioniert dieser Aufruf, läuft der Docker-Daemon grundsätzlich im Rootless-Modus.
Wo liegen die Schwierigkeiten?
Die eigentliche Installation ist meist nicht das Problem. Schwieriger wird es bei bereits vorhandenen Diensten.
Rootless Docker besitzt eine eigene Umgebung mit getrennten Daten und bringt einige Einschränkungen mit sich. Beispielsweise können normale Benutzer standardmäßig keine Ports unterhalb von 1024 öffnen. Auch bei Netzwerkfunktionen, eingebundenen Verzeichnissen und Containern mit erweiterten Berechtigungen gibt es Unterschiede.
Gerade bei Anwendungen, die auf bestimmte Funktionen des Hostsystems angewiesen sind, muss man genauer hinschauen.
Auf meinem Server hätte ich daher zahlreiche Compose-Dateien, Netzwerke und Datenverzeichnisse einzeln überprüfen und gegebenenfalls anpassen müssen.
Warum ich bei Rootful Docker bleibe
Irgendwann habe ich für mich entschieden, dass ich die Umstellung nicht weiterverfolge. Der eine Grund ist das 2 Docker Installationen auf einem System für unnötige Verwirrung sorgt, wie eingangs des Artikels erwähnt, andererseits ist meine bestehende Docker-Umgebung bereits durch verschiedene Maßnahmen abgesichert. Dazu gehören restriktive Firewall-Regeln, SSH-Zugriff ausschließlich über Schlüssel, regelmäßige Updates, Datensicherungen und möglichst wenige zusätzliche Container-Berechtigungen.
Auch den Docker-Socket gebe ich nicht unnötig an andere Container weiter.
Das bedeutet natürlich nicht, dass Rootful Docker genauso sicher wie Rootless Docker ist. Der Docker-Daemon läuft weiterhin mit Root-Rechten. Der zusätzliche Schutz durch Rootless Docker ist durchaus sinnvoll.
Für meine bestehende Serverumgebung war mir der Aufwand einer vollständigen Migration am Ende allerdings zu groß.
Bei einem neuen Server würde ich Rootless Docker durchaus wieder in Betracht ziehen. Dort könnte ich von Anfang an darauf achten, welche Anwendungen sich dafür eignen.
Wer die Einrichtung selbst ausprobieren möchte, findet in der offiziellen Docker-Dokumentation sowie auf meinem Blog weitere Informationen zu den Voraussetzungen und Einschränkungen.
Für mich bleibt Rootless Docker jedenfalls ein interessantes Konzept, auch wenn ich vorerst bei meiner bisherigen Installation bleibe. Nutzt ihr so ein Setup bei euren Servern, daheim oder bei einem Hoster?
Quellen: im Text
Titelbild: Foto von Prometheus 🔥 auf Unsplash
