Wie kann ich docker ohne sudo benutzen?

767

Auf den Dokumentationsseiten von Docker werden alle Beispielbefehle ohne Folgendes angezeigt sudo:

docker ps

Unter Ubuntu wird die Binärdatei aufgerufen docker.io. Ohne sudo geht es auch nicht:

sudo docker.io ps

Wie kann ich Docker so konfigurieren, dass ich nicht jedem Docker-Befehl sudo voranstellen muss?

Flimm
quelle
1
Vergiss nicht ufw zu aktivieren;)
Rinzwind
2
Unter Ubuntu 14.04 gibt es auch eine 'Docker'-Binärdatei.
Anatoly Techtonik
@anatolytechtonik Ich habe auch 'docker' anstelle von 'docker.io' in Ubuntu 14.04 LTS
Nabin
2
Die empfohlene Installation ist nicht der Docker in den Standard-Ubuntu-Repos. Befolgen Sie stattdessen die Anweisungen hier ( docs.docker.com/engine/installation/linux/ubuntulinux ) und empfehlen Sie, das Docker-Repository zu verwenden. Entfernen Sie alle vorhandenen Docker-Inhalte und vergewissern Sie sich, dass Sie sie aus der richtigen Quelle erhalten: apt-cache policy docker-engine(Die entsprechende URL sollte von dockerproject.org stammen.)
michael
2
Wie wäre es mit einem Alias ​​:? Auf diese Weise verwenden Sie weiterhin sudo mit Kennwortschutz. alias docker = "sudo docker"
Andrej Panjkov

Antworten:

1137

Gute Nachricht: Der neue Docker (Version 19.03 (derzeit experimentell)) kann ohne Root-Zugriff ausgeführt werden, um die Probleme zu beseitigen, die bei der Verwendung eines Root-Benutzers auftreten können. Keine Probleme mehr mit erhöhten Berechtigungen, Root-Rechten und allem, was Ihren Computer öffnen könnte, wenn Sie es nicht wollten.

Video dazu aus [DockerCon 2019] Docker-Daemon mit Rootless-Modus härten

Ein paar Vorsichtsmaßnahmen für den rootless Docker-Modus

Die Docker-Ingenieure sagen, dass der rootless-Modus nicht als Ersatz für die gesamte Suite der Docker-Engine-Funktionen angesehen werden kann. Einige Einschränkungen für den rootless-Modus sind:

  • cgroups-Ressourcensteuerungen, Apparmor-Sicherheitsprofile, Checkpoint / Restore, Overlay-Netzwerke usw. funktionieren nicht im rootless-Modus.
  • Das Freilegen von Ports aus Containern erfordert derzeit einen manuellen Socat-Hilfsprozess.
  • Nur Ubuntu-basierte Distributionen unterstützen Overlay-Dateisysteme im rootlosen 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):

Im Docker-Handbuch heißt es dazu:

Nicht-Root-Zugriff gewähren

Der Docker-Daemon wird immer als Root-Benutzer ausgeführt, und seit Docker Version 0.5.2 wird der Docker-Daemon nicht mehr an einen TCP-Port, sondern an einen Unix-Socket gebunden. Standardmäßig gehört dieser Unix-Socket dem Benutzer root, sodass Sie standardmäßig mit sudo darauf zugreifen können.

Wenn Sie (oder Ihr Docker-Installationsprogramm) ab Version 0.5.3 eine Unix-Gruppe namens docker erstellen und Benutzer hinzufügen, macht der Docker-Daemon den Besitz des Unix-Sockets für die Docker-Gruppe lesbar / beschreibbar, 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 festlegen, dass eine andere Gruppe als docker den Unix-Socket mit der Option -G besitzen soll.

Warnung: Die Docker-Gruppe (oder die mit -G angegebene Gruppe) ist root-äquivalent. siehe Docker Daemon Angriffsfläche Details und diese Blogpost auf Warum lassen wir nicht Nicht-Root - Benutzer ausführen Docker in CentOS, Fedora oder RHEL (dank michael-n).

In der jüngsten Version des experimentellen rootless-Modus auf GitHub erwähnen Ingenieure, dass der rootless-Modus das Ausführen von dockerd als nichtprivilegierter Benutzer unter Verwendung von user_namespaces (7), mount_namespaces (7) und network_namespaces (7) ermöglicht.

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 (enthält auch Links zu den Details zu Docker Daemon Attack Surface ).

Verwalten Sie Docker als Nicht-Root-Benutzer

Der Docker-Dämon wird an einen Unix-Socket anstelle eines TCP-Ports gebunden. Standardmäßig gehört der 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 sudo nicht verwenden möchten, wenn Sie den Befehl docker verwenden, erstellen Sie eine Unix-Gruppe mit dem Namen docker und fügen Sie Benutzer hinzu. Wenn der Docker-Dämon gestartet wird, kann die Docker-Gruppe den Besitz des Unix-Sockets lesen / schreiben.


  • Fügen Sie die Andockgruppe 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 eine newgrp dockeroder eine Abmeldung / Anmeldung aus, um die Änderungen an Gruppen zu aktivieren.

  • Sie können verwenden

    docker run hello-world
    

    um zu überprüfen, ob Sie docker ohne sudo ausführen können.

Rinzwind
quelle
3
Ja, aber jeder privilegierte Prozess eröffnet ein Exploit-Potenzial. Lässt sich Docker so tief in das Betriebssystem einbinden, um wirklich diese Berechtigungsstufe zu erhalten?
Matt
3
newgrp dockerhat bei mir nicht funktioniert, ich musste mich ausloggen.
Lolmaus - Andrey Mikhaylov
43
Es sei darauf hingewiesen, dass dies dem Benutzer uneingeschränkten, nicht kennwortgeschützten Root-Zugriff ermöglicht . Einzelheiten zur Sicherheitsanfälligkeit finden Sie hier
Chris Foster,
2
Sie müssen den Docker-Daemon NICHT neu starten, damit diese Änderung wirksam wird. Haben Sie nur den Benutzer, den Sie gerade hinzugefügt haben, abmelden und dann wieder anmelden
Tommy
4
Wenn Sie verwenden docker login, stellen Sie möglicherweise fest, dass der .dockerOrdner, der in Ihrem Basisordner erstellt wurde, zu gehört root. so würde diese Warnung in denen Docker Befehle ausführen: WARNING: Error loading config file:/home/myuser/.docker/config.json - stat /home/myuser/.docker/config.json: permission denied. Ich habe meine Benutzer- .dockerOrdner zugänglich , ohne sudo wie folgt: sudo chgrp -hR docker ~/.docker && sudo chown -R myuser ~/.docker. das chgrpschien aber nicht zu helfen, also sollte ich den chown step wohl nur weiterempfehlen.
Birchlabs
202

Um den Docker-Befehl ohne auszuführen sudo, müssen Sie Ihren Benutzer (der über Root-Berechtigungen verfügt) zur Docker-Gruppe hinzufügen. Führen Sie dazu folgenden Befehl aus:

 sudo usermod -aG docker $USER

Jetzt muss sich der Benutzer abmelden und erneut anmelden. Diese Lösung wird hier anhand des richtigen Installationsprozesses ausführlich erläutert .

Rohini Choudhary
quelle
14
Nachdem Sie den Benutzer zur Gruppe hinzugefügt haben, führen Sie den folgenden Befehl aus: sg group_name -c "bash"
madjardi
4
Sie müssen das Betriebssystem nicht neu starten, damit diese Änderung wirksam wird! Das wird alle laufenden Container bombardieren! Bitten Sie den Benutzer, den Sie gerade hinzugefügt haben, sich dann
Tommy
5
Wie unterscheidet sich dieser Befehl von "sudo gpasswd -a $ {USER} docker" in einer anderen Antwort? Wenn überhaupt ...
Ashley Aitken
9
Könnten Sie bitte die Warnung der Dokumentation hinzufügen: "Die Docker-Gruppe [...] ist root-äquivalent", so dass die Leute eine Chance haben, darüber nachzudenken
Murmel
2
Gleicher Effekt wie die 2 Jahre ältere akzeptierte Antwort, aber ohne die Warnungen über die Sicherheitsrisiken
Gert van den Berg
57

Der Mechanismus, durch den das Hinzufügen eines Benutzers zur Gruppe dockerdie Berechtigung zum Ausführen von Docker erteilt, besteht darin, auf den Socket von Docker unter zuzugreifen /var/run/docker.sock. Wenn das darin enthaltene Dateisystem /var/runmit aktivierten ACLs bereitgestellt wurde, kann dies auch über ACLs erfolgen.

sudo setfacl -m user:$USER:rw /var/run/docker.sock

Ich beziehe dies nur der Vollständigkeit halber ein.

Im Allgemeinen empfehle ich, ACLs zu vermeiden, wenn eine gute Alternative basierend auf Gruppen verfügbar ist: Es ist besser, wenn die Berechtigungen in einem System nur anhand von 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 rootentspricht dem Hinzufügen usernamezur dockerGruppe. Sie können einen Container weiterhin so starten, dass er rootZugriff auf das Host-Dateisystem hat.

Warnung 2 : ACLs sind für Sicherheitsüberprüfungen wesentlich schwieriger als gruppenbasierte Sicherheit. Vermeiden Sie wahrscheinlich nach Möglichkeit ACLs, wenn Sie stattdessen Gruppen verwenden können, zumindest in auditrelevanten Umgebungen.

Christian Hujer
quelle
5
Es funktionierte am 16.04.
Edib 12.12.17
Dies ist, was ich brauchte, andere Antworten erfordern, dass der Benutzer root-Berechtigung hat. Vielen Dank!
Mrinal Saurabh
1
Viel besser so imo. Der Gruppendock ist root-äquivalent und das ist immer ein Zeichen der Gefahr. Und ich sehe keinen Nachteil darin, das Eigentum an dieser einen Datei zu übernehmen.
Xerus
5
Wenn ich @Xerus richtig verstehe, kann jeder, der in diesen Socket schreiben kann, auch root-äquivalente Rechte erhalten . Wenn Sie also jemandem über eine Zugriffssteuerungsliste Zugriff auf diesen Socket gewähren, hat dies den gleichen Sicherheitseffekt wie das Hinzufügen dieser Person zur Docking-Gruppe.
Paŭlo Ebermann
1
Hat für mich an Linux Mint 19 gearbeitet. Vielen Dank.
Wir sind Borg