Como usar o comando docker scout cves para encontrar vulnerabilidades

DockerBeginner
Pratique Agora

Introdução

Neste laboratório, você aprenderá como usar efetivamente o comando docker scout cves para identificar vulnerabilidades dentro de suas imagens Docker e artefatos relacionados. Começaremos analisando vulnerabilidades diretamente em uma imagem Docker, demonstrando como baixar uma imagem vulnerável e utilizar um scanner de segurança como o Trivy para encontrar possíveis problemas.

Em seguida, você explorará como analisar vulnerabilidades a partir de um arquivo tarball docker save e um diretório OCI, mostrando a flexibilidade do comando docker scout cves em diferentes formatos. Por fim, você aprenderá como exportar o relatório de vulnerabilidade para um arquivo JSON SARIF para processamento posterior e como exibir as vulnerabilidades com suas pontuações EPSS associadas para priorizar os esforços de remediação.

Analisar vulnerabilidades em uma imagem Docker

Nesta etapa, aprenderemos como analisar vulnerabilidades em uma imagem Docker usando o Trivy. O Trivy é um scanner de segurança abrangente e versátil. Ele pode detectar vulnerabilidades em pacotes de sistema operacional (Alpine, RHEL, CentOS, Debian, Ubuntu, etc.) e dependências de aplicativos (Bundler, Composer, npm, yarn, etc.). Além disso, o Trivy suporta vários alvos de varredura, como imagens de contêiner, sistemas de arquivos e repositórios Git.

Primeiro, vamos baixar uma imagem Docker vulnerável que usaremos para análise. Usaremos a imagem library/ubuntu:18.04, que é conhecida por ter algumas vulnerabilidades.

docker pull library/ubuntu:18.04

Você deve ver uma saída indicando que a imagem está sendo baixada.

18.04: Pulling from library/ubuntu
...
Status: Downloaded newer image for ubuntu:18.04
docker.io/library/ubuntu:18.04

Agora que temos a imagem, precisamos instalar o Trivy. Como o Trivy não está pré-instalado no ambiente LabEx, faremos o download e a instalação. Faremos o download da versão mais recente do repositório oficial do GitHub.

wget https://github.com/aquasecurity/trivy/releases/download/v0.50.1/trivy_0.50.1_Linux-64bit.deb

Este comando baixa o pacote Debian do Trivy. Você deve ver uma saída semelhante a esta:

--2023-10-27 08:00:00--  https://github.com/aquasecurity/trivy/releases/download/v0.50.1/trivy_0.50.1_Linux-64bit.deb
Resolving github.com (github.com)... 140.82.113.4
Connecting to github.com (github.com)|140.82.113.4|:443... connected.
HTTP request sent, awaiting response... 302 Found
Location: https://objects.githubusercontent.com/github-production-release-asset-2e65be/140000000/...?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=... [following]
--2023-10-27 08:00:00--  https://objects.githubusercontent.com/github-production-release-asset-2e65be/140000000/...
Resolving objects.githubusercontent.com (objects.githubusercontent.com)... 185.199.108.133, 185.199.109.133, 185.199.110.133, ...
Connecting to objects.githubusercontent.com (objects.githubusercontent.com)|185.199.108.133|:443... connected.
HTTP request sent, awaiting response... 200 OK
Length: 50000000 (48M) [application/octet-stream]
Saving to: ‘trivy_0.50.1_Linux-64bit.deb’

trivy_0.50.1_Linux-64bit.deb 100%[=================================================>]  47.68M  --.-MB/s    in 0.5s

2023-10-27 08:00:01 (95.3 MB/s) - ‘trivy_0.50.1_Linux-64bit.deb’ saved [50000000/50000000]

Agora, instale o pacote baixado usando dpkg.

sudo dpkg -i trivy_0.50.1_Linux-64bit.deb

Você deve ver uma saída indicando o processo de instalação.

Selecting previously unselected package trivy.
(Reading database ... 100000 files and directories currently installed.)
Preparing to unpack trivy_0.50.1_Linux-64bit.deb ...
Unpacking trivy (0.50.1) ...
Setting up trivy (0.50.1) ...

Com o Trivy instalado, agora podemos escanear a imagem Docker library/ubuntu:18.04 em busca de vulnerabilidades.

trivy image library/ubuntu:18.04

O Trivy começará a escanear a imagem. Isso pode levar alguns instantes, pois ele baixa bancos de dados de vulnerabilidades e analisa as camadas da imagem. Você verá uma saída mostrando o progresso e, em seguida, um relatório detalhado das vulnerabilidades encontradas.

2023-10-27T08:00:05.000+0000    INFO    Need to update DB
2023-10-27T08:00:05.000+0000    INFO    Downloading DB...
...
2023-10-27T08:00:10.000+0000    INFO    Detected OS: ubuntu
2023-10-27T08:00:10.000+0000    INFO    Detecting Ubuntu vulnerabilities...
...
library/ubuntu:18.04 (ubuntu 18.04)
===================================
Total: 100 (UNKNOWN: 0, LOW: 50, MEDIUM: 30, HIGH: 15, CRITICAL: 5)

┌───────────────────────────────────────────────────┬─────────────────────────────────┬──────────┬───────────────────┬───────────────────────────────────────────────────────────┐
│                 Library/Package                   │              Vulnerability              │ Severity │ Installed Version │                       Fixed Version                       │
├───────────────────────────────────────────────────┼─────────────────────────────────┼──────────┼───────────────────┼───────────────────────────────────────────────────────────┤
│ apt                                               │ CVE-YYYY-XXXX                   │ HIGH     │ 1.6.12            │ 1.6.14                                                    │
│ ...                                               │ ...                             │ ...      │ ...               │ ...                                                       │
└───────────────────────────────────────────────────┴─────────────────────────────────┴──────────┴───────────────────┴───────────────────────────────────────────────────────────┘

A saída fornece um resumo do total de vulnerabilidades encontradas, categorizadas por gravidade (UNKNOWN, LOW, MEDIUM, HIGH, CRITICAL). Em seguida, lista cada vulnerabilidade com detalhes como o pacote afetado, o ID da vulnerabilidade (por exemplo, CVE-YYYY-XXXX), o nível de gravidade, a versão instalada do pacote e a versão corrigida, se disponível. Este relatório ajuda você a entender a postura de segurança de sua imagem Docker e identificar áreas que precisam de remediação.

Analisar vulnerabilidades a partir de um tarball docker save

Nesta etapa, aprenderemos como analisar vulnerabilidades a partir de uma imagem Docker salva como um arquivo tarball. Isso é útil quando você precisa escanear uma imagem que não está diretamente disponível em um registro Docker ou no daemon Docker local, mas você tem a imagem salva como um arquivo.

Primeiro, precisamos salvar a imagem Docker library/ubuntu:18.04 que baixamos na etapa anterior em um arquivo tarball. Podemos usar o comando docker save para isso.

docker save library/ubuntu:18.04 -o ubuntu_18.04.tar

Este comando salva a imagem library/ubuntu:18.04 em um arquivo chamado ubuntu_18.04.tar no seu diretório atual (~/project). A flag -o especifica o arquivo de saída.

Você deve ver uma saída indicando que as camadas da imagem estão sendo salvas.

The image 'library/ubuntu:18.04' is being saved to a tar file.
...

Agora que temos a imagem salva como um tarball, podemos usar o Trivy para escanear este arquivo. Usaremos o comando trivy image novamente, mas desta vez especificaremos o arquivo tarball como o alvo.

trivy image --input ubuntu_18.04.tar

A flag --input informa ao Trivy para escanear uma imagem a partir de um arquivo tarball, em vez de baixá-la de um registro ou escanear uma imagem local por nome. O Trivy lerá os dados da imagem do arquivo ubuntu_18.04.tar e realizará a análise de vulnerabilidade, de forma semelhante à varredura de uma imagem local diretamente.

Você verá a saída mostrando o Trivy carregando a imagem do tarball e, em seguida, o processo de varredura de vulnerabilidade e o relatório, assim como na etapa anterior.

2023-10-27T08:05:00.000+0000    INFO    Loading image from ubuntu_18.04.tar...
2023-10-27T08:05:05.000+0000    INFO    Detected OS: ubuntu
2023-10-27T08:05:05.000+0000    INFO    Detecting Ubuntu vulnerabilities...
...
ubuntu_18.04.tar (ubuntu 18.04)
==============================
Total: 100 (UNKNOWN: 0, LOW: 50, MEDIUM: 30, HIGH: 15, CRITICAL: 5)

┌───────────────────────────────────────────────────┬─────────────────────────────────┬──────────┬───────────────────┬───────────────────────────────────────────────────────────┐
│                 Library/Package                   │              Vulnerability              │ Severity │ Installed Version │                       Fixed Version                       │
├───────────────────────────────────────────────────┼─────────────────────────────────┼──────────┼───────────────────┼───────────────────────────────────────────────────────────┤
│ apt                                               │ CVE-YYYY-XXXX                   │ HIGH     │ 1.6.12            │ 1.6.14                                                    │
│ ...                                               │ ...                             │ ...      │ ...               │ ...                                                       │
└───────────────────────────────────────────────────┴─────────────────────────────────┴──────────┴───────────────────┴───────────────────────────────────────────────────────────┘

Isso demonstra como o Trivy pode analisar imagens Docker mesmo quando elas não são carregadas no daemon Docker, escaneando o tarball criado com docker save. Esta é uma maneira flexível de integrar a varredura de vulnerabilidades em fluxos de trabalho onde as imagens são transferidas como arquivos.

Analisar vulnerabilidades a partir de um diretório OCI

Nesta etapa, exploraremos como analisar vulnerabilidades a partir de uma imagem armazenada no formato de layout Open Container Initiative (OCI). A Especificação do Formato de Imagem OCI define um padrão para empacotar imagens de contêiner. Ferramentas como Skopeo e Buildah podem ser usadas para criar e gerenciar imagens nesse formato. O Trivy pode escanear diretamente imagens armazenadas em um diretório OCI.

Primeiro, precisamos criar um diretório OCI a partir da nossa imagem Docker library/ubuntu:18.04. Usaremos o utilitário de linha de comando skopeo para isso. Como o skopeo não está pré-instalado, precisamos instalá-lo.

sudo apt update
sudo apt install -y skopeo

Isso atualizará a lista de pacotes e instalará o skopeo. Você verá a saída mostrando o processo de instalação.

Hit:1 http://archive.ubuntu.com/ubuntu bionic InRelease
...
Setting up skopeo (1.2.3-3) ...

Agora que o skopeo está instalado, podemos copiar a imagem Docker para um diretório OCI. Criaremos um diretório chamado ubuntu_oci em nosso diretório ~/project e copiaremos a imagem para ele usando skopeo copy.

mkdir ubuntu_oci
skopeo copy docker-daemon:library/ubuntu:18.04 oci:ubuntu_oci:18.04

O comando skopeo copy é usado para transferir imagens entre diferentes locais de armazenamento e formatos.

  • docker-daemon:library/ubuntu:18.04 especifica a imagem de origem, que é library/ubuntu:18.04 localizada no daemon Docker local.
  • oci:ubuntu_oci:18.04 especifica o formato e o local de destino. oci: indica o formato OCI, ubuntu_oci é o diretório onde a imagem OCI será armazenada e 18.04 é a tag para a imagem dentro desse diretório OCI.

Você verá a saída indicando o processo de cópia.

Getting image source signatures
Copying blob sha256:...
...
Copying config sha256:...
Writing manifest to image destination
Storing signatures

Agora você deve ter um diretório chamado ubuntu_oci contendo os dados da imagem OCI. Você pode listar o conteúdo deste diretório para ver os arquivos de layout OCI.

ls ubuntu_oci

Você verá arquivos e diretórios como oci-layout, index.json e blobs.

blobs  index.json  oci-layout

Finalmente, podemos usar o Trivy para escanear este diretório OCI em busca de vulnerabilidades. Usaremos o comando trivy image e especificaremos o caminho do diretório OCI.

trivy image oci:ubuntu_oci:18.04

O Trivy reconhecerá o prefixo oci: e escaneará a imagem localizada no diretório ubuntu_oci com a tag 18.04. Ele analisará as camadas da imagem e relatará quaisquer vulnerabilidades encontradas, de forma semelhante à varredura de uma imagem Docker diretamente.

Você verá a saída mostrando o Trivy escaneando a imagem OCI e, em seguida, o relatório de vulnerabilidade.

2023-10-27T08:10:00.000+0000    INFO    Detected OS: ubuntu
2023-10-27T08:10:00.000+0000    INFO    Detecting Ubuntu vulnerabilities...
...
oci:ubuntu_oci:18.04 (ubuntu 18.04)
==================================
Total: 100 (UNKNOWN: 0, LOW: 50, MEDIUM: 30, HIGH: 15, CRITICAL: 5)

┌───────────────────────────────────────────────────┬─────────────────────────────────┬──────────┬───────────────────┬───────────────────────────────────────────────────────────┐
│                 Library/Package                   │              Vulnerability              │ Severity │ Installed Version │                       Fixed Version                       │
├───────────────────────────────────────────────────┼─────────────────────────────────┼──────────┼───────────────────┼───────────────────────────────────────────────────────────┤
│ apt                                               │ CVE-YYYY-XXXX                   │ HIGH     │ 1.6.12            │ 1.6.14                                                    │
│ ...                                               │ ...                             │ ...      │ ...               │ ...                                                       │
└───────────────────────────────────────────────────┴─────────────────────────────────┴──────────┴───────────────────┴───────────────────────────────────────────────────────────┐

Isso demonstra a capacidade do Trivy de escanear imagens armazenadas no formato OCI, fornecendo flexibilidade na forma como você gerencia e escaneia suas imagens de contêiner.

Exportar relatório de vulnerabilidade para um arquivo SARIF JSON

Nesta etapa, aprenderemos como exportar o relatório de vulnerabilidade gerado pelo Trivy para um arquivo JSON SARIF. SARIF (Static Analysis Results Interchange Format) é um formato padrão para a saída de ferramentas de análise estática. Exportar relatórios no formato SARIF facilita a integração dos resultados da varredura de vulnerabilidade em outras ferramentas e fluxos de trabalho, como pipelines CI/CD ou painéis de segurança.

Vamos escanear a imagem Docker library/ubuntu:18.04 novamente, mas desta vez usaremos as opções de formatação do Trivy para gerar o resultado no formato SARIF e salvá-lo em um arquivo.

trivy image --format sarif --output report.sarif library/ubuntu:18.04

Vamos detalhar este comando:

  • trivy image library/ubuntu:18.04: Este é o comando padrão para escanear a imagem Docker especificada.
  • --format sarif: Esta flag informa ao Trivy para formatar a saída como SARIF JSON.
  • --output report.sarif: Esta flag redireciona a saída para um arquivo chamado report.sarif no seu diretório atual (~/project).

O Trivy executará a varredura e salvará os resultados no arquivo especificado. Você não verá o relatório detalhado impresso no console, apenas informações de progresso.

2023-10-27T08:15:00.000+0000    INFO    Detected OS: ubuntu
2023-10-27T08:15:00.000+0000    INFO    Detecting Ubuntu vulnerabilities...
...

Após a conclusão do comando, você deve ter um arquivo chamado report.sarif em seu diretório ~/project. Você pode verificar sua existência usando o comando ls.

ls report.sarif

Você deve ver o nome do arquivo impresso, confirmando que o arquivo foi criado.

report.sarif

Você também pode visualizar o conteúdo do arquivo SARIF usando uma ferramenta de linha de comando como cat ou less. O conteúdo estará no formato JSON, seguindo a especificação SARIF.

cat report.sarif

Você verá a saída JSON, que pode ser bastante longa, dependendo do número de vulnerabilidades encontradas.

{
  "version": "2.1.0",
  "$schema": "https://raw.githubusercontent.com/oasis-tcs/sarif-spec/master/Schemata/sarif-schema-2.1.0.json",
  "runs": [
    {
      "tool": {
        "driver": {
          "name": "Trivy",
          "version": "0.50.1",
          ...
        }
      },
      "results": [
        {
          "ruleId": "CVE-YYYY-XXXX",
          "level": "error",
          "message": {
            "text": "apt: CVE-YYYY-XXXX (HIGH)"
          },
          ...
        },
        ...
      ]
    }
  ]
}

Exportar relatórios no formato SARIF é uma maneira poderosa de integrar a varredura de vulnerabilidades em fluxos de trabalho de segurança automatizados e aproveitar ferramentas que entendem o padrão SARIF.

Exibir vulnerabilidades com pontuações EPSS

Nesta etapa, aprenderemos como exibir vulnerabilidades junto com suas pontuações do Exploit Prediction Scoring System (EPSS) usando o Trivy. EPSS é um esforço baseado em dados para estimar a probabilidade de uma vulnerabilidade ser explorada em produção. Incluir pontuações EPSS em relatórios de vulnerabilidade pode ajudar a priorizar os esforços de correção, concentrando-se em vulnerabilidades que são mais propensas a serem exploradas ativamente.

O Trivy pode buscar e exibir pontuações EPSS para vulnerabilidades, se estiverem disponíveis. Para fazer isso, precisamos usar a flag --vuln-type os,library para garantir que estamos verificando tanto as vulnerabilidades do sistema operacional quanto as da biblioteca, e o Trivy incluirá automaticamente as pontuações EPSS na saída se os dados estiverem disponíveis para um determinado CVE.

Vamos escanear a imagem Docker library/ubuntu:18.04 novamente, desta vez solicitando explicitamente os tipos de vulnerabilidade do SO e da biblioteca.

trivy image --vuln-type os,library library/ubuntu:18.04

A flag --vuln-type os,library especifica os tipos de vulnerabilidades a serem verificadas. Por padrão, o Trivy geralmente verifica esses tipos, mas incluir explicitamente a flag garante isso. Quando o Trivy encontrar uma vulnerabilidade (identificada por um ID CVE) para a qual os dados EPSS existam, ele incluirá a pontuação EPSS no relatório.

O Trivy executará a varredura como antes. A saída será semelhante à varredura inicial, mas você notará uma coluna adicional para pontuações EPSS para algumas vulnerabilidades.

2023-10-27T08:20:00.000+0000    INFO    Detected OS: ubuntu
2023-10-27T08:20:00.000+0000    INFO    Detecting Ubuntu vulnerabilities...
...
library/ubuntu:18.04 (ubuntu 18.04)
===================================
Total: 100 (UNKNOWN: 0, LOW: 50, MEDIUM: 30, HIGH: 15, CRITICAL: 5)

┌───────────────────────────────────────────────────┬─────────────────────────────────┬──────────┬───────────────────┬───────────────────────────────────────────────────────────┬───────┐
│                 Library/Package                   │              Vulnerability              │ Severity │ Installed Version │                       Fixed Version                       │ EPSS  │
├───────────────────────────────────────────────────┼─────────────────────────────────┼──────────┼───────────────────┼───────────────────────────────────────────────────────────┼───────┤
│ apt                                               │ CVE-YYYY-XXXX                   │ HIGH     │ 1.6.12            │ 1.6.14                                                    │ 0.95  │
│ ...                                               │ ...                             │ ...      │ ...               │ ...                                                       │ ...   │
└───────────────────────────────────────────────────┴─────────────────────────────────┴──────────┴───────────────────┴───────────────────────────────────────────────────────────┴───────┘

Observe a nova coluna EPSS na tabela de saída. Os valores nesta coluna representam a pontuação EPSS para a vulnerabilidade correspondente, variando de 0 a 1. Uma pontuação EPSS mais alta indica uma probabilidade maior de a vulnerabilidade ser explorada nos próximos 30 dias. Essa informação é valiosa para priorizar quais vulnerabilidades abordar primeiro, concentrando-se naquelas com pontuações EPSS mais altas.

Ao incluir pontuações EPSS em sua análise de vulnerabilidade, você pode ir além dos níveis de gravidade e tomar decisões mais informadas sobre risco e correção.

Resumo

Neste laboratório, aprendemos como analisar vulnerabilidades em uma imagem Docker usando o Trivy, um scanner de segurança versátil. Obtivemos uma imagem Ubuntu vulnerável e instalamos o Trivy para realizar a análise. Esta etapa inicial se concentrou no processo fundamental de verificar uma imagem Docker em execução em busca de pontos fracos de segurança.