Intégration avec Cloud Build

Cette page présente la configuration de l'autorisation binaire avec 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 en savoir plus sur l'ajout de l'analyse des failles à votre pipeline de compilation Cloud Build, consultez la page Analyser les failles avec Container Analysis et Kritis Signer.

Présentation

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.

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. Schéma d'un pipeline d'attestation par l'autorisation binaire avec Cloud Build.

Dans la Figure 1, (1) le code est transféré vers un dépôt. (2) Un pipeline d'intégration continue (CI), tel que Cloud Build, compile et teste le conteneur. (3) L'image de conteneur ainsi créée est envoyée vers Container Registry. (4) Cloud Key Management Service signe l'image du conteneur puis (5) crée une attestation et la stocke dans l'autorisation binaire.

Les composants sont les suivants :

  • Cloud Source Repositories ou un autre dépôt sécurisé hébergeant le code source utilisé pour générer une image de conteneur.

  • Cloud Build, qui exécute les compilations et tests, et génère l'image de conteneur dans Container Registry ou un autre registre logiciel chargé de stocker vos images compilées.

  • Container Registry, registre privé d'images de conteneurs qui s'exécute sur Google Cloud.

  • Cloud Key Management Service, qui assure la gestion des clés pour la paire de clés cryptographiques. La paire de clés comprend une clé privée et une clé publique. La clé privée est utilisée pour signer une image de conteneur. La signature résultante est ensuite stockée dans une attestation créée pour l'occasion. Au moment du déploiement, l'attestation est validée par un certificateur comprenant la clé publique de la paire de clés.

  • L'autorisation binaire, qui applique la politique exigeant des attestations signées avant d'autoriser le déploiement d'une image de conteneur.

Créer une attestation d'autorisation binaire à 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 Container 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 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. Configurez le projet pour l'outil de ligne de commande gcloud :

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

    PROJECT_NUMBER=$(gcloud projects list --filter="${PROJECT}" --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} \
      --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} \
      --member serviceAccount:${PROJECT_NUMBER}@cloudbuild.gserviceaccount.com \
      --role roles/cloudkms.signerVerifier
    
  7. Attribuez le rôle "Agent d'association de notes Container Analysis" au compte de service Cloud Build :

    gcloud projects add-iam-policy-binding ${PROJECT} \
      --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
    

Étapes suivantes