<h2>Introdução: A Segurança de Imagens Docker em Produção</h2>
<p>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.</p>
<p>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.</p>
<h2>Entendendo Vulnerabilidades em Imagens Docker</h2>
<h3>O que são CVEs e por que importam</h3>
<p>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 <code>RUN</code>, <code>COPY</code> e <code>ADD</code>. 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.</p>
<p>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.</p>
<h3>Como scanners identificam vulnerabilidades</h3>
<p>Ferramentas como Docker Scout e Trivy funcionam mantendo um banco de dados constantemente atualizado de vulnerabilidades conhecidas. Quando você executa um scan, essas ferramentas:</p>
<ol>
<li>Extraem a lista de pacotes instalados na imagem (através de gerenciadores como apt, yum, pip, npm, etc.)</li>
<li>Comparam essas versões de pacotes contra seu banco de dados de CVEs</li>
<li>Identificam quais vulnerabilidades se aplicam à sua imagem</li>
<li>Relatam o nível de severidade (Critical, High, Medium, Low) e fornecem informações sobre como remediá-las</li>
</ol>
<p>É importante notar que o scanner identifica vulnerabilidades <em>conhecidas</em> — não há previsão de futuras vulnerabilidades. Por isso, é essencial manter suas imagens e ferramentas de scanning atualizadas.</p>
<h2>Docker Scout: Integração Nativa e Análise Avançada</h2>
<h3>Configuração e Autenticação</h3>
<p>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:</p>
<pre><code class="language-bash">docker login</code></pre>
<p>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.</p>
<h3>Executando um Scan Básico</h3>
<p>O comando mais simples para fazer um scan é:</p>
<pre><code class="language-bash">docker scout cves [IMAGE]</code></pre>
<p>Substitua <code>[IMAGE]</code> pela sua imagem. Por exemplo:</p>
<pre><code class="language-bash">docker scout cves nginx:latest</code></pre>
<p>Isso fará o scanning da imagem oficial do Nginx e exibirá um relatório de vulnerabilidades. A saída será algo como:</p>
<pre><code> ✓ 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)</code></pre>
<h3>Análise Detalhada com Flags Adicionais</h3>
<p>Docker Scout oferece várias flags para customizar sua análise. Se você quiser ver detalhes completos sobre cada vulnerabilidade:</p>
<pre><code class="language-bash">docker scout cves --details nginx:latest</code></pre>
<p>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:</p>
<pre><code class="language-bash">docker scout cves --severity critical nginx:latest</code></pre>
<h3>Comparação Entre Imagens</h3>
<p>Uma funcionalidade poderosa é comparar duas versões da sua imagem para ver quais vulnerabilidades foram corrigidas:</p>
<pre><code class="language-bash">docker scout cves --compare nginx:1.24 nginx:1.25</code></pre>
<p>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.</p>
<h3>Integração em Pipeline CI/CD</h3>
<p>Para falhar seu build automaticamente se vulnerabilidades críticas forem detectadas, você pode usar:</p>
<pre><code class="language-bash">docker scout cves --exit-code [LEVEL] [IMAGE]</code></pre>
<p>Onde <code>[LEVEL]</code> pode ser <code>critical</code>, <code>high</code>, <code>medium</code> ou <code>low</code>. Exemplo em um GitHub Actions:</p>
<pre><code class="language-yaml">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 }}</code></pre>
<p>Este workflow garante que nenhuma imagem com vulnerabilidades críticas seja deployada.</p>
<h2>Trivy: Flexibilidade e Profundidade</h2>
<h3>Instalação e Configuração Inicial</h3>
<p>Trivy é uma ferramenta open-source que você instala separadamente. No Ubuntu/Debian:</p>
<pre><code class="language-bash">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</code></pre>
<p>No macOS com Homebrew:</p>
<pre><code class="language-bash">brew install trivy</code></pre>
<p>Após a instalação, valide:</p>
<pre><code class="language-bash">trivy --version</code></pre>
<h3>Scan Básico de Imagens</h3>
<p>O scan básico no Trivy é semelhante ao Docker Scout:</p>
<pre><code class="language-bash">trivy image nginx:latest</code></pre>
<p>A saída será estruturada e informativa:</p>
<pre><code>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 │
└─────────────────────────────┴────────────┴──────────────┴─────────────────┘</code></pre>
<h3>Filtragem por Severidade e Tipo</h3>
<p>Trivy permite filtrar resultados para focar no que importa. Para ver apenas vulnerabilidades críticas:</p>
<pre><code class="language-bash">trivy image --severity CRITICAL nginx:latest</code></pre>
<p>Você também pode desabilitar a busca por secrets ou misconfigurations se estiver interessado apenas em vulnerabilidades de pacotes:</p>
<pre><code class="language-bash">trivy image --skip-db-update --severity CRITICAL,HIGH nginx:latest</code></pre>
<p>O flag <code>--skip-db-update</code> acelera o scan se você já atualizou o banco de dados recentemente.</p>
<h3>Scan de Repositórios Git</h3>
<p>Uma vantagem do Trivy é poder fazer scan de um repositório inteiro, incluindo configurações de infraestrutura:</p>
<pre><code class="language-bash">trivy repo https://github.com/seu-usuario/seu-repo</code></pre>
<p>Isso escaneia não apenas imagens Docker, mas também Dockerfiles, arquivos Kubernetes, Terraform, etc. Uma funcionalidade excelente para DevSecOps.</p>
<h3>Exportação de Relatórios</h3>
<p>Para integrar em ferramentas de análise ou compliance, Trivy pode exportar em vários formatos:</p>
<pre><code class="language-bash">trivy image --format json --output report.json nginx:latest</code></pre>
<p>Isso gera um JSON estruturado:</p>
<pre><code class="language-json">{
"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"]
}
]
}
]
}</code></pre>
<p>Você também pode exportar como SARIF (para integração com GitHub Security):</p>
<pre><code class="language-bash">trivy image --format sarif --output trivy-results.sarif nginx:latest</code></pre>
<h3>Integração em GitLab CI/CD</h3>
<p>No GitLab, você pode usar Trivy assim:</p>
<pre><code class="language-yaml">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</code></pre>
<p>Isso falha o pipeline se vulnerabilidades críticas ou altas forem encontradas.</p>
<h2>Estratégia Prática: Remediação e Boas Práticas</h2>
<h3>Interpretando os Resultados</h3>
<p>Quando você recebe um relatório de vulnerabilidades, não signifida que sua imagem é insegura instantaneamente. Uma vulnerabilidade só é explorada se:</p>
<ol>
<li>O pacote vulnerável está realmente instalado e em uso</li>
<li>A funcionalidade vulnerável é acessível (por exemplo, exposição de rede)</li>
<li>Há um vetor de ataque viável no seu contexto específico</li>
</ol>
<p>Por exemplo, uma CVE em um servidor SSH não importa se seu container não executa SSH. Sempre avalie o contexto.</p>
<h3>Remediar Vulnerabilidades</h3>
<p>A maioria das vulnerabilidades é corrigida atualizando para uma versão mais nova. Seu Dockerfile provavelmente se parece com algo assim:</p>
<pre><code class="language-dockerfile">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"]</code></pre>
<p>Se o scanner encontrar vulnerabilidades, a solução é atualizar:</p>
<pre><code class="language-dockerfile">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"]</code></pre>
<p>Repasse o scan para validar que as vulnerabilidades foram corrigidas. Note que remover <code>apt-get</code> cache com <code>rm -rf /var/lib/apt/lists/*</code> reduz o tamanho da imagem.</p>
<h3>Escolher uma Imagem Base Segura</h3>
<p>A escolha da imagem base é crucial. Imagens Alpine Linux são menores e frequentemente têm menos vulnerabilidades:</p>
<pre><code class="language-dockerfile"># Em vez de
FROM ubuntu:22.04
Considere
FROM alpine:3.18
RUN apk add --no-cache python3 curl</code></pre>
<p>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.</p>
<h3>Política de Scan Contínuo</h3>
<p>A melhor estratégia é não fazer scanning apenas uma vez. Configure-o para rodar:</p>
<ol>
<li><strong>Ao fazer build de imagens</strong>: No pipeline CI/CD, sempre que você faz push</li>
<li><strong>Em imagens já deployadas</strong>: Com ferramentas como Trivy ou Snyk que monitoram imagens em registro</li>
<li><strong>Periodicamente</strong>: 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)</li>
</ol>
<p>Exemplo de scan contínuo com cron:</p>
<pre><code class="language-bash">#!/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</code></pre>
<p>Adicione ao crontab:</p>
<pre><code class="language-bash">0 2 * /usr/local/bin/scan-images.sh</code></pre>
<h3>Falsos Positivos e Exceções</h3>
<p>Nem toda vulnerabilidade precisa ser corrigida imediatamente. Algumas podem ser aceitas por motivos legítimos. Trivy permite criar um arquivo de exceções:</p>
<pre><code class="language-bash">trivy image --ignorefile .trivyignore nginx:latest</code></pre>
<p>Arquivo <code>.trivyignore</code>:</p>
<pre><code># Ignora uma CVE específica
CVE-2021-12345
Ignora uma CVE em um pacote específico
CVE-2022-9999:glibc</code></pre>
<p>Use com cuidado — documentar <em>por que</em> você está ignorando uma vulnerabilidade é tão importante quanto ignorá-la.</p>
<h2>Conclusão</h2>
<p>Nesta aula, você aprendeu que <strong>scanning de vulnerabilidades não é opcional</strong> — é 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.</p>
<p>O segundo ponto crítico é que <strong>vulnerabilidades não são um problema binário</strong> — 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, <strong>integrar scanning no seu CI/CD desde o início</strong> evita surpresas desagradáveis em produção e mantém a segurança como responsabilidade compartilhada do time de desenvolvimento.</p>
<h2>Referências</h2>
<ul>
<li>Docker Scout Documentation: https://docs.docker.com/scout/</li>
<li>Trivy GitHub Repository: https://github.com/aquasecurity/trivy</li>
<li>NIST National Vulnerability Database (NVD): https://nvd.nist.gov/</li>
<li>OWASP Container Security Top 10: https://owasp.org/www-project-container-security/</li>
<li>Aqua Security Blog - Container Scanning Best Practices: https://aquasecurity.github.io/blog/</li>
</ul>
<p><!-- FIM --></p>