Utiliser des secrets et des identifiants

Cette page explique comment inclure des informations sensibles telles que des mots de passe et des clés API dans Cloud Build.

Avant d'inclure des informations sensibles dans vos compilations, vous devez les stocker dans Secret Manager ou les chiffrer à l'aide de Cloud Key Management Service et n'inclure que les informations chiffrées dans Cloud Build. Il s'agit de la technique recommandée pour gérer les données sensibles avec Cloud Build. Pour les projets existants, vous pouvez continuer à utiliser Cloud KMS, mais pour les nouveaux projets, utilisez Secret Manager.

Avant de commencer

Pour exécuter les commandes gcloud sur cette page, installez l'outil de ligne de commande gcloud.

  • Si vous avez déjà installé le SDK Cloud, assurez-vous de disposer de la dernière version disponible en exécutant gcloud components update.

Utiliser Secret Manager

Secret Manager est un service Google Cloud qui stocke de manière sécurisée des clés API, des mots de passe et d'autres données sensibles.

Pour stocker des données dans Secret Manager et les utiliser dans Cloud Build, procédez comme suit :

  1. Activez l'API Secret Manager :

    Activer l'API Secret Manager

  2. Attribuez le rôle IAM Secret Accessor au compte de service Cloud Build :

    1. Ouvrez la page "IAM" dans Cloud Console :

      Ouvrir la page IAM

    2. Sélectionnez votre projet et cliquez sur Ouvrir.

    3. Dans le tableau des autorisations, recherchez l'e-mail se terminant par @cloudbuild.gserviceaccount.com, puis cliquez sur l'icône en forme de crayon.

    4. Ajoutez un rôle Secret Manager Secret Accessor.

    5. Cliquez sur Enregistrer.

  3. Stocker des données dans Secret Manager

    1. Accédez à la page "Secret Manager" dans Cloud Console :

      Accéder à la page Secret Manager

    2. Sur la page Secret Manager, cliquez sur Créer un secret.

    3. Sur la page Créer un secret, sous Nom, saisissez secret-name.

    4. Dans le champ Valeur du secret, saisissez vos données.

    5. Ne modifiez pas la section Régions.

    6. Cliquez sur le bouton Créer un secret.

    Pour savoir comment utiliser Secret Manager à l'aide de l'outil de ligne de commande gcloud, consultez le guide de démarrage rapide de Secret Manager. Pour savoir comment accorder l'accès à un secret spécifique, consultez la page Gérer l'accès aux secrets.

  4. Dans votre fichier de configuration de compilation, ajoutez une étape de compilation pour accéder à la version du secret dans Secret Manager et la stocker dans un fichier. L'étape de compilation suivante accède à secret-name et le stocke dans un fichier nommé decrypted-data.txt :

    YAML

    steps:
    - name: gcr.io/cloud-builders/gcloud
      entrypoint: 'bash'
      args: [ '-c', "gcloud secrets versions access latest --secret=secret-name --format='get(payload.data)' | tr '_-' '/+' | base64 -d > decrypted-data.txt" ]
    

    JSON

    {
      "steps": [
      {
        "name": "gcr.io/cloud-builders/gcloud",
        "entrypoint": "bash",
        "args": [
          "-c",
          "gcloud secrets versions access latest --secret=secret-name --format='get(payload.data)' | tr '_-' '/+' | base64 -d > decrypted-data.txt"
        ]
      }
      ]
    }
    
  5. Utilisez le fichier avec les données déchiffrées dans une étape de compilation. L'extrait de code suivant utilise decrypted-data.txt pour se connecter à un registre Docker privé :

    YAML

    steps:
    - name: gcr.io/cloud-builders/gcloud
      entrypoint: 'bash'
      args: [ '-c', "gcloud secrets versions access latest --secret=secret-name --format='get(payload.data)' | tr '_-' '/+' | base64 -d > decrypted-data.txt" ]
    - name: gcr.io/cloud-builders/docker
      entrypoint: 'bash'
      args: [ '-c', 'docker login --username=my-user --password-stdin < decrypted-data.txt']
    

    JSON

    {
      "steps": [
      {
        "name": "gcr.io/cloud-builders/gcloud",
        "entrypoint": "bash",
        "args": [
          "-c",
          "gcloud secrets versions access latest --secret=secret-name --format='get(payload.data)' | tr '_-' '/+' | base64 -d > password.txt"
         ]
      },
      {
        "name": "gcr.io/cloud-builders/docker",
        "entrypoint": "bash",
        "args": [
          "-c",
          "docker login --username=my-user --password-stdin < decrypted-data.txt"
         ]
      }
      ]
    }
    
  1. Vous pouvez utiliser le fichier de configuration de compilation pour démarrer manuellement une compilation ou pour automatiser les compilations à l'aide de déclencheurs.

Utiliser Cloud KMS

Cloud KMS est un service Google Cloud qui vous permet de gérer et d'utiliser des clés cryptographiques.

Pour chiffrer des données sensibles à l'aide de Cloud KMS et les utiliser dans un fichier de configuration de compilation, procédez comme suit :

  1. Activez l'API Cloud KMS :

    Activer l'API Cloud KMS

  2. Attribuez le rôle IAM Cloud KMS CryptoKey Decrypter au compte de service Cloud Build :

    1. Dans Cloud Console, accédez à la page Paramètres de Cloud Build :

      Ouvrir la page Paramètres

    2. Localisez la ligne contenant le rôle Déchiffreur de clé de chiffrement Cloud KMS et définissez son état sur ENABLED.

  3. Ouvrez une fenêtre de terminal.

  4. Créez un projet Cloud KMS key-ring portant le nom keyring-name :

      gcloud kms keyrings create keyring-name --location global
    
  5. Créez un Cloud KMS key key-name pour key-ring keyring-name :

      gcloud kms keys create key-name \
          --location global --keyring keyring-name \
          --purpose encryption
    
  6. Configurez Cloud Build pour utiliser des données chiffrées :

    • Pour utiliser des variables chiffrées, procédez comme suit :

      1. Chiffrez secret-name à l'aide de key-name et de keyring-name. La valeur chiffrée est une chaîne encodée en base64. Assurez-vous de ne pas inclure de caractères superflus, tels que des espaces ou des sauts de ligne dans secret-name. L'indicateur -n demande à echo de ne pas inclure de saut de ligne de fin :

         echo -n secret-name | gcloud kms encrypt --plaintext-file=- \
             --ciphertext-file=- --location=global --keyring=keyring-name \
             --key=key-name | base64
        
      2. Dans votre fichier de configuration de compilation, ajoutez un champ secrets pour spécifier la valeur chiffrée et la valeur CryptoKey à utiliser pour la déchiffrer. Ensuite, à l'étape de compilation où vous souhaitez utiliser la variable chiffrée, ajoutez un champ secretEnv pour spécifier la variable en tant que variable d'environnement. Incluez le nom de la variable dans le champ secretEnv. Si vous spécifiez une valeur ou s'il existe une variable d'environnement non secrète portant le même nom, Cloud Build génère une erreur.

        YAML

         steps:
         - name: 'gcr.io/cloud-builders/docker'
           entrypoint: 'bash'
           args: ['-c', 'docker login --username=user-name --password=$$PASSWORD']
           secretEnv: ['PASSWORD']
         - name: 'gcr.io/cloud-builders/docker'
           args: ['push', 'user-name/myubuntu']
         secrets:
         - kmsKeyName: projects/project-id/locations/global/keyRings/keyring-name/cryptoKeys/key-name
           secretEnv:
             PASSWORD: 'encrypted-password'
        

        JSON

         {
           "steps": [
            {
              "name": "gcr.io/cloud-builders/docker",
              "entrypoint": "bash",
              "args": [
                "-c",
                "docker login --username=user-name --password=$$PASSWORD"
               ],
               "secretEnv": [
                 "PASSWORD"
                ]
            },
            {
              "name": "gcr.io/cloud-builders/docker",
              "args": [
                "push",
                "user-name/myubuntu"
               ]
            }
            ],
            "secrets": [
             {
               "kmsKeyName": "projects/project-id/locations/global/keyRings/keyring-name/cryptoKeys/key-name",
               "secretEnv": {
                 "PASSWORD": "encrypted-password"
                }
             }
             ]
         }
        
    • Pour utiliser des fichiers chiffrés, procédez comme suit :

      1. Chiffrez le fichier nommé secrets.json à l'aide de keyring-name et de keyring-name. Cela produit un fichier chiffré nommé secrets.json.enc. secrets.json ne doit pas dépasser 64 KiB.

         gcloud kms encrypt --plaintext-file=secrets.json \
             --ciphertext-file=secrets.json.enc \
             --location=global --keyring=keyring-name\
             --key=key-name
        
      2. Dans votre fichier de configuration de compilation, avant toute étape de compilation qui interagit avec le fichier secrets.json déchiffré, ajoutez une étape de compilation qui appelle le CLoud Build gcloud à déchiffrer secrets.json.enc à l'aide de la clé de chiffrement. Cette étape de compilation est semblable aux commandes utilisées pour chiffrer le fichier.

        YAML

         steps:
         - name: gcr.io/cloud-builders/gcloud
           args:
           - kms
           - decrypt
           - --ciphertext-file=secrets.json.enc
           - --plaintext-file=secrets.json
           - --location=global
           - --keyring=keyring-name
           - --key=key-name
           # more steps here
        

        JSON

         {
           "steps": [
            {
              "name": "gcr.io/cloud-builders/gcloud",
              "args": [
                "kms",
                "decrypt",
                "--ciphertext-file=secrets.json.enc",
                "--plaintext-file=secrets.json",
                "--location=global",
                "--keyring=keyring-name",
                "--key=key-name"
              ]
            }
            ]
         }
        

        Une fois cette étape terminée, toutes les étapes suivantes peuvent utiliser le fichier secrets.json déchiffré. Par exemple, vous pouvez utiliser les secrets de ce fichier pour récupérer des dépendances externes ou pour inclure des jetons secrets dans les images de conteneurs Docker que vous compilez.

  7. Vous pouvez utiliser le fichier de configuration de compilation pour démarrer manuellement une compilation ou pour automatiser les compilations à l'aide de déclencheurs.

Étape suivante