Segurança de Imagens Docker com Trivy

10 min de leitura Docker & Containers
Segurança de Imagens Docker com Trivy

Na era do DevSecOps e da entrega contínua de software, a segurança não pode ser uma etapa final, mas sim um componente intrínseco do ciclo de desenvolvimento. Um dos vetores de ataque mais comuns hoje em dia ocorre nas camadas das imagens de contêineres. Vulnerabilidades conhecidas (CVEs), bibliotecas desatualizadas e configurações incorretas podem transformar uma aplicação robusta em uma porta aberta para invasores.

Neste tutorial, vamos explorar como implementar a prática de scanning (varredura) de imagens Docker utilizando o trivy, uma ferramenta de código aberto, rápida e abrangente. O objetivo é integrar essa verificação no seu pipeline de CI/CD ou executá-la localmente para garantir que suas imagens estejam seguras antes de serem promovidas para produção.

O que é Trivy e por que ele é essencial?

O trivy é um scanner de vulnerabilidade completo desenvolvido pela Aqua Security. Diferente de ferramentas mais antigas ou limitadas, o Trivy varre tanto as dependências do sistema operacional (pacotes Linux) quanto as bibliotecas da linguagem de programação utilizada na aplicação (como Go, Python, Ruby, Java, PHP, etc.).

Para profissionais de TI e sysadmins, a principal vantagem do Trivy é a simplicidade e a velocidade. Ele utiliza um banco de dados global atualizado diariamente pelo NVD (National Vulnerability Database) e outros provedores, garantindo que as assinaturas das vulnerabilidades sejam precisas. Além disso, o suporte nativo a Docker permite escanear imagens diretamente do registro ou do cache local sem necessidade de descompactação manual.

Outro ponto crucial é a capacidade de detectar não apenas CVEs, mas também configurações incorretas de segurança (misconfigurations) em arquivos como Dockerfile, Kubernetes YAMLs e Terraform HCL. Isso alinha perfeitamente com os princípios de "shift left", onde a segurança é identificada o mais cedo possível no processo de desenvolvimento.

Pré-requisitos para Instalação

Antes de iniciar o processo de instalação, certifique-se de que você possui acesso a um ambiente Linux (Ubuntu, Debian, CentOS ou RHEL) ou macOS. A versão do Docker recomendada é a 18.09 ou superior, embora o Trivy funcione independentemente da versão do Docker se utilizado apenas para leitura de imagens locais.

Você precisará das seguintes ferramentas básicas instaladas em seu sistema:

  • Git (para clonar repositórios, se necessário)
  • Curl ou Wget (para baixar binários)
  • Permissões de superusuário (sudo) para instalação no sistema

Passo 1: Instalação do Trivy no Linux

A maneira mais recomendada de instalar o Trivy em distribuições baseadas em Debian e Ubuntu é através dos repositórios oficiais. Isso facilita futuras atualizações via gerenciador de pacotes.

  1. Crie um diretório para os metadados do apt e instale as dependências necessárias:
sudo apt-get update
sudo apt-get install -y apt-transport-https ca-certificates gnupg curl
  1. Adicione a chave GPG pública da Aqua Security ao seu sistema:
curl https://aquasecurity.github.io/trivy-repo/deb/public.key | sudo apt-key add -
  1. Adicione o repositório estável do Trivy. Para versões mais recentes do Ubuntu (20.04+), use o comando abaixo:
echo "deb https://aquasecurity.github.io/trivy-repo/deb stable main" | sudo tee /etc/apt/sources.list.d/trivy.list
  1. Atualize a lista de pacotes e instale o Trivy:
sudo apt-get update
sudo apt-get install trivy

Se você estiver utilizando CentOS ou RHEL, pode utilizar o yum ou dnf seguindo a documentação oficial para repositórios RPM, ou simplesmente baixar o binário estático diretamente do GitHub Releases.

Passo 2: Verificação da Instalação

Após a instalação, é fundamental verificar se o comando foi reconhecido pelo sistema e qual versão está em uso. Execute o seguinte comando:

trivy --version

A saída deve indicar a versão instalada (ex: Version: 0.xx.x). Se o comando não for encontrado, verifique se o caminho do binário foi adicionado corretamente às variáveis de ambiente PATH.

Passo 3: Preparando um Ambiente de Teste

Para demonstrar a eficácia do scanner, precisamos de uma imagem Docker que contenha vulnerabilidades conhecidas. A maneira mais segura de testar é utilizando imagens oficiais da Alpine Linux ou Ubuntu com pacotes intencionalmente desatualizados.

Crie um diretório temporário e navegue até ele:

mkdir ~/trivy-test
cd ~/trivy-test

Crie um arquivo Dockerfile simples que instale uma versão antiga e vulnerável do pacote wget ou apenas utilize a imagem base mais recente para ver o relatório completo:

FROM alpine:3.12
RUN apk add --no-cache wget

Construa essa imagem localmente com uma tag específica:

docker build -t vulnerable-app:test .

Agora você possui uma imagem local pronta para ser analisada.

Passo 4: Executando o Primeiro Scan (Severidade)

O comando básico do Trivy exige a especificação do tipo de alvo e do nome da imagem. Vamos começar escaneando por vulnerabilidades de pacote (os CVEs).

trivy image --severity HIGH,CRITICAL vulnerable-app:test

Aqui, a flag --severity filtra os resultados. Por padrão, o Trivy relata tudo, mas em ambientes de produção, você pode querer focar apenas em falhas críticas e altas para reduzir ruído na análise inicial.

A saída do terminal será dividida em seções claras:

  • Library Version: Mostra a versão atual instalada no contêiner.
  • Vulnerable Version: Indica a versão mínima segura.
  • Title/Description: Breve explicação da vulnerabilidade.
  • CVE ID: O identificador único para rastreamento.

Se o scan encontrar falhas, o comando retornará um código de saída diferente de zero (exit code 1), o que é extremamente útil para bloquear pipelines automatizados.

Passo 5: Gerando Relatórios em JSON

Para integrar o Trivy com sistemas de monitoramento, Slack, Jira ou dashboards de segurança, você precisará da saída em formato estruturado. O formato JSON é o padrão da indústria para essa integração.

trivy image --format json -o report.json vulnerable-app:test

O arquivo report.json gerado conterá todos os detalhes do scan, organizados por severidade e tipo de pacote. Você pode visualizar o conteúdo usando o comando cat ou processá-lo com ferramentas como jq:

cat report.json | jq '.Results[] | select(.Vulnerabilities) | .Vulnerabilities'

Para ambientes corporativos, existe também o formato table que é otimizado para leitura humana em terminais, e o formato sarif, padrão da Microsoft, compatível com GitHub Security Dashboard.

Passo 6: Escaneando Misconfigurations no Dockerfile

Além das vulnerabilidades nos pacotes instalados, a forma como a imagem foi construída é crítica. O Trivy pode analisar o Dockerfile diretamente para identificar más práticas de segurança.

trivy config .

Execute este comando na raiz do seu projeto (onde o Dockerfile reside). O Trivy verificará regras como:

  • Uso de USER root no final do build.
  • Falta de instrução COPY específica (evitar uso excessivo de ADD).
  • Vazamento de segredos em variáveis de ambiente durante o build.

Essa etapa é vital para garantir que a infraestrutura como código (IaC) esteja seguindo os benchmarks de segurança do CIS Docker Benchmark.

Passo 7: Integração com Docker Scan

Se você utiliza Docker CLI moderno, pode integrar o Trivy diretamente ao plugin de scans do Docker. Isso permite que comandos padrão como docker scan utilizem o motor do Trivy.

  1. Instale o plugin:
docker plugin install aquasec/trivy:latest --alias trivy --grant-all-permissions
  1. Verifique se o plugin está ativo:
docker plugin ls
  1. Agora, escaneie qualquer imagem usando o comando nativo do Docker:
docker scan vulnerable-app:test

Esta abordagem é particularmente útil para desenvolvedores que desejam uma experiência unificada sem aprender comandos específicos do Trivy, mantendo a robustez do scanner por trás dos panos.

Passo 8: Atualização do Banco de Dados

O Trivy baixa um banco de dados de vulnerabilidades localmente para acelerar os scans subsequentes. É importante manter este banco atualizado, especialmente se você executar scans frequentes.

trivy image --clear-cache
trivy image --download-db-only vulnerable-app:test

Opcionalmente, você pode automatizar essa atualização via cron ou em um job do Kubernetes para garantir que o scanner esteja sempre usando as definições mais recentes de CVEs.

Melhores Práticas para DevSecOps com Trivy

A implementação técnica é apenas metade da equação. Para maximizar a eficácia do Trivy em sua organização, considere as seguintes práticas:

  1. Filtre Falsos Positivos: Nem toda vulnerabilidade representa um risco real no seu contexto. Se uma biblioteca vulnerável não for chamada pela sua aplicação ou se o vetor de ataque não for aplicável ao seu ambiente, documente e ignore essa falha específica.
  2. Defina Limiares de Bloqueio: Configure seu pipeline para falhar apenas em CRITICAL e HIGH. Permitir que MEDIUM e LOW passem com um alerta (warning) evita o "alert fatigue" (fadiga de alerta), permitindo que a equipe foque no que realmente importa.
  3. Integre ao CI/CD: Adicione o passo de scan após o build da imagem, mas antes do push para o registro (Docker Hub, ECR, ACR). Isso impede que imagens inseguras deixem o ambiente de desenvolvimento.
  4. Monitore Mudanças: Vulnerabilidades são descobertas diariamente. Não basta escanear no momento do deploy; execute scans regulares nas imagens em produção para detectar novas ameaças surgidas após a publicação.

Conclusão

A segurança de imagens Docker não deve ser um obstáculo, mas sim um facilitador da confiança no seu software. O trivy oferece uma das abordagens mais completas e fáceis de implementar para scanning de vulnerabilidades e configurações.

Ao adotar essas práticas, você protege sua infraestrutura contra exploits conhecidos, cumpre requisitos de conformidade regulatória e reduz drasticamente a superfície de ataque da sua aplicação. Lembre-se: a segurança é um processo contínuo, e ferramentas como o Trivy são seus aliados essenciais nessa jornada rumo a uma cultura DevSecOps madura.

Comece hoje mesmo integrando o trivy em seus projetos. A primeira linha de defesa contra ameaças cibernéticas começa com a imagem que você constrói.

Compartilhar: Link copiado!
Esse tutorial foi útil?

Comentários (0)

Seja o primeiro a comentar.

Deixe seu comentário

Seu comentário será analisado antes de ser publicado.

0/2000