Analyser automatiquement les packages Go

Ce document explique comment activer l'API Container Scanning, transférer une image vers Artifact Registry et afficher la liste des failles détectées dans l'image.

Artifact Analysis stocke les informations sur les failles sous forme de notes. Une occurrence est créée pour chaque instance d'une note associée à une image. Pour en savoir plus, consultez les documents Présentation et Tarifs.

Avant de commencer

  1. Connectez-vous à votre compte Google Cloud . Si vous débutez sur Google Cloud, créez un compte pour évaluer les performances de nos produits en conditions réelles. Les nouveaux clients bénéficient également de 300 $ de crédits sans frais pour exécuter, tester et déployer des charges de travail.
  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 role (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, if any are not already enabled.

    Roles required to enable APIs

    To enable APIs, you need the serviceusage.services.enable permission. If you created the project, then you likely already have this permission through the Owner role (roles/owner). Otherwise, you can get this permission through the Service Usage Admin role (roles/serviceusage.serviceUsageAdmin). 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 role (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, if any are not already enabled.

    Roles required to enable APIs

    To enable APIs, you need the serviceusage.services.enable permission. If you created the project, then you likely already have this permission through the Owner role (roles/owner). Otherwise, you can get this permission through the Service Usage Admin role (roles/serviceusage.serviceUsageAdmin). 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. Créez un dépôt Docker dans Artifact Registry et transférez-y une image de conteneur avec votre code Go. Si vous ne connaissez pas Artifact Registry, consultez le guide de démarrage rapide pour Docker.

    Pour en savoir plus sur l'utilisation de Cloud Build pour créer et conteneuriser vos applications Go, consultez la page Créer des applications Go.

Rôles requis

Pour obtenir les autorisations nécessaires pour afficher les résultats de l'analyse des packages, demandez à votre administrateur de vous accorder les rôles IAM suivants sur le projet :

Pour en savoir plus sur l'attribution de rôles, consultez Gérer l'accès aux projets, aux dossiers et aux organisations.

Vous pouvez également obtenir les autorisations requises avec des rôles personnalisés ou d'autres rôles prédéfinis.

Afficher les failles de l'image

Artifact Analysis analyse les nouvelles images au fur et à mesure de leur importation dans Artifact Registry. Cette analyse extrait des informations sur les packages du conteneur.

Vous pouvez afficher les occurrences de failles pour vos images dans Artifact Registry à l'aide de la console Google Cloud , de Google Cloud CLI ou de l'API Container Analysis. Si une image présente des failles, vous pouvez obtenir les détails.

Artifact Analysis continue d'analyser les images et les packages tant qu'ils ont été extraits au cours des 30 derniers jours. Au bout de 30 jours, les métadonnées des images et des packages analysés ne seront plus mises à jour et les résultats seront obsolètes.

Artifact Analysis archive les métadonnées obsolètes depuis plus de 90 jours. Ces métadonnées archivées ne peuvent être évaluées qu'à l'aide de l'API. Pour lancer une nouvelle analyse d'une image avec des métadonnées obsolètes ou archivées, vous devez extraire cette image. L'actualisation des métadonnées peut prendre jusqu'à 24 heures. Les packages dont les métadonnées sont obsolètes ou archivées ne peuvent pas être réanalysés.

Afficher les occurrences dans la console Google Cloud

Pour afficher les failles d'une image :

  1. Obtenez la liste des dépôts.

    Ouvrir la page "Dépôts"

  2. Dans la liste des dépôts, cliquez sur un dépôt.

  3. Dans la liste des images, cliquez sur le nom d'une image.

    Le nombre total de failles pour chaque condensé d'image s'affiche dans la colonne Failles.

    Image analysée présentant des failles

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

    La section Résultats de l'analyse affiche un récapitulatif des types de packages analysés, du nombre total de failles, des failles pour lesquelles des correctifs sont disponibles, des failles sans correctif et de la gravité effective.

    Page des résultats d'analyse listant les failles, les correctifs et la gravité effective

    Le tableau des failles liste le nom CVE (Common Vulnerabilities and Exposures) de chaque faille détectée, la gravité effective, le score CVSS (Common Vulnerability Scoring System), les correctifs (le cas échéant), le nom du package contenant la faille et le type de package.

    La consoleGoogle Cloud affiche jusqu'à 1 200 failles par page dans ce tableau. Vous pouvez filtrer et trier ces fichiers pour vérifier un fichier, un répertoire, une couche ou un type de fichier spécifique par extension de fichier.

  5. Pour en savoir plus sur une faille CVE spécifique, cliquez sur son nom.

  6. Pour afficher les détails d'une occurrence de faille, tels que le numéro de version et l'emplacement concerné, cliquez sur Afficher ou Afficher les failles corrigées dans la ligne contenant le nom de la faille. Le texte du lien est Afficher pour les failles sans correctif et Afficher les correctifs pour les failles auxquelles un correctif a été appliqué.

Afficher les failles dans un calque spécifique

Artifact Analysis fournit des métadonnées spécifiques aux couches pour vous aider à identifier le package contenant des failles et la commande Docker Build qui a introduit cette couche.

Pour afficher les métadonnées de failles basées sur les couches dans la console Google Cloud  :

  1. Dans Artifact Registry, ouvrez la liste de vos dépôts.

    Ouvrir la page "Dépôts"

  2. Sur la page Dépôts, cliquez sur un dépôt.

  3. Sur la page Détails du dépôt, cliquez sur une image.

  4. Dans la liste des versions d'image, cliquez sur un condensé d'image.

  5. Sur la page d'informations sur le résumé de l'image, cliquez sur l'onglet Failles.

    Lorsque des métadonnées basées sur des calques sont disponibles, Artifact Analysis affiche une liste de calques sélectionnables dans la barre Calque :

    Image de la page "Failles" pour un condensé d'image, y compris la barre "Couche". La barre des calques comporte un menu déroulant permettant de sélectionner un calque dans une liste numérotée.

  6. Pour afficher la liste des calques, cliquez sur le menu déroulant "Calque".

    Une liste déroulante s'ouvre et affiche une liste numérotée de calques. La couche 0 représente la couche du bas, et chaque couche suivante s'appuie sur la précédente. Seules les couches dans lesquelles des failles ont été détectées sont affichées.

    Image d'un menu déroulant de calques ouvert. Le menu affiche la commande Docker utilisée pour créer le calque, ainsi que le type et le nombre de failles pour chaque calque.

    Pour chaque couche, Artifact Analysis affiche la commande Docker utilisée pour la créer et le nombre de failles trouvées dans cette couche.

  7. Pour en savoir plus sur les failles d'une couche spécifique, sélectionnez-la dans la liste des couches.

    Le tableau des failles est mis à jour pour n'afficher que les failles détectées dans la couche sélectionnée. Vous pouvez appliquer d'autres filtres ou examiner des failles spécifiques.

  8. Cliquez sur AFFICHER ou AFFICHER LE CORRECTIF à côté d'une faille pour afficher des informations plus détaillées sur la faille.

    Le panneau latéral Détails de la faille affiche les emplacements des fichiers où les packages présentent des failles.

  9. Dans le tableau Emplacement(s) du fichier, pointez sur le point d'interrogation pour ouvrir les métadonnées de calque supplémentaires.

    Une boîte de dialogue affiche l'index de la couche, la commande de compilation de la couche, le résumé de la couche et l'image de base où vous pouvez corriger la faille.

Afficher les occurrences à l'aide de gcloud

Pour afficher les occurrences des images dans Artifact Registry, exécutez la commande gcloud artifacts docker images list :

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

Où :

  • LOCATION correspond à l'emplacement régional ou multirégional du dépôt.
  • PROJECT_ID est l'ID de projet de votre console Google Cloud .
  • REPOSITORY est le nom du dépôt où l'image est stockée.
  • IMAGE_ID est le nom de l'image dans le dépôt. Vous ne pouvez pas spécifier de tag d'image avec cette commande.

Par défaut, la commande renvoie les 10 résultats les plus récents. Pour afficher un nombre différent de résultats, utilisez l'option --show-occurrences-from. Par exemple, la commande suivante renvoie les 25 résultats les plus récents :

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

Le résultat ressemble à ceci :

Exemple d'image générée

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

Filtrer les occurrences de failles

Pour filtrer les occurrences de failles, utilisez le paramètre --occurrence-filter :

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

Où :

  • LOCATION est l'emplacement régional ou multirégional du dépôt.
  • PROJECT_ID est l'ID de votre projet dans la console Google Cloud .
  • REPOSITORY est le nom du dépôt où l'image est stockée.
  • IMAGE_ID est le nom de l'image dans le dépôt.
  • FILTER_EXPRESSION est un exemple d'expression de filtre au format expliqué dans Filtrer les occurrences de failles.

Afficher les failles d'un calque spécifique

Vous pouvez utiliser le champ layerDetails pour déterminer quelle couche spécifique a introduit un package vulnérable et pour afficher des informations supplémentaires sur cette couche. Par exemple, prenons la sortie layerDetails suivante pour une image :

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

Le résultat indique que l'index de calque est 0 dans l'image, avec un hachage de calque de sha256:123. La commande de compilation Docker utilisée pour créer cette couche est FROM golang:example_sha256, et la couche se trouve également dans l'image de base library/golang.

Afficher les occurrences à l'aide de l'API

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 des informations sur une occurrence spécifique :

 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

Afficher les failles dans Cloud Build

Si vous utilisez Cloud Build, vous pouvez également afficher les failles des images dans le panneau latéral Informations sur la sécurité de la console Google Cloud .

Le panneau latéral Insights sur la sécurité fournit un aperçu général des informations de sécurité des compilations pour les artefacts stockés dans Artifact Registry. Pour en savoir plus sur le panneau latéral et sur la façon dont vous pouvez utiliser Cloud Build pour protéger votre chaîne d'approvisionnement logicielle, consultez Afficher les insights de sécurité des builds.

Filtrer les occurrences

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

Afficher les occurrences d'un type spécifique

Vous pouvez utiliser la valeur kind pour filtrer par type d'occurrence. Consultez les types disponibles.

Les exemples suivants montrent comment filtrer les occurrences de failles de package :

gcloud

Dans la gcloud CLI, exécutez la commande suivante :

gcloud artifacts docker images list --show-occurrences \
    --occurrence-filter='kind="PACKAGE_VULNERABILITY"' --format=json \
    LOCATION-docker.pkg.dev/PROJECT_ID/REPOSITORY/IMAGE_ID

Où :

  • PACKAGE_VULNERABILITY correspond au type d'occurrence.
  • LOCATION est l'emplacement régional ou multirégional du dépôt.
  • PROJECT_ID est l'ID de votre projet dans la console Google Cloud .
  • REPOSITORY est le nom du dépôt où l'image est stockée.
  • IMAGE_ID est le nom de l'image dans le dépôt.

API

Dans votre requête API, utilisez l'expression de filtre suivante :

kind="PACKAGE_VULNERABILITY" AND resourceUrl="RESOURCE_URL"

Où :

  • DEPLOYMENT correspond au type d'occurrence.
  • RESOURCE_URL correspond à l'URL complète de l'image au format https://LOCATION-docker.pkg.dev/PROJECT_ID/REPOSITORY_ID/IMAGE@sha256:HASH :
    • LOCATION correspond à l'emplacement régional ou multirégional du dépôt.
    • PROJECT_ID est l'ID de projet de votre console Google Cloud .
    • REPOSITORY est le nom du dépôt où l'image est stockée.
    • IMAGE_ID est le nom de l'image dans le dépôt. Vous ne pouvez pas spécifier de tag d'image avec cette commande.

Vous pouvez utiliser la fonction hasPrefix pour filtrer avec une portée plus large.

Par exemple, les filtres suivants s'appliquent aux occurrences d'un type spécifique dans plusieurs versions du même package :

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

Où :

  • RESOURCE_URL_PREFIX spécifie une sous-chaîne d'une URL de ressource.
    • Pour filtrer toutes les versions d'une image, omettez le résumé de l'image. Utilisez le format : https://LOCATION-docker.pkg.dev/PROJECT_ID/REPOSITORY/IMAGE_ID@
    • Pour filtrer toutes les images d'un projet, spécifiez uniquement l'emplacement de la ressource et le projet. Utilisez le format suivant : https://LOCATION-docker.pkg.dev/PROJECT_ID/

Afficher les occurrences de failles

Vous pouvez afficher des listes d'occurrences de failles à l'aide de la gcloud CLI ou de l'API Artifact Analysis.

gcloud

Pour récupérer la liste des occurrences de failles pour une image, vous pouvez filtrer par type d'occurrence VULNERABILITY :

gcloud artifacts docker images list \
    --show-occurrences \
    --occurrence-filter='kind="VULNERABILITY"' \
    --format=json \
    LOCATION-docker.pkg.dev/PROJECT_ID/REPOSITORY/IMAGE_ID

Où :

  • VULNERABILITY correspond au type d'occurrence.
  • LOCATION est l'emplacement régional ou multirégional du dépôt.
  • PROJECT_ID est l'ID de votre projet dans la console Google Cloud .
  • REPOSITORY est le nom du dépôt où l'image est stockée.
  • IMAGE_ID est le nom de l'image dans le dépôt.

API

Dans votre requête API, utilisez l'expression de filtre suivante :

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

Où :

  • ENCODED_RESOURCE_URL correspond au chemin d'accès encodé à votre image. Pour en savoir plus sur l'encodage, consultez Encodage d'URL.

Pour en savoir plus sur l'utilisation de l'API, consultez projects.occurrences.get.

Filtrer par type de package

Pour limiter les résultats de l'analyse des failles à un seul type de package, exécutez la commande gcloud CLI suivante :

  gcloud artifacts docker images list /
      --show-occurrences /
      --occurrence-filter='kind="VULNERABILITY" AND packageType="PACKAGE_TYPE"' /
      LOCATION-docker.pkg.dev/PROJECT_ID/REPOSITORY/IMAGE_ID

Où :

  • VULNERABILITY correspond au type d'occurrence.
  • PACKAGE_TYPE est le type de package de langage de l'application. Les types disponibles sont les suivants : COMPOSER, GO, MAVEN, NPM, NUGET, PYTHON, RUBYGEMS et RUST.
  • LOCATION est l'emplacement régional ou multirégional du dépôt.
  • PROJECT_ID est l'ID de projet de votre console Google Cloud .
  • REPOSITORY est le nom du dépôt où l'image est stockée.
  • IMAGE_ID est le nom de l'image dans le dépôt. Vous ne pouvez pas spécifier de tag d'image avec cette commande.

Afficher les images associées à une note spécifique

Vous pouvez récupérer la liste des ressources associées à un ID de note spécifique. Par exemple, vous pouvez lister les images présentant 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 :

gcloud

gcloud artifacts docker images list /
    --show-occurrences /
    --occurrence-filter='noteProjectId="goog-vulnz" AND noteId="NOTE_ID"' /
    LOCATION-docker.pkg.dev/PROJECT_ID

Où :

  • goog-vulnz est le PROVIDER_PROJECT_ID pour l'analyse des failles Artifact Analysis. Si vous utilisez Artifact Analysis dans un projet personnalisé, vous pouvez remplacer cette valeur par l'ID de votre propre projet de fournisseur.
  • LOCATION est l'emplacement régional ou multirégional du dépôt.
  • PROJECT_ID est l'ID de votre projet dans la console Google Cloud .
  • NOTE_ID est l'ID de la note. Par exemple, lorsqu'une faille est détectée dans les résultats de l'analyse Artifact Analysis, elle utilise souvent un format d'ID CVE semblable à CVE-2019-12345.

API

GET https://containeranalysis.googleapis.com/v1/projects/PROJECT_ID/occurrences?filter=noteProjectId%3D%22goog-vulnz%22%20AND%20resourceUrl%3D%22ENCODED_RESOURCE_URL%22%20AND%20noteId%3D%22NOTE_ID%22

Où :

  • goog-vulnz est l'PROVIDER_PROJECT_ID pour l'analyse des failles Artifact Analysis. Si vous utilisez Artifact Analysis dans un projet personnalisé, vous pouvez remplacer cette valeur par l'ID de votre propre projet de fournisseur.
  • ENCODED_RESOURCE_URL correspond au chemin d'accès encodé à votre image. Pour en savoir plus sur l'encodage, consultez Encodage d'URL.
  • NOTE_ID est l'ID de la note. Par exemple, lorsque vous voyez une faille dans les résultats d'analyse d'Artifact Analysis, elle utilise souvent le format d'ID CVE semblable à CVE-2019-12345.

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

gcloud

gcloud artifacts docker images list /
    --show-occurrences /
    --occurrence-filter='noteProjectId="goog-vulnz" AND noteId="NOTE_ID"' /
    LOCATION-docker.pkg.dev/PROJECT_ID/REPOSITORY/IMAGE_ID

Où

  • LOCATION est l'emplacement régional ou multirégional du dépôt.
  • PROJECT_ID est l'ID de votre projet dans la console Google Cloud .
  • REPOSITORY est le nom du dépôt où l'image est stockée.
  • IMAGE_ID est le nom de l'image dans le dépôt. Vous ne pouvez pas spécifier de tag d'image avec cette commande.

API

Dans votre requête API, ajoutez l'expression de filtre suivante :

resourceUrl="RESOURCE_URL" AND noteProjectId="goog-vulnz" \
AND noteId="NOTE_ID"

Où :

  • RESOURCE_URL est l'URL complète de l'image au format http://LOCATION-docker.pkg.dev/PROJECT_ID/REPOSITORY_ID/IMAGE@sha256:HASH.
  • goog-vulnz est le PROVIDER_PROJECT_ID pour l'analyse des failles Artifact Analysis.
  • NOTE_ID est l'ID de la note. Les notes liées à la sécurité sont souvent mises en forme comme suit : CVE-2019-12345.

Étapes suivantes