Créer une attestation d'autorisation binaire dans un pipeline Cloud Build

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 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 :

Architecture

Le schéma suivant présente les composants utilisés dans une configuration d'autorisation binaire avec Cloud Build :

Pipeline d'attestation par l'autorisation binaire avec Cloud Build.
Figure 1.Pipeline Cloud Build qui crée une attestation d'autorisation binaire.

Dans ce pipeline :

  1. Le code permettant de créer l'image de conteneur est transféré vers un dépôt source, tel que Cloud Source Repositories.

  2. Un outil d'intégration continue (CI), tel que Cloud Build, compile et teste le conteneur.

  3. La compilation envoie l'image du conteneur à Container Registry ou à un autre registre qui stocke les images compilées.

  4. 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.

  5. 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 :

  1. Activez Cloud Build :

    Activez l'API Cloud Build dans le projet Google Cloud cible.

  2. Enregistrez votre ID de projet dans une variable d'environnement :

    PROJECT_ID=PROJECT_ID
    

    PROJECT_ID correspond à votre ID de projet Google Cloud.

  3. Définissez la CLI Google Cloud pour le projet :

    gcloud config set project ${PROJECT_ID}
    
  4. Obtenez le numéro du projet :

    PROJECT_NUMBER=$(gcloud projects list --filter="${PROJECT_ID}" --format="value(PROJECT_NUMBER)")
    
  5. 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
    
  6. 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
    
  7. 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

  1. Clonez le dépôt de la communauté Google Cloud Build :

    git clone https://github.com/GoogleCloudPlatform/cloud-builders-community.git
    
  2. 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

  1. 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 :

  1. 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
    
  2. 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