Come posso usare la finestra mobile senza sudo?


767

Nelle pagine della documentazione di Docker, tutti i comandi di esempio sono mostrati senza sudo, come questo:

docker ps

Su Ubuntu viene chiamato il binario docker.io. Inoltre non funziona senza sudo:

sudo docker.io ps

Come posso configurare Docker in modo da non dover aggiungere il prefisso a ogni comando Docker con sudo?


1
Non dimenticare di abilitare ufw;)
Rinzwind

2
Su Ubuntu 14.04 c'è anche il binario 'docker'.
Anatoly Techtonik,

@anatolytechtonik Ho anche usato 'docker' invece di 'docker.io' in Ubuntu 14.04 LTS
Nabin,

2
L'installazione consigliata non è la finestra mobile nei repository ubuntu predefiniti; invece, le istruzioni qui ( docs.docker.com/engine/installation/linux/ubuntulinux ), raccomandano di usare il repository docker. Rimuovi tutte le cose esistenti dalla finestra mobile e verifica che stai ricevendo quella dalla fonte giusta: apt-cache policy docker-engine(l'URL apt dovrebbe essere di dockerproject.org)
michael

2
Che ne dici di un alias :? In questo modo, usi ancora sudo, con protezione tramite password. alias docker = "sudo docker"
Andrej Panjkov

Risposte:


1136

Buone notizie: la nuova finestra mobile (versione 19.03 (attualmente in fase di sperimentazione)) sarà in grado di eseguire rootless negando i problemi che possono verificarsi utilizzando un utente root. Niente più pasticci con permessi elevati, root e tutto ciò che potrebbe aprire il tuo computer quando non volevi.

Video su questo da [DockerCon 2019] Indurimento del demone Docker con modalità Rootless

Alcuni avvertimenti sulla modalità Docker rootless

Gli ingegneri Docker affermano che la modalità rootless non può essere considerata una sostituzione della suite completa di funzionalità del motore Docker. Alcune limitazioni alla modalità rootless includono:

  • i controlli delle risorse di cgroups, i profili di sicurezza di apparmor, il checkpoint / restore, le reti di overlay ecc. non funzionano in modalità rootless.
  • L'esposizione delle porte dai container richiede attualmente un processo manuale di supporto socat.
  • Solo le distribuzioni basate su Ubuntu supportano i filesystem overlay in modalità rootless.
  • La modalità Rootless è attualmente prevista solo per build notturne che potrebbero non essere stabili come al solito.

A partire dalla docker 19.3 questo è obsoleto (e più pericoloso del necessario):

Il manuale docker ha questo da dire al riguardo:

Dare accesso non root

Il daemon docker viene sempre eseguito come utente root e, dalla Docker versione 0.5.2, il daemon docker si collega a un socket Unix anziché a una porta TCP. Per impostazione predefinita, il socket Unix è di proprietà dell'utente root e quindi, per impostazione predefinita, è possibile accedervi con sudo.

A partire dalla versione 0.5.3, se tu (o il tuo installer Docker) crei un gruppo Unix chiamato docker e aggiungi utenti ad esso, il demone docker renderà la proprietà del socket Unix leggibile / scrivibile dal gruppo docker all'avvio del demone . Il daemon docker deve essere sempre eseguito come utente root, ma se si esegue il client docker come utente nel gruppo docker, non è necessario aggiungere sudo a tutti i comandi client. A partire dalla 0.9.0, è possibile specificare che un gruppo diverso dalla finestra mobile deve possedere il socket Unix con l'opzione -G.

Avvertenza: il gruppo docker (o il gruppo specificato con -G) è equivalente alla radice; vedi i dettagli della superficie di attacco dei demoni Docker e questo post sul blog Perché non consentiamo agli utenti non root di eseguire Docker in CentOS, Fedora o RHEL (grazie michael-n).

Nella recente versione della modalità sperimentale rootless su GitHub , gli ingegneri menzionano la modalità rootless che consente di eseguire dockerd come utente non privilegiato, utilizzando user_namespaces (7), mount_namespaces (7), network_namespaces (7).

Gli utenti devono eseguire dockerd-rootless.sh invece di dockerd.

$ dockerd-rootless.sh --experimental

Poiché la modalità Rootless è sperimentale, gli utenti devono sempre eseguire dockerd-rootless.sh con –experimental.


Importante da leggere: passaggi successivi all'installazione per Linux (si collega anche ai dettagli di Docker Daemon Attack Surface ).

Gestisci Docker come utente non root

Il daemon docker si collega a un socket Unix anziché a una porta TCP. Per impostazione predefinita, il socket Unix è di proprietà dell'utente root e gli altri utenti possono accedervi solo tramite sudo. Il daemon docker viene sempre eseguito come utente root.

Se non vuoi usare sudo quando usi il comando docker, crea un gruppo Unix chiamato docker e aggiungi utenti ad esso. Quando il daemon docker viene avviato, rende la proprietà del socket Unix leggibile / scrivibile dal gruppo docker.


  • Aggiungi il gruppo docker se non esiste già:

    sudo groupadd docker
    
  • Aggiungi l'utente connesso "$ USER" al gruppo docker. Modificare il nome utente in modo che corrisponda all'utente preferito se non si desidera utilizzare l'utente corrente:

    sudo gpasswd -a $USER docker
    
  • Fare un newgrp dockero disconnettersi / accedere per attivare le modifiche ai gruppi.

  • Puoi usare

    docker run hello-world
    

    per verificare se è possibile eseguire la finestra mobile senza sudo.


3
Sì, ma ogni processo privilegiato apre un potenziale di sfruttamento. La docker si collega così profondamente al sistema operativo per imporre davvero quel livello di privilegi?
matt

3
newgrp dockernon ha funzionato per me, ho dovuto disconnettermi.
lolmaus - Andrey Mikhaylov,

43
Vale la pena sottolineare che ciò offre all'utente l' accesso alla radice senza restrizioni e senza password . Vedi i dettagli della vulnerabilità qui
Chris Foster,

2
NON è necessario riavviare il daemon docker affinché questa modifica abbia luogo !! chiedi all'utente che hai appena aggiunto di disconnetterti e riconnetterti
Tommy,

4
se lo usi docker login, potresti scoprire che la .dockercartella creata nella tua cartella home appartiene root. in tal modo si dovrebbe incontrare questo avviso quando si esegue i comandi della finestra mobile: WARNING: Error loading config file:/home/myuser/.docker/config.json - stat /home/myuser/.docker/config.json: permission denied. Ho fatto del mio utente .dockercartella accessibile senza sudo in questo modo: sudo chgrp -hR docker ~/.docker && sudo chown -R myuser ~/.docker. il chgrpnon sembra aiutare, quindi probabilmente dovrei solo raccomandare il passaggio chown.
Birchlabs,

202

Per eseguire il comando docker senza sudo, è necessario aggiungere l'utente (che dispone dei privilegi di root) al gruppo docker. Per questo eseguire il comando seguente:

 sudo usermod -aG docker $USER

Ora, fai disconnettere l'utente e accedi nuovamente. Questa soluzione è ben spiegata qui con il corretto processo di installazione.


14
dopo aver aggiunto l'utente al gruppo, eseguire questo comando: sg nome_gruppo -c "bash"
madjardi

4
non è necessario riavviare il sistema operativo affinché questa modifica abbia luogo! Ciò bombarderà tutti i container in esecuzione! Basta avere l'utente che hai appena aggiunto, quindi disconnettiti.
Tommy,

5
In che modo quel comando è diverso da "sudo gpasswd -a $ {USER} docker" in un'altra risposta? Se mai ...
Ashley Aitken,

9
Potresti per favore aggiungere l'avvertimento dato dai documenti: "Il gruppo docker [...] è root-equivalente", quindi le persone hanno la possibilità di pensarci
Murmel

2
Stesso effetto della risposta accettata per 2 anni più vecchia, ma senza avvertimenti sui rischi per la sicurezza
Gert van den Berg,

57

Il meccanismo mediante il quale l'aggiunta di un utente al gruppo dockerconcede l'autorizzazione per eseguire la finestra mobile è ottenere l'accesso al socket della finestra mobile in /var/run/docker.sock. Se il filesystem che contiene /var/runè stato montato con ACL abilitati, questo può essere ottenuto anche tramite ACL.

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

Lo sto includendo solo per completezza.

In generale, consiglio di evitare ACL ogni volta che è disponibile una buona alternativa basata su gruppi: è meglio se i privilegi in un sistema possono essere compresi osservando solo le appartenenze ai gruppi. Dover eseguire la scansione del file system per le voci ACL al fine di comprendere i privilegi di sistema è un onere aggiuntivo per i controlli di sicurezza.

Avviso 1 : ha la stessa rootequivalenza dell'aggiunta usernameal dockergruppo. È comunque possibile avviare un contenitore in modo da avere rootaccesso al file system host.

Avviso 2 : gli ACL sono significativamente più difficili per i controlli di sicurezza rispetto alla sicurezza basata su gruppi. Probabilmente evitare ACL, se possibile, quando è possibile utilizzare i gruppi, almeno in ambienti rilevanti per il controllo.


5
Ha funzionato il 16.04
edib il

Questo è ciò di cui avevo bisogno, altre risposte, richiedono all'utente di avere il permesso di root. Grazie mille!
Mrinal Saurabh,

1
Modo molto migliore imo. La finestra mobile del gruppo è equivalente alla radice e questo è sempre un segnale di pericolo. E non vedo alcun svantaggio di prendere la proprietà di questo unico file.
Xerus,

5
@Xerus se ho capito bene, chiunque può scrivere su questo socket può ottenere anche privilegi equivalenti a root . Pertanto, dare a qualcuno l'accesso a questo socket tramite ACL ha lo stesso effetto di sicurezza dell'aggiunta di quella persona al gruppo docker.
Paŭlo Ebermann,

1
Ho lavorato su Linux Mint 19 per me. Grazie.
Siamo Borg il
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.