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

L'utilisation de l'analyse à la demande dans 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, l'analyser pour détecter les failles, vérifier le niveau de gravité des failles et transférer l'image vers Artifact Registry s'il n'y a pas de failles d'un niveau de gravité spécifique.

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

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 et 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 du projet sur 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
    

Compiler 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 créés précédemment 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 de vulnérabilité SEVERITY que vous souhaitez bloquer, puis lancez 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. Cette instruction 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 l'analyse à la demande détecte des failles correspondant à l'un des niveaux de gravité spécifiés, votre compilation échoue.

Comprendre vos résultats

Lorsque vous définissez la valeur SEVERITY sur CRITICAL|HIGH, l'analyse à la demande recherche les failles, puis vérifie s'il en existe au niveau HIGH et au niveau CRITICAL, qui est 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 l'analyse à la demande 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 accessible au public, debian10:latest. Les distributions Linux et les données sur les failles associées sont mises à jour en continu.

Pour en savoir plus sur les outils et les bonnes pratiques supplémentaires permettant de protéger votre chaîne d'approvisionnement logicielle, consultez 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 la formation en ligne gratuite proposée par la Linux Foundation. Consultez Développer des logiciels sécurisés.