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
- Linha de Base de Segurança CIS Docker Bench
- Assinatura e Verificação de Imagens (Docker Content Trust)
- Segurança em tempo de execução (seccomp/AppArmor)
- Política de Gestão de Secrets
- Princípio do Menor Privilégio
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.
# 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
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: ⭐⭐)
# 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
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: ⭐⭐)
# 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: ⭐⭐⭐)
# 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) |
--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: ⭐⭐⭐)
# 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: ⭐⭐)
# 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: ⭐⭐)
# 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
[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
# ============================================
# 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 inspectVariá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
- Modelo de segurança de contêiner em seis camadas: Host → Daemon → Imagem → Runtime → Rede → Secret
--cap-drop ALL+--cap-addSob Demanda para Implementar o Princípio do Menor Privilégio- Trivy/Docker Scout escaneia imagens em busca de vulnerabilidades e bloqueia automaticamente CVEs de alto risco no CI
- Verificação de assinatura Docker Content Trust para evitar adulteração de imagens
- Secrets: Não defina variáveis de ambiente; em vez disso, use Docker Secrets ou Vault para gestão criptografada
- O CIS Docker Benchmark é a ferramenta padrão para verificações de linha de base de segurança
📝 Exercícios
- Exercício Básico (Dificuldade: ⭐): Execute uma varredura Docker Bench Security em sua máquina local e registre quaisquer alertas de nível WARN.
- Desafio Avançado (Dificuldade: ⭐⭐): Use Trivy para escanear uma imagem existente e corrija todos os CVEs de nível CRITICAL.
- 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).