Obtenir les failles et métadonnées d'images

Container Analysis fournit des informations sur les failles et d'autres types de métadonnées pour les images de conteneur dans Container Registry. Les métadonnées sont stockées sous forme de notes. Une occurrence est créée pour chaque occurrence d'une note associée à une image. Pour en savoir plus sur la tarification, consultez la page Tarifs.

Cette page explique comment afficher et filtrer les notes et les occurrences.

Avant de commencer

  1. Activez l'API Container Scanning.

  2. Lisez la présentation de Container Analysis.

  3. Découvrez comment configurer le contrôle d'accès de Container Analysis pour vos projets.

Afficher des failles et autres occurrences

Vous pouvez afficher les occurrences de vos images dans Container Registry à l'aide de Cloud Console, de l'outil de ligne de commande gcloud ou de l'API Container Analysis. Si une image présente des failles, vous pouvez obtenir les détails.

Pour afficher les occurrences d'une image :

Console

  1. Ouvrez la page Container Registry dans Cloud Console.

    Ouvrir la page "Container Registry"

  2. Cliquez sur un nom d'image.

    Le nombre total de failles par image est affiché dans la colonne Vulnerabilities (Failles).

    Capture d'écran d'une image avec des failles

  3. Pour afficher la liste des failles d'une image, cliquez sur le lien dans la colonne Vulnerabilities (Failles).

    Les informations sur la gravité, la disponibilité d'un correctif et le nom du package contenant la faille sont affichées dans la liste des failles.

  4. Pour en savoir plus sur une faille spécifique à partir de la source de la faille, cliquez sur le lien dans la colonne Documentation.

gcloud

Pour afficher les occurrences d'une image :

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

où :

  • [PROJECT_ID] est l'ID du projet qui contient les images.
  • [IMAGE_ID] est l'ID de l'image pour laquelle vous souhaitez afficher les failles.
  • [HOSTNAME] est l'une des options décrites dans Nom du registre.

Vous ne pouvez pas spécifier de tag d'image avec cette commande.

Pour afficher des informations sur un tag ou sur une couche :

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

ou

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

où :

  • [PROJECT_ID] est l'ID du projet qui contient les images.
  • [IMAGE_ID] est l'ID de l'image pour laquelle vous souhaitez afficher les failles.
  • [TAG] est le tag d'image sur lequel vous souhaitez obtenir des informations.
  • [HASH] est le condensé de l'image.
  • [HOSTNAME] est l'une des options décrites dans Nom du registre.

Pour afficher les failles d'un tag d'image ou d'une couche :

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

ou

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

Pour filtrer les occurrences de failles :

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

où :

  • [PROJECT_ID] est l'ID du projet qui contient les images.
  • [IMAGE_ID] est l'ID de l'image pour laquelle vous souhaitez afficher les occurrences de failles.
  • [FILTER_EXPRESSION] est un exemple d'expression de filtre au format expliqué dans la section Filtrer les occurrences de failles.
  • [HOSTNAME] est l'une des options décrites dans Nom du registre.

API

Utiliser cURL

Pour obtenir la liste des occurrences dans votre projet :

 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

Pour obtenir un résumé des failles de votre projet :

 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

Pour obtenir une occurrence :

 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

Pour apprendre à installer et à utiliser la bibliothèque cliente pour Container Registry, consultez la page Bibliothèques clientes Container Registry. Pour en savoir plus, consultez la documentation de référence sur l'API Container Registry en langage Java.

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

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

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

Go

Pour apprendre à installer et à utiliser la bibliothèque cliente pour Container Registry, consultez la page Bibliothèques clientes Container Registry. Pour en savoir plus, consultez la documentation de référence sur l'API Container Registry en langage Go.


import (
	"context"
	"fmt"
	"io"

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

// getOccurrencesForImage retrieves all the Occurrences associated with a specified image.
// Here, all Occurrences are simply printed and counted.
func getOccurrencesForImage(w io.Writer, resourceURL, projectID string) (int, error) {
	// resourceURL := fmt.Sprintf("https://gcr.io/my-project/my-image")
	ctx := context.Background()
	client, err := containeranalysis.NewClient(ctx)
	if err != nil {
		return -1, fmt.Errorf("NewClient: %v", err)
	}
	defer client.Close()

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

Node.js

Pour apprendre à installer et à utiliser la bibliothèque cliente pour Container Registry, consultez la page Bibliothèques clientes Container Registry. Pour en savoir plus, consultez la documentation de référence sur l'API Container Registry en langage Node.js.

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

Pour apprendre à installer et à utiliser la bibliothèque cliente pour Container Registry, consultez la page Bibliothèques clientes Container Registry. Pour en savoir plus, consultez la documentation de référence sur l'API Container Registry en langage Ruby.

# 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

Pour apprendre à installer et à utiliser la bibliothèque cliente pour Container Registry, consultez la page Bibliothèques clientes Container Registry. Pour en savoir plus, consultez la documentation de référence sur l'API Container Registry en langage Python.

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

Filtrer des occurrences

Vous pouvez utiliser des chaînes de filtre dans les commandes gcloud et l'API Container Analysis pour filtrer les occurrences avant de les afficher. Les sections ci-dessous décrivent les filtres de recherche compatibles.

Afficher les occurrences de découverte

Lorsqu'une image est initialement transférée dans Container Registry, elle crée une occurrence de découverte qui contient des informations sur l'analyse initiale de l'image de conteneur.

Pour récupérer l'occurrence de découverte d'une image, utilisez l'expression de filtre suivante :

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

L'extrait suivant montre comment utiliser l'expression de filtre ci-dessus pour afficher les occurrences de découverte d'une image.

gcloud

Pour afficher les occurrences de découverte d'une image :

Dans ce cas, l'expression n'est pas utilisée directement dans la commande, mais les mêmes informations sont transmises en tant qu'arguments :

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

API

Pour récupérer l'occurrence de découverte, vous devez encoder l'expression de filtre ci-dessus en URL et l'intégrer dans une requête GET comme suit :

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

Pour en savoir plus, reportez-vous au point de terminaison projects.occurrences.get de l'API.

Java

Pour apprendre à installer et à utiliser la bibliothèque cliente pour Container Registry, consultez la page Bibliothèques clientes Container Registry. Pour en savoir plus, consultez la documentation de référence sur l'API Container Registry en langage Java.

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

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

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

Go

Pour apprendre à installer et à utiliser la bibliothèque cliente pour Container Registry, consultez la page Bibliothèques clientes Container Registry. Pour en savoir plus, consultez la documentation de référence sur l'API Container Registry en langage Go.


import (
	"context"
	"fmt"
	"io"

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

// getDiscoveryInfo retrieves and prints the Discovery Occurrence created for a specified image.
// The Discovery Occurrence contains information about the initial scan on the image.
func getDiscoveryInfo(w io.Writer, resourceURL, projectID string) error {
	// resourceURL := fmt.Sprintf("https://gcr.io/my-project/my-image")
	ctx := context.Background()
	client, err := containeranalysis.NewClient(ctx)
	if err != nil {
		return fmt.Errorf("NewClient: %v", err)
	}
	defer client.Close()

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

Node.js

Pour apprendre à installer et à utiliser la bibliothèque cliente pour Container Registry, consultez la page Bibliothèques clientes Container Registry. Pour en savoir plus, consultez la documentation de référence sur l'API Container Registry en langage Node.js.

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

Pour apprendre à installer et à utiliser la bibliothèque cliente pour Container Registry, consultez la page Bibliothèques clientes Container Registry. Pour en savoir plus, consultez la documentation de référence sur l'API Container Registry en langage Ruby.

# 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

Pour apprendre à installer et à utiliser la bibliothèque cliente pour Container Registry, consultez la page Bibliothèques clientes Container Registry. Pour en savoir plus, consultez la documentation de référence sur l'API Container Registry en langage Python.

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 = f"projects/{project_id}"
    response = grafeas_client.list_occurrences(parent=project_name,
                                               filter_=filter_str)
    for occ in response:
        print(occ)

Afficher les occurrences de faille

Pour afficher les occurrences de faille pour une image spécifique, créez une requête avec une expression de filtre :

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

L'extrait de code suivant montre comment récupérer la liste des occurrences de failles d'une image.

gcloud

Pour afficher les occurrences de failles d'une image :

Dans ce cas, l'expression n'est pas utilisée directement dans la commande, mais les mêmes informations sont transmises en tant qu'arguments :

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

API

L'URL de la ressource souhaitée doit être une URL encodée et intégrée dans une requête GET comme suit :

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

Pour en savoir plus, reportez-vous au point de terminaison projects.occurrences.get de l'API.

Java

Pour apprendre à installer et à utiliser la bibliothèque cliente pour Container Registry, consultez la page Bibliothèques clientes Container Registry. Pour en savoir plus, consultez la documentation de référence sur l'API Container Registry en langage Java.

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

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

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

Go

Pour apprendre à installer et à utiliser la bibliothèque cliente pour Container Registry, consultez la page Bibliothèques clientes Container Registry. Pour en savoir plus, consultez la documentation de référence sur l'API Container Registry en langage Go.


import (
	"context"
	"fmt"

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

// findVulnerabilityOccurrencesForImage retrieves all vulnerability Occurrences associated with a resource.
func findVulnerabilityOccurrencesForImage(resourceURL, projectID string) ([]*grafeaspb.Occurrence, error) {
	// resourceURL := fmt.Sprintf("https://gcr.io/my-project/my-image")
	ctx := context.Background()
	client, err := containeranalysis.NewClient(ctx)
	if err != nil {
		return nil, fmt.Errorf("NewClient: %v", err)
	}
	defer client.Close()

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

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

	return occurrenceList, nil
}

Node.js

Pour apprendre à installer et à utiliser la bibliothèque cliente pour Container Registry, consultez la page Bibliothèques clientes Container Registry. Pour en savoir plus, consultez la documentation de référence sur l'API Container Registry en langage Node.js.

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

Pour apprendre à installer et à utiliser la bibliothèque cliente pour Container Registry, consultez la page Bibliothèques clientes Container Registry. Pour en savoir plus, consultez la documentation de référence sur l'API Container Registry en langage Ruby.

# 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

Pour apprendre à installer et à utiliser la bibliothèque cliente pour Container Registry, consultez la page Bibliothèques clientes Container Registry. Pour en savoir plus, consultez la documentation de référence sur l'API Container Registry en langage Python.

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

Afficher les occurrences d'un type spécifique

Dans les deux exemples précédents, la seule différence entre les expressions de filtre est la valeur du champ kind, qui identifie le type d'occurrence. Utilisez ce champ pour limiter la liste des occurrences à un type particulier, tel qu'une faille ou un déploiement.

L'expression de filtre permettant de récupérer des occurrences pour une image spécifique est la suivante :

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

où :

  • [NOTE_KIND] est le genre de note.
    • Par exemple, utilisez le genre DISCOVERY pour répertorier les occurrences de découverte. Celles-ci sont créées pour les images lorsqu'elles sont initialement placées dans Container Registry.
    • Pour répertorier les occurrences de failles, utilisez le genre VULNERABILITY.
  • [RESOURCE_URL] est l'URL complète de l'image https://[HOSTNAME]/[PROJECT_ID]/[IMAGE_ID]@sha256:[HASH].

L'expression de filtre permettant de récupérer des occurrences d'un genre spécifique dans de nombreuses images est la suivante :

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

où :

  • [RESOURCE_URL_PREFIX] est le préfixe de l'URL pour certaines images.
    • Pour répertorier toutes les versions d'une image : https://[HOSTNAME]/[PROJECT_ID]/[IMAGE_ID]@
    • Pour répertorier toutes les images d'un projet : https://[HOSTNAME]/[PROJECT_ID]/

Visualiser des images associées à une note spécifique

Vous pouvez récupérer une liste de ressources associées à un ID de note spécifique. Par exemple, vous pouvez répertorier les images avec une faille CVE spécifique.

Pour répertorier toutes les images d'un projet associées à une note particulière, utilisez l'expression de filtre suivante :

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

Pour consulter une image spécifique pour une note spécifique, utilisez l'expression de filtre suivante :

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

où :

  • [PROVIDER_PROJECT_ID] est l'ID du projet du fournisseur. Par exemple, goog-vulnz fournit l'analyse de faille par défaut.
  • [NOTE_ID] est l'ID de la note. Les notes relatives à la sécurité sont souvent au format CVE-2019-12345.
  • [RESOURCE_URL] est l'URL complète de l'image https://[HOSTNAME]/[PROJECT_ID]/[IMAGE_ID]@sha256:[HASH].

Par exemple, pour vérifier que toutes les images ayant une occurrence de CVE-2017-16231 ont été analysées par Google, utilisez l'expression de filtre suivante :

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

Afficher les déploiements

Vous pouvez répertorier les déploiements en cours d'exécution ou en cours d'exécution pendant une période spécifiée.

Pour afficher les déploiements en cours d'exécution, utilisez l'expression de filtre suivante :

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

Pour afficher les déploiements en cours d'exécution pendant une période spécifique, utilisez l'expression de filtre suivante :

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

où :

  • [RESOURCE_URL] est l'URL complète de l'image https://[HOSTNAME]/[PROJECT_ID]/[IMAGE_ID]@sha256:[HASH].
  • [DEPLOY_TIME] est l'heure de début de la période de déploiement. Cet élément utilise un horodatage au format RFC 3339 UTC "Zulu", précis à la nanoseconde près. Exemple : "2014-10-02T15:01:23.045123456Z"
  • [UNDEPLOY_TIME] correspond à la fin de la période de déploiement. Cet élément utilise un horodatage au format RFC 3339 UTC "Zulu", précis à la nanoseconde près.

Étape suivante