A segurança de containers é um tema crítico na infraestrutura moderna, especialmente com a adoção generalizada de Docker e Kubernetes. Containers oferecem isolamento leve, mas compartilham o kernel do host, o que introduz riscos específicos. Nesta aula, vamos explorar as melhores práticas para garantir que seus containers sejam seguros desde a construção da imagem até a execução.

Abordaremos quatro áreas fundamentais: imagens, run-time, vulnerabilidades e image scanning. Cada uma delas requer atenção para evitar que vulnerabilidades comuns comprometam a segurança do ambiente.

Imagens

Imagens de containers são a base de qualquer aplicação containerizada. Escolher imagens oficiais e de fontes confiáveis é o primeiro passo para a segurança. Imagens oficiais no Docker Hub são mantidas pelas equipes dos projetos e passam por revisões de segurança, enquanto imagens não oficiais podem conter malware ou configurações inseguras.

Além disso, é importante minimizar o tamanho da imagem, removendo ferramentas e dependências desnecessárias. Isso reduz a superfície de ataque. Use imagens base como Alpine Linux, que são enxutas e têm menos vulnerabilidades conhecidas. Evite usar a tag latest, pois ela pode mudar sem aviso; prefira tags específicas de versão.

Exemplo de Dockerfile seguro:

FROM alpine:3.18
RUN apk add --no-cache python3
COPY app.py /app/
CMD ["python3", "/app/app.py"]

Observe o uso de versão específica e a instalação de apenas o necessário.

Run-time

A segurança em tempo de execução envolve configurar corretamente os privilégios e recursos do container. Por padrão, containers rodam como root, o que é perigoso. Sempre execute containers com um usuário não privilegiado, usando a instrução USER no Dockerfile ou a opção --user no comando docker run.

Outras práticas incluem: limitar capacidades do kernel com --cap-drop=ALL e adicionar apenas as necessárias; usar sistemas de arquivos somente leitura quando possível (--read-only); e restringir o acesso à rede com políticas de rede. Em orquestradores como Kubernetes, utilize SecurityContext e PodSecurityPolicies para aplicar essas restrições.

Exemplo de execução segura:

docker run --rm -it --user 1001 --cap-drop=ALL --read-only --tmpfs /tmp alpine:3.18 sh

Isso roda o container com um usuário não root, sem capacidades extras, sistema de arquivos somente leitura e um diretório /tmp temporário gravável.

Vulnerabilidades

Vulnerabilidades em containers podem vir de várias fontes: imagem base desatualizada, bibliotecas com CVEs conhecidas, configurações incorretas ou até mesmo o próprio kernel do host. Ataques como escape de container, onde um processo dentro do container obtém acesso ao host, são especialmente perigosos.

Para mitigar, mantenha as imagens atualizadas, assine suas imagens com Docker Content Trust (DCT) para garantir integridade, e evite montar diretórios sensíveis do host (/var/run/docker.sock por exemplo). Use ferramentas de análise estática e dinâmica para identificar vulnerabilidades antes da implantação.

Exemplo de vulnerabilidade comum: CVE-2024-21626 no runc, que permite escalonamento de privilégios. A correção é atualizar o runc para a versão patched.

Image scanning

Image scanning é o processo de analisar imagens de containers em busca de vulnerabilidades conhecidas, malwares, segredos expostos e más configurações. Ferramentas como Trivy, Clair, Snyk e Docker Scout integram-se ao pipeline de CI/CD para escanear imagens automaticamente.

O scanning deve ser feito em várias etapas: ao construir a imagem, ao armazená-la em um registry e antes de implantar. É importante definir políticas de severidade (por exemplo, bloquear deploys se houver vulnerabilidades críticas). Além disso, o scanning pode detectar segredos acidentalmente incluídos na imagem, como senhas ou chaves SSH.

Exemplo de comando com Trivy:

trivy image --severity HIGH,CRITICAL alpine:3.18

Isso escaneia a imagem Alpine e reporta apenas vulnerabilidades altas e críticas.

Boas Práticas e Observações Finais

Além dos tópicos acima, considere: usar multi-stage builds para reduzir o tamanho da imagem final; assinar e verificar imagens com Notary ou Cosign; implementar políticas de rede para isolar containers; e monitorar logs e eventos de segurança com ferramentas como Falco. A segurança de containers é um processo contínuo, que deve ser integrado ao ciclo de vida da aplicação.

Referências

Exercícios

  1. Explique por que é importante evitar usar a tag 'latest' em imagens de containers e dê um exemplo de tag específica segura.

    ✓ Resposta: A tag 'latest' é mutável e pode apontar para diferentes versões ao longo do tempo, o que pode introduzir mudanças inesperadas ou vulnerabilidades. É recomendável usar tags específicas como 'alpine:3.18' para garantir consistência e rastreabilidade.
  2. Qual comando Docker você usaria para executar um container com privilégios mínimos? Escreva um exemplo.

    ✓ Resposta:
    docker run --rm -it --user 1001 --cap-drop=ALL --read-only alpine:3.18 sh
  3. Cite duas fontes comuns de vulnerabilidades em containers e como mitigá-las.

    ✓ Resposta: Fontes comuns: imagem base desatualizada (mitigação: usar imagens atualizadas e escanear regularmente) e configurações inseguras como rodar como root (mitigação: usar usuário não root e limitar capacidades).
  4. O que é image scanning e por que ele é importante no ciclo de vida de containers?

    ✓ Resposta: Image scanning é a análise automatizada de imagens em busca de vulnerabilidades, segredos e más configurações. É importante porque permite detectar riscos antes da implantação, reduzindo a superfície de ataque e garantindo conformidade.
  5. Escreva um comando Trivy para escanear a imagem 'nginx:1.25' e exibir apenas vulnerabilidades críticas.

    ✓ Resposta:
    trivy image --severity CRITICAL nginx:1.25