Créer des attestations avec OpenSSF Scorecard

Ce tutoriel explique comment vérifier que les images de conteneur respectent les bonnes pratiques de sécurité de la chaîne d'approvisionnement en utilisant OpenSSF Scorecard. Scorecard Attestator s'exécute dans le cadre du pipeline Cloud Build pour générer une attestation qui peut être validée par l'autorisation binaire avant le déploiement. Cette étape de validation empêche le déploiement d'artefacts de conteneur compromis en production, ce qui permet de se prémunir de plusieurs classes de failles de la chaîne d'approvisionnement.

Présentation

Open Source Security Foundation (OpenSSF) est une organisation qui fournit des outils, des services et une infrastructure pour les initiatives de sécurité Open Source. Scorecard est un outil géré par OpenSSF qui analyse les dépôts de gestion de code source (SCM) afin de vérifier le respect des bonnes pratiques de sécurité de la chaîne d'approvisionnement.

Scorecard Attestor est un outil intégré à Scorecard qui vous permet de créer des attestations pour l'autorisation binaire en fonction d'une règle que vous configurez. Scorecard Attestor exécute Scorecard sur le dépôt SCM d'une image de conteneur, génère des résultats, évalue les résultats par rapport à la règle et génère une attestation si celle-ci est satisfaite.

Dans ce tutoriel, vous allez compiler un exemple de dépôt, puis utiliser Scorecard Attestor. Chaque exemple de pipeline contient les étapes de compilation suivantes :

  1. build : Créer un exemple d'image de conteneur.
  2. push : stocker l'image dans Container Registry.
  3. attest : Vérifier et signer l'image, en utilisant Scorecard Attestor afin de créer une attestation basée sur la stratégie.

À l'étape attest de chaque pipeline, Scorecard Attestor effectue les opérations suivantes :

  1. Récupérer les données du dépôt SCM pour l'image de conteneur qui vient d'être créée.
  2. Exécuter Scorecard sur les données brutes et évalue le dépôt SCM par rapport à la règle spécifiée par l'utilisateur.
    1. Si toutes les règles sont satisfaites, Scorecard Attestor crée l'attestation.
    2. Si l'une des règles n'est pas satisfaite, Scorecard Attestor ne crée pas l'attestation.

Au moment du déploiement, l'autorisation binaire recherche une attestation vérifiable. Sans cela, l'outil d'application bloque le déploiement de l'image.

Coûts

Ce tutoriel utilise les produits Google Cloud suivants.

  • Container Registry
  • Artifact Analysis
  • Cloud Build
  • Cloud Key Management Service

Utilisez le simulateur de coût pour générer une estimation des coûts en fonction de votre utilisation prévue.

Objectifs

Dans ce tutoriel, vous allez effectuer les opérations suivantes :

  1. Configurer Scorecard Attestor en tant que compilateur personnalisé Cloud Build.
  2. Affichez et configurez la règle Scorecard Attestor.
  3. Exécutez Scorecard Attestor sur un exemple de dépôt afin de créer une attestation basée sur une règle.
  4. Exécutez Scorecard Attestor sur un exemple de dépôt en mode validation uniquement, sans créer d'attestation. ## Avant de commencer

Dans cette section, vous allez effectuer une configuration unique du système.

Configurer votre environnement

  1. Stockez votre projet Google Cloud dans une variable d'environnement.

    export PROJECT_ID=PROJECT_ID
    

    Remplacez PROJECT_ID par votre projet Google Cloud.

  2. Définissez l'ID de projet par défaut sur votre projet Google Cloud :

    gcloud config set project $PROJECT_ID
    
  3. Stockez le numéro de projet dans une variable d'environnement pour les étapes suivantes :

    export PROJECT_NUMBER=$(gcloud projects list --filter="${PROJECT_ID}" \
     --format="value(PROJECT_NUMBER)")
    
  4. Activez les API :

    Pour vous assurer que les services requis pour ce guide sont activés, exécutez la commande suivante :

    gcloud services enable \
      cloudbuild.googleapis.com \
      containerregistry.googleapis.com \
      containerscanning.googleapis.com \
      cloudkms.googleapis.com
    

Configurer les rôles IAM

Exécutez les commandes suivantes pour configurer les rôles suivants sur le compte de service Cloud Build :

  • containeranalysis.notes.editor : ajoute le rôle Éditeur de notes Artifact Analysis pour gérer le certificateur.
  • containeranalysis.notes.occurrences.viewer : ajoute le rôle Lecteur d'occurrences Artifact Analysis pour les notes afin de gérer à la fois les occurrences de failles et d'attestation.
  • roles/containeranalysis.occurrences.editor : ajoute le rôle Éditeur d'occurrences Artifact Analysis pour créer des occurrences d'attestation dans Artifact Analysis.
  • cloudkms.signer : ajoute le rôle Signataire de CryptoKeys Cloud KMS qui permet au compte de service d'accéder au service de signature Cloud KMS.

    gcloud projects add-iam-policy-binding $PROJECT_ID --member serviceAccount:$PROJECT_NUMBER@cloudbuild.gserviceaccount.com --role roles/containeranalysis.notes.editor
    gcloud projects add-iam-policy-binding $PROJECT_ID --member serviceAccount:$PROJECT_NUMBER@cloudbuild.gserviceaccount.com --role roles/containeranalysis.notes.occurrences.viewer
    gcloud projects add-iam-policy-binding $PROJECT_ID --member serviceAccount:$PROJECT_NUMBER@cloudbuild.gserviceaccount.com --role roles/containeranalysis.occurrences.editor
    gcloud projects add-iam-policy-binding $PROJECT_ID --member serviceAccount:$PROJECT_NUMBER@cloudbuild.gserviceaccount.com --role roles/cloudkms.signer
    

Créer une clé de signature Cloud KMS

Les clés Cloud Key Management Service sont utilisées pour créer l'attestation.

  1. Créez un trousseau de clés Cloud KMS nommé scorecard-attestor-key-ring :

    gcloud kms keyrings create scorecard-attestor-key-ring \
        --location global
    
  2. Dans ce trousseau, créez une clé Cloud KMS appelée scorecard-attestor-key :

    gcloud kms keys create scorecard-attestor-key \
        --keyring scorecard-attestor-key-ring \
        --location global \
        --purpose "asymmetric-signing" \
        --default-algorithm "rsa-sign-pkcs1-2048-sha256"
    
  3. Stockez l'algorithme de condensé et la clé Cloud KMS dans une variable d'environnement pour les prochaines étapes :

    export KMS_DIGEST_ALG=SHA256
    export KMS_KEY_NAME=projects/$PROJECT_ID/locations/global/keyRings/scorecard-attestor-key-ring/cryptoKeys/scorecard-attestor-key/cryptoKeyVersions/1
    
  4. Créez le certificateur de l'autorisation binaire. Scorecard Attestor crée ensuite une note associée à ce certificateur.

    gcloud container binauthz attestors create scorecard-attestor \
        --attestation-authority-note=scorecard-attestation \
        --attestation-authority-note-project=$PROJECT_ID \
        --description="Attest that ossf/scorecard policy checks pass"
    
  5. Associez le certificateur de l'autorisation binaire à la clé KMS :

    gcloud container binauthz attestors public-keys add \
        --attestor=scorecard-attestor \
        --keyversion=1 \
        --keyversion-key=scorecard-attestor-key \
        --keyversion-keyring=scorecard-attestor-key-ring \
        --keyversion-location=global \
        --keyversion-project=$PROJECT_ID
    

Remarque : Pour découvrir d'autres algorithmes de signature, reportez-vous à la section Créer des clés asymétriques.

Créer des attestations à l'aide de Attestor Scorecard dans un pipeline Cloud Build

Envoyer l'exemple d'échec de la compilation

Dans cette section, vous allez créer une image de conteneur et vérifier ses pratiques de sécurité de chaîne d'approvisionnement avec OpenSSF Scorecard. L'image se compile correctement, mais aucune attestation n'est créée. Le dépôt de base contient des pratiques de sécurité déconseillées pour la chaîne d'approvisionnement, telles qu'une dépendance non épinglée pour Debian 10 dans le fichier Dockerfile et un artefact binaire compilé enregistré dans le dépôt source. Il s'agit de cas de non-respect des règles d'attestation dans le dépôt.

  1. Clonez le dépôt de test : scorecard-binauthz-test-bad.

  2. Affichez le fichier de règle d'attestation pour le cas d'échec.

    cat policy-binauthz.yaml
    
  3. (Facultatif) Affichez le fichier de configuration de compilation pour le cas d'échec.

    cat samples/signer/cloudbuild.yaml
    
  4. Envoyez la compilation :

    gcloud builds submit \
        --substitutions=_KMS_KEY_NAME=$KMS_KEY_NAME,_KMS_DIGEST_ALG=$KMS_DIGEST_ALG \
        --config=cloudbuild.yaml
    

Vous devriez voir une sortie semblable à ce qui suit.

time="2022-12-20T22:30:14Z" level=info msg="image failed scorecard attestation policy check"
  1. Enregistrez l'ID de la dernière compilation :

    export BUILD_ID=$(gcloud builds list --limit=1 --format="value('ID')")
    
  2. Vérifiez le résultat :

    gcloud storage cat gs://${PROJECT_NUMBER}.cloudbuild-logs.googleusercontent.com/log-${BUILD_ID}.txt | grep "failed scorecard attestation policy check"
    

Envoyer l'exemple de réussite de la compilation

Dans cette section, vous allez créer une image de conteneur qui répond à ses règles d'attestation Scorecard. Dans ce cas, Scorecard Attestor crée une attestation.

Pour envoyer l'exemple de réussite de la compilation dans Cloud Build, procédez comme suit :

  1. Clonez le dépôt de test : scorecard-binauthz-test-good.

  2. Affichez le fichier de règle d'attestation pour le cas d'échecsh cat policy-binauthz.yaml.

  3. (Facultatif) Affichez le fichier de configuration de compilation pour le cas d'échec.

    cat samples/signer/cloudbuild.yaml
    
  4. Envoyez la compilation :

    gcloud builds submit \
        --substitutions=_KMS_KEY_NAME=$KMS_KEY_NAME,_KMS_DIGEST_ALG=$KMS_DIGEST_ALG \
        --config=cloudbuild.yaml
    
  5. Vérifiez le résultat :

    gcloud storage cat gs://${PROJECT_NUMBER}.cloudbuild-logs.googleusercontent.com/log-${BUILD_ID}.txt | grep "passed scorecard attestation policy check"
    
  6. Obtenez l'URL de l'image de conteneur créée et vérifiée par Scorecard.

    export IMAGE_URI=$(gcloud storage cat gs://${PROJECT_NUMBER}.cloudbuild-logs.googleusercontent.com/log-${BUILD_ID}.txt | grep -o "Attestation for image .* is successfully uploaded" txt | cut -d' ' -f4 | tr -d '"')
    
  7. Confirmez qu'une attestation a été créée pour l'image de conteneur. Scorecard Attestor utilise l'ID de note ossf-scorecard-attestation et le nom de note projects/${PROJECT_ID}/notes/ossf-scorecard-attestation.

    gcloud container binauthz attestations list \
        --attestor="projects/${PROJECT_ID}/attestors/ossf-scorecard-attestor" \
        --filter="resourceUri='https://${IMAGE_URI}'"
    

Effectuer un nettoyage

Pour nettoyer les ressources utilisées dans ce document, vous pouvez supprimer le projet :

gcloud projects delete $PROJECT_ID

Étapes suivantes