Análise de vulnerabilidades com Trivy e Grype no pipeline de CI
1. Introdução à segurança em pipelines de CI
A segurança em pipelines de integração contínua (CI) deixou de ser opcional para se tornar um requisito fundamental em qualquer estratégia de desenvolvimento moderno. Com a crescente adoção de containers e dependências de código aberto, a superfície de ataque se expande a cada commit. A análise de vulnerabilidades em artefatos e dependências permite detectar falhas conhecidas antes que cheguem ao ambiente de produção, reduzindo o custo e o impacto de possíveis incidentes.
Trivy e Grype são duas ferramentas open source amplamente utilizadas para varredura de vulnerabilidades. O Trivy, mantido pela Aqua Security, destaca-se por sua velocidade e suporte a múltiplos formatos (imagens Docker, sistemas de arquivos, repositórios Git). Já o Grype, da Anchore, oferece integração profunda com SBOMs (Software Bill of Materials) e bases de dados atualizadas constantemente. Enquanto o Trivy prioriza performance e simplicidade, o Grype foca em precisão e rastreabilidade.
Um cenário típico envolve a execução dessas ferramentas em pipelines de CI para impedir que imagens ou artefatos com vulnerabilidades críticas avancem nos estágios de deploy. A detecção precoce evita retrabalho e reforça a postura de segurança da equipe.
2. Configuração do ambiente de CI para análise
Para iniciar, é necessário instalar o Trivy e o Grype no ambiente de CI. Ambos podem ser executados via containers Docker, scripts de instalação ou ações específicas de plataformas como GitHub Actions.
Instalação via script (Linux):
curl -sfL https://raw.githubusercontent.com/aquasecurity/trivy/main/contrib/install.sh | sh
curl -sSfL https://raw.githubusercontent.com/anchore/grype/main/install.sh | sh
Variáveis de ambiente recomendadas:
export TRIVY_SEVERITY=CRITICAL,HIGH
export GRYPE_FAIL_ON_SEVERITY=critical
export GRYPE_CHECK_FOR_APP_UPDATE=false
A estrutura de diretórios típica inclui as imagens Docker a serem varridas, sistemas de arquivos com dependências (Node.js, Python, Java) e SBOMs gerados previamente. Exemplo:
./artifacts/
docker-images/
app.tar
sboms/
app-sbom.json
dependencies/
package-lock.json
requirements.txt
3. Varredura de vulnerabilidades com Trivy
O Trivy oferece comandos intuitivos para diferentes alvos. Para varrer uma imagem Docker local:
trivy image --severity CRITICAL,HIGH --format json --output trivy-report.json nginx:1.25
Para sistemas de arquivos (diretório local com dependências):
trivy fs --severity CRITICAL --format sarif --output trivy-fs-report.sarif ./app/
Para repositórios Git remotos:
trivy repo --severity HIGH https://github.com/user/repo.git
A saída em JSON ou SARIF permite integração direta com ferramentas de CI como GitHub Advanced Security ou GitLab Security Dashboard. Para filtrar por CVE específico:
trivy image --severity CRITICAL --ignorefile .trivyignore nginx:1.25
O arquivo .trivyignore pode conter CVEs conhecidos como falsos positivos:
# Falsos positivos conhecidos
CVE-2024-0001
CVE-2024-0002
4. Varredura de vulnerabilidades com Grype
O Grype segue abordagem similar, mas com foco em SBOMs e dependências diretas. Para varrer uma imagem Docker:
grype nginx:1.25 --fail-on critical --output json > grype-report.json
Para varrer um diretório local:
grype dir:./app/ --fail-on high --output table
Uma das vantagens do Grype é a capacidade de trabalhar com SBOMs gerados por ferramentas como Syft ou o próprio Trivy. Exemplo:
# Gerar SBOM com Syft
syft nginx:1.25 -o json > nginx-sbom.json
# Varrer SBOM com Grype
grype sbom:./nginx-sbom.json --fail-on critical
Comparativamente, o Trivy tende a ser mais rápido em imagens grandes, enquanto o Grype oferece maior cobertura de bases de dados como a National Vulnerability Database (NVD) e a GitHub Advisory Database. Em testes práticos, o Grype frequentemente detecta CVEs que o Trivy não cobre, e vice-versa.
5. Integração no pipeline de CI (GitHub Actions, GitLab CI, Jenkins)
Exemplo no GitHub Actions:
name: Segurança CI
on: [push]
jobs:
vulnerability-scan:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Executar Trivy
uses: aquasecurity/trivy-action@master
with:
image-ref: 'nginx:1.25'
format: 'sarif'
output: 'trivy-results.sarif'
severity: 'CRITICAL,HIGH'
- name: Executar Grype
uses: anchore/grype-action@v2
with:
image: 'nginx:1.25'
fail-build: true
severity-cutoff: 'critical'
- name: Upload relatório SARIF
uses: github/codeql-action/upload-sarif@v3
with:
sarif_file: 'trivy-results.sarif'
Para quebrar o pipeline com base em limites de severidade, utiliza-se a flag --fail-on no Grype ou --exit-code 1 no Trivy. Notificações podem ser enviadas via Slack ou e-mail usando ações complementares.
6. Estratégias de mitigação e correção
A simples detecção não é suficiente. É necessário implementar políticas automatizadas. Uma abordagem comum é criar uma allowlist de CVEs aceitos temporariamente e uma blocklist para vulnerabilidades críticas sem correção.
Exemplo de política em YAML:
policies:
- severity: CRITICAL
action: block
- severity: HIGH
action: warn
- cve: CVE-2024-0001
action: allow
reason: "Falso positivo confirmado pela equipe de segurança"
A atualização de dependências deve ser automatizada com ferramentas como Dependabot ou Renovate. Após a correção, as imagens devem ser rebuildadas e varridas novamente. O uso de SBOMs permite rastrear vulnerabilidades mesmo após o deploy, facilitando auditorias contínuas.
7. Boas práticas e limitações
A frequência das varreduras depende do contexto. Para projetos críticos, recomenda-se varredura em cada commit. Para projetos menos sensíveis, varreduras diárias ou semanais podem ser suficientes.
Limitações comuns:
- Falsos positivos: CVEs que não afetam o código devido à configuração específica.
- Dependências não rastreáveis: Pacotes compilados ou binários sem metadados.
- Performance: Varreduras completas em imagens grandes podem levar minutos.
A combinação de Trivy e Grype oferece cobertura complementar. Use Trivy para varreduras rápidas de imagens e Grype para análise detalhada de SBOMs e dependências. Essa estratégia reduz a chance de vulnerabilidades passarem despercebidas.
8. Conclusão e próximos passos
Implementar análise de vulnerabilidades com Trivy e Grype no pipeline de CI é uma etapa essencial para fortalecer a segurança do ciclo de desenvolvimento. O checklist a seguir ajuda na implantação inicial:
- Instalar Trivy e Grype no ambiente de CI.
- Definir limites de severidade (CRITICAL e HIGH).
- Configurar varreduras para imagens Docker e dependências.
- Integrar relatórios SARIF com o repositório.
- Implementar políticas de allowlist/blocklist.
- Automatizar notificações para a equipe.
Tendências futuras incluem a integração com ferramentas de observabilidade (como Prometheus e Grafana) e plataformas de compliance (como OpenSCAP e OPA). A geração contínua de SBOMs e a correlação com CVEs em tempo real serão diferenciais competitivos.
Referências
- Documentação oficial do Trivy — Guia completo de instalação, comandos e integrações do Trivy.
- Documentação oficial do Grype — Referência técnica sobre varredura de vulnerabilidades com Grype e SBOMs.
- Trivy Action no GitHub Marketplace — Ação oficial para integrar Trivy em workflows do GitHub Actions.
- Grype Action no GitHub Marketplace — Ação oficial para executar Grype em pipelines do GitHub.
- Syft: Gerador de SBOMs — Ferramenta complementar para geração de Software Bill of Materials utilizada com Grype.
- OWASP Dependency-Check — Alternativa para análise de dependências em projetos Java, .NET e Python.
- GitHub Advisory Database — Base de dados de vulnerabilidades consultada por Grype e outras ferramentas de segurança.