
Tenho um problema com a instalação do meu docker. Por alguns motivos de segurança configurei meu "daemon.json" para que o namespace seja alternado para outro usuário ( userns-remap
). Agora tenho o problema de que se eu executar um contêiner (com contexto de usuário alternado ( USER containeruser
) e tentar executar ping em outro que esteja na mesma rede de contêineres, recebo o seguinte erro:
$ ping 172.16.0.3
PING 172.16.0.3 (172.16.0.3): 56 data bytes
ping: permission denied (are you root?)
Já tentei várias coisas com o AppArmor, atribuindo mais capacidades e assim por diante. Mas nada ajudou a resolver esse problema.
A imagem em execução é um Linux alpino sem quaisquer modificações.
Você tem uma solução para o meu problema?
Responder1
DR
apk add iputils
Explicação
Alpine é baseado emcaixa ocupadaque implementa os comandos usuais do Linux em um único binário. Se você olhar o /bin
diretório em sua imagem alpina base, verá que o ping
comando (como outros) é um link simbólico para/bin/busybox
Para ser executado como um usuário normal, ping
precisa doum pouco idiotadefinir. Você pode ficar tentado a definir o bit suid no link simbólico (ou seja, chmod u+s /bin/ping
). Mas isso na verdade o configuraria no binário do busybox e, portanto, em todos os outros comandos registrados como um link simbólico, o que seria uma violação de segurança.
Felizmente, existe um iputils
pacote no Alpine que contém uma versão alternativa do ping
. Se você instalá-lo, ele substituirá o link simbólico por um binário simples contendo as permissões necessárias para ser executado por todos. Basta adicionar o comando necessário acima em uma RUN
linha no seu Dockerfile.
Responder2
Embora não responda à pergunta do OP, pode ser útil para pessoas que procuram o erro no título.
Você pode executar o seguinte comando para entrar no shell como usuário root do contêiner docker.
docker exec -u 0 -it <container-name> <shell>
Dependendo do shell presente na imagem, shell
pode ser qualquer um entre zsh
, bash
, sh
, ash
, etc. Você pode encontrar através do método de tentativa e erro.
Isso é especialmente útil se você não tiver o dockerfile para modificá-lo (por exemplo, ao buscar a imagem do docker diretamente do registro).