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 :
- Configurer Voucher Server dans Cloud Run.
- Configurer Voucher Client
- 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
- Connectez-vous à votre compte Google Cloud. 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 gratuits pour exécuter, tester et déployer des charges de travail.
-
In the Google Cloud console, on the project selector page, select or create a Google Cloud project.
-
Make sure that billing is enabled for your Google Cloud project.
-
Enable the Cloud Build, Container Registry, Artifact Analysis, Cloud KMS, Cloud Run, and Identity and Access Management APIs.
- Install the Google Cloud CLI.
-
To initialize the gcloud CLI, run the following command:
gcloud init
-
In the Google Cloud console, on the project selector page, select or create a Google Cloud project.
-
Make sure that billing is enabled for your Google Cloud project.
-
Enable the Cloud Build, Container Registry, Artifact Analysis, Cloud KMS, Cloud Run, and Identity and Access Management APIs.
- Install the Google Cloud CLI.
-
To initialize the gcloud CLI, run the following command:
gcloud init
- 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.
-
Spécifiez votre projet Google Cloud dans une variable d'environnement.
export PROJECT_ID=PROJECT_ID
Remplacez PROJECT_ID par l'ID du projet.
-
Définissez l'ID du projet pour les commandes
gcloud
:gcloud config set project ${PROJECT_ID}
-
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.
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
.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
.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
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.
Stockez l'identifiant de la note :
export NOTE_ID=snakeoil
Stockez l'URI de la note :
export NOTE_URI=projects/$PROJECT_ID/notes/$NOTE_ID
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
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.
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.
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
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}
.
- Remplacez
Enregistrez le fichier sous le nom
tutorials/cloudrun/config.toml
.
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 surhigh
. 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é estHIGH
, la vérification échoue et Voucher Server ne crée pas l'attestation pour l'autorisation binaire. Pour en savoir plus sur les paramètresfail-on
, consultez la page Fail-On : Failing on vulnerabilities (Fail-On : échec dans la gestion des vulnérabilités).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
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.
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
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.
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
.Spécifiez le compte de service :
export INVOKER_SERVICE_ACCOUNT=INVOKER_ACCOUNT_NAME@$PROJECT_ID.iam.gserviceaccount.com
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}
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.
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
Recherchez les résultats
snakeoil
de Voucher dans le journal de la dernière compilation :Console
Notez l'ID de la dernière compilation.
Dans la console Google Cloud, accédez à la page Historique de compilation.
Sous Build, cliquez sur l'élément contenant les premiers caractères de l'ID de compilation.
Cliquez sur Afficher les données brutes.
Recherchez
snakeoil
à l'aide de votre navigateur.Un résultat semblable à celui-ci s'affiche :
"name":"snakeoil","error":"vulnerable to 14 vulnerabilities"
gcloud
Enregistrez l'ID de la compilation :
export BUILD_ID=$(gcloud builds list --limit=1 --format="value('ID')")
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.
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
Recherchez les résultats
snakeoil
de Voucher dans le journal de la dernière compilation :Console
Notez l'ID de la dernière compilation.
Dans la console Google Cloud, accédez à la page Historique de compilation.
Sous Build, cliquez sur l'élément contenant les premiers caractères de l'ID de compilation.
Cliquez sur Afficher les données brutes.
Recherchez
snakeoil
à l'aide de votre navigateur.Un résultat semblable à celui-ci s'affiche :
"name":"snakeoil","success":true,"attested":true
gcloud
Enregistrez l'ID de la dernière compilation :
export BUILD_ID=$(gcloud builds list --limit=1 --format="value('ID')")
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 :
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
)
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.
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
- Configurez la stratégie d'autorisation binaire pour exiger des attestations en utilisant l'outil de ligne de commande ou Google Cloud Console.
- Créez l'autorisation binaire du certificateur pour valider l'attestation au moment du déploiement en utilisant l'outil de ligne de commande ou Google Cloud Console.
- Consultez la documentation de Voucher sur GitHub.
- Découvrez l'autorisation binaire.
- Découvrez Artifact Analysis et l'analyse des failles.
- Découvrez Cloud Key Management Service.