Créer des attestations avec OpenSSF Scorecard

Restez organisé à l'aide des collections Enregistrez et classez les contenus selon vos préférences.

Ce tutoriel explique comment vérifier les bonnes pratiques de sécurité de la chaîne d'approvisionnement à l'aide d'OpenSSF Scorecard. Scorecard Attestor s'exécute dans le pipeline Cloud Build afin de 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 en production d'artefacts de conteneur compromis, ce qui peut empêcher plusieurs classes de failles de la chaîne d'approvisionnement.

Présentation

L'OpenSSF (Open Source Security Foundation) 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 du code source (SCM) afin de détecter les 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 stratégie que vous configurez. Scorecard Attestor exécute le tableau de données sur le dépôt SCM d'une image de conteneur, génère des résultats, évalue les résultats par rapport à la stratégie et génère une attestation si celle-ci est satisfaite.

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

  1. build : créez un exemple d'image de conteneur.
  2. push : transférez l'image vers Container Registry.
  3. attest: vérifiez et signez l'image, en utilisant Scorecard Attestor pour 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ère les données du dépôt SCM pour la nouvelle image de conteneur.
  2. Exécute le tableau de données sur les données brutes et évalue le dépôt SCM par rapport à la stratégie spécifiée par l'utilisateur.
    1. Si toutes les règles sont remplies, 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
  • Container 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. Configurez Scorecard Attestor en tant que compilateur personnalisé Cloud Build.
  2. Affichez et configurez la stratégie du certificateur de tableau de données.
  3. Exécutez Scorecard Attestor sur un exemple de dépôt pour créer une attestation basée sur une stratégie.
  4. Exécutez Scorecard Attestor sur un exemple de dépôt en mode de 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 Container Analysis pour gérer le certificateur.
  • containeranalysis.notes.occurrences.viewer : ajoute le rôle Lecteur d'occurrences Container 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 Container Analysis pour créer des occurrences d'attestation dans Container 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
    

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

Créer des attestations avec Scorecard Attestor 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 la chaîne d'approvisionnement avec OpenSSF Scorecard. L'image est compilée, mais ne génère pas d'attestation. 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 à 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 des règles 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 :

    gsutil 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 respecte sa règle d'attestation de tableau de données. Dans ce cas, l'attesteur de tableau de données 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 des règles d'attestation pour le cas d'échec. sh 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 :

    gsutil cat gs://${PROJECT_NUMBER}.cloudbuild-logs.googleusercontent.com/log-${BUILD_ID}.txt | grep "passed scorecard attestation policy check"
    
  6. Obtenir l'URL de l'image de conteneur créée et vérifiée par un tableau de données

    export IMAGE_URI=$(gsutil 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