
Auf den Dokumentationsseiten von Docker werden alle Beispielbefehle ohne angezeigt sudo
, wie dieser:
docker ps
Unter Ubuntu heißt die Binärdatei docker.io
. Ohne funktioniert es auch nicht sudo
:
sudo docker.io ps
Wie kann ich Docker so konfigurieren, dass ich nicht jedem Docker-Befehl ein Präfix voranstellen muss sudo
?
Antwort1
Gute Neuigkeiten: Die neue Docker-Version 19.03 (derzeit experimentell) kann ohne Root ausgeführt werden, wodurch die Probleme, die bei Verwendung eines Root-Benutzers auftreten können, vermieden werden. Kein Herumspielen mehr mit erhöhten Berechtigungen, Root und allem, was Ihren Computer öffnen könnte, wenn Sie es nicht möchten.
Video dazu von[DockerCon 2019] Docker-Daemon mit Rootless-Modus härten
Einige Einschränkungen zum Rootless-Docker-Modus
Docker-Ingenieure sagen, dass der Rootless-Modus nicht als Ersatz für die komplette Suite der Docker-Engine-Funktionen angesehen werden kann. Einige Einschränkungen des Rootless-Modus sind:
- Cgroups-Ressourcenkontrollen, Apparmor-Sicherheitsprofile, Checkpoint/Restore, Overlay-Netzwerke usw. funktionieren im Rootless-Modus nicht.
- Das Freigeben von Ports aus Containern erfordert derzeit einen manuellen Socat-Hilfsprozess.
- Nur Ubuntu-basierte Distributionen unterstützen Overlay-Dateisysteme im Rootless-Modus.
- Der Rootless-Modus ist derzeit nur für nächtliche Builds verfügbar, die möglicherweise nicht so stabil sind, wie Sie es gewohnt sind.
Ab Docker 19.3 ist dies veraltet (und gefährlicher als nötig):
DerDocker-Handbuchhat dazu folgendes zu sagen:
Gewähren von Nicht-Root-Zugriff
Der Docker-Daemon wird immer als Root-Benutzer ausgeführt und seit Docker Version 0.5.2 wird der Docker-Daemon an einen Unix-Socket statt an einen TCP-Port gebunden. Standardmäßig gehört dieser Unix-Socket dem Root-Benutzer, und Sie können daher standardmäßig mit sudo darauf zugreifen.
Ab Version 0.5.3 können Sie (oder Ihr Docker-Installer) eine Unix-Gruppe namens „Docker“ erstellen und Benutzer hinzufügen. Dann macht der Docker-Daemon den Besitz des Unix-Sockets für die Docker-Gruppe lesbar/schreibbar, wenn der Daemon gestartet wird. Der Docker-Daemon muss immer als Root-Benutzer ausgeführt werden. Wenn Sie den Docker-Client jedoch als Benutzer in der Docker-Gruppe ausführen, müssen Sie nicht allen Client-Befehlen „sudo“ hinzufügen. Ab 0.9.0 können Sie mit der Option -G angeben, dass eine andere Gruppe als Docker den Unix-Socket besitzen soll.
Achtung: Die Docker-Gruppe (oder die mit -G angegebene Gruppe) ist root-äquivalent; sieheDetails zur Angriffsfläche des Docker Daemonund dieser Blogbeitrag aufWarum wir Nicht-Root-Benutzern nicht erlauben, Docker in CentOS, Fedora oder RHEL auszuführen(danke, Michael-N).
In der jüngsten Veröffentlichung desexperimenteller Rootless-Modus auf GitHub, Ingenieure erwähnen, dass der Rootless-Modus es ermöglicht, Dockerd als nicht privilegierter Benutzer auszuführen, indem user_namespaces(7), mount_namespaces(7) und network_namespaces(7) verwendet werden.
Benutzer müssen dockerd-rootless.sh anstelle von dockerd ausführen.
$ dockerd-rootless.sh --experimental
Da der Rootless-Modus experimentell ist, müssen Benutzer dockerd-rootless.sh immer mit –experimental ausführen.
Wichtig zu lesen:Schritte nach der Installation für Linux(es verlinkt auch aufDetails zur Angriffsfläche des Docker Daemon).
Verwalten Sie Docker als Nicht-Root-Benutzer
Der Docker-Daemon bindet sich an einen Unix-Socket statt an einen TCP-Port. Standardmäßig gehört dieser Unix-Socket dem Benutzer root und andere Benutzer können nur mit sudo darauf zugreifen. Der Docker-Daemon wird immer als Root-Benutzer ausgeführt.
Wenn Sie bei Verwendung des Docker-Befehls nicht sudo verwenden möchten, erstellen Sie eine Unix-Gruppe namens Docker und fügen Sie ihr Benutzer hinzu. Wenn der Docker-Daemon startet, macht er den Besitz des Unix-Sockets für die Docker-Gruppe lesbar/schreibbar.
Fügen Sie die
docker
Gruppe hinzu, falls sie noch nicht vorhanden ist:sudo groupadd docker
Fügen Sie den verbundenen Benutzer „$USER“ zur
docker
Gruppe hinzu. Ändern Sie den Benutzernamen so, dass er Ihrem bevorzugten Benutzer entspricht, wenn Sie Ihren aktuellen Benutzer nicht verwenden möchten:sudo gpasswd -a $USER docker
Führen Sie entweder einen aus
newgrp docker
oder melden Sie sich ab/an, um die Änderungen an den Gruppen zu aktivieren.Sie können
docker run hello-world
um zu überprüfen, ob Sie Docker ohne ausführen können
sudo
.
Antwort2
Um den Docker-Befehl ohne auszuführen sudo
, müssen Sie Ihren Benutzer (mit Root-Rechten) zur Docker-Gruppe hinzufügen. Führen Sie dazu den folgenden Befehl aus:
sudo usermod -aG docker $USER
Lassen Sie den Benutzer sich nun abmelden und dann erneut anmelden. Diese Lösung ist gut erklärtHiermit dem richtigen Installationsprozess.
Antwort3
Der Mechanismus, mit dem das Hinzufügen eines Benutzers zur Gruppe docker
die Berechtigung zum Ausführen von Docker erteilt, besteht darin, Zugriff auf den Socket von Docker unter zu erhalten /var/run/docker.sock
. Wenn das Dateisystem, das enthält, /var/run
mit aktivierten ACLs gemountet wurde, kann dies auch über ACLs erreicht werden.
sudo setfacl -m user:$USER:rw /var/run/docker.sock
Ich füge dies nur der Vollständigkeit halber hinzu.
Generell empfehle ich, ACLs zu vermeiden, wenn eine gute Alternative auf Gruppenbasis verfügbar ist: Es ist besser, wenn die Berechtigungen in einem System nur durch Betrachtung der Gruppenmitgliedschaften verstanden werden können. Das Dateisystem nach ACL-Einträgen durchsuchen zu müssen, um die Systemberechtigungen zu verstehen, ist eine zusätzliche Belastung für Sicherheitsüberprüfungen.
Warnung 1: Dies hat dieselbe root
Entsprechung wie das Hinzufügen $USER
zur docker
Gruppe. Sie können einen Container weiterhin so starten, dass er root
Zugriff auf das Host-Dateisystem hat.
Warnung 2: ACLs sind für Sicherheitsprüfungen deutlich schwieriger als gruppenbasierte Sicherheit. Vermeiden Sie ACLs, wenn möglich, wenn Sie stattdessen Gruppen verwenden können, zumindest in prüfungsrelevanten Umgebungen.
Antwort4
Docker-Container müssen von einem Superuser ausgeführt werden. Sie können sich selbst zur docker
Gruppe hinzufügen (z. B. durch Ausführen sudo usermod -aG docker $USER
), aber dies macht es für jeden mit Zugriff auf das $USER
Konto einfacher, Root-Zugriff auf die Maschine zu erhalten (z. B. durch Einbinden eines Root-Volumes in einen privilegierten Container).
Eine sicherheitsbewusstere Möglichkeit, Docker-Container als Nicht-Root-Benutzer auszuführen, wäre die VerwendungPodman. Von seiner Website:
Podman ist eine daemonlose Container-Engine zum Entwickeln, Verwalten und Ausführen von OCI-Containern auf Ihrem Linux-System. Container können entweder als Root oder inRootless-Modus. Einfach gesagt:
alias docker=podman
.
Eine weitere Alternative istSingularität, das häufiger in HPC-Umgebungen eingesetzt wird.