Eseguire la scansione automatica dei pacchetti del sistema operativo

In questo documento scoprirai come abilitare l'API Container Scanning, eseguire il push di un'immagine in Artifact Registry e visualizzare l'elenco delle vulnerabilità rilevate nell'immagine.

Artifact Analysis fornisce informazioni sulle vulnerabilità per le immagini container in Artifact Registry. I metadati vengono archiviati come note. Viene creata un'occorrenza per ogni istanza di una nota associata a un'immagine. Per saperne di più, consulta i documenti relativi alla panoramica e ai prezzi.

Prima di iniziare

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

    Go to project selector

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

  4. Enable the Artifact Registry and Container Scanning APIs.

    Enable the APIs

  5. Install the Google Cloud CLI.

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

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

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

    Go to project selector

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

  10. Enable the Artifact Registry and Container Scanning APIs.

    Enable the APIs

  11. Install the Google Cloud CLI.

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

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

    gcloud init
  14. Crea un repository Docker in Artifact Registry ed esegui il push di un'immagine container nel repository. Se non hai familiarità con Artifact Registry, consulta la guida rapida di Docker.

L'abilitazione di questa API attiva anche la scansione dei pacchetti di lingua in Artifact Registry. Consulta i tipi di pacchetti supportati.

Visualizza le vulnerabilità dell'immagine

Artifact Analysis esegue la scansione delle nuove immagini quando vengono caricate in Artifact Registry. Questa scansione estrae informazioni sui pacchetti di sistema nel contenitore.

Puoi visualizzare le occorrenze di vulnerabilità per le tue immagini nel registro utilizzando la console Google Cloud , Google Cloud CLI o l'API Container Analysis. Se un'immagine presenta vulnerabilità, puoi ottenere i dettagli.

Artifact Analysis aggiorna solo i metadati delle immagini di cui è stato eseguito il push o il pull negli ultimi 30 giorni. Dopo 30 giorni, i metadati non verranno più aggiornati e i risultati saranno obsoleti. Inoltre, Artifact Analysis archivia i metadati che sono rimasti inattivi per più di 90 giorni e i metadati non saranno disponibili nella console Google Cloud , in gcloud o utilizzando l'API. Per eseguire di nuovo la scansione di un'immagine con metadati obsoleti o archiviati, esegui il pull dell'immagine. L'aggiornamento dei metadati può richiedere fino a 24 ore.

Visualizzare le occorrenze nella console Google Cloud

Per visualizzare le vulnerabilità in un'immagine:

  1. Recupera l'elenco dei repository.

    Apri la pagina Repository

  2. Nell'elenco dei repository, fai clic su un repository.

  3. Nell'elenco delle immagini, fai clic sul nome di un'immagine.

    I totali delle vulnerabilità per ogni digest dell'immagine vengono visualizzati nella colonna Vulnerabilità.

    Un'immagine analizzata con vulnerabilità

  4. Per visualizzare l'elenco delle vulnerabilità di un'immagine, fai clic sul link nella colonna Vulnerabilità.

    La sezione Risultati scansione mostra un riepilogo dei tipi di pacchetti scansionati, delle vulnerabilità totali, delle vulnerabilità con correzioni disponibili, delle vulnerabilità senza correzioni e della gravità effettiva.

    La pagina dei risultati dell'analisi che elenca vulnerabilità, correzioni e gravità effettiva

    La tabella delle vulnerabilità elenca il nome delle vulnerabilità ed esposizioni comuni (CVE) per ogni vulnerabilità trovata, la gravità effettiva, il punteggio del Common Vulnerability Scoring System (CVSS), le correzioni (se disponibili), il nome del pacchetto che contiene la vulnerabilità e il tipo di pacchetto. Puoi filtrare e ordinare questi file per controllare un file, una directory o un tipo di file specifico in base all'estensione del file.La console Google Cloud mostra fino a 1200 vulnerabilità per pagina in questa tabella.

  5. Per i dettagli di una CVE specifica, fai clic sul nome della CVE.

  6. Per visualizzare i dettagli dell'occorrenza della vulnerabilità, come il numero di versione e la posizione interessata, fai clic su Visualizza o Visualizza correzione nella riga con il nome della vulnerabilità. Il testo del link è Visualizza per le vulnerabilità senza correzione e Visualizza correzione per le vulnerabilità a cui è stata applicata una correzione.

Visualizzare le occorrenze utilizzando gcloud

Per visualizzare le occorrenze per un'immagine in Artifact Registry, esegui il comando gcloud artifacts docker images list:

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

Dove:

  • LOCATION è la posizione regionale o multiregionale del repository.
  • PROJECT_ID è l' Google Cloud ID progetto della console.
  • REPOSITORY è il nome del repository in cui è archiviata l'immagine.
  • IMAGE_ID è il nome dell'immagine nel repository. Non puoi specificare un tag immagine con questo comando.

Per impostazione predefinita, il comando restituisce le 10 immagini più recenti. Per mostrare un numero diverso di immagini, utilizza il flag --show-occurrences-from. Ad esempio, il seguente comando restituisce le 25 immagini più recenti:

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

L'output è simile al seguente:

Esempio di output dell'immagine

  {
      "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"
        }
      }
    }
  

Visualizzare le vulnerabilità per un tag immagine

Per visualizzare le vulnerabilità per un tag immagine, inserisci uno dei seguenti comandi:

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

Dove:

  • LOCATION è la posizione regionale o multiregionale del repository.
  • PROJECT_ID è l' Google Cloud ID progetto della console.
  • REPOSITORY è il nome del repository in cui è archiviata l'immagine.
  • IMAGE_ID è il nome dell'immagine nel repository.
  • TAG è il tag immagine su cui vuoi ottenere informazioni.
  • HASH è il digest dell'immagine.

Artifact Analysis restituisce risultati che includono packageType.

Filtra le occorrenze di vulnerabilità

Per filtrare le occorrenze di vulnerabilità, utilizza il parametro --occurrence-filter:

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

Dove:

  • LOCATION è la posizione regionale o multiregionale del repository.
  • PROJECT_ID è l' Google Cloud ID progetto della console.
  • REPOSITORY è il nome del repository in cui è archiviata l'immagine.
  • IMAGE_ID è il nome dell'immagine nel repository.
  • FILTER_EXPRESSION è un'espressione di filtro di esempio nel formato spiegato in Filtrare le occorrenze di vulnerabilità.

Visualizzare le vulnerabilità per un livello specifico

Puoi utilizzare il campo layerDetails per determinare quale livello specifico ha introdotto un pacchetto vulnerabile e per visualizzare ulteriori informazioni su quel livello. Ad esempio, considera il seguente output layerDetails per un'immagine:

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

L'output mostra che l'indice del livello è 0 nell'immagine container, con un hash del livello pari a sha256:123. Il comando Docker build utilizzato per creare questo livello è FROM golang:example_sha256 e il livello si trova anche nell'immagine di base library/golang.

Visualizzare le occorrenze utilizzando l'API o il codice

Per visualizzare le occorrenze di un'immagine, specifica le immagini con un URL nel seguente formato:

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

API

Utilizzo di cURL

Per ottenere un elenco delle occorrenze nel tuo progetto:

 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

Per ottenere un riepilogo delle vulnerabilità nel tuo progetto:

 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

Per visualizzare i dettagli di un evento specifico:

 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

Per scoprire come installare e utilizzare la libreria client per Artifact Analysis, consulta la sezione Librerie client di Artifact Analysis. Per saperne di più, consulta la documentazione di riferimento dell'API Artifact Analysis Java.

Per eseguire l'autenticazione in Artifact Analysis, configura le Credenziali predefinite dell'applicazione. Per ulteriori informazioni, consulta Configura l'autenticazione per un ambiente di sviluppo locale.

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

Per scoprire come installare e utilizzare la libreria client per Artifact Analysis, consulta la sezione Librerie client di Artifact Analysis. Per saperne di più, consulta la documentazione di riferimento dell'API Artifact Analysis Go.

Per eseguire l'autenticazione in Artifact Analysis, configura le Credenziali predefinite dell'applicazione. Per ulteriori informazioni, consulta Configura l'autenticazione per un ambiente di sviluppo locale.


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

Per scoprire come installare e utilizzare la libreria client per Artifact Analysis, consulta la sezione Librerie client di Artifact Analysis. Per saperne di più, consulta la documentazione di riferimento dell'API Artifact Analysis Node.js.

Per eseguire l'autenticazione in Artifact Analysis, configura le Credenziali predefinite dell'applicazione. Per ulteriori informazioni, consulta Configura l'autenticazione per un ambiente di sviluppo locale.

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

Per scoprire come installare e utilizzare la libreria client per Artifact Analysis, consulta la sezione Librerie client di Artifact Analysis. Per saperne di più, consulta la documentazione di riferimento dell'API Artifact Analysis Ruby.

Per eseguire l'autenticazione in Artifact Analysis, configura le Credenziali predefinite dell'applicazione. Per ulteriori informazioni, consulta Configura l'autenticazione per un ambiente di sviluppo locale.

# 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

Per scoprire come installare e utilizzare la libreria client per Artifact Analysis, consulta la sezione Librerie client di Artifact Analysis. Per saperne di più, consulta la documentazione di riferimento dell'API Artifact Analysis Python.

Per eseguire l'autenticazione in Artifact Analysis, configura le Credenziali predefinite dell'applicazione. Per ulteriori informazioni, consulta Configura l'autenticazione per un ambiente di sviluppo locale.

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

Visualizza le occorrenze in Cloud Build

Se utilizzi Cloud Build, puoi visualizzare le vulnerabilità delle immagini anche nel riquadro laterale Approfondimenti sulla sicurezza all'interno della console Google Cloud .

Il riquadro laterale Approfondimenti sulla sicurezza fornisce una panoramica generale delle informazioni sulla sicurezza della build per gli artefatti archiviati in Artifact Registry. Per scoprire di più sul riquadro laterale e su come utilizzare Cloud Build per proteggere la tua catena di fornitura del software, consulta Visualizzare gli approfondimenti sulla sicurezza delle build.

Filtra occorrenze

Puoi utilizzare le stringhe di filtro nei comandi gcloud e nell'API Artifact Analysis per filtrare le occorrenze prima di visualizzarle. Le sezioni seguenti descrivono i filtri di ricerca supportati.

Visualizzare le occorrenze del rilevamento

Quando un'immagine viene inizialmente inviata ad Artifact Registry, Artifact Registry crea un'occorrenza di rilevamento, che contiene informazioni sulla scansione iniziale dell'immagine container.

Per recuperare l'occorrenza di rilevamento per un'immagine, utilizza la seguente espressione di filtro:

kind="DISCOVERY" AND resourceUrl="RESOURCE_URL"

Dove RESOURCE_URL ha il seguente formato:

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

gcloud

Visualizzare le occorrenze di rilevamento per un'immagine:

In questo caso, l'espressione non viene utilizzata direttamente nel comando, ma le stesse informazioni vengono trasmesse come argomenti:

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

Per recuperare l'occorrenza di rilevamento, l'espressione di filtro deve essere codificata come URL e incorporata in una richiesta GET nel seguente modo:

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

Per maggiori dettagli, consulta l'endpoint API projects.occurrences.get.

Java

Per scoprire come installare e utilizzare la libreria client per Artifact Analysis, consulta la sezione Librerie client di Artifact Analysis. Per saperne di più, consulta la documentazione di riferimento dell'API Artifact Analysis Java.

Per eseguire l'autenticazione in Artifact Analysis, configura le Credenziali predefinite dell'applicazione. Per ulteriori informazioni, consulta Configura l'autenticazione per un ambiente di sviluppo locale.

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

Per scoprire come installare e utilizzare la libreria client per Artifact Analysis, consulta la sezione Librerie client di Artifact Analysis. Per saperne di più, consulta la documentazione di riferimento dell'API Artifact Analysis Go.

Per eseguire l'autenticazione in Artifact Analysis, configura le Credenziali predefinite dell'applicazione. Per ulteriori informazioni, consulta Configura l'autenticazione per un ambiente di sviluppo locale.


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

Per scoprire come installare e utilizzare la libreria client per Artifact Analysis, consulta la sezione Librerie client di Artifact Analysis. Per saperne di più, consulta la documentazione di riferimento dell'API Artifact Analysis Node.js.

Per eseguire l'autenticazione in Artifact Analysis, configura le Credenziali predefinite dell'applicazione. Per ulteriori informazioni, consulta Configura l'autenticazione per un ambiente di sviluppo locale.

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

Per scoprire come installare e utilizzare la libreria client per Artifact Analysis, consulta la sezione Librerie client di Artifact Analysis. Per saperne di più, consulta la documentazione di riferimento dell'API Artifact Analysis Ruby.

Per eseguire l'autenticazione in Artifact Analysis, configura le Credenziali predefinite dell'applicazione. Per ulteriori informazioni, consulta Configura l'autenticazione per un ambiente di sviluppo locale.

# 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

Per scoprire come installare e utilizzare la libreria client per Artifact Analysis, consulta la sezione Librerie client di Artifact Analysis. Per saperne di più, consulta la documentazione di riferimento dell'API Artifact Analysis Python.

Per eseguire l'autenticazione in Artifact Analysis, configura le Credenziali predefinite dell'applicazione. Per ulteriori informazioni, consulta Configura l'autenticazione per un ambiente di sviluppo locale.

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)

Visualizzare le occorrenze di vulnerabilità

Per visualizzare le occorrenze di vulnerabilità per un'immagine specifica, crea una query con un'espressione di filtro:

kind="VULNERABILITY" AND resourceUrl="RESOURCE_URL"

Dove RESOURCE_URL ha il seguente formato:

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

gcloud

In questo caso, l'espressione non viene utilizzata direttamente nel comando, ma le stesse informazioni vengono trasmesse come argomenti:

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

L'URL della risorsa deve essere codificato come URL e incorporato in una richiesta GET nel seguente modo:

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

Per maggiori dettagli, consulta l'endpoint API projects.occurrences.get.

Java

Per scoprire come installare e utilizzare la libreria client per Artifact Analysis, consulta la sezione Librerie client di Artifact Analysis. Per saperne di più, consulta la documentazione di riferimento dell'API Artifact Analysis Java.

Per eseguire l'autenticazione in Artifact Analysis, configura le Credenziali predefinite dell'applicazione. Per ulteriori informazioni, consulta Configura l'autenticazione per un ambiente di sviluppo locale.

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

Per scoprire come installare e utilizzare la libreria client per Artifact Analysis, consulta la sezione Librerie client di Artifact Analysis. Per saperne di più, consulta la documentazione di riferimento dell'API Artifact Analysis Go.

Per eseguire l'autenticazione in Artifact Analysis, configura le Credenziali predefinite dell'applicazione. Per ulteriori informazioni, consulta Configura l'autenticazione per un ambiente di sviluppo locale.


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

Per scoprire come installare e utilizzare la libreria client per Artifact Analysis, consulta la sezione Librerie client di Artifact Analysis. Per saperne di più, consulta la documentazione di riferimento dell'API Artifact Analysis Node.js.

Per eseguire l'autenticazione in Artifact Analysis, configura le Credenziali predefinite dell'applicazione. Per ulteriori informazioni, consulta Configura l'autenticazione per un ambiente di sviluppo locale.

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

Per scoprire come installare e utilizzare la libreria client per Artifact Analysis, consulta la sezione Librerie client di Artifact Analysis. Per saperne di più, consulta la documentazione di riferimento dell'API Artifact Analysis Ruby.

Per eseguire l'autenticazione in Artifact Analysis, configura le Credenziali predefinite dell'applicazione. Per ulteriori informazioni, consulta Configura l'autenticazione per un ambiente di sviluppo locale.

# 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

Per scoprire come installare e utilizzare la libreria client per Artifact Analysis, consulta la sezione Librerie client di Artifact Analysis. Per saperne di più, consulta la documentazione di riferimento dell'API Artifact Analysis Python.

Per eseguire l'autenticazione in Artifact Analysis, configura le Credenziali predefinite dell'applicazione. Per ulteriori informazioni, consulta Configura l'autenticazione per un ambiente di sviluppo locale.

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

Visualizzare le occorrenze di un tipo specifico

Nei due esempi precedenti, l'unica differenza tra le espressioni di filtro è il valore di kind, che identifica il tipo di occorrenza. Utilizza questo campo per limitare l'elenco delle occorrenze a un tipo specifico, ad esempio una vulnerabilità o un deployment.

Per recuperare le occorrenze di un'immagine specifica, utilizza questa espressione di filtro:

kind="NOTE_KIND" AND resourceUrl="RESOURCE_URL"

Dove:

  • NOTE_KIND è il tipo di nota.
    • Ad esempio, utilizza il tipo DISCOVERY per elencare le occorrenze di rilevamento. Le occorrenze di scoperta vengono create per le immagini quando vengono inizialmente inserite in Artifact Registry.
    • Per elencare le occorrenze di vulnerabilità, utilizza il tipo VULNERABILITY.
  • RESOURCE_URL è l'URL completo dell'immagine https://HOSTNAME/PROJECT_ID/IMAGE_ID@sha256:HASH

L'espressione di filtro per recuperare le occorrenze di un tipo specifico in molte immagini è:

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

Dove:

  • RESOURCE_URL_PREFIX è il prefisso URL per alcune immagini
    • Per elencare tutte le versioni di un'immagine: https://HOSTNAME/PROJECT_ID/IMAGE_ID@
    • Per elencare tutte le immagini in un progetto: https://HOSTNAME/PROJECT_ID/

Visualizzare le immagini associate a una nota specifica

Puoi recuperare un elenco di risorse associate a un ID nota specifico. Ad esempio, puoi elencare le immagini con una vulnerabilità CVE specifica.

Per elencare tutte le immagini all'interno di un progetto associate a una determinata nota, utilizza la seguente espressione di filtro:

noteProjectId="PROVIDER_PROJECT_ID" AND noteId="NOTE_ID"

Per controllare un'immagine specifica per una nota specifica, utilizza la seguente espressione di filtro:

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

Dove:

  • PROVIDER_PROJECT_ID è l'ID del progetto del fornitore. Ad esempio, goog-vulnz fornisce l'analisi delle vulnerabilità predefinita.
  • NOTE_ID è l'ID della nota. Le note relative alla sicurezza sono spesso formattate come CVE-2019-12345.
  • RESOURCE_URL è l'URL completo dell'immagine https://HOSTNAME/PROJECT_ID/IMAGE_ID@sha256:HASH

Ad esempio, per verificare la presenza di tutte le immagini che hanno un'occorrenza di CVE-2017-16231 come analizzato da Google, utilizza la seguente espressione di filtro:

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

Passaggi successivi