Analyser manuellement les packages Go

L'API On-Demand Scanning vous permet d'analyser les images stockées localement sur votre ordinateur ou à distance dans Artifact Registry ou Container Registry. Vous pouvez utiliser On-Demand Scanning pour analyser les images de votre pipeline CI/CD afin de détecter les failles système et les failles de package Go avant de décider de les stocker ou non dans un registre. Pour en savoir plus sur la tarification, consultez la page Tarifs.

Cette page explique comment analyser manuellement les images de conteneurs pour détecter les failles du système et des packages Go.

Avant de commencer

  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. Make sure that billing is enabled for your Google Cloud project.

  4. Enable the On-Demand Scanning API.

    Enable the API

  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. Make sure that billing is enabled for your Google Cloud project.

  10. Enable the On-Demand Scanning API.

    Enable the API

  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. Ajoutez le composant local-extract à votre installation Google Cloud CLI.

    Utiliser le gestionnaire de composants Google Cloud CLI

    Le gestionnaire de composants vous invite à installer les composants requis la première fois que vous exécutez la commande d'analyse.

    Utiliser votre gestionnaire de paquets système

    • Pour Debian/Ubuntu :
      sudo apt install google-cloud-sdk-local-extract
          
    • Pour Red Hat/Fedora/CentOS :
      sudo dnf install google-cloud-sdk-local-extract
          

      Vous pouvez également remplacer dnf par yum dans la commande précédente.

  15. Attribuez le rôle IAM Administrateur de l'analyse à la demande à l'utilisateur ou au compte de service que vous allez utiliser avec l'analyse à la demande. Si vous utilisez le compte de propriétaire du projet pour exécuter les analyses, vous pouvez ignorer cette étape.
  16. Analyser une image de conteneur

    • Analyse locale :

      gcloud artifacts docker images scan IMAGE_URI \
          [--location=(us,europe,asia)] [--async]
      

      Pour une image locale, utilisez l'un des formats suivants pour IMAGE_URI :

      • REPOSITORY:TAG
      • REPOSITORY
    • Analyse à distance :

      gcloud artifacts docker images scan IMAGE_URI \
          --remote [--location=(us,europe,asia)] [--async]
      

      Pour une image distante, utilisez l'un des formats suivants pour IMAGE_URI :

      • HOSTNAME/PROJECT_ID/REPOSITORY_ID/IMAGE_ID@sha256:HASH
      • HOSTNAME/PROJECT_ID/REPOSITORY_ID/IMAGE_ID:HASH
      • HOSTNAME/PROJECT_ID/REPOSITORY_ID/IMAGE_ID
      • HOSTNAME/PROJECT_ID/IMAGE_ID@sha256:HASH
      • HOSTNAME/PROJECT_ID/IMAGE_ID:HASH
      • HOSTNAME/PROJECT_ID/IMAGE_ID

      Pour les images dans Artifact Registry, IMAGE_URI doit inclure REPOSITORY_ID.

    Pour les analyses locales et à distance, vous pouvez utiliser les options facultatives suivantes :

    • --location est un indicateur facultatif qui permet de sélectionner manuellement la région multirégionale dans laquelle l'analyse est effectuée. Le choix d'une multirégion plus proche de votre emplacement physique minimise la latence. Les emplacements disponibles sont les suivants : us, europe et asia. L'emplacement par défaut est us.

    • --async est une option facultative permettant d'exécuter le processus d'analyse de manière asynchrone. Si vous omettez cet indicateur, votre terminal sera bloqué jusqu'à la fin du processus d'analyse.

    Analyse synchrone

    L'exemple suivant montre le résultat d'une analyse synchrone, sans l'indicateur --async :

    $ gcloud artifacts docker images scan golang:1.17.6-alpine
    
    ✓ Scanning container image
      ✓ Locally extracting packages and versions from local container image
      ✓ Remotely initiating analysis of packages and versions
      ✓ Waiting for analysis operation to complete [projects/my-project/locations/us/operations/87d2e137-1d1c-4790-8e5e-daf6c96ae7d7]
    Done.
    done: true
    metadata:
      '@type': type.googleapis.com/google.cloud.ondemandscanning.v1.AnalyzePackagesMetadata
      createTime: '2022-01-11T16:58:11.711487Z'
      resourceUri: golang:1.16.13-alpine
    name: projects/my-project/locations/us/operations/87d2e137-1d1c-4790-8e5e-daf6c96ae7d7
    response:
      '@type': type.googleapis.com/google.cloud.ondemandscanning.v1.AnalyzePackagesResponse
      scan: projects/my-project/locations/us/scans/2fe2bfb8-f0c5-4dd6-a8c8-38961869767a
    

    Utilisez le nom de l'analyse pour récupérer les résultats de l'analyse des failles. Le nom de l'analyse correspond à la valeur de scan dans la dernière ligne du message de résultat.

    Analyse asynchrone

    L'exemple suivant montre le résultat d'une analyse asynchrone :

    $ gcloud artifacts docker images scan golang:1.17.6-alpine --async
    
    ✓ Scanning container image
      ✓ Locally extracting packages and versions from local container image
      ✓ Remotely initiating analysis of packages and versions
    Done.
    Check operation [projects/my-project/locations/us/operations/2e1a6b1f-16e5-4427-ac86-72c998a3dd16] for status.
    metadata:
      '@type': type.googleapis.com/google.cloud.ondemandscanning.v1.AnalyzePackagesMetadata
      createTime: '2022-01-11T16:58:11.711487Z'
      resourceUri: golang:1.16.13-alpine
    name: projects/my-project/locations/us/operations/2e1a6b1f-16e5-4427-ac86-72c998a3dd16
    

    Cette commande lance une opération de longue durée et renvoie son ID sans bloquer votre terminal. Utilisez l'ID d'opération, la valeur de name dans la dernière ligne du message de sortie, pour interroger l'opération.

    Interroger l'opération de longue durée

    Utilisez l'ID d'opération issu du résultat de la commande d'analyse asynchrone pour vérifier l'état de l'opération :

    gcloud artifacts docker images get-operation LRO_ID
    

    LRO_ID est l'ID de l'opération de longue durée.

    En reprenant l'exemple de la section Analyse asynchrone, pour vérifier l'état de l'opération :

    $ gcloud artifacts docker images get-operation \
      projects/my-project/locations/us/operations/2e1a6b1f-16e5-4427-ac86-72c998a3dd16
    
    done: true
    metadata:
      '@type': type.googleapis.com/google.cloud.ondemandscanning.v1.AnalyzePackagesMetadata
      createTime: '2022-01-11T16:58:11.711487Z'
      resourceUri: golang:1.16.13-alpine
    name: projects/my-project/locations/us/operations/2e1a6b1f-16e5-4427-ac86-72c998a3dd16
    response:
      '@type': type.googleapis.com/google.cloud.ondemandscanning.v1.AnalyzePackagesResponse
      scan: projects/my-project/locations/us/scans/2fe2bfb8-f0c5-4dd6-a8c8-38961869767a
    

    Si le résultat inclut la ligne done: true, l'opération d'analyse est terminée. Utilisez le nom de l'analyse pour récupérer les résultats concernant les failles. Le nom correspond à la valeur de scan sur la dernière ligne du message de sortie.

    Récupérer les résultats de l'analyse

    Pour récupérer les résultats de l'analyse une fois l'opération terminée, utilisez la commande suivante :

    gcloud artifacts docker images list-vulnerabilities SCAN_NAME [--limit=X]
    

    Où :

    Exemple :

    createTime: '2022-01-11T16:58:11.972043Z'
    kind: VULNERABILITY
    name: projects/my-project/locations/us/occurrences/0c607d9b-aff4-4cde-86b7-e2c0a865aadd
    noteName: projects/goog-vulnz/notes/CVE-2021-38297
    resourceUri: golang:1.16.13-alpine
    updateTime: '2022-01-11T16:58:11.972043Z'
    vulnerability:
      cvssScore: 7.5
      effectiveSeverity: CRITICAL
      longDescription: Go before 1.16.9 and 1.17.x before 1.17.2 has a Buffer Overflow
        via large arguments in a function invocation from a WASM module, when GOARCH=wasm
        GOOS=js is used.
      packageIssue:
      - affectedCpeUri: cpe:/o:alpine:alpine_linux:3.15
        affectedPackage: go
        affectedVersion:
          fullName: 1.16.13
          kind: NORMAL
          name: 1.16.13
        effectiveSeverity: CRITICAL
        fixedCpeUri: cpe:/o:alpine:alpine_linux:3.15
        fixedPackage: go
        fixedVersion:
          fullName: 1.17.2
          kind: NORMAL
          name: 1.17.2
        packageType: GO_STDLIB
      relatedUrls:
      - label: More Info
        url: https://security-tracker.debian.org/tracker/CVE-2021-38297
      - label: More Info
        url: https://access.redhat.com/security/cve/CVE-2021-38297
      - label: More Info
        url: https://nvd.nist.gov/vuln/detail/CVE-2021-38297
      severity: HIGH
      shortDescription: CVE-2021-38297
    

    Le résultat de cette commande est une liste des occurrences au format Grafeas. Dans ce cas, une faille de gravité élevée a été détectée dans l'image.

    L'analyse à la demande identifie deux types de failles de packages Go :

    • packageType:GO_STDLIB : failles de la bibliothèque standard Go. Cela indique que la faille a été détectée dans la chaîne d'outils Go utilisée pour compiler le binaire ou dans la bibliothèque standard fournie avec la chaîne d'outils. Une solution possible consiste à mettre à niveau votre chaîne d'outils de compilation.

    • packageType:GO Failles des packages Go. Cela indique que la faille a été détectée dans un package tiers. Une solution possible consiste à mettre à niveau vos modules dépendants.

    Les résultats de l'analyse sont disponibles pendant 48 heures après la fin de l'opération.

    Étapes suivantes