Nas páginas de documentação do Docker's, todos os comandos de exemplo são mostrados sem o sudo
, como este:
docker ps
No Ubuntu, o binário é chamado de `docker.io'. Ele também não funciona sem o sudo:
sudo docker.io ps
Como posso configurar o Docker para que eu não'não preciso prefixar cada comando Docker com sudo?
Boas notícias: o novo docker (versão 19.03 (atualmente experimental)) será capaz de rodar sem root, negando os problemas que podem ocorrer usando um usuário root. Não mexa mais com permissões elevadas, root e qualquer coisa que possa abrir sua máquina quando você não quiser.
Vídeo sobre isto de [DockerCon 2019] Hardening Docker daemon with Rootless mode
Algumas Caveats para o modo Docker sem raiz
Os engenheiros da Docker dizem que o modo sem raiz não pode ser considerado um substituto para o conjunto completo de características do motor Docker. Algumas limitações para o modo sem raiz incluem:
- Os controles de recursos de cgroups, perfis de segurança de apparmor, checkpoint/restore, redes overlay, etc. não funcionam no modo rootless.
- A exposição de portas de contentores requer actualmente um processo de socat helper manual.
- Somente distros baseadas em Ubuntu suportam sistemas de arquivos sobrepostos no modo rootless.
- O modo sem raiz é atualmente fornecido apenas para construções noturnas que podem não ser tão estáveis quanto você está acostumado.
A partir do estivador 19.3 isto é obsoleto (e mais perigoso do que é necessário):
O manual do estivador tem isto a dizer sobre isso:
**Dando acesso não-raiz***
O daemon de doca corre sempre como utilizador root, e desde a versão 0.5.2 do Docker, o daemon de doca liga-se a um socket Unix em vez de uma porta TCP. Por padrão, esse socket Unix é de propriedade do usuário root, e assim, por padrão, você pode acessá-lo com o sudo.
Iniciando na versão 0.5.3, se você (ou seu instalador Docker) criar um grupo Unix chamado docker e adicionar usuários a ele, então o daemon da docker fará com que a propriedade do soquete Unix seja lida/escrita pelo grupo da docker quando o daemon iniciar. O daemon do docker deve sempre ser executado como usuário root, mas se você executar o docker client como um usuário no grupo docker então você não precisa adicionar sudo a todos os comandos do cliente. A partir da 0.9.0, você pode especificar que um grupo diferente do docker deve ser dono do soquete Unix com a opção -G.
Aviso: O grupo docker (ou o grupo especificado com -G) é equivalente à raiz; veja Docker Daemon Attack Surface details e este post do blog em Porque não deixamos usuários não-root rodar Docker no CentOS, Fedora, ou RHEL ** (obrigado michael-n).
No recente lançamento do modo experimental rootless no GitHub, engenheiros mencionam que o modo rootless permite executar o dockerd como um usuário sem privilégios, usando user_namespaces(7), mount_namespaces(7), network_namespaces(7).
Os utilizadores precisam de executar dockerd-rootless.sh em vez de dockerd.
$ dockerd-rootless.sh -experimental
Como o modo Rootless é experimental, os usuários precisam sempre rodar dockerd-rootless.sh com -experimental.
Importante para ler: passos pós-instalação para Linux (também se liga a detalhes da superfície de ataque do Docker Daemon).
**Gerenciar Docker como um usuário não-root***
O daemon de doca liga-se a uma tomada Unix em vez de uma porta TCP. Por padrão, o socket Unix é propriedade do usuário root e outros usuários só podem acessá-lo usando o sudo. O daemon de encaixe sempre é executado como usuário root.
Se você não quiser usar o sudo quando usar o comando docker, crie um grupo Unix chamado docker e adicione usuários a ele. Quando o daemon das docas inicia, ele torna a propriedade do soquete Unix legível/escritível pelo grupo de docas.
Adicione o grupo de estivadores se ele ainda não existir:
sudo groupadd docker
Adicione o usuário conectado "$USER" ao grupo de atracação. Mude o nome do usuário para corresponder ao seu usuário preferido se você não quiser usar o seu usuário atual:
sudo gpasswd - uma doca de $USER
Faça um 'newgrp docker' ou log out/in para ativar as alterações nos grupos.
Você pode usar o
estivador corre o mundo do inferno
para verificar se consegues correr a doca sem o sudo.
Para executar o comando docker sem o sudo
, você precisa adicionar seu usuário (que tem privilégios de root) ao grupo docker. Para isso, 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.
O mecanismo pelo qual adicionando um usuário ao grupo docker' concede permissão para executar o docker é obter acesso ao socket do docker em
/var/run/docker.sock'. Se o sistema de arquivos que contém `/var/run' foi montado com ACLs habilitadas, isto também pode ser conseguido através de ACLs.
sudo setfacl -m user:$USER:rw /var/run/docker.sock
Só estou a incluir isto para ser exaustivo.
Em geral, eu recomendo evitar ACLs sempre que uma boa alternativa baseada em grupos estiver disponível: É melhor se os privilégios de um sistema puderem ser entendidos olhando apenas para os membros do grupo. Ter de procurar entradas ACL no sistema de ficheiros para compreender os privilégios do sistema é um fardo adicional para auditorias de segurança.
Aviso 1: Isto tem a mesma equivalência de root
como adicionar nome do usuário
ao grupo docker
. Você ainda pode iniciar um container de uma forma que tenha acesso root
ao sistema de arquivos do host.
Aviso 2: As ACLs são significativamente mais difíceis para auditorias de segurança do que a segurança em grupo. Provavelmente evite ACLs, se possível, quando você pode usar grupos em vez disso, pelo menos em ambientes relevantes para auditoria.