
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 sudo
:
sudo docker.io ps
Como posso configurar o Docker para não precisar prefixar todos os comandos do Docker com sudo
?
Responder1
Boas notícias: a nova versão 19.03 do Docker (atualmente experimental) será capaz de rodar sem root, negando os problemas que podem ocorrer ao usar um usuário root. Chega de mexer com permissões elevadas, root e qualquer coisa que possa abrir sua máquina quando você não deseja.
Vídeo sobre isso de[DockerCon 2019] Fortalecendo o daemon Docker com modo Rootless
Algumas advertências para o modo Docker sem root
Os engenheiros do Docker dizem que o modo rootless não pode ser considerado um substituto para o conjunto completo de recursos do mecanismo Docker. Algumas limitações do modo sem raiz incluem:
- controles de recursos de cgroups, perfis de segurança de 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.
- Apenas distros baseadas em 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 está obsoleto (e mais perigoso do que o necessário):
OManual do Dockertem isso a dizer sobre isso:
Dando acesso não root
O daemon docker sempre é executado como usuário root e, desde a versão 0.5.2 do Docker, o daemon docker se liga a um soquete Unix em vez de a uma porta TCP. Por padrão, esse soquete Unix pertence ao usuário root e, portanto, por padrão, você pode acessá-lo com sudo.
A partir da versão 0.5.3, se você (ou seu instalador do Docker) criar um grupo Unix chamado docker e adicionar usuários a ele, o daemon do docker tornará a propriedade do soquete Unix lida/gravável pelo grupo do docker quando o daemon for iniciado . O daemon do docker deve sempre ser executado como usuário root, mas se você executar o cliente do docker como um usuário no grupo do docker, não será necessário adicionar sudo a todos os comandos do cliente. A partir da versão 0.9.0, você pode especificar que um grupo diferente do docker deve possuir o soquete Unix com a opção -G.
Aviso: o grupo docker (ou o grupo especificado com -G) é equivalente à raiz; verDetalhes da superfície de ataque do Docker Daemone esta postagem do blog emPor que não permitimos que usuários não root executem o Docker no CentOS, Fedora ou RHEL(obrigado Michael-n).
No recente lançamento domodo 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 dockerd-rootless.sh em vez de dockerd.
$ dockerd-rootless.sh --experimental
Como o modo Rootless é experimental, os usuários precisam sempre executar dockerd-rootless.sh com –experimental.
Importante ler:etapas de pós-instalação para Linux(também tem links paraDetalhes da superfície de ataque do Docker Daemon).
Gerencie o Docker como um usuário não root
O daemon docker se liga a um soquete Unix em vez de a uma porta TCP. Por padrão, o soquete Unix pertence ao usuário root e outros usuários só podem acessá-lo usando sudo. O daemon docker sempre é executado como usuário root.
Se você não quiser usar sudo ao usar o comando docker, crie um grupo Unix chamado docker e adicione usuários a ele. Quando o daemon do docker é iniciado, ele torna a propriedade do soquete Unix legível/gravável pelo grupo do docker.
Adicione o
docker
grupo se ele ainda não existir:sudo groupadd docker
Adicione o usuário conectado "$USER" ao
docker
grupo. Altere o nome de usuário para corresponder ao seu usuário preferido se não quiser usar o usuário atual:sudo gpasswd -a $USER docker
Faça um
newgrp docker
ou efetue logout/login 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
.
Responder2
Para executar o comando docker sem 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 com que o usuário saia e faça login novamente. Esta solução está bem explicadaaquicom processo de instalação adequado.
Responder3
O mecanismo pelo qual adicionar um usuário ao grupo docker
concede 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/run
foi montado com ACLs habilitadas, isso também pode ser alcançado por meio de ACLs.
sudo setfacl -m user:$USER:rw /var/run/docker.sock
Estou incluindo isso apenas para completar.
Em geral, recomendo evitar ACLs sempre que uma boa alternativa baseada em grupos estiver disponível: É melhor que os privilégios em um sistema possam ser compreendidos observando-se apenas as associações de grupo. Ter que verificar o sistema de arquivos em busca de entradas ACL para entender os privilégios do sistema é um fardo adicional para auditorias de segurança.
Aviso 1: Isso tem a mesma root
equivalência que adicionar $USER
ao docker
grupo. Você ainda pode iniciar um contêiner de uma forma que tenha root
acesso 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 puder usar grupos, pelo menos em ambientes relevantes para auditoria.
Responder4
Os contêineres Docker precisam ser executados por um superusuário. Você pode se adicionar ao docker
grupo (por exemplo, executando sudo usermod -aG docker $USER
), mas isso torna mais fácil para qualquer pessoa com acesso à $USER
conta obter acesso root à máquina (por exemplo, montando um volume raiz em um contêiner privilegiado).
Uma maneira mais consciente de segurança de executar contêineres Docker como um usuário não root seria usarPodman. Do seu site:
Podman é um mecanismo de contêiner sem daemon para desenvolver, gerenciar e executar contêineres OCI em seu sistema Linux. Os contêineres podem ser executados como root ou emmodo sem raiz. Simplificando:
alias docker=podman
.
Outra alternativa éSingularidade, que é mais comumente implantado em ambientes HPC.