Analizar paquetes de SO automáticamente

En este documento se explica cómo habilitar la API Container Scanning, enviar una imagen a Artifact Registry y ver la lista de vulnerabilidades encontradas en la imagen.

Artifact Analysis proporciona información sobre las vulnerabilidades de las imágenes de contenedor de Artifact Registry. Los metadatos se almacenan como notas. Se crea una ocurrencia por cada instancia de una nota asociada a una imagen. Consulta los documentos de información general y precios para obtener más información.

Antes de empezar

  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.

    Roles required to select or create a project

    • Select a project: Selecting a project doesn't require a specific IAM role—you can select any project that you've been granted a role on.
    • Create a project: To create a project, you need the Project Creator (roles/resourcemanager.projectCreator), which contains the resourcemanager.projects.create permission. Learn how to grant roles.

    Go to project selector

  3. Verify that billing is enabled for your Google Cloud project.

  4. Enable the Artifact Registry and Container Scanning APIs.

    Roles required to enable APIs

    To enable APIs, you need the Service Usage Admin IAM role (roles/serviceusage.serviceUsageAdmin), which contains the serviceusage.services.enable permission. Learn how to grant roles.

    Enable the APIs

  5. Install the Google Cloud CLI.

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

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

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

    Roles required to select or create a project

    • Select a project: Selecting a project doesn't require a specific IAM role—you can select any project that you've been granted a role on.
    • Create a project: To create a project, you need the Project Creator (roles/resourcemanager.projectCreator), which contains the resourcemanager.projects.create permission. Learn how to grant roles.

    Go to project selector

  9. Verify that billing is enabled for your Google Cloud project.

  10. Enable the Artifact Registry and Container Scanning APIs.

    Roles required to enable APIs

    To enable APIs, you need the Service Usage Admin IAM role (roles/serviceusage.serviceUsageAdmin), which contains the serviceusage.services.enable permission. Learn how to grant roles.

    Enable the APIs

  11. Install the Google Cloud CLI.

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

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

    gcloud init
  14. Crea un repositorio de Docker en Artifact Registry y envía una imagen de contenedor al repositorio. Si no estás familiarizado con Artifact Registry, consulta la guía de inicio rápido de Docker.

Si habilitas esta API, también se habilitará el análisis de paquetes de idiomas en Artifact Registry. Consulta los tipos de paquetes admitidos.

Ver las vulnerabilidades de la imagen

Artifact Analysis analiza las imágenes nuevas cuando se suben a Artifact Registry. Este análisis extrae información sobre los paquetes del sistema del contenedor.

Puedes ver las vulnerabilidades de tus imágenes en el registro mediante la Google Cloud consola, la CLI de Google Cloud o la API Container Analysis. Si una imagen tiene vulnerabilidades, puedes obtener los detalles.

Análisis de artefactos solo actualiza los metadatos de las imágenes que se han enviado o extraído en los últimos 30 días. Transcurridos 30 días, los metadatos dejarán de actualizarse y los resultados estarán obsoletos. Además, Análisis de artefactos archiva los metadatos que no se han actualizado en más de 90 días, y estos no estarán disponibles en la consola, gcloud ni mediante la API. Google Cloud Para volver a analizar una imagen con metadatos obsoletos o archivados, extrae esa imagen. La actualización de los metadatos puede tardar hasta 24 horas.

Ver las incidencias en la Google Cloud consola

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

  1. Obtén la lista de repositorios.

    Abre la página Repositorios.

  2. En la lista de repositorios, haz clic en uno.

  3. En la lista de imágenes, haz clic en el nombre de una imagen.

    Los totales de vulnerabilidades de cada digest de imagen se muestran en la columna Vulnerabilidades.

    Imagen analizada con vulnerabilidades

  4. Para ver la lista de vulnerabilidades de una imagen, haga clic en el enlace de la columna Vulnerabilidades.

    En la sección Resultados del análisis se muestra un resumen de los tipos de paquetes analizados, el número total de vulnerabilidades, las vulnerabilidades con correcciones disponibles, las vulnerabilidades sin correcciones y la gravedad efectiva.

    La página de resultados del análisis, que muestra las vulnerabilidades, las correcciones y la gravedad efectiva

    En la tabla de vulnerabilidades se indica el nombre de la lista Common Vulnerabilities and Exposures (CVE) de cada vulnerabilidad detectada, la gravedad efectiva, la puntuación del sistema de puntuación de vulnerabilidades común (CVSS), las correcciones (si están disponibles), el nombre del paquete que contiene la vulnerabilidad y el tipo de paquete. Puede filtrar y ordenar estos archivos para consultar un archivo, un directorio o un tipo de archivo específico por extensión de archivo. Google Cloud La consola muestra hasta 1200 vulnerabilidades por página en esta tabla.

  5. Para obtener información sobre una CVE específica, haz clic en su nombre.

  6. Para ver los detalles de la vulnerabilidad, como el número de versión y la ubicación afectada, haga clic en Ver o Ver corregido en la fila con el nombre de la vulnerabilidad. El texto del enlace es Ver para las vulnerabilidades sin corrección y Ver corregidas para las vulnerabilidades en las que se ha aplicado una corrección.

Ver las incidencias con gcloud

Para ver las ocurrencias de una imagen en Artifact Registry, ejecuta el comando gcloud artifacts docker images list:

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

Donde:

  • LOCATION es la ubicación regional o multirregional del repositorio.
  • PROJECT_ID es el Google Cloud ID del proyecto de la consola.
  • REPOSITORY es el nombre del repositorio en el que se almacena la imagen.
  • IMAGE_ID es el nombre de la imagen en el repositorio. No puedes especificar una etiqueta de imagen con este comando.

De forma predeterminada, el comando devuelve las 10 imágenes más recientes. Para mostrar un número diferente de imágenes, usa la marca --show-occurrences-from. Por ejemplo, el siguiente comando devuelve las 25 imágenes más recientes:

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

La salida tiene un aspecto similar al siguiente:

Ejemplo de salida de imagen

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

Ver las vulnerabilidades de una etiqueta de imagen

Para ver las vulnerabilidades de una etiqueta de imagen, introduce uno de los siguientes comandos:

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

o

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

Donde:

  • LOCATION es la ubicación regional o multirregional del repositorio.
  • PROJECT_ID es el Google Cloud ID del proyecto de la consola.
  • REPOSITORY es el nombre del repositorio en el que se almacena la imagen.
  • IMAGE_ID es el nombre de la imagen en el repositorio.
  • TAG es la etiqueta de imagen sobre la que quieres obtener información.
  • HASH es el digest de la imagen.

Artifact Analysis devuelve resultados, incluido el packageType.

Filtrar ocurrencias de vulnerabilidades

Para filtrar las incidencias de vulnerabilidades, usa el parámetro --occurrence-filter:

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

Donde:

  • LOCATION es la ubicación regional o multirregional del repositorio.
  • PROJECT_ID es el Google Cloud ID del proyecto de la consola.
  • REPOSITORY es el nombre del repositorio en el que se almacena la imagen.
  • IMAGE_ID es el nombre de la imagen en el repositorio.
  • FILTER_EXPRESSION es una expresión de filtro de ejemplo con el formato que se explica en Filtrar ocurrencias de vulnerabilidades.

Ver las vulnerabilidades de una capa específica

Puede usar el campo layerDetails para determinar qué capa específica ha introducido un paquete vulnerable y para ver información adicional sobre esa capa. Por ejemplo, echa un vistazo a la siguiente salida de layerDetails para una imagen:

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

La salida muestra que el índice de la capa es 0 en la imagen del contenedor, con un hash de capa de sha256:123. El comando de compilación de Docker que se ha usado para compilar esta capa es FROM golang:example_sha256, y la capa también se encuentra en la imagen base library/golang.

Ver las incidencias con la API o el código

Para ver las apariciones de una imagen, especifica las imágenes con una URL en el siguiente formato:

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

API

Usar cURL

Para obtener una lista de las ocurrencias 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

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 información sobre una incidencia concreta, 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/OCCURRENCE_ID

Java

Para saber cómo instalar y usar la biblioteca de cliente de Artifact Analysis, consulta Bibliotecas de cliente de Artifact Analysis. Para obtener más información, consulta la documentación de referencia de la API Artifact Analysis Java.

Para autenticarte en Artifact Analysis, configura las credenciales predeterminadas de la aplicación. Para obtener más información, consulta el artículo Configurar la autenticación en un entorno de desarrollo 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 cómo instalar y usar la biblioteca de cliente de Artifact Analysis, consulta Bibliotecas de cliente de Artifact Analysis. Para obtener más información, consulta la documentación de referencia de la API Artifact Analysis Go.

Para autenticarte en Artifact Analysis, configura las credenciales predeterminadas de la aplicación. Para obtener más información, consulta el artículo Configurar la autenticación en un entorno de desarrollo 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 cómo instalar y usar la biblioteca de cliente de Artifact Analysis, consulta Bibliotecas de cliente de Artifact Analysis. Para obtener más información, consulta la documentación de referencia de la API Artifact Analysis Node.js.

Para autenticarte en Artifact Analysis, configura las credenciales predeterminadas de la aplicación. Para obtener más información, consulta el artículo Configurar la autenticación en un entorno de desarrollo 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 cómo instalar y usar la biblioteca de cliente de Artifact Analysis, consulta Bibliotecas de cliente de Artifact Analysis. Para obtener más información, consulta la documentación de referencia de la API Artifact Analysis Ruby.

Para autenticarte en Artifact Analysis, configura las credenciales predeterminadas de la aplicación. Para obtener más información, consulta el artículo Configurar la autenticación en un entorno de desarrollo 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 cómo instalar y usar la biblioteca de cliente de Artifact Analysis, consulta Bibliotecas de cliente de Artifact Analysis. Para obtener más información, consulta la documentación de referencia de la API Artifact Analysis Python.

Para autenticarte en Artifact Analysis, configura las credenciales predeterminadas de la aplicación. Para obtener más información, consulta el artículo Configurar la autenticación en un entorno de desarrollo 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

Ver las incidencias en Cloud Build

Si usas Cloud Build, también puedes ver las vulnerabilidades de las imágenes en el panel lateral Información de seguridad de la Google Cloud consola.

El panel lateral Estadísticas de seguridad ofrece una vista general de la información de seguridad de las compilaciones de los artefactos almacenados en Artifact Registry. Para obtener más información sobre el panel lateral y cómo puedes usar Cloud Build para proteger tu cadena de suministro de software, consulta Ver información valiosa sobre la seguridad de las compilaciones.

Filtrar ocurrencias

Puede usar cadenas de filtro en los comandos gcloud y en la API Artifact Analysis para filtrar las incidencias antes de verlas. En las siguientes secciones se describen los filtros de búsqueda admitidos.

Ver las ocurrencias de descubrimiento

Cuando se envía una imagen a Artifact Registry por primera vez, Artifact Registry crea un elemento de descubrimiento que contiene información sobre el análisis inicial de la imagen de contenedor.

Para obtener la ocurrencia de descubrimiento de una imagen, usa la siguiente expresión de filtro:

kind="DISCOVERY" AND resourceUrl="RESOURCE_URL"

Donde RESOURCE_URL tiene el siguiente formato:

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

gcloud

Para ver las detecciones de una imagen, sigue estos pasos:

En este caso, la expresión no se usa directamente en el comando, pero se transmite la misma información 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

API

Para recuperar la ocurrencia de descubrimiento, la expresión de filtro debe codificarse como URL e insertarse 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 más información sobre el punto final de la API projects.occurrences.get.

Java

Para saber cómo instalar y usar la biblioteca de cliente de Artifact Analysis, consulta Bibliotecas de cliente de Artifact Analysis. Para obtener más información, consulta la documentación de referencia de la API Artifact Analysis Java.

Para autenticarte en Artifact Analysis, configura las credenciales predeterminadas de la aplicación. Para obtener más información, consulta el artículo Configurar la autenticación en un entorno de desarrollo 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 cómo instalar y usar la biblioteca de cliente de Artifact Analysis, consulta Bibliotecas de cliente de Artifact Analysis. Para obtener más información, consulta la documentación de referencia de la API Artifact Analysis Go.

Para autenticarte en Artifact Analysis, configura las credenciales predeterminadas de la aplicación. Para obtener más información, consulta el artículo Configurar la autenticación en un entorno de desarrollo 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 cómo instalar y usar la biblioteca de cliente de Artifact Analysis, consulta Bibliotecas de cliente de Artifact Analysis. Para obtener más información, consulta la documentación de referencia de la API Artifact Analysis Node.js.

Para autenticarte en Artifact Analysis, configura las credenciales predeterminadas de la aplicación. Para obtener más información, consulta el artículo Configurar la autenticación en un entorno de desarrollo 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 cómo instalar y usar la biblioteca de cliente de Artifact Analysis, consulta Bibliotecas de cliente de Artifact Analysis. Para obtener más información, consulta la documentación de referencia de la API Artifact Analysis Ruby.

Para autenticarte en Artifact Analysis, configura las credenciales predeterminadas de la aplicación. Para obtener más información, consulta el artículo Configurar la autenticación en un entorno de desarrollo 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 cómo instalar y usar la biblioteca de cliente de Artifact Analysis, consulta Bibliotecas de cliente de Artifact Analysis. Para obtener más información, consulta la documentación de referencia de la API Artifact Analysis Python.

Para autenticarte en Artifact Analysis, configura las credenciales predeterminadas de la aplicación. Para obtener más información, consulta el artículo Configurar la autenticación en un entorno de desarrollo 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)

Ver las ocurrencias de vulnerabilidades

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

kind="VULNERABILITY" AND resourceUrl="RESOURCE_URL"

Donde RESOURCE_URL tiene el siguiente formato:

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

gcloud

En este caso, la expresión no se usa directamente en el comando, pero se transmite la misma información 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

API

La URL del recurso debe estar codificada como URL e insertada 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 más información sobre el punto final de la API projects.occurrences.get.

Java

Para saber cómo instalar y usar la biblioteca de cliente de Artifact Analysis, consulta Bibliotecas de cliente de Artifact Analysis. Para obtener más información, consulta la documentación de referencia de la API Artifact Analysis Java.

Para autenticarte en Artifact Analysis, configura las credenciales predeterminadas de la aplicación. Para obtener más información, consulta el artículo Configurar la autenticación en un entorno de desarrollo 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 cómo instalar y usar la biblioteca de cliente de Artifact Analysis, consulta Bibliotecas de cliente de Artifact Analysis. Para obtener más información, consulta la documentación de referencia de la API Artifact Analysis Go.

Para autenticarte en Artifact Analysis, configura las credenciales predeterminadas de la aplicación. Para obtener más información, consulta el artículo Configurar la autenticación en un entorno de desarrollo 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 cómo instalar y usar la biblioteca de cliente de Artifact Analysis, consulta Bibliotecas de cliente de Artifact Analysis. Para obtener más información, consulta la documentación de referencia de la API Artifact Analysis Node.js.

Para autenticarte en Artifact Analysis, configura las credenciales predeterminadas de la aplicación. Para obtener más información, consulta el artículo Configurar la autenticación en un entorno de desarrollo 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 cómo instalar y usar la biblioteca de cliente de Artifact Analysis, consulta Bibliotecas de cliente de Artifact Analysis. Para obtener más información, consulta la documentación de referencia de la API Artifact Analysis Ruby.

Para autenticarte en Artifact Analysis, configura las credenciales predeterminadas de la aplicación. Para obtener más información, consulta el artículo Configurar la autenticación en un entorno de desarrollo 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 cómo instalar y usar la biblioteca de cliente de Artifact Analysis, consulta Bibliotecas de cliente de Artifact Analysis. Para obtener más información, consulta la documentación de referencia de la API Artifact Analysis Python.

Para autenticarte en Artifact Analysis, configura las credenciales predeterminadas de la aplicación. Para obtener más información, consulta el artículo Configurar la autenticación en un entorno de desarrollo 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))

Ver las incidencias 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 ocurrencia. Usa este campo para limitar la lista de incidencias a un tipo concreto, como una vulnerabilidad o una implementación.

Para obtener las apariciones de una imagen concreta, 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 las detecciones. Las ocurrencias de Discovery se crean para las imágenes cuando se envían por primera vez a Artifact Registry.
    • Para enumerar las incidencias 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 obtener las apariciones 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 de algunas imágenes.
    • Para mostrar todas las versiones de una imagen, sigue estos pasos: https://HOSTNAME/PROJECT_ID/IMAGE_ID@
    • Para obtener una lista de todas las imágenes de un proyecto, haz lo siguiente: https://HOSTNAME/PROJECT_ID/

Ver las imágenes asociadas a una nota específica

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

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

noteProjectId="PROVIDER_PROJECT_ID" AND noteId="NOTE_ID"

Para comprobar si una imagen concreta tiene una nota específica, 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 buscar todas las imágenes que tengan una instancia de CVE-2017-16231 analizada por Google, usa la siguiente expresión de filtro:

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

Siguientes pasos