Ce tutoriel vous explique comment créer une attestation d'autorisation binaire dans un pipeline Cloud Build. Cette configuration permet de garantir que seules les images de conteneur compilées et signées dans le cadre du processus de compilation Cloud Build sont automatiquement autorisées à s'exécuter dans votre environnement de déploiement.
Pour apprendre à utiliser l'analyse des failles d'Artifact Analysis dans votre pipeline de compilation Cloud Build, consultez la page Créer des attestations avec Voucher ou Créer des attestations avec Kritis Signer.
Présentation de Cloud Build
Cloud Build (présentation) récupère le code source stocké dans Cloud Source Repositories ou tout autre dépôt hébergé, exécute vos compilations et tests, et stocke les éléments logiciels résultants dans Container Registry ou un autre service de stockage sur Google Cloud Platform.
Présentation de l'autorisation binaire
L'autorisation binaire (présentation) est un produit Google Cloud qui applique des contraintes sur les applications au moment de leur déploiement. Son intégration avec Google Kubernetes Engine (GKE) permet aux utilisateurs de s'assurer que les conteneurs déployés sur un cluster Kubernetes présentent une signature cryptographique réalisée par une autorité de confiance et sont vérifiés par un certificateur de l'autorisation binaire.
Vous pouvez configurer l'autorisation binaire pour qu'elle exige des attestations basées sur l'emplacement du code source afin d'empêcher le déploiement d'images de conteneurs créées à partir d'une source non autorisée.
Pour en savoir plus :
- Introduction générale à l'autorisation binaire
- Atelier de programmation : Sécuriser vos déploiements GKE avec l'autorisation binaire
Architecture
Le schéma suivant présente les composants utilisés dans une configuration d'autorisation binaire avec Cloud Build :
Dans ce pipeline :
Le code permettant de créer l'image de conteneur est transféré vers un dépôt source, tel que Cloud Source Repositories.
Un outil d'intégration continue (CI), tel que Cloud Build, compile et teste le conteneur.
La compilation envoie l'image du conteneur à Container Registry ou à un autre registre qui stocke les images compilées.
Cloud Key Management Service, qui assure la gestion des clés pour la paire de clés cryptographiques, signe l'image du conteneur. La signature résultante est ensuite stockée dans une attestation créée pour l'occasion.
Au moment du déploiement, le certificateur valide l'attestation en utilisant la clé publique de la paire de clés. L'autorisation binaire applique la stratégie en exigeant des attestations signées pour déployer l'image de conteneur.
Créer une attestation à l'aide de Cloud Build avec Cloud Key Management Service
Cette section explique comment mettre en œuvre l'architecture illustrée ci-dessus. Elle utilise une étape de compilation personnalisée Open Source fournie par la communauté Cloud Build. L'étape de compilation personnalisée signe une image de conteneur, crée l'attestation et l'importe dans l'autorisation binaire.
Configurer la gestion de l'authentification et des accès (IAM)
Pour utiliser cette étape de compilation, le compte de service Cloud Build a besoin des rôles IAM suivants :
- Lecteur des certificateurs de l'autorisation binaire
roles/binaryauthorization.attestorsViewer
- Signataire/Validateur de CryptoKeys Cloud KMS (si vous utilisez une clé dans KMS pour signer l'attestation)
roles/cloudkms.signerVerifier
- Agent d'association de notes Artifact Analysis
roles/containeranalysis.notes.attacher
Pour ajouter ces rôles au compte de service Cloud Build de votre projet, vous pouvez faire appel aux commandes suivantes :
Activez Cloud Build :
Activez l'API Cloud Build dans le projet Google Cloud cible.
Enregistrez votre ID de projet dans une variable d'environnement :
PROJECT_ID=PROJECT_ID
Où PROJECT_ID correspond à votre ID de projet Google Cloud.
Définissez la CLI Google Cloud pour le projet :
gcloud config set project ${PROJECT_ID}
Obtenez le numéro du projet :
PROJECT_NUMBER=$(gcloud projects list --filter="${PROJECT_ID}" --format="value(PROJECT_NUMBER)")
Attribuez le rôle "Lecteur des certificateurs de l'autorisation binaire" au compte de service Cloud Build :
gcloud projects add-iam-policy-binding ${PROJECT_ID} \ --member serviceAccount:${PROJECT_NUMBER}@cloudbuild.gserviceaccount.com \ --role roles/binaryauthorization.attestorsViewer
Attribuez le rôle "Signataire/Validateur de CryptoKeys Cloud KMS" au compte de service Cloud Build (signature basée sur KMS) :
gcloud projects add-iam-policy-binding ${PROJECT_ID} \ --member serviceAccount:${PROJECT_NUMBER}@cloudbuild.gserviceaccount.com \ --role roles/cloudkms.signerVerifier
Attribuez le rôle "Agent d'association de notes Artifact Analysis" au compte de service Cloud Build :
gcloud projects add-iam-policy-binding ${PROJECT_ID} \ --member serviceAccount:${PROJECT_NUMBER}@cloudbuild.gserviceaccount.com \ --role roles/containeranalysis.notes.attacher
Créer et enregistrer l'étape de compilation personnalisée à l'aide de Cloud Build
Clonez le dépôt de la communauté Google Cloud Build :
git clone https://github.com/GoogleCloudPlatform/cloud-builders-community.git
Configurez l'outil de signature de l'autorisation binaire pour Cloud Build :
Avant toute utilisation, le code de l'étape de compilation personnalisée doit être intégré à un conteneur et transféré vers Cloud Build. Pour ce faire, exécutez les commandes suivantes :
cd cloud-builders-community/binauthz-attestation gcloud builds submit . --config cloudbuild.yaml
L'étape de compilation personnalisée est alors transmise au registre Google Container Registry de votre projet actuel et est maintenant prête à être utilisée.
Créer un certificateur dans l'autorisation binaire
Créez un certificateur que l'autorisation binaire utilisera au moment du déploiement pour valider l'attestation.
Configurez un certificateur et une paire de clés Cloud Key Management Service dans l'autorisation binaire :
Reportez-vous à la page Créer des certificateurs à l'aide de la CLI.
Vérifier que le certificateur a bien été créé
gcloud --project="${ATTESTOR_PROJECT_ID}" container binauthz attestors list
Ajouter une étape "create-attestation" à votre fichier cloudbuild.yaml
Pour utiliser l'étape binauthz-attestation
, vous devez mettre à jour votre fichier cloudbuild.yaml
en ajoutant l'étape chargée de signer la compilation transmise à Container Registry.
Deux méthodes sont fournies ci-dessous :
Mettre à jour votre fichier
cloudbuild.yaml
manuellement.Exécuter un exemple de pipeline avec les variables d'environnement que vous avez définies précédemment.
Mettre à jour le fichier cloudbuild.yaml
manuellement
Mettez à jour votre fichier
cloudbuild.yaml
manuellement en ajoutant l'étape de compilation ci-dessous après l'étape d'importation de votre conteneur dans Container Registry. Remarque : Vous devez remplacer les éléments ATTESTOR_NAME, KMS_KEY_LOCATION, KMS_KEYRING_NAME, KMS_KEY_NAME et KMS_KEY_VERSION manuellement par les valeurs correspondant à votre propre contexte :- id: 'create-attestation' name: 'gcr.io/${PROJECT_ID}/binauthz-attestation:latest' args: - '--artifact-url' - 'gcr.io/${PROJECT_ID}/helloworld:latest' - '--attestor' - 'projects/${PROJECT_ID}/attestors/ATTESTOR_NAME' - '--keyversion' - 'projects/${PROJECT_ID}/locations/KMS_KEY_LOCATION/keyRings/KMS_KEYRING_NAME/cryptoKeys/KMS_KEY_NAME/cryptoKeyVersions/KMS_KEY_VERSION'
Le code suivant est également valide :
- id: 'create-attestation' name: 'gcr.io/${PROJECT_ID}/binauthz-attestation:latest' args: - '--artifact-url' - 'gcr.io/${PROJECT_ID}/helloworld:latest' - '--attestor' - 'ATTESTOR_NAME' - '--attestor-project' - '${PROJECT_ID}' - '--keyversion' - 'KEY_VERSION' - '--keyversion-project' - '${PROJECT_ID}' - '--keyversion-location' - 'KEY_LOCATION' - '--keyversion-keyring' - 'KEYRING_NAME' - '--keyversion-key' - 'KEY_NAME'
Facultatif : Tester le pipeline
Pour tester un exemple de pipeline d'attestation Cloud Build, procédez comme suit :
Créez un fichier
cloudbuild.yaml
avec les variables d'environnement que vous avez définies précédemment :cd example cat <<EOM > cloudbuild_example.yaml steps: - id: 'build' name: 'gcr.io/cloud-builders/docker' args: - 'build' - '-t' - 'gcr.io/$PROJECT_ID/helloworld:latest' - '.' - id: 'publish' name: 'gcr.io/cloud-builders/docker' args: - 'push' - 'gcr.io/$PROJECT_ID/helloworld:latest' - id: 'create-attestation' name: 'gcr.io/$PROJECT_ID/binauthz-attestation:latest' args: - '--artifact-url' - 'gcr.io/$PROJECT_ID/helloworld:latest' - '--attestor' - 'projects/$PROJECT_ID/attestors/${ATTESTOR_NAME}' - '--keyversion' - 'projects/${PROJECT_ID}/locations/${KMS_KEY_LOCATION}/keyRings/${KMS_KEYRING_NAME}/cryptoKeys/${KMS_KEY_NAME}/cryptoKeyVersions/${KMS_KEY_VERSION}' tags: ['cloud-builders-community'] EOM
Exécutez Cloud Build avec le fichier
cloudbuild_example.yaml
d'exemple :Exécutez les commandes suivantes dans le répertoire
cloud-builders-community/binauthz-attestation/example
:gcloud builds submit . --config cloudbuild_example.yaml
Étape suivante
- Créez des attestations après avoir recherché des failles dans une image à l'aide de Kritis Signer ou de Voucher.
- Créez une étape Cloud Build personnalisée pour signer et importer des attestations pour l'autorisation binaire sur GitHub.