Removendo Capacidades de Contêineres Docker
Nesta etapa, aprenderemos como remover capacidades de contêineres Docker usando a flag --cap-drop. Esta é uma prática de segurança importante que segue o princípio do menor privilégio - os contêineres devem ter apenas as capacidades de que absolutamente precisam.
Sintaxe Básica para Remover Capacidades
A sintaxe básica para remover uma capacidade de um contêiner Docker é:
docker run --cap-drop=<CAPABILITY> <IMAGE> <COMMAND>
Vamos tentar remover a capacidade CHOWN, que permite alterar a propriedade do arquivo:
docker run --rm -it --cap-drop=CHOWN ubuntu:22.04 capsh --print
Na saída, você notará que cap_chown não está mais listado entre as capacidades:
Current: cap_dac_override,cap_fowner,cap_fsetid,cap_kill,cap_setgid,cap_setuid,cap_setpcap,cap_net_bind_service,cap_net_raw,cap_sys_chroot,cap_mknod,cap_audit_write,cap_setfcap=ep
Removendo Múltiplas Capacidades
Você pode remover várias capacidades especificando a flag --cap-drop várias vezes:
docker run --rm -it --cap-drop=CHOWN --cap-drop=NET_RAW ubuntu:22.04 capsh --print
Este comando remove as capacidades CHOWN e NET_RAW do contêiner.
Exemplo Prático: Testando Restrições de Capacidade
Vamos criar um contêiner com a capacidade CHOWN removida e tentar alterar a propriedade do arquivo:
docker run --rm -it --cap-drop=CHOWN ubuntu:22.04 /bin/bash
Dentro do contêiner, vamos criar um arquivo de teste e tentar alterar sua propriedade:
touch test_file
ls -l test_file
chown nobody:nogroup test_file
Você deve ver uma mensagem de erro indicando que a operação não é permitida:
chown: changing ownership of 'test_file': Operation not permitted
Isso demonstra que a remoção da capacidade CHOWN impede que o contêiner altere a propriedade do arquivo, mesmo que o contêiner esteja sendo executado como root. Digite exit para sair do contêiner.
Usando --cap-add e --cap-drop
Você pode usar as flags --cap-add e --cap-drop no mesmo comando para controlar com precisão as capacidades do seu contêiner:
docker run --rm -it --cap-add=NET_ADMIN --cap-drop=CHOWN ubuntu:22.04 capsh --print
Este comando adiciona a capacidade NET_ADMIN enquanto remove a capacidade CHOWN.
Removendo Todas as Capacidades e Adicionando as Específicas
Para máxima segurança, você pode remover todas as capacidades e, em seguida, adicionar apenas as específicas de que sua aplicação precisa:
docker run --rm -it --cap-drop=ALL --cap-add=NET_BIND_SERVICE ubuntu:22.04 capsh --print
Este comando cria um contêiner com apenas a capacidade NET_BIND_SERVICE, que permite a ligação a portas privilegiadas (abaixo de 1024).
Testando um Contêiner com Todas as Capacidades Removidas
Vamos criar um contêiner com todas as capacidades removidas e observar as restrições:
docker run -d --name no-caps --cap-drop=ALL ubuntu:22.04 sleep 3600
Agora, vamos anexar ao contêiner e tentar executar várias operações:
docker exec -it no-caps /bin/bash
Dentro do contêiner, tente fazer ping em um host externo:
apt-get update && apt-get install -y iputils-ping
ping -c 1 google.com
Você provavelmente verá um erro porque o contêiner não tem as capacidades necessárias para criar sockets de rede brutos necessários para o ping.
Saia do contêiner digitando exit e, em seguida, limpe:
docker stop no-caps
docker rm no-caps
Ao entender como remover capacidades de contêineres Docker, você pode aprimorar significativamente a segurança de suas aplicações em contêineres, limitando estritamente o que cada contêiner pode fazer.