Verificar pacotes Java automaticamente

Este documento explica como ativar a API Container Scanning, enviar uma imagem para o Artifact Registry e conferir a lista de vulnerabilidades encontradas na imagem.

O Artifact Analysis armazena informações de vulnerabilidade como notas. Uma ocorrência é criada para cada instância de uma nota associada a uma imagem. Consulte os documentos de visão geral e preços para mais informações.

Antes de começar

  1. Sign in to your Google Cloud account. If you're new to Google Cloud, create an account to evaluate how our products perform in real-world scenarios. New customers also get $300 in free credits to run, test, and deploy workloads.
  2. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Go to project selector

  3. Make sure that billing is enabled for your Google Cloud project.

  4. Enable the Artifact Registry and Container Scanning APIs.

    Enable the APIs

  5. Install the Google Cloud CLI.

  6. If you're using an external identity provider (IdP), you must first sign in to the gcloud CLI with your federated identity.

  7. To initialize the gcloud CLI, run the following command:

    gcloud init
  8. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Go to project selector

  9. Make sure that billing is enabled for your Google Cloud project.

  10. Enable the Artifact Registry and Container Scanning APIs.

    Enable the APIs

  11. Install the Google Cloud CLI.

  12. If you're using an external identity provider (IdP), you must first sign in to the gcloud CLI with your federated identity.

  13. To initialize the gcloud CLI, run the following command:

    gcloud init
  14. Crie um repositório do Docker no Artifact Registry e envie uma imagem de contêiner com seu código Java para o repositório. Se você não conhece o Artifact Registry, consulte o Guia de início rápido do Docker.

    Para informações sobre como usar o Cloud Build para criar e conteinerizar seus aplicativos Java, consulte Criar, testar e conteinerizar aplicativos Java.

Ver as vulnerabilidades da imagem

O Artifact Analysis verifica as novas imagens quando elas são enviadas para o Artifact Registry. Essa verificação extrai informações sobre os pacotes no contêiner.

É possível conferir as ocorrências de vulnerabilidade das suas imagens no Artifact Registry usando o console Google Cloud , a Google Cloud CLI ou a API Container Analysis. Os detalhes das vulnerabilidades das imagens também estarão disponíveis, caso haja alguma.

O Artifact Analysis só atualiza os metadados de imagens enviadas ou extraídas nos últimos 30 dias. Após 30 dias, os metadados não serão mais atualizados, e os resultados vão ficar desatualizados. Além disso, o Artifact Analysis arquiva metadados que estão desatualizados há mais de 90 dias, e eles não ficam disponíveis no console Google Cloud , na gcloud ou usando a API. Para verificar novamente uma imagem com metadados desatualizados ou arquivados, extraia essa imagem. A atualização dos metadados pode levar até 24 horas.

Ver ocorrências no console do Google Cloud

Para ver as vulnerabilidades em uma imagem:

  1. Confira a lista de repositórios.

    Abrir a página Repositórios

  2. Na lista de repositórios, clique em um deles.

  3. Na lista de imagens, clique no nome de uma imagem.

    O total de vulnerabilidades de cada resumo de imagem é exibido na coluna Vulnerabilidades.

    Uma imagem verificada com vulnerabilidades

  4. Para ver a lista de vulnerabilidades de uma imagem, clique no link na coluna Vulnerabilidades.

    A seção Resultados da verificação mostra um resumo dos tipos de pacotes verificados, o total de vulnerabilidades, as vulnerabilidades com correções disponíveis, as vulnerabilidades sem correções e a gravidade efetiva.

    A página de resultados da verificação lista vulnerabilidades, correções e gravidade efetiva.

    A tabela de vulnerabilidades lista o nome de Vulnerabilidades e Exposições Comuns (CVE, na sigla em inglês) de cada vulnerabilidade encontrada, a gravidade efetiva, a pontuação do Sistema de Pontuação de Vulnerabilidade Comum (CVSS, na sigla em inglês), as correções (quando disponíveis), o nome do pacote que contém a vulnerabilidade e o tipo de pacote. É possível filtrar e classificar esses arquivos para verificar um arquivo, diretório ou tipo específico por extensão. O console do Google Cloud mostra até 1.200 vulnerabilidades por página nessa tabela.

  5. Para detalhes sobre uma CVE específica, clique no nome dela.

  6. Para ver detalhes da ocorrência de vulnerabilidade, como número da versão e local afetado, clique em Ver ou Ver corrigido na linha com o nome da vulnerabilidade. O texto do link é Ver para vulnerabilidades sem correção e Ver corrigidas para vulnerabilidades em que uma correção foi aplicada.

Conferir ocorrências usando o gcloud

Para ver as ocorrências de uma imagem no Artifact Registry, execute o comando gcloud artifacts docker images list:

gcloud artifacts docker images list --show-occurrences \
    LOCATION-docker.pkg.dev/PROJECT_ID/REPOSITORY/IMAGE_ID

Em que:

  • LOCATION é o local regional ou multirregional do repositório.
  • PROJECT_ID é o ID do projeto do seu console Google Cloud .
  • REPOSITORY é o nome do repositório em que a imagem está armazenada.
  • IMAGE_ID é o nome da imagem no repositório. Não é possível especificar uma tag de imagem com esse comando.

Por padrão, o comando retorna as 10 imagens mais recentes. Para mostrar um número diferente de imagens, use a flag --show-occurrences-from. Por exemplo, o comando a seguir retorna as 25 imagens mais recentes:

gcloud artifacts docker images list --show-occurrences-from=25 \
    us-central1-docker.pkg.dev/my-project/my-repo/my-image

A saída será semelhante a:

Exemplo de saída de imagem

  {
      "name": "projects/my-project/locations/us-central1/occurrences/22d3edfb-34f2-4d3f-be08-fd90c549f010",
      "resource": {
        "uri": "https://us-central1-docker.pkg.dev/my-project/my-repo/golang-nginx@sha256:5b54ef20748417ccdb0b87afedf98c44e699e2f59bd6cv48cbdc1ca2e72c80e3"
      },
      "noteName": "projects/my-project/locations/us-central1/notes/CVE-2005-2541",
      "kind": "VULNERABILITY",
      "createTime": "2025-01-21T15:57:01.238832Z",
      "updateTime": "2025-01-21T15:57:01.238832Z",
      "vulnerability": {
        "severity": "CRITICAL",
        "cvssScore": 10,
        "packageIssue": [
          {
            "affectedLocation": {
              "cpeUri": "cpe:/o:debian:debian_linux:12",
              "package": "tar",
              "version": {
                "name": "1.34+dfsg",
                "revision": "1.2+deb12u1",
                "kind": "NORMAL"
              }
            },
            "fixedLocation": {
              "cpeUri": "cpe:/o:debian:debian_linux:12",
              "package": "tar",
              "version": {
                "kind": "MAXIMUM"
              }
            },
            "packageType": "OS",
            "effectiveSeverity": "LOW",
            "file_location": [
                {
                "file_path": "/var/lib/dpkg/status",
                "layerDetails": {
                  "index": 0,
                  "diffID": "sha256:123",
                  "buildCommand": "FROM golang:example_sha256",
                  "BaseImages": [
                    {
                      "name": "library/golang",
                    },
                  ],
                },
              },
            ],
          }
        ],
        "shortDescription": "CVE-2005-2541",
        "longDescription": "NIST vectors: AV:N/AC:L/Au:N/C:C/I:C/A:C",
        "relatedUrls": [
          {
            "url": "https://security-tracker.debian.org/tracker/CVE-2005-2541",
            "label": "More Info"
          }
        ],
        "effectiveSeverity": "LOW",
        "cvssVersion": "CVSS_VERSION_2",
        "cvssV2": {
          "baseScore": 10,
          "attackVector": "ATTACK_VECTOR_NETWORK",
          "attackComplexity": "ATTACK_COMPLEXITY_LOW",
          "authentication": "AUTHENTICATION_NONE",
          "confidentialityImpact": "IMPACT_COMPLETE",
          "integrityImpact": "IMPACT_COMPLETE",
          "availabilityImpact": "IMPACT_COMPLETE"
        }
      }
    }
  

Ver vulnerabilidades de uma tag de imagem

Para ver vulnerabilidades de uma tag de imagem, insira um dos seguintes comandos:

gcloud artifacts docker images describe \
    LOCATION-docker.pkg.dev/PROJECT_ID/REPOSITORY/IMAGE_ID:TAG \
    --show-package-vulnerability

ou

gcloud artifacts docker images describe \
    LOCATION-docker.pkg.dev/PROJECT_ID/REPOSITORY/IMAGE_ID@sha256:HASH \
    --show-package-vulnerability

Em que:

  • LOCATION é o local regional ou multirregional do repositório.
  • PROJECT_ID é o ID do projeto do seu console Google Cloud .
  • REPOSITORY é o nome do repositório em que a imagem está armazenada.
  • IMAGE_ID é o nome da imagem no repositório.
  • TAG é a tag da imagem que tem as informações que você quer receber.
  • HASH é o resumo da imagem.

O Artifact Analysis retorna resultados, incluindo o packageType.

Filtrar ocorrências de vulnerabilidades

Para filtrar ocorrências de vulnerabilidades, use o parâmetro --occurrence-filter:

gcloud artifacts docker images list --show-occurrences \
    LOCATION-docker.pkg.dev/PROJECT_ID/REPOSITORY/IMAGE_ID \
    --occurrence-filter=FILTER_EXPRESSION

Em que:

  • LOCATION é o local regional ou multirregional do repositório.
  • PROJECT_ID é o ID do projeto do seu console Google Cloud .
  • REPOSITORY é o nome do repositório em que a imagem está armazenada.
  • IMAGE_ID é o nome da imagem no repositório.
  • FILTER_EXPRESSION é uma expressão de filtro de amostra no formato explicado em Filtrar ocorrências de vulnerabilidades.

Ver vulnerabilidades de uma camada específica

Use o campo layerDetails para determinar qual camada específica introduziu um pacote vulnerável e para conferir mais informações sobre essa camada. Por exemplo, considere a seguinte saída de layerDetails para uma imagem:

  "layerDetails": {
    "index": 0,
    "diffID": "sha256:123",
    "buildCommand": "FROM golang:example_sha256",
    "BaseImages": [
      {
        "name": "library/golang",
      },
    ],
  }

A saída mostra que o índice da camada é 0 na imagem do contêiner, com um hash de camada de sha256:123. O comando de build do Docker usado para criar essa camada é FROM golang:example_sha256, e a camada também é encontrada na imagem de base library/golang.

Ver ocorrências usando a API

Para ver uma lista de ocorrências no projeto:

 curl -X GET -H "Content-Type: application/json" -H \
    "Authorization: Bearer $(gcloud auth print-access-token)" \
    https://containeranalysis.googleapis.com/v1/projects/PROJECT_ID/occurrences

Para ver um resumo das vulnerabilidades no projeto:

 curl -X GET -H "Content-Type: application/json" -H \
    "Authorization: Bearer $(gcloud auth print-access-token)" \
    https://containeranalysis.googleapis.com/v1/projects/PROJECT_ID/occurrences:vulnerabilitySummary

Para ver detalhes de uma ocorrência específica:

 curl -X GET -H "Content-Type: application/json" -H \
    "Authorization: Bearer $(gcloud auth print-access-token)" \
    https://containeranalysis.googleapis.com/v1/projects/PROJECT_ID/occurrences/OCCURRENCE_ID

Ver vulnerabilidades no Cloud Build

Se você estiver usando o Cloud Build, também poderá conferir as vulnerabilidades de imagem no painel lateral Insights de segurança no console Google Cloud .

O painel lateral Insights de segurança oferece uma visão geral de alto nível das informações de segurança de build para artefatos armazenados no Artifact Registry. Para saber mais sobre o painel lateral e como usar o Cloud Build para proteger sua cadeia de suprimentos de software, consulte Ver insights de segurança de build.

Filtrar ocorrências

É possível usar as strings de filtro nos comandos gcloud e na API Artifact Analysis para filtrar ocorrências antes de visualizá-las. Veja a descrição dos filtros de pesquisa compatíveis nas seções a seguir.

Como visualizar ocorrências de um tipo específico

Use o valor kind para filtrar por tipo de ocorrência. Consulte os tipos disponíveis.

Os exemplos a seguir mostram como filtrar ocorrências de implantação para uma imagem:

gcloud

Na CLI gcloud, execute o seguinte:

gcloud artifacts docker images list --show-occurrences \
    --occurrence-filter='kind="DEPLOYMENT"' --format=json \
    LOCATION-docker.pkg.dev/PROJECT_ID/REPOSITORY/IMAGE_ID

Em que:

  • DEPLOYMENT é o tipo de ocorrência.
  • LOCATION é o local regional ou multirregional do repositório.
  • PROJECT_ID é o ID do projeto do seu console Google Cloud .
  • REPOSITORY é o nome do repositório em que a imagem está armazenada.
  • IMAGE_ID é o nome da imagem no repositório.

API

Na consulta da API, use a seguinte expressão de filtro:

kind="DEPLOYMENT" AND resourceUrl="RESOURCE_URL"

Em que:

  • DEPLOYMENT é o tipo de ocorrência.
  • RESOURCE_URL é o URL completo da imagem no formato https://LOCATION-docker.pkg.dev/PROJECT_ID/REPOSITORY/IMAGE_ID@sha256:HASH.

Use a função hasPrefix para filtrar com um escopo mais amplo.

Por exemplo, os filtros a seguir para ocorrências de um tipo específico em várias imagens:

kind="NOTE_KIND" AND has_prefix(resourceUrl, "RESOURCE_URL_PREFIX")

Em que:

  • RESOURCE_URL_PREFIX especifica uma substring de um URL de recurso.
    • Para filtrar todas as versões de uma imagem, omita o resumo dela. Use o formato: https://LOCATION-docker.pkg.dev/PROJECT_ID/REPOSITORY/IMAGE_ID@
    • Para filtrar todas as imagens em um projeto, especifique apenas o local do recurso e o projeto. Use o formato: https://LOCATION-docker.pkg.dev/PROJECT_ID/

Ver ocorrências de vulnerabilidade

Para recuperar uma lista de ocorrências de vulnerabilidade de uma imagem, filtre pelo tipo de ocorrência VULNERABILITY.

gcloud

Na CLI gcloud, execute o seguinte:

gcloud artifacts docker images list \
    --show-occurrences \
    --occurrence-filter='kind="VULNERABILITY"' \
    --format=json \
    LOCATION-docker.pkg.dev/PROJECT_ID/REPOSITORY/IMAGE_ID

Em que:

  • VULNERABILITY é o tipo de ocorrência.
  • LOCATION é o local regional ou multirregional do repositório.
  • PROJECT_ID é o ID do projeto do seu console Google Cloud .
  • REPOSITORY é o nome do repositório em que a imagem está armazenada.
  • IMAGE_ID é o nome da imagem no repositório.

API

Na consulta da API, use a seguinte expressão de filtro:

GET https://containeranalysis.googleapis.com/v1/projects/PROJECT_ID/occurrences?filter=kind%3D%22VULNERABILITY%22%20AND%20resourceUrl%3D%22ENCODED_RESOURCE_URL%22

Em que:

  • ENCODED_RESOURCE_URL é o caminho codificado para a imagem. Para saber mais sobre codificação, consulte Codificação de URL.

Para mais informações sobre como usar a API, consulte projects.occurrences.get.

Filtrar por tipo de pacote

Para limitar os resultados da verificação de vulnerabilidades a um tipo de pacote, execute o seguinte comando da CLI gcloud:

  gcloud artifacts docker images list /
      --show-occurrences /
      --occurrence-filter='kind="VULNERABILITY" AND packageType="PACKAGE_TYPE"' /
      LOCATION-docker.pkg.dev/PROJECT_ID/REPOSITORY/IMAGE_ID

Em que:

  • VULNERABILITY é o tipo de ocorrência.
  • PACKAGE_TYPE é o tipo de pacote de idioma do aplicativo. Os tipos disponíveis são: COMPOSER, GO, MAVEN, NPM, NUGET, PYTHON, RUBYGEMS e RUST.
  • LOCATION é o local regional ou multirregional do repositório.
  • PROJECT_ID é o ID do projeto do seu Google Cloud console.
  • REPOSITORY é o nome do repositório em que a imagem está armazenada.
  • IMAGE_ID é o nome da imagem no repositório. Não é possível especificar uma tag de imagem com esse comando.

Ver imagens associadas a uma nota específica

É possível recuperar uma lista de recursos associados a um ID de nota específico. Por exemplo, é possível listar imagens com uma vulnerabilidade CVE específica.

Para listar todas as imagens de um projeto que estão associadas a uma nota específica, use a seguinte expressão de filtro:

gcloud

gcloud artifacts docker images list /
    --show-occurrences /
    --occurrence-filter='noteProjectId="goog-vulnz" AND noteId="NOTE_ID"' /
    LOCATION-docker.pkg.dev/PROJECT_ID

Em que:

  • goog-vulnz é o PROVIDER_PROJECT_ID para a análise de vulnerabilidades do Artifact Analysis. Se você estiver usando o Artifact Analysis em um projeto personalizado, substitua esse valor pelo ID do projeto do seu provedor.
  • LOCATION é o local regional ou multirregional do repositório.
  • PROJECT_ID é o ID do projeto do seu console Google Cloud .
  • NOTE_ID é o código da nota. Por exemplo, quando você vê uma vulnerabilidade nos resultados da verificação do Artifact Analysis, ela geralmente usa a formatação de ID da CVE semelhante a CVE-2019-12345.

API

GET https://containeranalysis.googleapis.com/v1/projects/PROJECT_ID/occurrences?filter=noteProjectId%3D%22goog-vulnz%22%20AND%20resourceUrl%3D%22ENCODED_RESOURCE_URL%22%20AND%20noteId%3D%22NOTE_ID%22

Em que:

  • goog-vulnz é o PROVIDER_PROJECT_ID para a análise de vulnerabilidades do Artifact Analysis. Se você estiver usando o Artifact Analysis em um projeto personalizado, substitua esse valor pelo ID do projeto do seu provedor.
  • ENCODED_RESOURCE_URL é o caminho codificado para a imagem. Para saber mais sobre codificação, consulte Codificação de URL.
  • NOTE_ID é o código da nota. Por exemplo, quando você vê uma vulnerabilidade nos resultados da verificação do Artifact Analysis, ela geralmente usa a formatação de ID da CVE semelhante a CVE-2019-12345.

Para verificar uma imagem específica de uma determinada nota, use a seguinte expressão de filtro:

gcloud

gcloud artifacts docker images list /
    --show-occurrences /
    --occurrence-filter='noteProjectId="goog-vulnz" AND noteId="NOTE_ID"' /
    LOCATION-docker.pkg.dev/PROJECT_ID/REPOSITORY/IMAGE_ID

Onde

  • LOCATION é o local regional ou multirregional do repositório.
  • PROJECT_ID é o ID do projeto do seu console Google Cloud .
  • REPOSITORY é o nome do repositório em que a imagem está armazenada.
  • IMAGE_ID é o nome da imagem no repositório. Não é possível especificar uma tag de imagem com esse comando.

API

Na consulta da API, adicione a seguinte expressão de filtro:

resourceUrl="RESOURCE_URL" AND noteProjectId="goog-vulnz" \
AND noteId="NOTE_ID"

Em que:

  • RESOURCE_URL é o URL completo da imagem no formato https://LOCATION-docker.pkg.dev/PROJECT_ID/REPOSITORY/IMAGE_ID@sha256:HASH.
  • goog-vulnz é o PROVIDER_PROJECT_ID para a análise de vulnerabilidades do Artifact Analysis. Se você estiver usando o Artifact Analysis em um projeto personalizado, substitua esse valor pelo ID do projeto do seu provedor.
  • NOTE_ID é o código da nota. As notas relacionadas à segurança costumam ter o formato CVE-2019-12345.

A seguir