Como visualizar vulnerabilidades e metadados para imagens

O Container Analysis fornece informações sobre vulnerabilidade das imagens de contêiner no Container Registry. Os metadados são armazenados como notas. Uma ocorrência é criada para cada instância de nota associada a uma imagem. Consulte a página de preços para mais informações.

Nesta página, você verá uma descrição sobre como visualizar e filtrar notas e ocorrências.

Antes de começar

  1. Ativar a API Container Scanning.

  2. Leia a Visão geral do Container Analysis.

Como visualizar vulnerabilidades e outras ocorrências

Também é possível ver as ocorrências de suas imagens no Container Registry usando o Console do Cloud, a ferramenta de linha de comando gcloud, ou a API do Container Analysis. Os detalhes das vulnerabilidades das imagens também estarão disponíveis, caso haja alguma.

Para ver todas as ocorrências de uma imagem:

Console

  1. Abra a página do Container Registry no Console do Cloud.

    Abrir a página do Container Registry

  2. Clique no nome de uma imagem.

    O total de vulnerabilidades das imagens será exibido na coluna Vulnerabilidades.

    Captura de tela de uma imagem com vulnerabilidades

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

    A lista de vulnerabilidades mostra a gravidade, se há alguma correção disponível e o nome do pacote que contém a vulnerabilidade.

  4. Para saber mais sobre uma vulnerabilidade específica da origem de vulnerabilidade, clique no link na coluna Documentação.

Comando gcloud

Para ver ocorrências para uma imagem:

    gcloud beta container images list-tags --show-occurrences \
    [HOSTNAME]/[PROJECT_ID]/[IMAGE_ID]
    

em que:

  • [PROJECT_ID] é o ID do projeto onde as imagens estão localizadas.
  • [IMAGE_ID] é o código da imagem com as vulnerabilidades que você quer ver;
  • [HOSTNAME] é uma das opções descritas em Nome do registro.

Não é possível especificar uma tag de imagem com esse comando.

Para ver informações sobre uma tag ou uma camada:

    gcloud beta container images describe [HOSTNAME]/[PROJECT_ID]/[IMAGE_ID]:[TAG]
    

ou

    gcloud beta container images describe [HOSTNAME]/[PROJECT_ID]/[IMAGE_ID]@sha256:[HASH]
    

em que:

  • [PROJECT_ID] é o ID do projeto onde as imagens estão localizadas.
  • [IMAGE_ID] é o código da imagem com vulnerabilidades que você quer visualizar.
  • [TAG] é a tag da imagem que tem as informações que você quer conseguir;
  • [HASH] é o resumo da imagem;
  • [HOSTNAME] é uma das opções descritas em Nome do registro.

Para ver vulnerabilidades de uma tag de imagem ou camada:

    gcloud beta container images describe [HOSTNAME]/[PROJECT_ID]/[IMAGE_ID]:[TAG]  \
    --show-package-vulnerability
    

ou

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

Para filtrar as ocorrências de vulnerabilidades:

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

em que:

  • [PROJECT_ID] é o ID do projeto onde as imagens estão localizadas.
  • [IMAGE_ID] é o código da imagem com as ocorrências de vulnerabilidades que você quer ver.
  • [FILTER_EXPRESSION] é uma expressão de filtro de amostra no formato explicado nas Ocorrências de vulnerabilidades de filtragem.
  • [HOSTNAME] é uma das opções descritas em Nome do registro.

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 ver uma ocorrência:

 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 Container Registry, consulte Bibliotecas de cliente do Container Registry. Para mais informações, consulte a documentação de referência da API Container Registry Java.

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 Container Registry, consulte Bibliotecas de cliente do Container Registry. Para mais informações, consulte a documentação de referência da API Container Registry Go.


    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) {
    	// resourceURL := fmt.Sprintf("https://gcr.io/my-project/my-image")
    	ctx := context.Background()
    	client, err := containeranalysis.NewClient(ctx)
    	if err != nil {
    		return -1, fmt.Errorf("NewClient: %v", 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: %v", 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 Container Registry, consulte Bibliotecas de cliente do Container Registry. Para mais informações, consulte a documentação de referência da API Container Registry Node.js (em inglês).

/**
     * TODO(developer): Uncomment these variables before running the sample
     */
    // const projectId = 'your-project-id', // Your GCP Project ID
    // const imageUrl = 'https://gcr.io/my-project/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 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 Container Registry, consulte Bibliotecas de cliente do Container Registry. Para mais informações, consulte a documentação de referência da API Container Registry Ruby (em inglês).

# 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 "grafeas"

    # Initialize the client
    client = Grafeas.new

    formatted_parent = Grafeas::V1::GrafeasClient.project_path project_id
    filter = "resourceUrl = \"#{resource_url}\""
    count = 0
    client.list_occurrences(formatted_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 Container Registry, consulte Bibliotecas de cliente do Container Registry. Para mais informações, consulte a documentação de referência da API Container Registry Python (em inglês).

def get_occurrences_for_image(resource_url, project_id):
        """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'

        from google.cloud.devtools import containeranalysis_v1

        filter_str = 'resourceUrl="{}"'.format(resource_url)
        client = containeranalysis_v1.ContainerAnalysisClient()
        grafeas_client = client.get_grafeas_client()
        project_name = grafeas_client.project_path(project_id)

        response = grafeas_client.list_occurrences(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

Como filtrar ocorrências

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

Como visualizar 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 a expressão de filtro acima para exibir ocorrências de descoberta para uma imagem.

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

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

API

Para recuperar a ocorrência da descoberta, a expressão de filtro acima 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 Container Registry, consulte Bibliotecas de cliente do Container Registry. Para mais informações, consulte a documentação de referência da API Container Registry Java.

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 Container Registry, consulte Bibliotecas de cliente do Container Registry. Para mais informações, consulte a documentação de referência da API Container Registry Go.


    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 {
    	// resourceURL := fmt.Sprintf("https://gcr.io/my-project/my-image")
    	ctx := context.Background()
    	client, err := containeranalysis.NewClient(ctx)
    	if err != nil {
    		return fmt.Errorf("NewClient: %v", 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: %v", err)
    		}
    		fmt.Fprintln(w, occ)
    	}
    	return nil
    }
    

Node.js

Para saber como instalar e usar a biblioteca de cliente do Container Registry, consulte Bibliotecas de cliente do Container Registry. Para mais informações, consulte a documentação de referência da API Container Registry Node.js (em inglês).

/**
     * TODO(developer): Uncomment these variables before running the sample
     */
    // const projectId = 'your-project-id', // Your GCP Project ID
    // const imageUrl = 'https://gcr.io/my-project/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 Container Registry, consulte Bibliotecas de cliente do Container Registry. Para mais informações, consulte a documentação de referência da API Container Registry Ruby (em inglês).

# 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 "grafeas"

    # Initialize the client
    client = Grafeas.new

    formatted_parent = Grafeas::V1::GrafeasClient.project_path project_id
    filter = "kind = \"DISCOVERY\" AND resourceUrl = \"#{resource_url}\""
    client.list_occurrences(formatted_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 Container Registry, consulte Bibliotecas de cliente do Container Registry. Para mais informações, consulte a documentação de referência da API Container Registry Python (em inglês).

def get_discovery_info(resource_url, project_id):
        """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'

        from google.cloud.devtools import containeranalysis_v1

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

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

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

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

API

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

GET https://containeranalysis.googleapis.com/v1/projects/PROJECT_ID/occurrences?filter=kind%3D%VULNERABILITY%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 Container Registry, consulte Bibliotecas de cliente do Container Registry. Para mais informações, consulte a documentação de referência da API Container Registry Java.

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 Container Registry, consulte Bibliotecas de cliente do Container Registry. Para mais informações, consulte a documentação de referência da API Container Registry Go.


    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) {
    	// resourceURL := fmt.Sprintf("https://gcr.io/my-project/my-image")
    	ctx := context.Background()
    	client, err := containeranalysis.NewClient(ctx)
    	if err != nil {
    		return nil, fmt.Errorf("NewClient: %v", 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: %v", err)
    		}
    		occurrenceList = append(occurrenceList, occ)
    	}

    	return occurrenceList, nil
    }
    

Node.js

Para saber como instalar e usar a biblioteca de cliente do Container Registry, consulte Bibliotecas de cliente do Container Registry. Para mais informações, consulte a documentação de referência da API Container Registry Node.js (em inglês).

/**
     * TODO(developer): Uncomment these variables before running the sample
     */
    // const projectId = 'your-project-id', // Your GCP Project ID
    // const imageUrl = 'https://gcr.io/my-project/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 Container Registry, consulte Bibliotecas de cliente do Container Registry. Para mais informações, consulte a documentação de referência da API Container Registry Ruby (em inglês).

# 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 "grafeas"

    # Initialize the client
    client = Grafeas.new

    formatted_parent = Grafeas::V1::GrafeasClient.project_path project_id
    filter = "resourceUrl = \"#{resource_url}\" AND kind = \"VULNERABILITY\""
    client.list_occurrences formatted_parent, filter: filter

Python

Para saber como instalar e usar a biblioteca de cliente do Container Registry, consulte Bibliotecas de cliente do Container Registry. Para mais informações, consulte a documentação de referência da API Container Registry Python (em inglês).

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

        from google.cloud.devtools import containeranalysis_v1

        client = containeranalysis_v1.ContainerAnalysisClient()
        grafeas_client = client.get_grafeas_client()
        project_name = grafeas_client.project_path(project_id)

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

Como visualizar 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]")
    

onde:

  • [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]/

Como visualizar 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 ID do projeto provedor. Por exemplo, goog-vulnz fornece a análise de vulnerabilidade padrão.
  • [NOTE_ID] é o ID 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"
    

Como visualizar implantações

É possível listar as implantações que estão sendo executadas atualmente ou as implantações que estavam em execução durante um período específico.

Para visualizar implantações que estão em execução atualmente, use a seguinte expressão de filtro:

    kind="DEPLOYABLE" AND resourceUrl="[RESOURCE_URL]" AND \
        isNull(undeployTime)
    

Para visualizar implantações que estavam em execução durante um período de tempo específico, use a seguinte expressão de filtro:

    kind="DEPLOYABLE" AND resourceUrl="[RESOURCE_URL]" AND \
        deployTime<"[DEPLOY_TIME]" AND \
        undeployTime>"[UNDEPLOY_TIME]"
    

onde:

  • [RESOURCE_URL] é o URL completo da imagem https://[HOSTNAME]/[PROJECT_ID]/[IMAGE_ID]@sha256:[HASH]
  • [DEPLOY_TIME] é o horário de início do período de implantação. Use um carimbo de data/hora no formato UTC "Zulu" RFC 3339, medido com precisão de nanossegundos. Exemplo: "2014-10-02T15:01:23.045123456Z"
  • [UNDEPLOY_TIME] é o término do período de implementação. Use um carimbo de data/hora no formato UTC "Zulu" RFC 3339, medido com precisão de nanossegundos.

A seguir

  • Para instruções sobre como usar o Container Analysis para armazenar e gerenciar os metadados dos clientes, consulte Como fornecer metadados para imagens.

  • Você pode integrar a autorização binária com a verificação de vulnerabilidades para impedir que imagens com problemas de segurança conhecidos sejam executadas no seu ambiente de implantação. Para instruções sobre como fazer isso, consulte Integração da verificação de vulnerabilidades.