DR

DR

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 /bindiretório em sua imagem alpina base, verá que o pingcomando (como outros) é um link simbólico para/bin/busybox

Para ser executado como um usuário normal, pingprecisa 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 iputilspacote 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 RUNlinha 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, shellpode 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).

informação relacionada