Introdução: A Segurança de Imagens Docker em Produção
Quando trabalhamos com Docker, frequentemente nos concentramos em fazer a imagem funcionar corretamente, mas esquecemos de um aspecto crítico: a segurança. Uma imagem Docker pode conter vulnerabilidades em suas camadas de sistema operacional, bibliotecas de terceiros ou dependências do aplicativo. Essas vulnerabilidades podem ser exploradas por atacantes para comprometer toda a sua infraestrutura. É exatamente nesse cenário que ferramentas como Docker Scout e Trivy se tornam indispensáveis.
Docker Scout e Trivy são scanners de vulnerabilidades que analisam suas imagens Docker e identificam CVEs (Common Vulnerabilities and Exposures) conhecidas. Enquanto Docker Scout é a solução nativa do Docker, integrada ao seu ecossistema, Trivy é uma ferramenta open-source mantida pela Aqua Security que oferece flexibilidade e pode ser integrada em qualquer pipeline CI/CD. Neste artigo, você aprenderá não apenas a usar ambas as ferramentas, mas entenderá os conceitos por trás da detecção de vulnerabilidades e como implementar uma estratégia sólida de segurança em suas imagens.
Entendendo Vulnerabilidades em Imagens Docker
O que são CVEs e por que importam
Uma imagem Docker é composta por camadas: a imagem base (geralmente um sistema operacional como Ubuntu ou Alpine), e depois as camadas que você adiciona com seus comandos RUN, COPY e ADD. Cada uma dessas camadas pode conter software com vulnerabilidades conhecidas. Uma CVE é um identificador único para uma vulnerabilidade de segurança descoberta e documentada. Por exemplo, CVE-2021-22911 pode referir-se a uma falha crítica em uma biblioteca específica.
O risco é real e tangível: um atacante pode explorá-lo para executar código arbitrário, acessar dados sensíveis ou derrubar seu serviço. A maioria das empresas que sofrem brechas de segurança não foi invadida por causa de um zero-day (vulnerabilidade desconhecida), mas sim por não ter aplicado patches em vulnerabilidades já conhecidas. É por isso que fazer scanning regularmente é uma prática essencial de DevSecOps.
Como scanners identificam vulnerabilidades
Ferramentas como Docker Scout e Trivy funcionam mantendo um banco de dados constantemente atualizado de vulnerabilidades conhecidas. Quando você executa um scan, essas ferramentas:
- Extraem a lista de pacotes instalados na imagem (através de gerenciadores como apt, yum, pip, npm, etc.)
- Comparam essas versões de pacotes contra seu banco de dados de CVEs
- Identificam quais vulnerabilidades se aplicam à sua imagem
- Relatam o nível de severidade (Critical, High, Medium, Low) e fornecem informações sobre como remediá-las
É importante notar que o scanner identifica vulnerabilidades conhecidas — não há previsão de futuras vulnerabilidades. Por isso, é essencial manter suas imagens e ferramentas de scanning atualizadas.
Docker Scout: Integração Nativa e Análise Avançada
Configuração e Autenticação
Docker Scout é integrado diretamente ao Docker Desktop e ao Docker CLI. Para usá-lo, você precisa estar autenticado na Docker. Se ainda não estiver, execute:
docker login
Digite suas credenciais da Docker. Uma vez autenticado, você pode acessar o Docker Scout imediatamente. Note que Docker Scout é um serviço gratuito com limitações — versões pagas oferecem análises mais profundas e histórico mais longo.
Executando um Scan Básico
O comando mais simples para fazer um scan é:
docker scout cves [IMAGE]
Substitua [IMAGE] pela sua imagem. Por exemplo:
docker scout cves nginx:latest
Isso fará o scanning da imagem oficial do Nginx e exibirá um relatório de vulnerabilidades. A saída será algo como:
✓ PASSED 2 policies
nginx:latest
DATABASE
Powered by Grype and updated 2024-01-15
VULNERABILITIES
3 CVEs found in 2 packages
CRITICAL 1 (remediation available)
HIGH 1 (remediation available)
MEDIUM 1 (no fix available yet)
Análise Detalhada com Flags Adicionais
Docker Scout oferece várias flags para customizar sua análise. Se você quiser ver detalhes completos sobre cada vulnerabilidade:
docker scout cves --details nginx:latest
Isso exibirá informações como o ID da CVE, descrição, versão afetada, versão fixa e um link para mais informações. Se você quiser apenas vulnerabilidades de um nível específico:
docker scout cves --severity critical nginx:latest
Comparação Entre Imagens
Uma funcionalidade poderosa é comparar duas versões da sua imagem para ver quais vulnerabilidades foram corrigidas:
docker scout cves --compare nginx:1.24 nginx:1.25
Isso mostra as diferenças nas vulnerabilidades entre as duas imagens, ajudando você a validar se uma atualização realmente melhorou a postura de segurança.
Integração em Pipeline CI/CD
Para falhar seu build automaticamente se vulnerabilidades críticas forem detectadas, você pode usar:
docker scout cves --exit-code [LEVEL] [IMAGE]
Onde [LEVEL] pode ser critical, high, medium ou low. Exemplo em um GitHub Actions:
name: Build and Scan Image
on: [push]
jobs:
build-scan:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- uses: docker/setup-buildx-action@v2
- uses: docker/build-push-action@v4
with:
context: .
push: false
load: true
tags: myapp:${{ github.sha }}
- name: Scan with Docker Scout
run: docker scout cves --exit-code critical myapp:${{ github.sha }}
Este workflow garante que nenhuma imagem com vulnerabilidades críticas seja deployada.
Trivy: Flexibilidade e Profundidade
Instalação e Configuração Inicial
Trivy é uma ferramenta open-source que você instala separadamente. No Ubuntu/Debian:
wget -qO - https://aquasecurity.github.io/trivy-repo/deb/public.key | sudo apt-key add -
echo "deb https://aquasecurity.github.io/trivy-repo/deb $(lsb_release -sc) main" | sudo tee -a /etc/apt/sources.list.d/trivy.list
sudo apt-get update
sudo apt-get install trivy
No macOS com Homebrew:
brew install trivy
Após a instalação, valide:
trivy --version
Scan Básico de Imagens
O scan básico no Trivy é semelhante ao Docker Scout:
trivy image nginx:latest
A saída será estruturada e informativa:
nginx:latest (debian 11.6)
Total: 8 (CRITICAL: 2, HIGH: 4, MEDIUM: 2, LOW: 0)
CRITICAL (2)
┌─────────────────────────────┬────────────┬──────────────┬─────────────────┐
│ LIBRARY │ SEVERITY │ INSTALLED │ FIXED │
├─────────────────────────────┼────────────┼──────────────┼─────────────────┤
│ openssl │ CRITICAL │ 1.1.1k-1+deb │ 1.1.1n-0+deb11u5│
│ gnutls28 │ CRITICAL │ 3.7.1-5+deb11│ 3.7.4-1+deb11u7 │
└─────────────────────────────┴────────────┴──────────────┴─────────────────┘
Filtragem por Severidade e Tipo
Trivy permite filtrar resultados para focar no que importa. Para ver apenas vulnerabilidades críticas:
trivy image --severity CRITICAL nginx:latest
Você também pode desabilitar a busca por secrets ou misconfigurations se estiver interessado apenas em vulnerabilidades de pacotes:
trivy image --skip-db-update --severity CRITICAL,HIGH nginx:latest
O flag --skip-db-update acelera o scan se você já atualizou o banco de dados recentemente.
Scan de Repositórios Git
Uma vantagem do Trivy é poder fazer scan de um repositório inteiro, incluindo configurações de infraestrutura:
trivy repo https://github.com/seu-usuario/seu-repo
Isso escaneia não apenas imagens Docker, mas também Dockerfiles, arquivos Kubernetes, Terraform, etc. Uma funcionalidade excelente para DevSecOps.
Exportação de Relatórios
Para integrar em ferramentas de análise ou compliance, Trivy pode exportar em vários formatos:
trivy image --format json --output report.json nginx:latest
Isso gera um JSON estruturado:
{
"ArtifactName": "nginx:latest",
"ArtifactType": "image",
"Results": [
{
"Target": "nginx:latest (debian 11.6)",
"Class": "os-pkgs",
"Type": "debian",
"Vulnerabilities": [
{
"VulnerabilityID": "CVE-2022-0391",
"PkgName": "glibc",
"InstalledVersion": "2.31-13+deb11u5",
"FixedVersion": "2.31-13+deb11u7",
"Severity": "HIGH",
"References": ["https://nvd.nist.gov/vuln/detail/CVE-2022-0391"]
}
]
}
]
}
Você também pode exportar como SARIF (para integração com GitHub Security):
trivy image --format sarif --output trivy-results.sarif nginx:latest
Integração em GitLab CI/CD
No GitLab, você pode usar Trivy assim:
scan_image:
stage: security
image: aquasec/trivy:latest
script:
- trivy image --severity CRITICAL,HIGH --exit-code 1 $CI_REGISTRY_IMAGE:$CI_COMMIT_SHA
allow_failure: false
Isso falha o pipeline se vulnerabilidades críticas ou altas forem encontradas.
Estratégia Prática: Remediação e Boas Práticas
Interpretando os Resultados
Quando você recebe um relatório de vulnerabilidades, não signifida que sua imagem é insegura instantaneamente. Uma vulnerabilidade só é explorada se:
- O pacote vulnerável está realmente instalado e em uso
- A funcionalidade vulnerável é acessível (por exemplo, exposição de rede)
- Há um vetor de ataque viável no seu contexto específico
Por exemplo, uma CVE em um servidor SSH não importa se seu container não executa SSH. Sempre avalie o contexto.
Remediar Vulnerabilidades
A maioria das vulnerabilidades é corrigida atualizando para uma versão mais nova. Seu Dockerfile provavelmente se parece com algo assim:
FROM ubuntu:20.04
RUN apt-get update && apt-get install -y \
curl \
git \
python3 \
&& rm -rf /var/lib/apt/lists/*
COPY app.py /app/
WORKDIR /app
CMD ["python3", "app.py"]
Se o scanner encontrar vulnerabilidades, a solução é atualizar:
FROM ubuntu:22.04
RUN apt-get update && apt-get install -y \
curl \
git \
python3 \
&& rm -rf /var/lib/apt/lists/*
COPY app.py /app/
WORKDIR /app
CMD ["python3", "app.py"]
Repasse o scan para validar que as vulnerabilidades foram corrigidas. Note que remover apt-get cache com rm -rf /var/lib/apt/lists/* reduz o tamanho da imagem.
Escolher uma Imagem Base Segura
A escolha da imagem base é crucial. Imagens Alpine Linux são menores e frequentemente têm menos vulnerabilidades:
# Em vez de
FROM ubuntu:22.04
# Considere
FROM alpine:3.18
RUN apk add --no-cache python3 curl
Alpine é mais seguro por padrão porque tem menos pacotes instalados. No entanto, nem sempre é compatível com sua aplicação — teste bem antes de usar em produção.
Política de Scan Contínuo
A melhor estratégia é não fazer scanning apenas uma vez. Configure-o para rodar:
- Ao fazer build de imagens: No pipeline CI/CD, sempre que você faz push
- Em imagens já deployadas: Com ferramentas como Trivy ou Snyk que monitoram imagens em registro
- Periodicamente: Um scan noturno para detectar novas vulnerabilidades em imagens que você não modificou (um banco de dados atualizado pode identificar novas CVEs em pacotes antigos)
Exemplo de scan contínuo com cron:
#!/bin/bash
# scan-images.sh
IMAGES=(
"myrepo/app:latest"
"myrepo/api:latest"
"myrepo/worker:latest"
)
for image in "${IMAGES[@]}"; do
echo "Scanning $image..."
trivy image --severity CRITICAL,HIGH "$image"
if [ $? -ne 0 ]; then
echo "ALERT: Vulnerabilities found in $image" | mail -s "Security Alert" admin@company.com
fi
done
Adicione ao crontab:
0 2 * * * /usr/local/bin/scan-images.sh
Falsos Positivos e Exceções
Nem toda vulnerabilidade precisa ser corrigida imediatamente. Algumas podem ser aceitas por motivos legítimos. Trivy permite criar um arquivo de exceções:
trivy image --ignorefile .trivyignore nginx:latest
Arquivo .trivyignore:
# Ignora uma CVE específica
CVE-2021-12345
# Ignora uma CVE em um pacote específico
CVE-2022-9999:glibc
Use com cuidado — documentar por que você está ignorando uma vulnerabilidade é tão importante quanto ignorá-la.
Conclusão
Nesta aula, você aprendeu que scanning de vulnerabilidades não é opcional — é parte fundamental de qualquer estratégia de segurança moderna com containers. Docker Scout oferece simplicidade e integração nativa com o ecossistema Docker, enquanto Trivy fornece flexibilidade e pode ser integrado em qualquer pipeline.
O segundo ponto crítico é que vulnerabilidades não são um problema binário — entender o contexto, priorizar pelo nível de severidade e implementar um processo contínuo de remedição é mais importante do que ter zero vulnerabilidades (o que é praticamente impossível). Finalmente, integrar scanning no seu CI/CD desde o início evita surpresas desagradáveis em produção e mantém a segurança como responsabilidade compartilhada do time de desenvolvimento.
Referências
- Docker Scout Documentation: https://docs.docker.com/scout/
- Trivy GitHub Repository: https://github.com/aquasecurity/trivy
- NIST National Vulnerability Database (NVD): https://nvd.nist.gov/
- OWASP Container Security Top 10: https://owasp.org/www-project-container-security/
- Aqua Security Blog - Container Scanning Best Practices: https://aquasecurity.github.io/blog/