Créer des attestations avec Voucher

Ce tutoriel explique comment configurer et utiliser Voucher pour créer des attestations pour l'autorisation binaire.

Présentation de Voucher

Voucher est un outil Open Source qui exécute une suite de vérifications sur les images de conteneurs avant de créer des attestations d'autorisation binaire pour les images. Voucher inclut un client et un composant de serveur. Vous exécutez le client Voucher en tant qu'étape supplémentaire de votre pipeline de compilation, après l'étape de compilation de l'image. Lorsque l'étape de compilation du client Voucher s'exécute, elle envoie l'image au serveur Voucher, qui effectue les vérifications. Vous pouvez définir les vérifications exécutées par Voucher, ainsi que d'autres critères, dans le fichier de configuration du serveur Voucher.

Ce tutoriel montre comment utiliser la vérification Voucher snakeoil pour vérifier les failles dans les images. Pour activer la vérification dans le fichier de configuration, définissez l'option fail-on sur un seuil de failles, comme indiqué plus loin dans le présent tutoriel.

Une fois la vérification snakeoil terminée, si toutes les failles identifiées tombent en dessous du seuil, Voucher Server crée l'attestation d'autorisation binaire pour l'image. Si l'une des failles identifiées atteint ou dépasse le seuil, Voucher Server ne crée pas d'attestation.

Au moment du déploiement de l'image de conteneur, sans attestation validée, l'outil d'application d'autorisation binaire interdit le déploiement de l'image.

Objectifs

Dans ce guide, vous allez exécuter les opérations suivantes :

  1. Configurer Voucher Server dans Cloud Run.
  2. Configurer Voucher Client
  3. Utiliser Voucher dans les exemples de pipelines de compilation.

Coûts

Ce guide utilise les produits Google Cloud suivants.

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

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

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 Cloud Build, Container Registry, Artifact Analysis, Cloud KMS, Cloud Run, and Identity and Access Management APIs.

    Enable the APIs

  5. Install the Google Cloud CLI.
  6. To initialize the gcloud CLI, run the following command:

    gcloud init
  7. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Go to project selector

  8. Make sure that billing is enabled for your Google Cloud project.

  9. Enable the Cloud Build, Container Registry, Artifact Analysis, Cloud KMS, Cloud Run, and Identity and Access Management APIs.

    Enable the APIs

  10. Install the Google Cloud CLI.
  11. To initialize the gcloud CLI, run the following command:

    gcloud init
  12. Nous vous recommandons de configurer l'autorisation binaire avec Google Kubernetes Engine. Ce tutoriel explique comment créer une attestation. Afin de pouvoir utiliser l'application forcée lors du déploiement pour valider l'attestation et déployer l'image associée, l'autorisation binaire doit être configurée. Assurez-vous de configurer la stratégie pour qu'elle exige des attestations. Vous pouvez configurer la stratégie dans Google Cloud Console ou dans la ligne de commande.
  13. Spécifiez votre projet Google Cloud dans une variable d'environnement.

      export PROJECT_ID=PROJECT_ID
    

    Remplacez PROJECT_ID par l'ID du projet.

  14. Définissez l'ID du projet pour les commandes gcloud :

    gcloud config set project ${PROJECT_ID}

  15. Spécifiez le numéro de projet dans une variable d'environnement pour les étapes suivantes :

    export PROJECT_NUMBER=$(gcloud projects describe "${PROJECT_ID}" \
      --format='value(project_number)')

Configurer Voucher Server

Dans les étapes suivantes, vous allez configurer Voucher Server.

Créer une clé de signature Cloud Key Management Service

Dans cette section, vous allez créer la clé utilisée par Voucher Server pour créer une attestation d'autorisation binaire.

  1. Créez un trousseau de clés comme suit :

    gcloud kms keyrings create KEY_RING\
       --location global
    

    Remplacez KEY_RING par un nom de trousseau de clés, tel que voucher-key-ring.

  2. Créez une clé de signature :

    gcloud kms keys create KEY_NAME \
      --keyring KEY_RING \
      --location global \
      --purpose "asymmetric-signing" \
      --default-algorithm "rsa-sign-pkcs1-4096-sha512"
    

    Remplacez KEY_NAME par un nom de clé, par exemple voucher-key.

  3. Stockez l'ID de ressource de la version de clé Cloud Key Management Service :

    export KMS_RESOURCE_ID=projects/$PROJECT_ID/locations/global/keyRings/KEY_RING/cryptoKeys/KEY_NAME/cryptoKeyVersions/1
    
  4. Attribuez le rôle cloudkms.signer au compte de service de Compute Engine.

    Au cours de cette étape, vous allez accorder le rôle cloudkms.signer au compte de service qui exécute Voucher Server. Cela permet à Voucher Server de signer des attestations avec les clés Cloud Key Management Service. Pour ce faire, exécutez la commande suivante :

    gcloud kms keys add-iam-policy-binding\
      KEY_NAME --keyring=KEY_RING\
      --location=global\
      --member=serviceAccount:${PROJECT_NUMBER}-compute@developer.gserviceaccount.com\
      --role=roles/cloudkms.signer
    

Créer la note Artifact Analysis

Dans cette section, vous allez créer la note.

  1. Stockez l'identifiant de la note :

    export NOTE_ID=snakeoil
    
  2. Stockez l'URI de la note :

    export NOTE_URI=projects/$PROJECT_ID/notes/$NOTE_ID
    
  3. Créez la charge utile de la requête :

    cat > /tmp/note_payload.json << EOM
    {
      "name": "${NOTE_URI}",
      "attestation": {
        "hint": {
          "human_readable_name": "voucher note for snakeoil check"
        }
      }
    }
    EOM
    
  4. Créez la note :

    curl -X POST \
      -H "Content-Type: application/json" \
      -H "Authorization: Bearer $(gcloud --project ${PROJECT_ID} auth print-access-token)"  \
      -H "x-goog-user-project: ${PROJECT_ID}" \
      --data-binary @/tmp/note_payload.json  \
    "https://containeranalysis.googleapis.com/v1/projects/${PROJECT_ID}/notes/?noteId=${NOTE_ID}"
    

Créer et configurer Voucher Server

Dans cette configuration unique, vous obtenez, configurez et compilez l'image Voucher Server. Vous la stockez ensuite dans Container Registry.

  1. Clonez le dépôt Voucher :

    git clone https://github.com/grafeas/voucher.git
    cd voucher/
    

    Ce dépôt contient :

    • Le code source permettant de compiler Voucher Server
    • Le code source permettant de compiler Voucher Client
    • Exemples illustrant l'utilisation de Voucher.
  2. Mettez à jour le fichier de configuration de Voucher Server.

    Linux

    Créez le fichier de configuration Voucher Server à partir d'un modèle, en remplaçant et par les valeurs que vous avez définies ci-dessus. Pour ce faire, exécutez la commande suivante :

     cat tutorials/cloudrun/config.toml.template \
        | sed -e "s?<PROJECT_ID>?${PROJECT_ID}?g" \
        | sed -e "s?<KMS_KEY_NAME>?${KMS_RESOURCE_ID}?g" \
          > tutorials/cloudrun/config.toml
    

    Autres systèmes d'exploitation

    1. Modifiez le fichier tutorials/cloudrun/config.toml.template.

      • Remplacez <PROJECT_ID> par la valeur de ${PROJECT_ID}.
      • Remplacez <KMS_KEY_NAME> par la valeur de ${KMS_RESOURCE_ID}.
    2. Enregistrez le fichier sous le nom tutorials/cloudrun/config.toml.

  3. Affichez le fichier de configuration de Voucher Server :

    cat tutorials/cloudrun/config.toml
    

    Un résultat contenant les éléments suivants s'affiche :

    failon = "high"
    

    Notez que dans le fichier de configuration, l'option failon est définie sur high. Ce paramètre configure Voucher Server pour effectuer une vérification de failles sur une image. Si l'image contient des failles dont la gravité est HIGH, la vérification échoue et Voucher Server ne crée pas l'attestation pour l'autorisation binaire. Pour en savoir plus sur les paramètres fail-on, consultez la page Fail-On : Failing on vulnerabilities (Fail-On : échec dans la gestion des vulnérabilités).

  4. Créez et importez l'image du conteneur Voucher Server :

    Dans cette section, vous allez exécuter le pipeline Cloud Build qui compile l'image de conteneur Voucher Server. La compilation importe également l'image Voucher Server dans gcr.io/$PROJECT_ID/voucher-server.

    gcloud  builds submit --config ./tutorials/cloudrun/cloudbuild-server.yaml
    

Déployer Voucher Server sur Cloud Run

  1. Sélectionnez une région.

    Pour afficher la liste des régions disponibles, consultez la section Afficher la liste des régions disponibles. Créez une variable pour stocker la région sélectionnée :

    export REGION=REGION
    

    Remplacez REGION par le nom de la région dans laquelle vous prévoyez de déployer Voucher Server.

  2. Déployez Voucher Server sur Cloud Run

    gcloud run deploy --image gcr.io/${PROJECT_ID}/voucher-server \
      --platform managed voucher-server \
      --region ${REGION} \
      --no-allow-unauthenticated
    

    Un résultat semblable à celui-ci s'affiche :

    Service [voucher-server] revision [voucher-server-00001-caw] has been deployed and is serving 100 percent of traffic.
    Service URL: https://voucher-server-4wjtm2amga-uc.a.run.app
    
  3. Stockez l'URL du service Voucher Server :

    export SERVER_SERVICE_URL=$(gcloud run services describe voucher-server --platform managed --region ${REGION} --format='value(status.url)')
    

Configurer Voucher Client

Lors des étapes suivantes, vous allez configurer Voucher Client.

  1. Créez le compte de service demandeur pour Voucher Client :

    gcloud iam service-accounts create INVOKER_ACCOUNT_NAME
    

    Remplacez INVOKER_ACCOUNT_NAME par le nom que vous souhaitez donner au compte de service demandeur, par exemple voucher-invoker.

  2. Spécifiez le compte de service :

    export INVOKER_SERVICE_ACCOUNT=INVOKER_ACCOUNT_NAME@$PROJECT_ID.iam.gserviceaccount.com
    
  3. Attribuez le rôle run.invoker au compte de service demandeur de votre projet.

    Accordez à votre compte de service demandeur l'autorisation d'appeler Voucher Server sur Cloud Run. Pour ce faire, saisissez la commande suivante :

    gcloud run services add-iam-policy-binding voucher-server \
      --member serviceAccount:$INVOKER_SERVICE_ACCOUNT \
      --role roles/run.invoker \
      --platform managed \
      --region ${REGION}
    
  4. Attribuez le rôle iam.serviceAccountTokenCreator au compte de service demandeur pour Cloud Build.

    Dans cette section, vous accordez au compte de service Cloud Build l'autorisation d'emprunter l'identité du compte de service demandeur pour que Voucher Client soit autorisé à envoyer des requêtes à Voucher Server pendant la compilation. Pour ce faire, saisissez la commande suivante :

    gcloud iam service-accounts add-iam-policy-binding $INVOKER_SERVICE_ACCOUNT \
      --member=serviceAccount:$PROJECT_NUMBER@cloudbuild.gserviceaccount.com \
      --role=roles/iam.serviceAccountTokenCreator
    

Détecter les failles dans les images en utilisant Voucher

Dans cette section, vous allez exécuter deux exemples de pipelines Cloud Build. Dans les deux pipelines, vous créez une image, puis vous utilisez Voucher pour en détecter les failles.

Exemple d'échec

Dans cette section, l'exemple de pipeline de compilation ne parvient pas à créer une attestation. L'image que vous créez basée sur Debian 9 contient au moins une faille de gravité HIGH. L'option fail-on de Voucher Server config.toml est configurée pour échouer en cas de failles de gravité HIGH. Dans ce cas, Voucher Server ne crée pas d'attestation d'autorisation binaire.

  1. Exécuter le pipeline de compilation :

    gcloud builds submit \
      --substitutions=_SERVICE_URL=$SERVER_SERVICE_URL,_SERVICE_ACCOUNT=$INVOKER_SERVICE_ACCOUNT \
      --config=tutorials/cloudrun/examples/cloudbuild-bad.yaml tutorials/cloudrun/examples
    
  2. Recherchez les résultats snakeoil de Voucher dans le journal de la dernière compilation :

    Console

    1. Notez l'ID de la dernière compilation.

    2. Dans la console Google Cloud, accédez à la page Historique de compilation.

      Accéder à l'historique de compilation

    3. Sous Build, cliquez sur l'élément contenant les premiers caractères de l'ID de compilation.

    4. Cliquez sur Afficher les données brutes.

    5. Recherchez snakeoil à l'aide de votre navigateur.

      Un résultat semblable à celui-ci s'affiche :

      "name":"snakeoil","error":"vulnerable to 14 vulnerabilities"
      

    gcloud

    1. Enregistrez l'ID de la compilation :

      export BUILD_ID=$(gcloud builds list --limit=1 --format="value('ID')")
      
    2. Recherchez votre journal de compilation en saisissant la commande suivante :

       gcloud builds log ${BUILD_ID} | grep "snakeoil"
      

      La sortie ressemble à ceci :

      "name":"snakeoil","error":"vulnerable to 14 vulnerabilities"
      

Exemple de réussite

Dans cette section, l'exemple de pipeline de compilation réussit à créer une attestation. Toutes les failles identifiées sont classées comme étant inférieures au seuil fail-on, après quoi la vérification réussit et le pipeline crée l'attestation.

  1. Exécutez le pipeline :

    gcloud builds submit\
      --substitutions=_SERVICE_URL=$SERVER_SERVICE_URL,_SERVICE_ACCOUNT=$INVOKER_SERVICE_ACCOUNT\
      --config=tutorials/cloudrun/examples/cloudbuild-good.yaml tutorials/cloudrun/examples
    
  2. Recherchez les résultats snakeoil de Voucher dans le journal de la dernière compilation :

    Console

    1. Notez l'ID de la dernière compilation.

    2. Dans la console Google Cloud, accédez à la page Historique de compilation.

      Accéder à l'historique de compilation

    3. Sous Build, cliquez sur l'élément contenant les premiers caractères de l'ID de compilation.

    4. Cliquez sur Afficher les données brutes.

    5. Recherchez snakeoil à l'aide de votre navigateur.

      Un résultat semblable à celui-ci s'affiche :

      "name":"snakeoil","success":true,"attested":true
      

    gcloud

    1. Enregistrez l'ID de la dernière compilation :

      export BUILD_ID=$(gcloud builds list --limit=1 --format="value('ID')")
      
    2. Recherchez votre journal de compilation en saisissant la commande suivante :

       gcloud builds log ${BUILD_ID} | grep "snakeoil"
      

      La sortie ressemble à ceci :

      "name":"snakeoil","success":true,"attested":true
      

Effectuer un nettoyage

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

gcloud projects delete ${PROJECT_ID}

Créer un certificateur

Pour créer une stratégie nécessitant les attestations que vous créez à l'aide de la méthode décrite dans ce guide, vous devez d'abord créer un certificateur.

Pour créer un certificateur, procédez comme suit :

  1. Récupérez le matériel de clé publique à partir de la clé Cloud KMS que vous avez créée précédemment dans ce guide :

    gcloud kms keys versions get-public-key 1 \
    --key KEY_NAME \
    --keyring KEY_RING \
    --location global \
    --output-file OUTPUT_PATH
    
    • KEY_NAME : nom de la clé
    • KEY_RING : nom du trousseau de clés.
    • OUTPUT_PATH : chemin d'accès au fichier (par exemple, my-key.pem)
  2. Créez un certificateur à l'aide du matériel de clé publique dans le fichier et de la note que vous avez créée précédemment dans ce guide. Vous pouvez créer un certificateur via la console Google Cloud ou gcloud CLI.

  3. Créez une stratégie exigeant des attestations et spécifiez le certificateur que vous avez créé dans cette section. Vous pouvez créer une règle via la console Google Cloud ou gcloud CLI.

Créez un certificat

Pour créer une attestation à l'aide de votre certificateur, consultez la page Créer une attestation à l'aide de Cloud KMS.

Étapes suivantes