Utiliser des identifiants chiffrés à partir de Cloud KMS

Cloud Key Management Service est un service Google Cloud qui vous permet de gérer et d'utiliser des clés cryptographiques. Cette page explique comment utiliser des informations chiffrées à partir de Cloud KMS dans Cloud Build.

Avant de commencer

  • Activer les API Cloud Build and Cloud KMS.

    Activer les API

  • Pour utiliser les exemples de ligne de commande de ce guide, installez et configurez la Google Cloud CLI.

  • Chiffrez les informations sensibles à l'aide de Cloud KMS. Cloud KMS enregistre vos contenus chiffrés dans un fichier.

  • [FACULTATIF] Pour configurer les compilations afin d'utiliser des données chiffrées, convertissez ENCRYPTED_FILE en base64 (cette étape n'est pas nécessaire pour les configurations de compilation utilisant des fichiers chiffrés):

        base64 ENCRYPTED_FILE
    

Autorisations IAM requises

Accordez le rôle IAM Déchiffreur de CryptoKey Cloud KMS (roles/cloudkms.cryptoKeyDecrypter) au compte de service Cloud Build:

  1. Dans la console Google Cloud, 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.

Configurer des compilations pour utiliser des données chiffrées

  1. Dans le répertoire racine de votre projet, créez un fichier de configuration de compilation Cloud Build nommé cloudbuild.yaml ou cloudbuild.json.

  2. Dans le fichier de configuration de compilation :

    • Après toute la compilation steps, ajoutez un champ availableSecrets pour spécifier la valeur chiffrée en tant que variable d'environnement et la kmsKeyName à utiliser pour la déchiffrer. Vous pouvez utiliser des variables de substitution dans la valeur de kmsKeyName.
    • À l'étape de compilation où vous souhaitez spécifier le secret :
      • Ajoutez un champ entrypoint pointant vers bash pour utiliser l'outil bash dans l'étape de compilation. Cette valeur est obligatoire pour faire référence à la variable d'environnement du secret.
      • Ajoutez un champ secretEnv spécifiant la variable d'environnement de la valeur chiffrée.
      • Dans le champ args, ajoutez une option -c en tant que premier argument. Toutes les chaînes que vous transmettez après -c sont traitées comme des commandes. Pour en savoir plus sur l'exécution des commandes bash avec -c, consultez la documentation bash.
      • Lorsque vous spécifiez la valeur chiffrée dans le champ args, spécifiez-la à l'aide de la variable d'environnement précédée de $$.

    L'exemple de fichier de configuration de compilation suivant montre comment se connecter à Docker et extraire une image privée:

    YAML

     steps:
     - name: 'gcr.io/cloud-builders/docker'
       entrypoint: 'bash'
       args: ['-c', 'docker login --username=$$USERNAME --password=$$PASSWORD']
       secretEnv: ['USERNAME', 'PASSWORD']
     - name: 'gcr.io/cloud-builders/docker'
       entrypoint: 'bash'
       args: ['-c', 'docker pull $$USERNAME/IMAGE:TAG']
       secretEnv: ['USERNAME']
     availableSecrets:
       inline:
       - kmsKeyName: projects/PROJECT_ID/locations/global/keyRings/USERNAME_KEYRING_NAME/cryptoKeys/USERNAME_KEY_NAME
         envMap:
           USERNAME: 'ENCRYPTED_USERNAME'
       - kmsKeyName: projects/PROJECT_ID/locations/global/keyRings/PASSWORD_KEYRING_NAME/cryptoKeys/PASSWORD_KEY_NAME
         envMap:
           PASSWORD: 'ENCRYPTED_PASSWORD'
    

    JSON

    {
      "steps": [
      {
        "name": "gcr.io/cloud-builders/docker",
        "entrypoint": "bash",
        "args": [
          "-c",
          "docker login --username=$$USERNAME --password=$$PASSWORD"
        ],
        "secretEnv": [
          "USERNAME",
          "PASSWORD"
        ]
      },
      {
        "name": "gcr.io/cloud-builders/docker",
        "entrypoint": "bash",
        "args": [
          "-c",
          "docker pull $$USERNAME/REPOSITORY:TAG"
         ],
         "secretEnv": [
          "USERNAME"
        ]
      }
      ],
      "availableSecrets": {
        "inline": [{
          "kmsKeyName":  "projects/PROJECT_ID/locations/global/keyRings/USERNAME_KEYRING_NAME/cryptoKeys/USERNAME_KEY_NAME",
          "envMap": {
            "USERNAME": "ENCRYPTED_USERNAME"
           }
       },
       {
        "kmsKeyName": "projects/PROJECT_ID/locations/global/keyRings/PASSWORD_KEYRING_NAME/cryptoKeys/PASSWORD_KEY_NAME",
        "envMap": {
            "PASSWORD": "ENCRYPTED_PASSWORD"
           }
       }]
     }
    }
    

    Remplacez les valeurs d'espace réservé dans les commandes ci-dessus par les éléments suivants :

    • PROJECT_ID: ID du projet Google Cloud qui contient votre service Cloud KMS.
    • USERNAME_KEYRING_NAME: nom du trousseau de clés correspondant à votre nom d'utilisateur Docker
    • USERNAME_KEY_NAME: nom de la clé de votre nom d'utilisateur Docker.
    • ENCRYPTED_USERNAME: nom d'utilisateur Docker chiffré au format base64
    • PASSWORD_KEYRING_NAME: nom du trousseau de clés contenant votre mot de passe Docker
    • PASSWORD_KEY_NAME: nom de la clé de votre mot de passe Docker.
    • ENCRYPTED_PASSWORD: votre mot de passe Docker chiffré au format base64
    • REPOSITORY: nom du dépôt Docker à partir duquel vous extrayez l'image.
    • TAG : nom du tag de votre image.

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

Configurer les compilations pour utiliser des fichiers chiffrés

  1. Dans le répertoire racine de votre projet, créez un fichier de configuration de compilation Cloud Build nommé cloudbuild.yaml ou cloudbuild.json.

  2. Dans votre fichier de configuration de compilation, avant toute étape de compilation qui interagit avec le fichier déchiffré, ajoutez une étape de compilation gcloud pour déchiffrer le fichier chiffré à l'aide de la clé de chiffrement. L'exemple de fichier de configuration de compilation suivant montre comment se connecter à Docker à l'aide du fichier chiffré avec un mot de passe Docker:

    YAML

    steps:
    - name: gcr.io/cloud-builders/gcloud
      args:
      - kms
      - decrypt
      - "--ciphertext-file=ENCRYPTED_PASSWORD_FILE"
      - "--plaintext-file=PLAINTEXT_PASSWORD_FILE"
      - "--location=global"
      - "--keyring=KEYRING_NAME"
      - "--key=KEY_NAME"
    - name: gcr.io/cloud-builders/docker
      entrypoint: bash
      args:
      - "-c"
      - docker login --username=DOCKER_USERNAME --password-stdin < PLAINTEXT_PASSWORD_FILE
    

    JSON

    {
      "steps": [
      {
        "name": "gcr.io/cloud-builders/gcloud",
        "args": [
          "kms",
          "decrypt",
          "--ciphertext-file=ENCRYPTED_PASSWORD_FILE",
          "--plaintext-file=PLAINTEXT_PASSWORD_FILE",
          "--location=global",
          "--keyring=KEYRING_NAME",
          "--key=KEY_NAME"
        ]
      },
      {
        "name": "gcr.io/cloud-builders/docker",
        "entrypoint": "bash",
        "args": [
          "-c",
          "docker login --username=DOCKER_USERNAME --password-stdin < PLAINTEXT_PASSWORD_FILE"
        ]
       }
      ]
    }
    

    Remplacez les valeurs d'espace réservé dans les commandes ci-dessus par les éléments suivants :

    • KEYRING_NAME: nom du trousseau de clés contenant votre mot de passe Docker
    • KEY_NAME: nom de la clé de votre mot de passe Docker.
    • ENCRYPTED_PASSWORD_FILE: fichier chiffré avec votre mot de passe Docker
    • PLAINTEXT_PASSWORD_FILE: fichier en texte brut avec votre mot de passe Docker.
  3. 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.

Configurer des compilations pour utiliser des données chiffrées (ancien)

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. 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"
         }
       }
       ]
    }
    

Étapes suivantes