Vraag Hoe kan ik docker zonder sudo gebruiken?


Op de documentatiepagina's van Docker worden alle voorbeeldopdrachten zonder weergegeven sudo, zoals deze:

docker ps

Op Ubuntu wordt het binaire bestand genoemd docker.io. Het werkt ook niet zonder sudo:

sudo docker.io ps

Hoe kan ik Docker zo configureren dat ik niet elke Docker-opdracht hoeft vooraf te zetten met sudo?


636
2018-06-06 08:17


oorsprong


Vergeet niet om ufw in te schakelen;) - Rinzwind
Op Ubuntu 14.04 er bestaat ook 'docker' binair. - anatoly techtonik
@anatolytechtonik Ik heb ook 'docker' gebruikt in plaats van 'docker.io' in Ubuntu 14.04 LTS - Nabin
Aanbevolen installatie is niet  de docker in default ubuntu repos; in plaats daarvan, instructies hier ( docs.docker.com/engine/installation/linux/ubuntulinux ), raad aan de koppelingsreporter te gebruiken. Verwijder alle bestaande Docker-dingen en controleer of u die van de juiste bron krijgt: apt-cache policy docker-engine (apt url zou van dockerproject.org moeten zijn) - michael
Wat dacht je van een alias :? Op die manier gebruik je nog steeds sudo, met wachtwoordbeveiliging. alias docker = "sudo docker" - Andrej Panjkov


antwoorden:


De dokwerkhandboek heeft dit te zeggen:

Niet-roottoegang verlenen

De docker-daemon werkt altijd als root-gebruiker en sinds Docker-versie 0.5.2 bindt de docker-daemon aan een Unix-socket in plaats van een TCP-poort. Standaard is de Unix-socket eigendom van de root van de gebruiker en dus kun je deze standaard openen met sudo.

Vanaf versie 0.5.3, als u (of uw Docker-installatieprogramma) een Unix-groep met de naam docker maakt en er gebruikers aan toevoegt, krijgt de docker-daemon het eigendom van de Unix-socket lees / schrijfbaar door de koppelingsgroep wanneer de daemon start . De docker-daemon moet altijd als de rootgebruiker worden uitgevoerd, maar als u de docker-client als een gebruiker in de koppelingsgroep uitvoert, hoeft u geen sudo aan alle clientopdrachten toe te voegen. Vanaf 0.9.0 kunt u opgeven dat een andere groep dan docker de Unix-socket met de -G-optie moet bezitten.

Waarschuwing: de koppelingsgroep (of de groep die is opgegeven met -G) is equivalent aan de hoofdmap; zien Docker Daemon Attack Surface-details en deze blogpost op Waarom we niet toestaan ​​dat niet-rootgebruikers Docker uitvoeren in CentOS, Fedora of RHEL  (bedankt michael-n).


Belangrijk om te lezen: na installatie stappen voor Linux (het linkt ook naar Docker Daemon Attack Surface-details).

Docker beheren als een niet-rootgebruiker

De docker-daemon bindt zich aan een Unix-socket in plaats van aan een TCP-poort. Standaard is de Unix-socket eigendom van de root van de gebruiker en hebben andere gebruikers alleen toegang tot de socket via sudo. De docker-daemon wordt altijd als de rootgebruiker uitgevoerd.

Als u geen sudo wilt gebruiken wanneer u de opdracht docker gebruikt, maakt u een Unix-groep met de naam docker en voegt u gebruikers eraan toe. Wanneer de docker-daemon start, wordt de eigendom van de Unix-socket gelezen / beschrijfbaar door de koppelingsgroep.


  • Voeg de koppelingsgroep toe als deze nog niet bestaat:

    sudo groupadd docker
    
  • Voeg de verbonden gebruiker "$ USER" toe aan de koppelingsgroep. Wijzig de gebruikersnaam zodat deze overeenkomt met uw voorkeur gebruiker als u uw huidige gebruiker niet wilt gebruiken:

    sudo gpasswd -a $USER docker
    
  • Ofwel een newgrp docker of log / in / uit om de wijzigingen in groepen te activeren.

  • Je kunt gebruiken

    docker run hello-world
    

    om te controleren of je docker zonder sudo kunt uitvoeren.


952
2018-06-06 08:24



Is dat niet de meest onzekere architectuur voor productie? Ik moet iets missen - matt
Ja, maar elk bevoorrecht proces opent potentieel voor misbruik. Laadt docker zich zo diep in het besturingssysteem dat dit niveau van privileges echt wordt vereist? - matt
newgrp docker werkte niet voor mij, ik moest uitloggen. - lolmaus - Andrey Mikhaylov
Het is de moeite waard om erop te wijzen dat dit die gebruiker geeft onbeperkte, niet-wachtwoord beveiligde root-toegang. Zie details van de kwetsbaarheid hier - Chris Foster
u hoeft de docker-daemon NIET opnieuw te starten om deze wijziging te laten plaatsvinden !! gewoon de gebruiker die u zojuist hebt toegevoegd uitloggen en weer terug in - Tommy


Om de Docker-opdracht uit te voeren zonder sudo, je moet je gebruiker (die root-rechten heeft) toevoegen aan de docker-groep. Voor dit volgende commando:

 sudo usermod -aG docker $USER

Laat de gebruiker nu loggen en opnieuw inloggen. Deze oplossing is goed uitgelegd hier met het juiste installatieproces.


152
2018-02-27 19:57



nadat u gebruiker aan groep hebt toegevoegd, voert u deze opdracht uit: sg group_name -c "bash" - madjardi
niet echt nodig om het OS opnieuw te starten. Log uit en log opnieuw in. - binW
u hoeft het besturingssysteem niet opnieuw op te starten voordat deze wijziging plaatsvindt! Dat zal alle lopende containers bombarderen! Gewoon de gebruiker hebben waaraan u zojuist hebt uitgelogd en vervolgens hebt toegevoegd. - Tommy
Hoe is dat commando anders dan "sudo gpasswd -a $ {USER} docker" in een ander antwoord? Als het al ... - Ashley Aitken
Kunt u de waarschuwing van de documenten als volgt toevoegen: "De koppelingsgroep [...] is equivalent aan de root", zodat mensen de kans hebben erover na te denken - Murmel


Het mechanisme waardoor een gebruiker aan een groep wordt toegevoegd docker verleent toestemming om docker uit te voeren is om toegang te krijgen tot de socket van docker op /var/run/docker.sock. Als het bestandssysteem dat bevat /var/run is gekoppeld met ACL's ingeschakeld, dit kan ook worden bereikt via ACL's.

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

Ik neem dit alleen voor de volledigheid op.

Over het algemeen raad ik aan om ACL's te vermijden als er een goed alternatief op basis van groepen beschikbaar is: het is beter als de rechten in een systeem alleen kunnen worden begrepen door te kijken naar groepslidmaatschappen. Het scannen van het bestandssysteem voor ACL-ingangen om systeemprivileges te begrijpen, is een extra belasting voor beveiligingsaudits.


23
2017-12-01 16:08



Het werkte op 16.04 - edib
Dit is wat ik nodig had, andere antwoorden, vereisen dat de gebruiker root-toestemming heeft. Bedankt veel! - Mrinal Saurabh
Veel betere manier imo. De groepskoppeling is root-equivalent en dat is altijd een teken van gevaar. En ik zie geen enkel nadeel om eigenaar te worden van dit ene bestand. - Xerus
Zou je kunnen beschrijven welke commando's moeten worden uitgevoerd om "krijg toegang tot de socket van docker op /var/run/docker.sock"? - Yuval Atzmon
@Xerus als ik het goed begrijp, iedereen die naar deze socket kan schrijven, kan ook root-equivalente rechten krijgen. Het geven van toegang tot deze socket via ACL heeft hetzelfde beveiligingseffect als het toevoegen van die persoon aan de koppelingsgroep. - Paŭlo Ebermann