Como usar o comando docker scout compare para analisar diferenças entre imagens

DockerBeginner
Pratique Agora

Introdução

Neste laboratório, você aprenderá como usar efetivamente o comando docker scout compare para analisar as diferenças entre duas imagens Docker. Este processo é crucial para entender as mudanças em vulnerabilidades, pacotes e outros componentes da imagem em diferentes versões ou construções.

Através de exercícios práticos, você explorará a comparação de imagens com configurações padrão, ignorando vulnerabilidades da imagem base, filtrando resultados por severidade e tipo de pacote, e gerando um relatório Markdown dos resultados da comparação. Ao final deste laboratório, você estará proficiente no uso do docker scout compare para obter informações valiosas sobre a segurança e composição de suas imagens de contêiner.

Comparar duas imagens com configurações padrão

Nesta etapa, você aprenderá como comparar duas imagens Docker usando uma ferramenta de varredura de vulnerabilidades. Comparar imagens é crucial para identificar riscos de segurança e entender as diferenças entre diferentes versões ou construções de suas imagens de contêiner. Usaremos uma ferramenta chamada trivy para este fim. trivy é um scanner de vulnerabilidades simples e abrangente para contêineres e outros artefatos.

Primeiro, vamos instalar o trivy. Como o trivy não está pré-instalado no ambiente LabEx, você precisa baixá-lo e instalá-lo.

sudo apt-get update
sudo apt-get install -y wget apt-transport-https gnupg lsb-release
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) stable main" | sudo tee /etc/apt/sources.list.d/trivy.list
sudo apt-get update
sudo apt-get install -y trivy

Os comandos acima primeiro atualizam a lista de pacotes e, em seguida, instalam as dependências necessárias para adicionar um novo repositório. Depois disso, ele baixa a chave pública para o repositório trivy e a adiciona às chaves confiáveis do seu sistema. Finalmente, ele adiciona o repositório trivy à sua lista de fontes, atualiza a lista de pacotes novamente e instala o trivy.

Agora que o trivy está instalado, vamos puxar as imagens Docker que queremos comparar. Compararemos duas versões diferentes da imagem ubuntu: ubuntu:20.04 e ubuntu:22.04.

docker pull ubuntu:20.04
docker pull ubuntu:22.04

Esses comandos puxam as versões da imagem ubuntu especificadas do Docker Hub. Você deve ver a saída indicando o progresso do download e a extração bem-sucedida das imagens.

Agora, podemos usar trivy para comparar essas duas imagens. O comando básico para comparar duas imagens é trivy image --diff-image [image1] [image2].

trivy image --diff-image ubuntu:20.04 ubuntu:22.04

Este comando analisará tanto ubuntu:20.04 quanto ubuntu:22.04 e relatará as diferenças nas vulnerabilidades encontradas entre as duas imagens. A saída mostrará vulnerabilidades que estão presentes em uma imagem, mas não na outra, ou vulnerabilidades com diferentes severidades. Isso ajuda você a entender como a atualização ou alteração das versões da imagem pode impactar sua postura de segurança.

A saída listará as vulnerabilidades categorizadas por severidade (UNKNOWN, LOW, MEDIUM, HIGH, CRITICAL). Ele mostrará vulnerabilidades que foram adicionadas na segunda imagem (ubuntu:22.04 neste caso) em comparação com a primeira (ubuntu:20.04), e vulnerabilidades que foram removidas.

Comparar imagens e ignorar vulnerabilidades da imagem base

Na etapa anterior, comparamos duas imagens ubuntu e vimos as diferenças nas vulnerabilidades. Às vezes, ao comparar imagens, você pode estar interessado nas vulnerabilidades introduzidas pelo código ou dependências do seu aplicativo, em vez das vulnerabilidades herdadas da imagem base. trivy permite que você ignore vulnerabilidades que estão presentes em uma imagem base especificada.

Para demonstrar isso, vamos primeiro criar um Dockerfile simples que usa ubuntu:20.04 como imagem base e adiciona um arquivo simples.

Navegue até o diretório do seu projeto:

cd ~/project

Crie um arquivo chamado Dockerfile usando nano:

nano Dockerfile

Cole o seguinte conteúdo no Dockerfile:

FROM ubuntu:20.04
RUN echo "This is a test file" >/app/test.txt

Salve o arquivo e saia do nano (Ctrl+X, Y, Enter).

Este Dockerfile é muito simples. Ele começa com a imagem ubuntu:20.04 e, em seguida, executa um comando para criar um arquivo chamado test.txt dentro de um diretório /app.

Agora, vamos construir uma imagem Docker a partir deste Dockerfile. Vamos marcá-la como my-ubuntu-app:latest.

docker build -t my-ubuntu-app:latest .

O comando docker build constrói uma imagem a partir de um Dockerfile. A flag -t my-ubuntu-app:latest marca a imagem com o nome my-ubuntu-app e a tag latest. O . no final especifica que o Dockerfile está no diretório atual. Você deve ver a saída indicando o processo de construção e a criação bem-sucedida da imagem.

Agora temos duas imagens: ubuntu:20.04 (a imagem base) e my-ubuntu-app:latest (a imagem construída sobre a imagem base). Podemos comparar my-ubuntu-app:latest com ubuntu:20.04 e ignorar as vulnerabilidades que já estão presentes em ubuntu:20.04. Isso nos mostrará apenas as vulnerabilidades introduzidas pelas alterações em nosso Dockerfile.

Usamos a flag --ignore-base com o comando trivy image para conseguir isso.

trivy image --ignore-base --diff-image ubuntu:20.04 my-ubuntu-app:latest

Este comando compara my-ubuntu-app:latest com ubuntu:20.04, mas relata apenas as vulnerabilidades que estão presentes em my-ubuntu-app:latest e não em ubuntu:20.04. Como nosso Dockerfile só adicionou um arquivo simples e não instalou nenhum pacote novo, você deve ver muito poucas ou nenhuma vulnerabilidade nova relatada em comparação com a saída da etapa anterior. Isso demonstra como --ignore-base ajuda a focar no impacto de segurança da sua camada de aplicação.

Comparar imagens e filtrar por severidade e tipo de pacote

Nas etapas anteriores, realizamos comparações básicas de imagens. No entanto, a saída pode, às vezes, ser muito detalhada, especialmente para imagens com muitas vulnerabilidades. trivy permite que você filtre os resultados com base no nível de severidade e no tipo de pacote, o que ajuda você a se concentrar nos problemas mais críticos ou em tipos específicos de vulnerabilidades.

Vamos comparar ubuntu:20.04 e ubuntu:22.04 novamente, mas desta vez filtraremos os resultados para mostrar apenas as vulnerabilidades com severidade HIGH ou CRITICAL. Isso é útil quando você deseja priorizar a correção das vulnerabilidades mais graves.

Usamos a flag --severity para especificar o nível mínimo de severidade a ser relatado. Você pode fornecer uma lista separada por vírgulas dos níveis de severidade.

trivy image --diff-image ubuntu:20.04 ubuntu:22.04 --severity HIGH,CRITICAL

Este comando comparará as duas imagens ubuntu e exibirá apenas as vulnerabilidades que são classificadas como HIGH ou CRITICAL em qualquer uma das imagens. Você notará que a saída é muito mais curta do que a comparação padrão, pois exclui vulnerabilidades com níveis de severidade mais baixos (UNKNOWN, LOW, MEDIUM).

Além de filtrar por severidade, você também pode filtrar pelo tipo de pacote onde a vulnerabilidade foi encontrada. trivy pode verificar vulnerabilidades em pacotes do sistema operacional (como aqueles instalados via apt, yum, etc.) e dependências de aplicativos (como bibliotecas usadas pelo seu código).

Vamos comparar as imagens novamente, mas desta vez só procuraremos vulnerabilidades em pacotes do sistema operacional. Usamos a flag --vuln-type para isso.

trivy image --diff-image ubuntu:20.04 ubuntu:22.04 --vuln-type os

Este comando comparará as duas imagens e relatará apenas as vulnerabilidades encontradas nos pacotes do sistema operacional. Isso é útil se você estiver principalmente preocupado com a segurança da camada base do sistema operacional da sua imagem.

Você também pode combinar esses filtros. Por exemplo, para ver apenas vulnerabilidades HIGH ou CRITICAL em pacotes do sistema operacional:

trivy image --diff-image ubuntu:20.04 ubuntu:22.04 --severity HIGH,CRITICAL --vuln-type os

Este comando fornece uma visão mais focada das vulnerabilidades mais graves dentro da camada do sistema operacional de suas imagens. A filtragem ajuda você a gerenciar a saída e priorizar seus esforços de segurança de forma eficaz.

Comparar imagens e gerar um relatório Markdown

Nas etapas anteriores, visualizamos os resultados da comparação de vulnerabilidades diretamente no terminal. Embora isso seja útil para verificações rápidas, você geralmente precisa salvar os resultados em um formato estruturado para relatórios, documentação ou análise posterior. trivy suporta vários formatos de saída, incluindo markdown.

Gerar um relatório em markdown é útil porque markdown é uma linguagem de marcação leve que é fácil de ler e pode ser facilmente convertida para outros formatos como HTML ou PDF.

Para gerar um relatório em markdown da comparação de imagens, usamos a flag --format e especificamos markdown. Também redirecionamos a saída para um arquivo usando o operador >.

Vamos comparar ubuntu:20.04 e ubuntu:22.04 novamente e salvar a saída em um arquivo markdown chamado comparison_report.md no seu diretório ~/project.

trivy image --diff-image ubuntu:20.04 ubuntu:22.04 --format markdown > ~/project/comparison_report.md

Este comando executa a mesma comparação que na primeira etapa, mas formata a saída como markdown e a salva no arquivo especificado. Você não verá a saída diretamente no terminal desta vez.

Após a conclusão do comando, você pode visualizar o arquivo markdown gerado usando cat ou nano.

cat ~/project/comparison_report.md

Este comando exibirá o conteúdo do arquivo comparison_report.md no seu terminal. Você deve ver os resultados da comparação de vulnerabilidades formatados usando a sintaxe markdown, incluindo títulos, listas e tabelas.

Você também pode abrir o arquivo com nano para visualizá-lo em um editor de texto:

nano ~/project/comparison_report_markdown.md

Lembre-se de sair do nano após visualizar o arquivo (Ctrl+X).

Gerar relatórios em diferentes formatos, como markdown, permite que você compartilhe facilmente as informações de vulnerabilidade com outras pessoas ou as integre em seus fluxos de trabalho de relatório existentes. Esta é uma etapa crucial na incorporação da verificação de segurança em seus pipelines de desenvolvimento e implantação.

Resumo

Neste laboratório, você aprendeu a usar a ferramenta trivy para comparar duas imagens Docker. Você começou instalando o trivy no ambiente LabEx, o que envolveu adicionar o repositório trivy e instalar o pacote usando apt. Após a instalação, você puxou duas versões diferentes da imagem ubuntu, ubuntu:20.04 e ubuntu:22.04, do Docker Hub. Finalmente, você executou o comando básico trivy image --diff-image para comparar essas duas imagens e analisar as diferenças em suas vulnerabilidades e pacotes.