Utiliser l'analyse à la demande dans votre pipeline Cloud Build

L'utilisation d'On-Demand Scanning dans le cadre de votre pipeline Cloud Build vous permet de bloquer les compilations si l'image de conteneur présente des failles dont le niveau de gravité correspond à un niveau prédéfini.

Ce tutoriel vous explique comment utiliser Cloud Build pour créer votre image de conteneur à partir du code source, rechercher les failles, vérifier les niveaux de gravité des failles et transférer l'image vers Artifact Registry si aucun niveau de gravité spécifique n'est détecté.

Nous vous recommandons de créer un nouveau Google Cloud projet pour ce tutoriel et de suivre les étapes dans un environnement isolé.

Objectifs

  • Créer une image avec Cloud Build
  • Analyser l'image créée avec On-Demand Scanning
  • Évaluer les niveaux de failles acceptables
  • Stocker l'image dans Artifact Registry

Coûts

Dans ce document, vous utilisez les composants facturables suivants de Google Cloud:

Obtenez une estimation des coûts en fonction de votre utilisation prévue, utilisez le simulateur de coût.

Les nouveaux utilisateurs de peuvent bénéficier d'un essai sans frais. Google Cloud

Une fois que vous avez terminé les tâches décrites dans ce document, supprimez les ressources que vous avez créées pour éviter que des frais vous soient facturés. Pour en savoir plus, consultez la section Effectuer un nettoyage.

Avant de commencer

  1. Connectez-vous à votre Google Cloud compte. 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 On-Demand Scanning, Cloud Build, and Artifact Registry APIs.

    Roles required to enable APIs

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

    Enable the APIs

  5. Installez la Google Cloud CLI.

  6. Si vous utilisez un fournisseur d'identité (IdP) externe, vous devez d'abord vous connecter à la gcloud CLI avec votre identité fédérée.

  7. Pour initialiser la gcloud CLI, exécutez la commande suivante :

    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 On-Demand Scanning, Cloud Build, and Artifact Registry APIs.

    Roles required to enable APIs

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

    Enable the APIs

  11. Installez la Google Cloud CLI.

  12. Si vous utilisez un fournisseur d'identité (IdP) externe, vous devez d'abord vous connecter à la gcloud CLI avec votre identité fédérée.

  13. Pour initialiser la gcloud CLI, exécutez la commande suivante :

    gcloud init

Rôles requis

Le compte de service que vous utilisez avec Cloud Build doit disposer des rôles suivants :

Le compte de service Cloud Build par défaut dispose des autorisations requises pour les dépôts Artifact Registry du même projet. Si vos dépôts se trouvent dans le même projet que celui que vous utilisez pour Cloud Build, vous n'avez qu'à accorder le rôle d'administrateur On-Demand Scanning.

Si vous utilisez un compte de service fourni par l'utilisateur pour Cloud Build, vous devez accorder les deux rôles.

Préparer votre fichier source

Pour ce tutoriel, vous allez créer une image à partir d'un fichier Dockerfile. Un fichier Dockerfile est un fichier source qui contient des instructions permettant à Docker de créer une image.

  1. Ouvrez un terminal, créez un répertoire nommé ods-tutorial, puis accédez-y :

    mkdir ods-tutorial && cd ods-tutorial
    
  2. Créez un fichier nommé Dockerfile avec le contenu suivant :

    # Debian10 image
    FROM gcr.io/google-appengine/debian10:latest
    
    # Ensures that the built image is always unique
    RUN apt-get update && apt-get -y install uuid-runtime && uuidgen > /IAMUNIQUE
    

Créer un dépôt Artifact Registry

  1. Définissez l'ID de projet sur le même projet que celui dans lequel vous avez activé les API :

    gcloud config set project PROJECT_ID
    
  2. Créez un dépôt Docker nommé ods-build-repo à l'emplacement us-central1 :

    gcloud artifacts repositories create ods-build-repo --repository-format=docker \
    --location=us-central1 --description="Repository for scan and build"
    
  3. Vérifiez que votre dépôt a bien été créé :

    gcloud artifacts repositories list
    

Créer et analyser

Dans cette section, vous allez exécuter votre pipeline de compilation à l'aide d'un fichier de configuration de compilation. Un fichier de configuration de compilation indique à Cloud Build comment effectuer plusieurs tâches en fonction de vos spécifications.

  1. Dans le dossier ods-tutorial/, créez le fichier cloudbuild.yaml avec le contenu suivant :

    steps:
       - id: build
         name: gcr.io/cloud-builders/docker
         entrypoint: /bin/bash
         args:
         - -c
         - |
           docker build -t us-central1-docker.pkg.dev/$_PROJECT_ID/ods-build-repo/ods-test:latest -f ./Dockerfile . &&
           docker image inspect us-central1-docker.pkg.dev/$_PROJECT_ID/ods-build-repo/ods-test:latest --format \
           '{{index .RepoTags 0}}@{{.Id}}' > /workspace/image-digest.txt &&
           cat image-digest.txt
       - id: scan
         name: gcr.io/google.com/cloudsdktool/cloud-sdk
         entrypoint: /bin/bash
         args:
         - -c
         - |
           gcloud artifacts docker images scan us-central1-docker.pkg.dev/$_PROJECT_ID/ods-build-repo/ods-test:latest \
           --format='value(response.scan)' > /workspace/scan_id.txt
       - id: severity check
         name: gcr.io/google.com/cloudsdktool/cloud-sdk
         entrypoint: /bin/bash
         args:
         - -c
         - |
           gcloud artifacts docker images list-vulnerabilities $(cat /workspace/scan_id.txt) \
           --format='value(vulnerability.effectiveSeverity)' | if grep -Exq $_SEVERITY; \
           then echo 'Failed vulnerability check' && exit 1; else exit 0; fi
       - id: push
         name: gcr.io/cloud-builders/docker
         entrypoint: /bin/bash
         args:
         - -c
         - |
           docker push us-central1-docker.pkg.dev/$_PROJECT_ID/ods-build-repo/ods-test:latest
    images: ['us-central1-docker.pkg.dev/$_PROJECT_ID/ods-build-repo/ods-test:latest']
    
    

    Ce fichier inclut l'emplacement et le dépôt précédemment créés dans Artifact Registry. Si vous décidez d'utiliser d'autres valeurs, modifiez le fichier cloudbuild.yaml en conséquence. Les valeurs de PROJECT_ID et SEVERITY sont transmises au script dans la commande de compilation.

  2. Spécifiez les niveaux SEVERITY des failles que vous souhaitez bloquer et démarrez votre compilation.

    Vous pouvez utiliser les valeurs suivantes pour SEVERITY :

    • CRITICAL
    • HIGH
    • MEDIUM
    • LOW

    Vous pouvez spécifier plusieurs niveaux de gravité à l'aide d'une expression régulière.

    Dans l'exemple suivant, vous spécifiez les valeurs de gravité CRITICAL et HIGH. Cela indique à Cloud Build de rechercher les failles classées au niveau de gravité HIGH ou supérieur.

    gcloud builds submit --substitutions=_PROJECT_ID=PROJECT_ID,_SEVERITY='"CRITICAL|HIGH"' \
    --config cloudbuild.yaml
    

    • PROJECT_ID est l'ID de votre projet.
    • SEVERITY vous permet de définir les niveaux de gravité que vous souhaitez bloquer. Si On-Demand Scanning détecte des failles correspondant à l'un des niveaux de gravité spécifiés, votre compilation échoue.

Interpréter vos résultats

Lorsque vous définissez la valeur SEVERITY sur CRITICAL|HIGH, une fois qu'On-Demand Scanning a recherché les failles, il vérifie s'il en existe au niveau HIGH et au niveau CRITICAL plus grave. Si aucune faille correspondante n'est détectée dans votre image, votre compilation réussit et Cloud Build transfère votre image vers Artifact Registry.

Le résultat ressemble à ce qui suit :

DONE
--------------------------------------------------------------------------------------------------------------------------------------------

ID                                    CREATE_TIME                DURATION  SOURCE                                                                                         IMAGES                                                                        STATUS
abb3ce73-6ae8-41d1-9080-7d74a7ecd7bc  2021-03-15T06:50:32+00:00  1M48S     gs://ods-tests_cloudbuild/source/1615791031.906807-a648d10faf4a46d695c163186a6208d5.tgz  us-central1-docker.pkg.dev/ods-tests/ods-build-repo/ods-test (+1 more)  SUCCESS

Si On-Demand Scanning détecte des failles HIGH ou CRITICAL dans votre image, l'étape de compilation scan échoue, les étapes de compilation suivantes ne démarrent pas et Cloud Build ne transfère pas d'image vers Artifact Registry.

Le résultat ressemble à ce qui suit :

Step #2 - "severity check": Failed vulnerability check
Finished Step #2 - "severity check"
ERROR
ERROR: build step 2 "gcr.io/cloud-builders/gcloud" failed: step exited with non-zero status: 1

Dans ce tutoriel, vos résultats peuvent varier, car l'exemple de code source est une distribution Linux disponible publiquement, debian10:latest. Les distributions Linux et les données de failles associées sont mises à jour en permanence.

Pour en savoir plus sur les outils supplémentaires et les bonnes pratiques permettant de protéger votre chaîne d'approvisionnement logicielle, consultez la section Sécurité de la chaîne d'approvisionnement logicielle. Google Cloud

Pour en savoir plus sur les bonnes pratiques de gestion des failles Linux, vous pouvez suivre une formation en ligne sans frais fournie par la Linux Foundation. Consultez la section Développer des logiciels sécurisés.

Effectuer un nettoyage

Pour éviter que les ressources utilisées lors de ce tutoriel soient facturées sur votre compte Google Cloud, supprimez le projet contenant les ressources, ou conservez le projet et supprimez les ressources individuelles.

Supprimer le projet

  1. Dans la Google Cloud console, accédez à la page Gérer les ressources.

    Accéder à la page "Gérer les ressources"

  2. Dans la liste des projets, sélectionnez le projet que vous souhaitez supprimer, puis cliquez sur Supprimer.
  3. Dans la boîte de dialogue, saisissez l'ID du projet, puis cliquez Arrêter pour supprimer le projet.

Supprimer des ressources individuelles

Avant de supprimer le dépôt, assurez-vous que toutes les images que vous souhaitez conserver sont disponibles à un autre emplacement.

Pour supprimer le dépôt :

Console

  1. Ouvrez la page Dépôts dans la Google Cloud console.

    Ouvrir la page "Dépôts"

  2. Dans la liste des dépôts, sélectionnez le dépôt ods-build-repo.

  3. Cliquez sur Supprimer.

gcloud

Pour supprimer le dépôt ods-build-repo, exécutez la commande suivante :

gcloud artifacts repositories delete ods-build-repo --location=us-central1

Étape suivante