Obtén vulnerabilidades y metadatos de las imágenes

Container Analysis proporciona información sobre las vulnerabilidades y otros tipos de metadatos de las imágenes de contenedor en Container Registry. Los metadatos se almacenan como notas. Se crea un caso para cada instancia de una nota asociada con una imagen. Consulta Precios para obtener información sobre los precios.

En esta página, se describe cómo ver y filtrar notas y casos.

Antes de comenzar

  1. Habilita la API de Container Scanning.

  2. Lee la descripción general de Container Analysis.

Visualiza vulnerabilidades y otros casos

Puedes ver los casos asociados a tus imágenes en Container Registry mediante Cloud Console, la herramienta de línea de comandos de gcloud o la API de Container Analysis. Si una imagen tiene vulnerabilidades, puedes obtener los detalles.

Para ver los casos de una imagen, sigue estos pasos:

Console

  1. Abre la página de Container Registry en Cloud Console.

    Abrir la página de Container Registry

  2. Haz clic en el nombre de una imagen.

    Los totales de las vulnerabilidades de las imágenes se muestran en la columna Vulnerabilidades.

    Captura de pantalla de una imagen con vulnerabilidades

  3. Para ver la lista de vulnerabilidades de una imagen, haz clic en el vínculo de la columna Vulnerabilidades.

    En la lista de vulnerabilidades, se muestra la gravedad, la disponibilidad de una corrección y el nombre del paquete que contiene la vulnerabilidad.

  4. Para obtener más información acerca de una vulnerabilidad específica de la fuente de vulnerabilidad, haz clic en el vínculo de la columna Documentación.

Comando de gcloud

Para ver los casos asociados a una imagen, sigue estos pasos:

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

donde:

  • [PROJECT_ID] es el ID del proyecto que contiene las imágenes.
  • [IMAGE_ID] es el ID de la imagen para la que deseas ver las vulnerabilidades.
  • [HOSTNAME] es una de las opciones descritas en Nombre del registro.

No puedes especificar una etiqueta de imagen con este comando.

Para ver información sobre una etiqueta o una capa, sigue estos pasos:

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

o

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

donde:

  • [PROJECT_ID] es el ID del proyecto que contiene las imágenes.
  • [IMAGE_ID] es el ID de la imagen para la que deseas ver las vulnerabilidades.
  • [TAG] es la etiqueta de imagen sobre la que deseas obtener información.
  • [HASH] es el resumen de la imagen.
  • [HOSTNAME] es una de las opciones descritas en Nombre del registro.

Para ver las vulnerabilidades de una etiqueta de imagen o una capa, sigue estos pasos:

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

o

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

Para filtrar los casos de vulnerabilidades, sigue estos pasos:

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

donde:

  • [PROJECT_ID] es el ID del proyecto que contiene las imágenes.
  • [IMAGE_ID] es el ID de la imagen para la que deseas ver los casos de vulnerabilidades.
  • [FILTER_EXPRESSION] es una expresión de filtro de muestra con el formato que se explica en Filtrar casos de vulnerabilidades.
  • [HOSTNAME] es una de las opciones descritas en Nombre del registro.

API

Usa cURL

Para obtener una lista de los casos en tu proyecto, sigue estos pasos:

 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 obtener un resumen de las vulnerabilidades de tu proyecto, sigue estos pasos:

 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 obtener un evento, realiza lo siguiente:

 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 obtener información sobre cómo instalar y usar la biblioteca cliente de Container Registry, consulta las Bibliotecas cliente de Container Registry. Si deseas obtener más información, consulta la documentación de referencia de la API de Java para Container Registry.

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 obtener información sobre cómo instalar y usar la biblioteca cliente de Container Registry, consulta las Bibliotecas cliente de Container Registry. Si deseas obtener más información, consulta la documentación de referencia de la API de Go para Container Registry.


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 obtener información sobre cómo instalar y usar la biblioteca cliente de Container Registry, consulta las Bibliotecas cliente de Container Registry. Si deseas obtener más información, consulta la documentación de referencia de la API de Node.js para Container Registry.

/**
 * 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 obtener información sobre cómo instalar y usar la biblioteca cliente de Container Registry, consulta las Bibliotecas cliente de Container Registry. Si deseas obtener más información, consulta la documentación de referencia de la API de Ruby para Container Registry.

# 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 obtener información sobre cómo instalar y usar la biblioteca cliente de Container Registry, consulta las Bibliotecas cliente de Container Registry. Si deseas obtener más información, consulta la documentación de referencia de la API de Python para Container Registry.

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

Filtra los casos

Puedes usar strings de filtro en los comandos de gcloud y en la API de Container Analysis para filtrar los casos antes de verlos. En las siguientes secciones, se describen los filtros de búsqueda admitidos.

Visualiza los casos de descubrimiento

Cuando se envía una imagen inicialmente a Container Registry, se crea un caso de descubrimiento que contiene información sobre el análisis inicial de la imagen del contenedor.

Para recuperar un caso de descubrimiento de una imagen, usa la siguiente expresión de filtro:

kind="DISCOVERY" AND resourceUrl="[RESOURCE_URL]"

En el siguiente fragmento, se muestra cómo usar la expresión de filtro anterior para ver los casos de descubrimiento de una imagen.

Comando de gcloud

Para ver los casos de descubrimiento de una imagen, sigue estos pasos:

En este caso, la expresión no se usa directamente en el comando, pero se pasa la misma información como argumentos:

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

API

Para recuperar el caso de descubrimiento, la expresión de filtro anterior debe estar codificada como una URL y también incorporada en una solicitud GET de la siguiente manera:

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

Consulta el extremo de la API de projects.occurrences.get para obtener más detalles.

Java

Para obtener información sobre cómo instalar y usar la biblioteca cliente de Container Registry, consulta las Bibliotecas cliente de Container Registry. Si deseas obtener más información, consulta la documentación de referencia de la API de Java para Container Registry.

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 obtener información sobre cómo instalar y usar la biblioteca cliente de Container Registry, consulta las Bibliotecas cliente de Container Registry. Si deseas obtener más información, consulta la documentación de referencia de la API de Go para Container Registry.


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 obtener información sobre cómo instalar y usar la biblioteca cliente de Container Registry, consulta las Bibliotecas cliente de Container Registry. Si deseas obtener más información, consulta la documentación de referencia de la API de Node.js para Container Registry.

/**
 * 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 obtener información sobre cómo instalar y usar la biblioteca cliente de Container Registry, consulta las Bibliotecas cliente de Container Registry. Si deseas obtener más información, consulta la documentación de referencia de la API de Ruby para Container Registry.

# 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 obtener información sobre cómo instalar y usar la biblioteca cliente de Container Registry, consulta las Bibliotecas cliente de Container Registry. Si deseas obtener más información, consulta la documentación de referencia de la API de Python para Container Registry.

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)

Visualiza los casos de vulnerabilidades

Para ver los casos de vulnerabilidades de una imagen específica, crea una consulta con una expresión de filtro:

kind="VULNERABILITY" AND resourceUrl="[RESOURCE_URL]"

El siguiente fragmento muestra cómo recuperar una lista de casos de vulnerabilidades de una imagen.

Comando de gcloud

Para ver los casos de vulnerabilidades de una imagen, sigue estos pasos:

En este caso, la expresión no se usa directamente en el comando, pero se pasa la misma información como argumentos:

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

API

La URL del recurso deseado debe estar codificada como una URL y también incorporada en una solicitud GET de la siguiente manera:

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

Consulta el extremo de la API de projects.occurrences.get para obtener más detalles.

Java

Para obtener información sobre cómo instalar y usar la biblioteca cliente de Container Registry, consulta las Bibliotecas cliente de Container Registry. Si deseas obtener más información, consulta la documentación de referencia de la API de Java para Container Registry.

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 obtener información sobre cómo instalar y usar la biblioteca cliente de Container Registry, consulta las Bibliotecas cliente de Container Registry. Si deseas obtener más información, consulta la documentación de referencia de la API de Go para Container Registry.


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 obtener información sobre cómo instalar y usar la biblioteca cliente de Container Registry, consulta las Bibliotecas cliente de Container Registry. Si deseas obtener más información, consulta la documentación de referencia de la API de Node.js para Container Registry.

/**
 * 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 obtener información sobre cómo instalar y usar la biblioteca cliente de Container Registry, consulta las Bibliotecas cliente de Container Registry. Si deseas obtener más información, consulta la documentación de referencia de la API de Ruby para Container Registry.

# 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 obtener información sobre cómo instalar y usar la biblioteca cliente de Container Registry, consulta las Bibliotecas cliente de Container Registry. Si deseas obtener más información, consulta la documentación de referencia de la API de Python para Container Registry.

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

Ver los casos de un tipo específico

En los dos ejemplos anteriores, la única diferencia entre las expresiones de filtro es el valor de kind, que identifica el tipo de caso. Usa este campo para limitar la lista de casos a un tipo determinado, como una vulnerabilidad o una implementación.

Para recuperar los casos de una imagen específica, usa esta expresión de filtro:

kind="[NOTE_KIND]" AND resourceUrl="[RESOURCE_URL]"

donde:

  • [NOTE_KIND] es el tipo de nota.
    • Por ejemplo, usa el tipo DISCOVERY para enumerar los casos de descubrimiento. Estos se crean para las imágenes cuando se envían inicialmente a Container Registry.
    • Para enumerar los casos de vulnerabilidades, usa el tipo VULNERABILITY.
  • [RESOURCE_URL] es la URL completa de la imagen https://[HOSTNAME]/[PROJECT_ID]/[IMAGE_ID]@sha256:[HASH].

La expresión de filtro para recuperar casos de un tipo específico en muchas imágenes es la siguiente:

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

Donde:

  • [RESOURCE_URL_PREFIX] es el prefijo de URL para algunas imágenes
    • Para visualizar una lista de todas las versiones de una imagen, utliza: https://[HOSTNAME]/[PROJECT_ID]/[IMAGE_ID]@
    • Para visualizar una lista de todas las imágenes de un proyecto, utiliza: https://[HOSTNAME]/[PROJECT_ID]/

Visualiza imágenes asociadas con una nota específica

Puedes recuperar una lista de recursos asociados con un ID de nota específico. Por ejemplo, puedes enumerar imágenes con una vulnerabilidad CVE específica.

Para enumerar todas las imágenes de un proyecto que están asociadas con una nota en particular, usa la siguiente expresión de filtro:

noteProjectId="[PROVIDER_PROJECT_ID]" AND noteId="[NOTE_ID]"

Para verificar una imagen específica de una nota en particular, usa la siguiente expresión de filtro:

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

Donde:

  • [PROVIDER_PROJECT_ID] es el ID del proyecto del proveedor. Por ejemplo, goog-vulnz proporciona el análisis de vulnerabilidades predeterminado.
  • [NOTE_ID] es el ID de la nota. Las notas relacionadas con la seguridad suelen tener el formato CVE-2019-12345.
  • [RESOURCE_URL] es la URL completa de la imagen https://[HOSTNAME]/[PROJECT_ID]/[IMAGE_ID]@sha256:[HASH].

Por ejemplo, para verificar todas las imágenes que tengan un caso de CVE-2017-16231 según el análisis de Google, usa la siguiente expresión de filtro:

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

Visualiza las implementaciones

Puedes enumerar las implementaciones que se están ejecutando actualmente o las que se estaban ejecutando durante un período especificado.

Para ver las implementaciones que se están ejecutando actualmente, usa la siguiente expresión de filtro:

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

Para ver las implementaciones que se estaban ejecutando durante un período específico, usa la siguiente expresión de filtro:

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

Donde:

  • [RESOURCE_URL] es la URL completa de la imagen https://[HOSTNAME]/[PROJECT_ID]/[IMAGE_ID]@sha256:[HASH].
  • [DEPLOY_TIME] es la hora de inicio del período de implementación. Usa una marca de tiempo en formato RFC 3339 UTC "Zulú", con precisión de nanosegundos. Ejemplo: "2014-10-02T15:01:23.045123456Z"
  • [UNDEPLOY_TIME] es el final del período de implementación. Usa una marca de tiempo en formato RFC 3339 UTC "Zulú", con precisión de nanosegundos.

Qué sigue

  • Si deseas obtener instrucciones para usar Container Analysis a fin de almacenar y administrar los metadatos de tus clientes, consulta Proporcionar metadatos para las imágenes.

  • Puedes integrar la autorización binaria en el análisis de vulnerabilidades para evitar que se ejecuten imágenes con problemas de seguridad conocidos en tu entorno de implementación. Si deseas obtener instrucciones para hacerlo, consulta la Integración del análisis de vulnerabilidades.