Verificar pacotes do SO automaticamente

Neste documento, você vai aprender a ativar a API Container Scanning, enviar uma imagem para o Artifact Registry e conferir a lista de vulnerabilidades encontradas na imagem.

O Artifact Analysis fornece informações de vulnerabilidade para as imagens de contêiner no Artifact Registry e no Container Registry (descontinuado). Os metadados são armazenados como notas. Uma ocorrência é criada para cada instância de nota associada a uma imagem. Consulte os documentos Visão geral e Preços para mais informações.

Ativar essa API também ativa a verificação de pacotes de linguagem no Artifact Registry. Consulte tipos de pacotes compatíveis.

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. To initialize the gcloud CLI, run the following command:

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

    Go to project selector

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

  9. Enable the Artifact Registry and Container Scanning APIs.

    Enable the APIs

  10. Install the Google Cloud CLI.
  11. To initialize the gcloud CLI, run the following command:

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

O Artifact Analysis não verifica automaticamente as imagens existentes. Para verificar uma imagem existente, é necessário enviá-la novamente.

Conferir 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 do sistema no contêiner.

É possível conferir as ocorrências de vulnerabilidade das suas imagens no registro usando o console do Google Cloud, a Google Cloud CLI ou a API Container Analysis. Se uma imagem tiver vulnerabilidades, você poderá conferir os detalhes.

O Artifact Analysis só atualiza os metadados de imagens enviadas ou extraídas nos últimos 30 dias. O Artifact Analysis arquiva metadados com mais de 30 dias.Para verificar novamente uma imagem com metadados arquivados, extraia essa imagem. A atualização de metadados pode levar até 24 horas.

Conferir ocorrências no console do Google Cloud

Para conferir as vulnerabilidades de uma imagem:

  1. Confira a lista de repositórios.

    Abrir a página Repositórios

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

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

    Os totais de vulnerabilidades de cada resumo de imagem são exibidos na coluna Vulnerabilidades.

    Captura de tela de uma imagem 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 pacote verificados, o total de vulnerabilidades, as vulnerabilidades com correções disponíveis, as vulnerabilidades sem correções e a gravidade efetiva.

    Captura de tela da seção "Resultados da verificação" com vulnerabilidades, correções e gravidade eficaz

    A tabela de vulnerabilidades lista o nome das vulnerabilidades e exposições comuns (CVE) para 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 do pacote.

    É possível filtrar e classificar esses arquivos para verificar um arquivo, diretório ou tipo de arquivo específico por extensão.

    O console do Google Cloud mostra até 1.200 vulnerabilidades nesta tabela. Se a imagem tiver mais de 1.200 vulnerabilidades, use a gcloud ou a API para conferir a lista completa.

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

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

Conferir ocorrências usando o gcloud

Para ver ocorrências para uma imagem:

Artifact Registry

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 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

Container Registry

gcloud beta container images list-tags \
HOSTNAME/PROJECT_ID/IMAGE_ID

Em que:

  • HOSTNAME é o nome de host multirregional:
    • gcr.io
    • asia.gcr.io
    • eu.gcr.io
    • us.gcr.io
  • PROJECT_ID é o ID do projeto que contém as imagens.
  • IMAGE_ID é o ID da imagem com as vulnerabilidades que você quer ver. 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, este comando retorna as 25 imagens mais recentes.

gcloud beta container images list-tags --show-occurrences-from=25 \
gcr.io/my-project/my-image

Para ver vulnerabilidades de uma tag de imagem ou camada:

Artifact Registry

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 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.

Container Registry

gcloud beta container images describe HOSTNAME/PROJECT_ID/IMAGE_ID@sha256:HASH \
--show-package-vulnerability

Em que:

  • HOSTNAME é o nome de host multirregional:
    • gcr.io
    • asia.gcr.io
    • eu.gcr.io
    • us.gcr.io
  • PROJECT_ID é o ID do projeto que contém as imagens.
  • IMAGE_ID é o ID da imagem com as vulnerabilidades que você quer ver.
  • HASH é o resumo da imagem.

Para filtrar as ocorrências de vulnerabilidades:

Artifact Registry

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 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 Como filtrar ocorrências de vulnerabilidades.

Container Registry

gcloud beta container images list-tags \
HOSTNAME/PROJECT_ID/IMAGE_ID --occurrence-filter=FILTER_EXPRESSION

Em que:

  • HOSTNAME é o nome de host multirregional:
    • gcr.io
    • asia.gcr.io
    • eu.gcr.io
    • us.gcr.io
  • PROJECT_ID é o ID do projeto que contém as imagens.
  • IMAGE_ID é o ID da imagem com as ocorrências de vulnerabilidades que você quer ver.
  • FILTER_EXPRESSION é uma expressão de filtro de amostra no formato explicado em Como filtrar ocorrências de vulnerabilidades.

Conferir ocorrências usando a API ou o código

Para conferir as ocorrências de uma imagem, use o snippet adequado. Os snippets de código especificam URLs para imagens no Container Registry. Se você estiver usando o Artifact Registry, especifique as imagens com um URL no formato:

LOCATION-docker.pkg.dev/PROJECT_ID/REPOSITORY/IMAGE_ID

API

Como usar cURL

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 conferir detalhes sobre 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

Java

Para saber como instalar e usar a biblioteca de cliente do Artifact Analysis, consulte Bibliotecas de cliente da Análise de artefato. Para mais informações, consulte a documentação de referência da API Artifact Analysis Java.

Para autenticar no Artifact Analysis, configure o Application Default Credentials. Para mais informações, consulte Configurar a autenticação para um ambiente de desenvolvimento local.

import com.google.cloud.devtools.containeranalysis.v1.ContainerAnalysisClient;
import io.grafeas.v1.GrafeasClient;
import io.grafeas.v1.Occurrence;
import io.grafeas.v1.ProjectName;
import java.io.IOException;
import java.lang.InterruptedException;

public class OccurrencesForImage {
  // Retrieves all the Occurrences associated with a specified image
  // Here, all Occurrences are simply printed and counted
  public static int getOccurrencesForImage(String resourceUrl, String projectId)
      throws IOException, InterruptedException {
    // String resourceUrl = "https://gcr.io/project/image@sha256:123";
    // String projectId = "my-project-id";
    final String projectName = ProjectName.format(projectId);
    final String filterStr = String.format("resourceUrl=\"%s\"", resourceUrl);

    // Initialize client that will be used to send requests. After completing all of your requests, 
    // call the "close" method on the client to safely clean up any remaining background resources.
    GrafeasClient client = ContainerAnalysisClient.create().getGrafeasClient();
    int i = 0;
    for (Occurrence o : client.listOccurrences(projectName, filterStr).iterateAll()) {
      // Write custom code to process each Occurrence here
      System.out.println(o.getName());
      i = i + 1;
    }
    return i;
  }
}

Go

Para saber como instalar e usar a biblioteca de cliente do Artifact Analysis, consulte Bibliotecas de cliente da Análise de artefato. Para mais informações, consulte a documentação de referência da API Artifact Analysis Go.

Para autenticar no Artifact Analysis, configure o Application Default Credentials. Para mais informações, consulte Configurar a autenticação para um ambiente de desenvolvimento local.


import (
	"context"
	"fmt"
	"io"

	containeranalysis "cloud.google.com/go/containeranalysis/apiv1"
	"google.golang.org/api/iterator"
	grafeaspb "google.golang.org/genproto/googleapis/grafeas/v1"
)

// getOccurrencesForImage retrieves all the Occurrences associated with a specified image.
// Here, all Occurrences are simply printed and counted.
func getOccurrencesForImage(w io.Writer, resourceURL, projectID string) (int, error) {
	// Use this style of URL when you use Google Container Registry.
	// resourceURL := "https://gcr.io/my-project/my-repo/my-image"
	// Use this style of URL when you use Google Artifact Registry.
	// resourceURL := "https://LOCATION-docker.pkg.dev/my-project/my-repo/my-image"
	ctx := context.Background()
	client, err := containeranalysis.NewClient(ctx)
	if err != nil {
		return -1, fmt.Errorf("NewClient: %w", err)
	}
	defer client.Close()

	req := &grafeaspb.ListOccurrencesRequest{
		Parent: fmt.Sprintf("projects/%s", projectID),
		Filter: fmt.Sprintf("resourceUrl=%q", resourceURL),
	}
	it := client.GetGrafeasClient().ListOccurrences(ctx, req)
	count := 0
	for {
		occ, err := it.Next()
		if err == iterator.Done {
			break
		}
		if err != nil {
			return -1, fmt.Errorf("occurrence iteration error: %w", err)
		}
		// Write custom code to process each Occurrence here.
		fmt.Fprintln(w, occ)
		count = count + 1
	}
	return count, nil
}

Node.js

Para saber como instalar e usar a biblioteca de cliente do Artifact Analysis, consulte Bibliotecas de cliente da Análise de artefato. Para mais informações, consulte a documentação de referência da API Artifact Analysis Node.js.

Para autenticar no Artifact Analysis, configure o Application Default Credentials. Para mais informações, consulte Configurar a autenticação para um ambiente de desenvolvimento local.

/**
 * TODO(developer): Uncomment these variables before running the sample
 */
// const projectId = 'your-project-id', // Your GCP Project ID
// If you are using Google Container Registry
// const imageUrl = 'https://gcr.io/my-project/my-repo/my-image@sha256:123' // Image to attach metadata to
// If you are using Google Artifact Registry
// const imageUrl = 'https://LOCATION-docker.pkg.dev/my-project/my-repo/my-image@sha256:123' // Image to attach metadata to

// Import the library and create a client
const {ContainerAnalysisClient} = require('@google-cloud/containeranalysis');
const client = new ContainerAnalysisClient();

const formattedParent = client.getGrafeasClient().projectPath(projectId);

// Retrieves all the Occurrences associated with a specified image
const [occurrences] = await client.getGrafeasClient().listOccurrences({
  parent: formattedParent,
  filter: `resourceUrl = "${imageUrl}"`,
});

if (occurrences.length) {
  console.log(`Occurrences for ${imageUrl}`);
  occurrences.forEach(occurrence => {
    console.log(`${occurrence.name}:`);
  });
} else {
  console.log('No occurrences found.');
}

Ruby

Para saber como instalar e usar a biblioteca de cliente do Artifact Analysis, consulte Bibliotecas de cliente da Análise de artefato. Para mais informações, consulte a documentação de referência da API Artifact Analysis Ruby.

Para autenticar no Artifact Analysis, configure o Application Default Credentials. Para mais informações, consulte Configurar a autenticação para um ambiente de desenvolvimento local.

# resource_url = "The URL of the resource associated with the occurrence."
#                # e.g. https://gcr.io/project/image@sha256:123"
# project_id   = "The Google Cloud project ID of the occurrences to retrieve"

require "google/cloud/container_analysis"

# Initialize the client
client = Google::Cloud::ContainerAnalysis.container_analysis.grafeas_client

parent = client.project_path project: project_id
filter = "resourceUrl = \"#{resource_url}\""
count = 0
client.list_occurrences(parent: parent, filter: filter).each do |occurrence|
  # Process occurrence here
  puts occurrence
  count += 1
end
puts "Found #{count} occurrences"

Python

Para saber como instalar e usar a biblioteca de cliente do Artifact Analysis, consulte Bibliotecas de cliente da Análise de artefato. Para mais informações, consulte a documentação de referência da API Artifact Analysis Python.

Para autenticar no Artifact Analysis, configure o Application Default Credentials. Para mais informações, consulte Configurar a autenticação para um ambiente de desenvolvimento local.

from google.cloud.devtools import containeranalysis_v1


def get_occurrences_for_image(resource_url: str, project_id: str) -> int:
    """Retrieves all the occurrences associated with a specified image.
    Here, all occurrences are simply printed and counted."""
    # resource_url = 'https://gcr.io/my-project/my-image@sha256:123'
    # project_id = 'my-gcp-project'

    filter_str = f'resourceUrl="{resource_url}"'
    client = containeranalysis_v1.ContainerAnalysisClient()
    grafeas_client = client.get_grafeas_client()
    project_name = f"projects/{project_id}"

    response = grafeas_client.list_occurrences(parent=project_name, filter=filter_str)
    count = 0
    for o in response:
        # do something with the retrieved occurrence
        # in this sample, we will simply count each one
        count += 1
    return count

Conferir ocorrências no Cloud Build

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

O painel lateral Insights de segurança fornece uma visão geral de alto nível das informações de segurança do 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 Acessar insights de segurança do build.

Filtrar ocorrências

É possível usar 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.

Conferir as ocorrências de descoberta

Quando uma imagem é inicialmente enviada para o Container Registry, ele cria uma ocorrência de descoberta que contém informações sobre a verificação inicial da imagem do contêiner.

Para recuperar a ocorrência de descoberta de uma imagem, use a seguinte expressão de filtro:

kind="DISCOVERY" AND resourceUrl="RESOURCE_URL"

O snippet a seguir mostra como usar uma expressão de filtro para conferir ocorrências de descoberta de uma imagem. Os snippets de código especificam URLs para imagens no Container Registry. Se você estiver usando o Artifact Registry, especifique as imagens com um URL no formato:

LOCATION-docker.pkg.dev/PROJECT_ID/REPOSITORY/IMAGE_ID

gcloud

Para ver as ocorrências descobertas de uma imagem:

Nesse caso, a expressão não é usada diretamente no comando, mas as mesmas informações são passadas como argumentos:

Artifact Registry:

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

Container Registry:

gcloud beta container images list-tags \
--occurrence-filter='kind="DISCOVERY"' --format=json HOSTNAME/PROJECT_ID/IMAGE_ID

API

Para recuperar a ocorrência da descoberta, a expressão de filtro precisa ser codificada por URL e incorporada a uma solicitação GET da seguinte maneira:

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

Consulte o endpoint da API projects.occurrences.get para mais detalhes.

Java

Para saber como instalar e usar a biblioteca de cliente do Artifact Analysis, consulte Bibliotecas de cliente da Análise de artefato. Para mais informações, consulte a documentação de referência da API Artifact Analysis Java.

Para autenticar no Artifact Analysis, configure o Application Default Credentials. Para mais informações, consulte Configurar a autenticação para um ambiente de desenvolvimento local.

import com.google.cloud.devtools.containeranalysis.v1.ContainerAnalysisClient;
import io.grafeas.v1.GrafeasClient;
import io.grafeas.v1.Occurrence;
import io.grafeas.v1.ProjectName;
import java.io.IOException;
import java.lang.InterruptedException;

public class GetDiscoveryInfo {
  // Retrieves and prints the Discovery Occurrence created for a specified image
  // The Discovery Occurrence contains information about the initial scan on the image
  public static void getDiscoveryInfo(String resourceUrl, String projectId) 
      throws IOException, InterruptedException {
    // String resourceUrl = "https://gcr.io/project/image@sha256:123";
    // String projectId = "my-project-id";
    String filterStr = "kind=\"DISCOVERY\" AND resourceUrl=\"" + resourceUrl + "\"";
    final String projectName = ProjectName.format(projectId);

    // Initialize client that will be used to send requests. After completing all of your requests, 
    // call the "close" method on the client to safely clean up any remaining background resources.
    GrafeasClient client = ContainerAnalysisClient.create().getGrafeasClient();
    for (Occurrence o : client.listOccurrences(projectName, filterStr).iterateAll()) {
      System.out.println(o);
    }
  }
}

Go

Para saber como instalar e usar a biblioteca de cliente do Artifact Analysis, consulte Bibliotecas de cliente da Análise de artefato. Para mais informações, consulte a documentação de referência da API Artifact Analysis Go.

Para autenticar no Artifact Analysis, configure o Application Default Credentials. Para mais informações, consulte Configurar a autenticação para um ambiente de desenvolvimento local.


import (
	"context"
	"fmt"
	"io"

	containeranalysis "cloud.google.com/go/containeranalysis/apiv1"
	"google.golang.org/api/iterator"
	grafeaspb "google.golang.org/genproto/googleapis/grafeas/v1"
)

// getDiscoveryInfo retrieves and prints the Discovery Occurrence created for a specified image.
// The Discovery Occurrence contains information about the initial scan on the image.
func getDiscoveryInfo(w io.Writer, resourceURL, projectID string) error {
	// Use this style of URL when you use Google Container Registry.
	// resourceURL := "https://gcr.io/my-project/my-repo/my-image"
	// Use this style of URL when you use Google Artifact Registry.
	// resourceURL := "https://LOCATION-docker.pkg.dev/my-project/my-repo/my-image"
	ctx := context.Background()
	client, err := containeranalysis.NewClient(ctx)
	if err != nil {
		return fmt.Errorf("NewClient: %w", err)
	}
	defer client.Close()

	req := &grafeaspb.ListOccurrencesRequest{
		Parent: fmt.Sprintf("projects/%s", projectID),
		Filter: fmt.Sprintf(`kind="DISCOVERY" AND resourceUrl=%q`, resourceURL),
	}
	it := client.GetGrafeasClient().ListOccurrences(ctx, req)
	for {
		occ, err := it.Next()
		if err == iterator.Done {
			break
		}
		if err != nil {
			return fmt.Errorf("occurrence iteration error: %w", err)
		}
		fmt.Fprintln(w, occ)
	}
	return nil
}

Node.js

Para saber como instalar e usar a biblioteca de cliente do Artifact Analysis, consulte Bibliotecas de cliente da Análise de artefato. Para mais informações, consulte a documentação de referência da API Artifact Analysis Node.js.

Para autenticar na Artifact Analysis, configure o Application Default Credentials. Para mais informações, consulte Configurar a autenticação para um ambiente de desenvolvimento local.

/**
 * TODO(developer): Uncomment these variables before running the sample
 */
// const projectId = 'your-project-id', // Your GCP Project ID
// If you are using Google Container Registry
// const imageUrl = 'https://gcr.io/my-project/my-repo/my-image:123' // Image to attach metadata to
// If you are using Google Artifact Registry
// const imageUrl = 'https://LOCATION-docker.pkg.dev/my-project/my-repo/my-image:123' // Image to attach metadata to

// Import the library and create a client
const {ContainerAnalysisClient} = require('@google-cloud/containeranalysis');
const client = new ContainerAnalysisClient();

const formattedParent = client.getGrafeasClient().projectPath(projectId);
// Retrieves and prints the Discovery Occurrence created for a specified image
// The Discovery Occurrence contains information about the initial scan on the image
const [occurrences] = await client.getGrafeasClient().listOccurrences({
  parent: formattedParent,
  filter: `kind = "DISCOVERY" AND resourceUrl = "${imageUrl}"`,
});

if (occurrences.length > 0) {
  console.log(`Discovery Occurrences for ${imageUrl}`);
  occurrences.forEach(occurrence => {
    console.log(`${occurrence.name}:`);
  });
} else {
  console.log('No occurrences found.');
}

Ruby

Para saber como instalar e usar a biblioteca de cliente do Artifact Analysis, consulte Bibliotecas de cliente da Análise de artefato. Para mais informações, consulte a documentação de referência da API Artifact Analysis Ruby.

Para autenticar no Artifact Analysis, configure o Application Default Credentials. Para mais informações, consulte Configurar a autenticação para um ambiente de desenvolvimento local.

# resource_url = "The URL of the resource associated with the occurrence."
#                # e.g. https://gcr.io/project/image@sha256:123
# project_id   = "The Google Cloud project ID of the occurrences to retrieve"

require "google/cloud/container_analysis"

# Initialize the client
client = Google::Cloud::ContainerAnalysis.container_analysis.grafeas_client

parent = client.project_path project: project_id
filter = "kind = \"DISCOVERY\" AND resourceUrl = \"#{resource_url}\""
client.list_occurrences(parent: parent, filter: filter).each do |occurrence|
  # Process discovery occurrence here
  puts occurrence
end

Python

Para saber como instalar e usar a biblioteca de cliente do Artifact Analysis, consulte Bibliotecas de cliente da Análise de artefato. Para mais informações, consulte a documentação de referência da API Artifact Analysis Python.

Para autenticar no Artifact Analysis, configure o Application Default Credentials. Para mais informações, consulte Configurar a autenticação para um ambiente de desenvolvimento local.

from google.cloud.devtools import containeranalysis_v1


def get_discovery_info(resource_url: str, project_id: str) -> None:
    """Retrieves and prints the discovery occurrence created for a specified
    image. The discovery occurrence contains information about the initial
    scan on the image."""
    # resource_url = 'https://gcr.io/my-project/my-image@sha256:123'
    # project_id = 'my-gcp-project'

    filter_str = f'kind="DISCOVERY" AND resourceUrl="{resource_url}"'
    client = containeranalysis_v1.ContainerAnalysisClient()
    grafeas_client = client.get_grafeas_client()
    project_name = f"projects/{project_id}"
    response = grafeas_client.list_occurrences(parent=project_name, filter_=filter_str)
    for occ in response:
        print(occ)

Conferir ocorrências de vulnerabilidade

Para visualizar todas as ocorrências de vulnerabilidade de uma imagem específica, crie uma consulta com uma expressão de filtro:

kind="VULNERABILITY" AND resourceUrl="RESOURCE_URL"

O snippet a seguir mostra como recuperar uma lista de ocorrências de vulnerabilidade de uma imagem. Os snippets de código especificam URLs para imagens no Container Registry. Se você estiver usando o Artifact Registry, especifique as imagens com um URL no formato:

LOCATION-docker.pkg.dev/PROJECT_ID/REPOSITORY/IMAGE_ID

gcloud

Para ver todas as ocorrências de vulnerabilidade de uma imagem:

Nesse caso, a expressão não é usada diretamente no comando, mas as mesmas informações são passadas como argumentos:

Artifact Registry

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

Container Registry

gcloud beta container images list-tags \
--occurrence-filter='kind="VULNERABILITY"' --format=json HOSTNAME/PROJECT_ID/IMAGE_ID

API

O URL do recurso precisa ser codificado por URL e incorporado a uma solicitação GET da seguinte maneira:

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

Consulte o endpoint da API projects.occurrences.get para mais detalhes.

Java

Para saber como instalar e usar a biblioteca de cliente do Artifact Analysis, consulte Bibliotecas de cliente da Análise de artefato. Para mais informações, consulte a documentação de referência da API Artifact Analysis Java.

Para autenticar no Artifact Analysis, configure o Application Default Credentials. Para mais informações, consulte Configurar a autenticação para um ambiente de desenvolvimento local.

import com.google.cloud.devtools.containeranalysis.v1.ContainerAnalysisClient;
import io.grafeas.v1.GrafeasClient;
import io.grafeas.v1.Occurrence;
import io.grafeas.v1.ProjectName;
import java.io.IOException;
import java.util.LinkedList;
import java.util.List;

public class VulnerabilityOccurrencesForImage {
  // Retrieve a list of vulnerability occurrences assoviated with a resource
  public static List<Occurrence> findVulnerabilityOccurrencesForImage(String resourceUrl, 
      String projectId) throws IOException {
    // String resourceUrl = "https://gcr.io/project/image@sha256:123";
    // String projectId = "my-project-id";
    final String projectName = ProjectName.format(projectId);
    String filterStr = String.format("kind=\"VULNERABILITY\" AND resourceUrl=\"%s\"", resourceUrl);

    // Initialize client that will be used to send requests. After completing all of your requests, 
    // call the "close" method on the client to safely clean up any remaining background resources.
    GrafeasClient client = ContainerAnalysisClient.create().getGrafeasClient();
    LinkedList<Occurrence> vulnerabilitylist = new LinkedList<Occurrence>();
    for (Occurrence o : client.listOccurrences(projectName, filterStr).iterateAll()) {
      vulnerabilitylist.add(o);
    }
    return vulnerabilitylist;
  }
}

Go

Para saber como instalar e usar a biblioteca de cliente do Artifact Analysis, consulte Bibliotecas de cliente da Análise de artefato. Para mais informações, consulte a documentação de referência da API Artifact Analysis Go.

Para autenticar na Artifact Analysis, configure o Application Default Credentials. Para mais informações, consulte Configurar a autenticação para um ambiente de desenvolvimento local.


import (
	"context"
	"fmt"

	containeranalysis "cloud.google.com/go/containeranalysis/apiv1"
	"google.golang.org/api/iterator"
	grafeaspb "google.golang.org/genproto/googleapis/grafeas/v1"
)

// findVulnerabilityOccurrencesForImage retrieves all vulnerability Occurrences associated with a resource.
func findVulnerabilityOccurrencesForImage(resourceURL, projectID string) ([]*grafeaspb.Occurrence, error) {
	// Use this style of URL when you use Google Container Registry.
	// resourceURL := "https://gcr.io/my-project/my-repo/my-image"
	// Use this style of URL when you use Google Artifact Registry.
	// resourceURL := "https://LOCATION-docker.pkg.dev/my-project/my-repo/my-image"
	ctx := context.Background()
	client, err := containeranalysis.NewClient(ctx)
	if err != nil {
		return nil, fmt.Errorf("NewClient: %w", err)
	}
	defer client.Close()

	req := &grafeaspb.ListOccurrencesRequest{
		Parent: fmt.Sprintf("projects/%s", projectID),
		Filter: fmt.Sprintf("resourceUrl = %q kind = %q", resourceURL, "VULNERABILITY"),
	}

	var occurrenceList []*grafeaspb.Occurrence
	it := client.GetGrafeasClient().ListOccurrences(ctx, req)
	for {
		occ, err := it.Next()
		if err == iterator.Done {
			break
		}
		if err != nil {
			return nil, fmt.Errorf("occurrence iteration error: %w", err)
		}
		occurrenceList = append(occurrenceList, occ)
	}

	return occurrenceList, nil
}

Node.js

Para saber como instalar e usar a biblioteca de cliente do Artifact Analysis, consulte Bibliotecas de cliente da Análise de artefato. Para mais informações, consulte a documentação de referência da API Artifact Analysis Node.js.

Para autenticar no Artifact Analysis, configure o Application Default Credentials. Para mais informações, consulte Configurar a autenticação para um ambiente de desenvolvimento local.

/**
 * TODO(developer): Uncomment these variables before running the sample
 */
// const projectId = 'your-project-id', // Your GCP Project ID
// If you are using Google Container Registry
// const imageUrl = 'https://gcr.io/my-project/my-repo/my-image:123' // Image to attach metadata to
// If you are using Google Artifact Registry
// const imageUrl = 'https://LOCATION-docker.pkg.dev/my-project/my-repo/my-image:123' // Image to attach metadata to

// Import the library and create a client
const {ContainerAnalysisClient} = require('@google-cloud/containeranalysis');
const client = new ContainerAnalysisClient();

const formattedParent = client.getGrafeasClient().projectPath(projectId);

// Retrieve a list of vulnerability occurrences assoviated with a resource
const [occurrences] = await client.getGrafeasClient().listOccurrences({
  parent: formattedParent,
  filter: `kind = "VULNERABILITY" AND resourceUrl = "${imageUrl}"`,
});

if (occurrences.length) {
  console.log(`All Vulnerabilities for ${imageUrl}`);
  occurrences.forEach(occurrence => {
    console.log(`${occurrence.name}:`);
  });
} else {
  console.log('No occurrences found.');
}

Ruby

Para saber como instalar e usar a biblioteca de cliente do Artifact Analysis, consulte Bibliotecas de cliente da Análise de artefato. Para mais informações, consulte a documentação de referência da API Artifact Analysis Ruby.

Para autenticar no Artifact Analysis, configure o Application Default Credentials. Para mais informações, consulte Configurar a autenticação para um ambiente de desenvolvimento local.

# resource_url = "The URL of the resource associated with the occurrence
#                e.g. https://gcr.io/project/image@sha256:123"
# project_id   = "The Google Cloud project ID of the vulnerabilities to find"

require "google/cloud/container_analysis"

# Initialize the client
client = Google::Cloud::ContainerAnalysis.container_analysis.grafeas_client

parent = client.project_path project: project_id
filter = "resourceUrl = \"#{resource_url}\" AND kind = \"VULNERABILITY\""
client.list_occurrences parent: parent, filter: filter

Python

Para saber como instalar e usar a biblioteca de cliente do Artifact Analysis, consulte Bibliotecas de cliente da Análise de artefato. Para mais informações, consulte a documentação de referência da API Artifact Analysis Python.

Para autenticar no Artifact Analysis, configure o Application Default Credentials. Para mais informações, consulte Configurar a autenticação para um ambiente de desenvolvimento local.

from typing import List

from google.cloud.devtools import containeranalysis_v1
from grafeas.grafeas_v1 import types


def find_vulnerabilities_for_image(
    resource_url: str, project_id: str
) -> List[types.grafeas.Occurrence]:
    """ "Retrieves all vulnerability occurrences associated with a resource."""
    # resource_url = 'https://gcr.io/my-project/my-image@sha256:123'
    # project_id = 'my-gcp-project'

    client = containeranalysis_v1.ContainerAnalysisClient()
    grafeas_client = client.get_grafeas_client()
    project_name = f"projects/{project_id}"

    filter_str = 'kind="VULNERABILITY" AND resourceUrl="{}"'.format(resource_url)
    return list(grafeas_client.list_occurrences(parent=project_name, filter=filter_str))

Conferir ocorrências de um tipo específico

Nos dois exemplos anteriores, a única diferença entre as expressões de filtro é o valor de kind, que identifica o tipo de ocorrência. Use esse campo para limitar a lista de ocorrências a um tipo específico, como uma vulnerabilidade ou implantação.

Para recuperar ocorrências de uma imagem específica, use esta expressão de filtro:

kind="NOTE_KIND" AND resourceUrl="RESOURCE_URL"

Em que:

  • NOTE_KIND é o tipo de nota.
    • Por exemplo, use o tipo DISCOVERY para listar ocorrências de descoberta. Elas são criadas para imagens no momento em que são enviadas por push para o Container Registry.
    • Para listar as ocorrências de vulnerabilidade, use o tipo VULNERABILITY.
  • RESOURCE_URL é o URL completo da imagem https://HOSTNAME/PROJECT_ID/IMAGE_ID@sha256:HASH

A expressão de filtro usada para recuperar 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 é o prefixo de URL para algumas imagens
    • Para listar todas as versões de uma imagem: https://HOSTNAME/PROJECT_ID/IMAGE_ID@
    • Para listar todas as imagens em um projeto: https://HOSTNAME/PROJECT_ID/

Conferir imagens associadas a uma nota específica

É possível recuperar uma lista de recursos associados a um código 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:

noteProjectId="PROVIDER_PROJECT_ID" AND noteId="NOTE_ID"

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

resourceUrl="RESOURCE_URL" AND noteProjectId="PROVIDER_PROJECT_ID" \
    AND noteId="NOTE_ID"

Em que:

  • PROVIDER_PROJECT_ID é o código do projeto provedor. Por exemplo, goog-vulnz fornece a análise de vulnerabilidade padrão.
  • NOTE_ID é o código da nota. As notas relacionadas à segurança costumam ter o formato CVE-2019-12345.
  • RESOURCE_URL é o URL completo da imagem https://HOSTNAME/PROJECT_ID/IMAGE_ID@sha256:HASH

Por exemplo, para verificar todas as imagens que têm uma ocorrência de CVE-2017-16231 conforme analisado pelo Google, use a seguinte expressão de filtro:

noteProjectId="goog-vulnz" AND noteId="CVE-2017-16231"

A seguir