Como posso usar o docker sem o sudo?

767

Nas páginas de documentação do Docker, todos os comandos de exemplo são mostrados sem sudo, como este:

docker ps

No Ubuntu, o binário é chamado docker.io. Também não funciona sem o sudo:

sudo docker.io ps

Como posso configurar o Docker para não precisar prefixar cada comando do Docker com o sudo?

Flimm
fonte
1
Não se esqueça de habilitar o ufw;)
Rinzwind 6/14
2
No Ubuntu 14.04, também o binário 'docker'.
Anatoly techtonik
@anatolytechtonik Eu também usei 'docker' em vez de 'docker.io' no Ubuntu 14.04 LTS
Nabin
2
A instalação recomendada não é a janela de encaixe nos repositórios padrão do ubuntu; em vez disso, instruções aqui ( docs.docker.com/engine/installation/linux/ubuntulinux ), recomendamos o uso do repositório do docker. Retirar todo o material janela de encaixe existente, e verificar se você está recebendo a partir da fonte de direito: apt-cache policy docker-engine(url apt deve ser de dockerproject.org)
michael
2
Que tal um apelido :? Dessa forma, você ainda usa o sudo, com proteção por senha. apelido docker = "sudo docker"
Andrej Panjkov 22/03

Respostas:

1136

Boas notícias: o novo docker (versão 19.03 (atualmente experimental)) poderá executar sem raiz, negando os problemas que podem ocorrer usando um usuário root. Chega de mexer com permissões elevadas, raiz e qualquer coisa que possa abrir sua máquina quando você não quiser.

Vídeo sobre isso no daemon [DockerCon 2019] Hardening Docker com modo sem raiz

Algumas advertências para o modo Docker sem raiz

Os engenheiros do Docker dizem que o modo sem raiz não pode ser considerado um substituto para o conjunto completo de recursos do mecanismo do Docker. Algumas limitações ao modo sem raiz incluem:

  • Os controles de recursos do cgroups, perfis de segurança do apparmor, ponto de verificação / restauração, redes de sobreposição etc. não funcionam no modo sem raiz.
  • A exposição de portas de contêineres atualmente requer um processo auxiliar socat manual.
  • Somente as distros baseadas no Ubuntu suportam sistemas de arquivos de sobreposição no modo sem raiz.
  • Atualmente, o modo sem raiz é fornecido apenas para compilações noturnas que podem não ser tão estáveis ​​quanto você está acostumado.

A partir do docker 19.3, isso é obsoleto (e mais perigoso do que o necessário):

O manual do docker tem a dizer sobre isso:

Dando acesso não raiz

O daemon docker sempre é executado como usuário raiz e, desde o Docker versão 0.5.2, o daemon docker se liga a um soquete Unix em vez de uma porta TCP. Por padrão, o soquete Unix pertence à raiz do usuário e, por padrão, você pode acessá-lo com o sudo.

A partir da versão 0.5.3, se você (ou o instalador do Docker) criar um grupo Unix chamado docker e adicionar usuários a ele, o daemon docker fará com que a propriedade do soquete Unix seja lida / gravável pelo grupo docker quando o daemon iniciar . O daemon docker sempre deve ser executado como usuário raiz, mas se você executar o cliente docker como usuário no grupo docker, não precisará adicionar sudo a todos os comandos do cliente. A partir do 0.9.0, você pode especificar que um grupo que não seja o docker deve possuir o soquete Unix com a opção -G.

Aviso: O grupo de janelas de encaixe (ou o grupo especificado com -G) é equivalente à raiz; consulte os detalhes do Docker Daemon Attack Surface e este post do blog sobre Por que não permitimos que usuários não root executem o Docker no CentOS, Fedora ou RHEL (obrigado michael-n).

Na versão recente do modo experimental sem raiz no GitHub , os engenheiros mencionam que o modo sem raiz permite executar o dockerd como um usuário sem privilégios, usando user_namespaces (7), mount_namespaces (7), network_namespaces (7).

Os usuários precisam executar o dockerd-rootless.sh em vez do dockerd.

$ dockerd-rootless.sh --experimental

Como o modo Rootless é experimental, os usuários precisam sempre executar o dockerd-rootless.sh com –experimental.


Importante para ler: etapas de pós-instalação para Linux (também vincula aos detalhes do Docker Daemon Attack Surface ).

Gerenciar o Docker como um usuário não raiz

O daemon do docker se liga a um soquete Unix em vez de uma porta TCP. Por padrão, o soquete Unix pertence à raiz do usuário e outros usuários podem acessá-lo apenas usando o sudo. O daemon docker sempre é executado como usuário root.

Se você não quiser usar o sudo ao usar o comando docker, crie um grupo Unix chamado docker e adicione usuários a ele. Quando o daemon do docker é iniciado, torna a propriedade do soquete Unix lida / gravável pelo grupo do docker.


  • Adicione o grupo de janelas de encaixe se ele ainda não existir:

    sudo groupadd docker
    
  • Adicione o usuário conectado "$ USER" ao grupo de janelas de encaixe. Altere o nome do usuário para corresponder ao seu usuário preferido, se você não quiser usar seu usuário atual:

    sudo gpasswd -a $USER docker
    
  • Faça um newgrp dockerou efetue logout / logon para ativar as alterações nos grupos.

  • Você pode usar

    docker run hello-world
    

    para verificar se você pode executar o docker sem o sudo.

Rinzwind
fonte
3
Sim, mas todo processo privilegiado abre potencial para exploração. O docker está se conectando tão profundamente ao sistema operacional para realmente exigir esse nível de privilégios?
Matt
3
newgrp dockernão funcionou para mim, eu tive que sair.
lolmaus - Andrey Mikhaylov
43
Vale ressaltar que isso fornece ao usuário acesso root irrestrito e não protegido por senha . Veja detalhes da vulnerabilidade aqui
Chris Foster
2
NÃO é necessário reiniciar o daemon do docker para que essa alteração ocorra !! só tem o usuário que você acabou de adicionar logout depois de volta na
Tommy
4
se você usar docker login, poderá descobrir que a .dockerpasta criada na sua pasta pessoal pertence root. assim você iria encontrar esse aviso ao executar comandos docker: WARNING: Error loading config file:/home/myuser/.docker/config.json - stat /home/myuser/.docker/config.json: permission denied. Eu fiz do meu usuário .dockerpasta acessível sem sudo assim: sudo chgrp -hR docker ~/.docker && sudo chown -R myuser ~/.docker. o chgrpnão pareceu ajudar, então provavelmente eu deveria apenas recomendar a etapa do chown.
Birchlabs
202

Para executar o comando docker sem sudo, você precisa adicionar seu usuário (que possui privilégios de root) ao grupo docker. Para esta execução, execute o seguinte comando:

 sudo usermod -aG docker $USER

Agora, faça o logout do usuário e faça o login novamente. Esta solução é bem explicada aqui com o processo de instalação adequado.

Rohini Choudhary
fonte
14
depois de adicionar usuário ao grupo, execute este comando: sg group_name -c "bash"
madjardi
4
você não precisa reiniciar o sistema operacional para que essa alteração ocorra! Isso bombardeará todos os contêineres em execução! Basta ter o usuário que você acabou de adicionar log out, em seguida, em.
Tommy
5
Como esse comando é diferente de "sudo gpasswd -a $ {USER} docker" em outra resposta? Se em tudo ...
Ashley Aitken
9
Você poderia adicionar o aviso dado pelos documentos: "O grupo de estivadores [...] é equivalente a raiz", para que as pessoas tenham a chance de pensar sobre isso
Murmel
2
O mesmo efeito que a resposta aceita 2 anos mais antiga, mas sem os avisos sobre os riscos à segurança
Gert van den Berg
57

O mecanismo pelo qual a adição de um usuário ao grupo dockerconcede permissão para executar o docker é obter acesso ao soquete do docker em /var/run/docker.sock. Se o sistema de arquivos que contém /var/runfoi montado com as ACLs ativadas, isso também pode ser alcançado através das ACLs.

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

Só estou incluindo isso por completo.

Em geral, eu recomendo evitar ACLs sempre que uma boa alternativa baseada em grupos estiver disponível: é melhor se os privilégios em um sistema puderem ser entendidos observando apenas as participações em grupos. Ter que procurar entradas do ACL no sistema de arquivos para entender os privilégios do sistema é um encargo adicional para as auditorias de segurança.

Aviso 1 : tem a mesma rootequivalência que adicionar usernameao dockergrupo. Você ainda pode iniciar um contêiner de uma maneira que tenha rootacesso ao sistema de arquivos host.

Aviso 2 : as ACLs são significativamente mais difíceis para auditorias de segurança do que a segurança baseada em grupo. Provavelmente, evite ACLs, se possível, quando você puder usar grupos, pelo menos em ambientes relevantes para auditoria.

Christian Hujer
fonte
5
Funcionou em 16.04
edib
Isto é o que eu precisava, outras respostas, exigem que o usuário tenha permissão de root. Muito obrigado!
Mrinal Saurabh
1
Muito melhor maneira imo. A janela de encaixe do grupo é equivalente à raiz e isso é sempre um sinal de perigo. E não vejo nenhuma desvantagem em assumir a propriedade desse arquivo.
Xerus
5
@ Xerus, se bem entendi, quem pode escrever neste soquete também pode obter privilégios equivalentes a root . Portanto, conceder a alguém acesso a esse soquete via ACL tem o mesmo efeito de segurança que adicionar essa pessoa ao grupo de janelas de encaixe.
Pa Elo Ebermann
1
Trabalhou no Linux Mint 19 para mim. Obrigado.
Estamos Borg