Docker: Boas Práticas de Segurança em Contêineres

Última atualização: 2026-08-26

A segurança de contêineres não é opcional — cada camada, da imagem ao runtime, precisa ser protegida.

1. O Que Você Vai Aprender



2. Uma História Sobre uma Auditoria de Segurança

(1) Ponto de Dor: 28 alertas de auditoria de segurança

A equipe de Charlie recebeu um relatório de auditoria de segurança: 28 alertas incluíam "Contêineres rodando como root" (alto risco), "Imagem contém 15 CVEs de alto risco" (alto risco) e "Secrets armazenadas em variáveis de ambiente" (risco médio). A pontuação da auditoria era de apenas 45; eles precisam elevá-la para 80 ou mais para alcançar a conformidade.

(2) Uma Abordagem Sistemática para Proteção de Segurança

Charlie liderou sua equipe na resolução dos problemas um por um: usuários não-root, varreduras Trivy para corrigir CVEs, migração para Docker Secrets e uso de seccomp para restringir chamadas de sistema.

BASH
# Proteção de segurança: não-root + capacidades mínimas
docker run -d \
  --user 1000:1000 \
  --cap-drop ALL \
  --cap-add NET_BIND_SERVICE \
  --security-opt no-new-privileges \
  --read-only \
  myapp:1.0

(3) Resultados: Pontuação de Auditoria 45→92

Após a proteção sistemática, a pontuação da auditoria melhorou de 45 para 92, e todos os problemas de alto risco foram resolvidos.



3. Modelo de Segurança em Camadas para Contêineres

(1) Segurança em Camadas

100%
graph TB
    L6["6. Gestão de Secrets<br/>Docker Secret / Vault"] --> L5["5. Cibersegurança<br/>Isolamento de rede / TLS"]
    L5 --> L4["4. Segurança de Runtime<br/>seccomp / AppArmor / capabilities"]
    L4 --> L3["3. Segurança de Imagens<br/>Varredura / Assinatura / Minimização"]
    L3 --> L2["2. Segurança do Docker Daemon<br/>TLS / Permissões de Usuário"]
    L2 --> L1["1. Segurança do Host<br/>Proteção do SO / Atualização de Kernel"]

(1) Comparação de Níveis de Segurança

Nível Medidas de Proteção Efeito
0 Configuração padrão Numerosos alertas
1 Não-root + tag latest Segurança básica
2 + Varredura de Imagem + Versão Fixa Segurança Moderada
3 + Capacidades Mínimas + seccomp Boa Segurança
4 + DCT + Gestão de Secrets Alta Segurança
5 + Isolamento de Rede + Logs de Auditoria Segurança Máxima


4. Varredura de Vulnerabilidades em Imagens

▶ Exemplo: Varredura de Imagem com Trivy (Dificuldade: ⭐⭐)

BASH
# Instalar Trivy (Linux)
curl -sfL https://raw.githubusercontent.com/aquasecurity/trivy/main/contrib/install.sh | sh

# Escanear uma imagem em busca de vulnerabilidades
trivy image nginx:1.25-alpine

# Escanear com filtro de severidade
trivy image --severity HIGH,CRITICAL nginx:1.25-alpine

# Escanear e gerar saída JSON
trivy image --format json --output report.json myapp:1.0
💻 Saída (trecho):

TEXT 📖 Somente leitura
nginx:1.25-alpine (alpine 3.19.0)
=========================
Total: 5 (HIGH: 2, CRITICAL: 0)

┌──────────┬────────────┬──────────┬──────────┬─────────────────┐
│ Library  │ Vulnerability│ Severity │ Version  │ Fixed Version   │
├──────────┼────────────┼──────────┼──────────┼─────────────────┤
│ libcurl  │ CVE-2023-xxxx│ HIGH     │ 8.4.0    │ 8.5.0           │
│ openssl  │ CVE-2023-yyyy│ HIGH     │ 3.1.3    │ 3.1.4           │
└──────────┴────────────┴──────────┴──────────┴─────────────────┘

▶ Exemplo: Varredura com Docker Scout (Dificuldade: ⭐⭐)

BASH
# Docker Scout (integrado ao Docker Desktop)
docker scout quickview nginx:latest

# Relatório detalhado de CVEs
docker scout cves nginx:latest

# Comparar duas imagens
docker scout compare --from nginx:1.24 --to nginx:1.25


5. O Princípio do Menor Privilégio

(1) Linux Capabilities

Capability Função Requisitos Comuns
NET_BIND_SERVICE Vincular a portas <1024 Serviços Web (80/443)
NET_RAW Pacotes de Rede Raw ping / Depuração de Rede
CHOWN Alterar Proprietário de Arquivo Gestão de Arquivos
SETUID / SETGID Alternar Usuário Algumas Ferramentas do Sistema
ALL Todas as Habilidades ❌ Não Usar

▶ Exemplo: --cap-drop Menor Privilégio (Dificuldade: ⭐⭐⭐)

BASH
# Remover TODAS as capacidades, adicionar apenas as necessárias
docker run -d \
  --name secure-app \
  --cap-drop ALL \
  --cap-add NET_BIND_SERVICE \
  --security-opt no-new-privileges \
  -p 80:8080 \
  myapp:1.0
Parâmetro Função
--cap-drop ALL Remover todas as capacidades Linux
--cap-add NET_BIND_SERVICE Adicionar apenas a capacidade de vincular a portas baixas
--security-opt no-new-privileges Escalonamento de privilégios proibido (setuid/setgid)
--read-only Sistema de arquivos somente leitura (requer tmpfs)
🔒 Segurança: --privileged concede aos contêineres quase todos os privilégios do host — nunca use isso em um ambiente de produção. Usar --cap-drop ALL + --cap-add sob demanda incorpora o princípio do menor privilégio.



6. Segurança em Tempo de Execução

▶ Exemplo: seccomp Restringe Chamadas de Sistema (Dificuldade: ⭐⭐⭐)

BASH
# Executar com um perfil seccomp personalizado
docker run -d \
  --security-opt seccomp=chrome.json \
  --name browser \
  chromium:latest

(1) seccomp Padrão do Docker

O Docker vem com um arquivo de configuração seccomp padrão que desabilita aproximadamente 44 chamadas de sistema perigosas (como mount, keyctl e add_key). A maioria das aplicações funciona normalmente com a configuração padrão.

▶ Exemplo: Assinatura Docker Content Trust (Dificuldade: ⭐⭐)

BASH
# Habilitar DCT para a sessão atual
export DOCKER_CONTENT_TRUST=1

# Fazer push de uma imagem assinada
docker push myorg/myapp:v1.0

# Pull: DCT verifica a assinatura
docker pull myorg/myapp:v1.0

# Pull de imagem não assinada: NEGADO (com DCT habilitado)
docker pull myorg/myapp:unsigned
# Error: No trust data for unsigned


7. Gestão Segura de Secrets

(1) Comparação de Três Métodos de Gestão de Secrets

Método Nível de Segurança Visibilidade Cenários Aplicáveis
Variáveis de Ambiente (-e) Baixo docker inspect Visível Ambiente de Desenvolvimento
Arquivos de Volume (-v) Médio Visível para Arquivos do Host Plano de Transição
Docker Secret Alto Armazenamento criptografado, montagem em runtime Ambiente de produção Swarm
Vault Externo Máximo Gestão Centralizada + Auditoria Nível empresarial


8. CIS Docker Benchmark

▶ Exemplo: Verificação de Linha de Base de Segurança Docker Bench (Dificuldade: ⭐⭐)

BASH
# Executar verificação CIS Docker Benchmark
docker run --rm --net host --pid host \
  --userns host --cap-drop audit_control \
  -e DOCKER_CONTENT_TRUST=$DOCKER_CONTENT_TRUST \
  -v /etc:/etc:ro \
  -v /lib/systemd/system:/lib/systemd/system:ro \
  -v /usr/bin/containerd:/usr/bin/containerd:ro \
  -v /usr/bin/runc:/usr/bin/runc:ro \
  -v /usr/lib/systemd:/usr/lib/systemd:ro \
  -v /var/lib:/var/lib:ro \
  -v /var/run/docker.sock:/var/run/docker.sock:ro \
  docker/docker-bench-security
💻 Saída (trecho):

TEXT 📖 Somente leitura
[INFO] 1 - Host Configuration
[INFO] 1.1  - Ensure Docker is up to date
[PASS] 1.2  - Ensure only trusted users are allowed to control Docker daemon
[WARN] 1.4  - Ensure a separate partition for containers has been created

[INFO] 4 - Container Images
[PASS] 4.1  - Ensure a user for the container has been created
[WARN] 4.7  - Ensure HEALTHCHECK instructions have been added
[WARN] 4.9  - Ensure COPY is used instead of ADD


9. Exemplo Completo: Proteção Completa de Contêineres de Produção

BASH
# ============================================
# Passo a passo completo: Proteção de contêiner de produção
# Da pontuação de auditoria 45 → 92
# ============================================

# Etapa 1: Verificar vulnerabilidades
trivy image --severity HIGH,CRITICAL myapp:1.0
# Corrigir: atualizar imagem base, fixar versões

# Etapa 2: Executar com restrições máximas de segurança
docker run -d \
  --name hardened-app \
  --user 1000:1000 \
  --cap-drop ALL \
  --cap-add NET_BIND_SERVICE \
  --security-opt no-new-privileges \
  --security-opt seccomp=default.json \
  --read-only \
  --tmpfs /tmp:rw,noexec,nosuid \
  --tmpfs /run:rw,noexec,nosuid \
  -v app-logs:/app/logs \
  --log-driver json-file \
  --log-opt max-size=10m \
  --log-opt max-file=3 \
  --health-cmd="curl -f http://localhost:8080/health || exit 1" \
  --health-interval=30s \
  --health-retries=3 \
  -p 8080:8080 \
  myapp:hardened

# Etapa 3: Verificar configuração de segurança
docker inspect hardened-app --format='
User: {{.Config.User}}
ReadOnly: {{.HostConfig.ReadonlyRootfs}}
Capabilities: {{.HostConfig.CapAdd}}
NoNewPrivileges: {{.HostConfig.SecurityOpt}}
'

# Etapa 4: Executar benchmark CIS
docker run --rm ... docker/docker-bench-security

# Etapa 5: Re-escanear após proteção
trivy image myapp:hardened

❓ Perguntas Frequentes

P: Os contêineres Docker podem ser completamente isolados? R: Não. Contêineres compartilham o kernel do host, e vulnerabilidades do kernel podem levar ao escape do contêiner. No entanto, os contêineres fornecem isolamento em nível de processo (namespace + cgroup + seccomp + AppArmor), o que reduz significativamente a superfície de ataque. Pontos-chave: Não use a opção --privileged, não execute como root e atualize o kernel prontamente.

P: Quais são os riscos de usar --privileged? R: --privileged concede ao contêiner quase todos os privilégios do host: acesso a todos os dispositivos, capacidade de modificar parâmetros do kernel, carregar módulos do kernel e contornar seccomp/AppArmor. Isso é essencialmente o mesmo que executar um programa diretamente no host. Nunca use --privileged em um ambiente de produção.

P: Quais ferramentas devo usar para varredura de vulnerabilidades em imagens? R: Trivy (open source, mais popular) ou Docker Scout (integrado ao Docker Desktop). Integre ao CI/CD: Realize varreduras automáticas após builds e bloqueie a implantação se vulnerabilidades CRITICAL forem detectadas. Recomendamos escanear imagens de produção diariamente e reconstruí-las prontamente após o lançamento de novos CVEs.

P: Qual é o problema de armazenar secrets em variáveis de ambiente? R: Existem três riscos: ① docker inspect Variáveis de ambiente são visíveis para qualquer pessoa; ② Processos filhos herdam variáveis de ambiente; ③ Variáveis de ambiente podem ser acidentalmente impressas em logs. Docker Secrets (Swarm) são armazenadas de forma criptografada e montadas como arquivos temporários em tempo de execução, o que é mais seguro. Em ambientes não-Swarm, use HashiCorp Vault.

P: O modo rootless é seguro? R: É muito seguro. O Docker Rootless executa todo o daemon Docker como um usuário comum, então mesmo que o próprio Docker tenha uma vulnerabilidade, um invasor teria apenas privilégios de usuário comum. No entanto, o modo rootless tem algumas limitações (sem opção --privileged, configuração de rede restrita). O modo rootless é recomendado para ambientes de produção.


📖 Resumo


📝 Exercícios

  1. Exercício Básico (Dificuldade: ⭐): Execute uma varredura Docker Bench Security em sua máquina local e registre quaisquer alertas de nível WARN.
  2. Desafio Avançado (Dificuldade: ⭐⭐): Use Trivy para escanear uma imagem existente e corrija todos os CVEs de nível CRITICAL.
  3. Desafio (Dificuldade: ⭐⭐⭐): Crie um contêiner com restrições seccomp e verifique se as restrições estão em vigor (por exemplo, desabilitando a chamada de sistema mount).
Web-Tutorial.com

Equipe Técnica Web-Tutorial

Uma plataforma de tutoriais mantida por diversos desenvolvedores. Cada tutorial é escrito e revisado por profissionais da área correspondente. Trabalhamos para manter nosso conteúdo preciso e confiável — se encontrar algum problema, avise-nos.

100%