Protégez les données sensibles à l'aide de Secret Manager avec Batch

Ce document explique comment protéger les données sensibles que vous souhaitez spécifier pour un job par lot à l'aide de secrets Secret Manager.

Les secrets Secret Manager protègent les données sensibles grâce au chiffrement. Dans une tâche par lot, vous pouvez spécifier un ou plusieurs secrets existants pour transmettre de manière sécurisée les données sensibles qu'ils contiennent. Vous pouvez les utiliser pour effectuer les opérations suivantes:

  • Définissez des variables d'environnement personnalisées contenant des données sensibles de manière sécurisée.

  • Spécifiez en toute sécurité les identifiants de connexion pour un registre Docker afin de permettre aux exécutables d'une tâche d'accéder à ses images de conteneurs privées.

Avant de commencer

Transmettre des données sensibles à des variables d'environnement personnalisées de façon sécurisée

Pour transmettre en toute sécurité des données sensibles des secrets Secret Manager vers des variables d'environnement personnalisées, vous devez définir chaque variable d'environnement dans le sous-champ Variables secrètes (secretVariables) pour un environnement et spécifier un secret pour chaque valeur. Chaque fois que vous spécifiez un secret dans une tâche, vous devez le formater sous la forme d'un chemin d'accès à une version de secret : projects/PROJECT_ID/secrets/SECRET_ID/versions/VERSION.

Vous pouvez créer un job qui définit les variables des secrets à l'aide de gcloud CLI ou de l'API Batch. L'exemple suivant explique comment créer une tâche qui définit et utilise une variable secrète pour l'environnement de tous les exécutables (sous-champ environment de taskSpec).

gcloud

  1. Créez un fichier JSON qui spécifie les détails de configuration de la tâche et incluez le sous-champ secretVariables pour un ou plusieurs environnements.

    Par exemple, pour créer une tâche de script de base qui utilise une variable secrète de l'environnement pour tous les exécutables, créez un fichier JSON avec le contenu suivant:

    {
      "taskGroups": [
        {
          "taskSpec": {
            "runnables": [
              {
                "script": {
                  "text": "echo This is the secret: ${SECRET_VARIABLE_NAME}"
                }
              }
            ],
            "environment": {
              "secretVariables": {
                "{SECRET_VARIABLE_NAME}": "projects/PROJECT_ID/secrets/SECRET_NAME/versions/VERSION"
              }
            }
          }
        }
      ],
      "logsPolicy": {
        "destination": "CLOUD_LOGGING"
      }
    }
    

    Remplacez les éléments suivants :

    • SECRET_VARIABLE_NAME: nom de la variable secrète. Par convention, les noms des variable d'environnement sont en majuscules.

      Pour accéder de manière sécurisée aux données sensibles à partir du secret Secret Manager de la variable, spécifiez ce nom de variable dans les exécutables de cette tâche. La variable secrète est accessible à tous les exécutables situés dans le même environnement que celui dans lequel vous la définissez.

    • PROJECT_ID: ID de votre projet.

    • SECRET_NAME: nom d'un secret Secret Manager existant.

    • VERSION: version du secret spécifié contenant les données que vous souhaitez transmettre à la tâche. Il peut s'agir du numéro de version ou de latest.

  2. Pour créer et exécuter la tâche, utilisez la commande gcloud batch jobs submit:

    gcloud batch jobs submit JOB_NAME \
      --location LOCATION \
      --config JSON_CONFIGURATION_FILE
    

    Remplacez les éléments suivants :

    • JOB_NAME: nom de la tâche.

    • LOCATION: lieu de la tâche.

    • JSON_CONFIGURATION_FILE: chemin d'accès à un fichier JSON contenant les détails de configuration de la tâche.

API

Envoyez une requête POST à la méthode jobs.create qui spécifie le sous-champ secretVariables pour un ou plusieurs environnements.

Par exemple, pour créer une tâche de script de base qui utilise une variable secrète de l'environnement pour tous les exécutables, exécutez la requête suivante:

POST https://batch.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION/jobs?job_id=JOB_NAME
{
  "taskGroups": [
    {
      "taskSpec": {
        "runnables": [
          {
            "script": {
              "text": "echo This is the secret: ${SECRET_VARIABLE_NAME}"
            }
          }
        ],
        "environment": {
          "secretVariables": {
            "{SECRET_VARIABLE_NAME}": "projects/PROJECT_ID/secrets/SECRET_NAME/versions/VERSION"
          }
        }
      }
    }
  ],
  "logsPolicy": {
    "destination": "CLOUD_LOGGING"
  }
}

Remplacez les éléments suivants :

  • PROJECT_ID: ID de votre projet.

  • LOCATION: lieu de la tâche.

  • JOB_NAME: nom de la tâche.

  • SECRET_VARIABLE_NAME: nom de la variable secrète. Par convention, les noms des variable d'environnement sont en majuscules.

    Pour accéder de manière sécurisée aux données sensibles à partir du secret Secret Manager de la variable, spécifiez ce nom de variable dans les exécutables de cette tâche. La variable secrète est accessible à tous les exécutables situés dans le même environnement que celui dans lequel vous la définissez.

  • SECRET_NAME: nom d'un secret Secret Manager existant.

  • VERSION: version du secret spécifié contenant les données que vous souhaitez transmettre à la tâche. Il peut s'agir du numéro de version ou de latest.

Accédez de manière sécurisée aux images de conteneurs nécessitant des identifiants de registre Docker

Pour utiliser une image de conteneur provenant d'un registre Docker privé, un exécutable doit spécifier des identifiants de connexion lui permettant d'accéder à ce registre Docker. Plus précisément, pour tout conteneur exécutable dont le champ URI d'image (imageUri) est défini sur une image d'un registre Docker privé, vous devez spécifier tous les identifiants requis pour accéder à ce registre Docker à l'aide du champ nom d'utilisateur (username) et du champ mot de passe (password).

Vous pouvez protéger des identifiants sensibles pour un registre Docker en spécifiant les secrets existants qui contiennent les informations au lieu de définir ces champs directement. Chaque fois que vous spécifiez un secret dans une tâche, vous devez le formater sous la forme d'un chemin d'accès à une version de secret : projects/PROJECT_ID/secrets/SECRET_ID/versions/VERSION.

Vous pouvez créer un job qui utilise des images de conteneur à partir d'un registre Docker privé à l'aide de la gcloud CLI ou de l'API Batch. L'exemple suivant explique comment créer une tâche qui utilise une image de conteneur provenant d'un registre Docker privé en spécifiant directement le nom d'utilisateur et le mot de passe en tant que secret.

gcloud

  1. Créez un fichier JSON qui spécifie les détails de configuration de la tâche. Pour tous les exécutables de conteneur qui utilisent des images provenant d'un registre Docker privé, incluez tous les identifiants requis pour y accéder dans les champs username et password.

    Par exemple, pour créer une tâche de conteneur de base qui spécifie une image d'un registre Docker privé, créez un fichier JSON avec le contenu suivant:

    {
      "taskGroups": [
        {
          "taskSpec": {
            "runnables": [
              {
                "container": {
                  "imageUri": "PRIVATE_IMAGE_URI",
                  "commands": [
                    "-c",
                    "echo This runnable uses a private image."
                  ],
                  "username": "USERNAME",
                  "password": "PASSWORD"
                }
              }
            ],
          }
        }
      ],
      "logsPolicy": {
        "destination": "CLOUD_LOGGING"
      }
    }
    

    Remplacez les éléments suivants :

    • PRIVATE_IMAGE_URI: URI d'une image de conteneur provenant d'un registre Docker privé. Si cette image nécessite d'autres paramètres de conteneur, vous devez également les inclure.

    • USERNAME: nom d'utilisateur du registre Docker privé, qui peut être spécifié en tant que secret ou directement.

    • PASSWORD: mot de passe du registre Docker privé, qui peut être spécifié en tant que secret (recommandé) ou directement.

      Par exemple, pour spécifier le mot de passe en tant que secret, définissez PASSWORD sur ce qui suit:

      projects/PROJECT_ID/secrets/SECRET_ID/versions/VERSION
      

      Remplacez les éléments suivants :

      • PROJECT_ID: ID de votre projet.

      • SECRET_NAME: nom d'un secret Secret Manager existant.

      • VERSION: version du secret spécifié contenant les données que vous souhaitez transmettre à la tâche. Il peut s'agir du numéro de version ou de latest.

  2. Pour créer et exécuter la tâche, utilisez la commande gcloud batch jobs submit:

    gcloud batch jobs submit JOB_NAME \
      --location LOCATION \
      --config JSON_CONFIGURATION_FILE
    

    Remplacez les éléments suivants :

    • JOB_NAME: nom de la tâche.

    • LOCATION: lieu de la tâche.

    • JSON_CONFIGURATION_FILE: chemin d'accès à un fichier JSON contenant les détails de configuration de la tâche.

API

Envoyez une requête POST à la méthode jobs.create. Pour tous les exécutables de conteneur qui utilisent des images provenant d'un registre Docker privé, incluez tous les identifiants requis pour y accéder dans les champs username et password.

Par exemple, pour créer une tâche de conteneur de base qui spécifie une image d'un registre Docker privé, exécutez la requête suivante:

POST https://batch.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION/jobs?job_id=JOB_NAME
{
  "taskGroups": [
    {
      "taskSpec": {
        "runnables": [
          {
            "container": {
              "imageUri": "PRIVATE_IMAGE_URI",
                "commands": [
                  "-c",
                  "echo This runnable uses a private image."
                ],
                "username": "USERNAME",
                "password": "PASSWORD"
            }
          }
        ],
      }
    }
  ],
  "logsPolicy": {
    "destination": "CLOUD_LOGGING"
  }
}

Remplacez les éléments suivants :

  • PROJECT_ID: ID de votre projet.

  • LOCATION: lieu de la tâche.

  • JOB_NAME: nom de la tâche.

  • PRIVATE_IMAGE_URI: URI d'une image de conteneur provenant d'un registre Docker privé. Si cette image nécessite d'autres paramètres de conteneur, vous devez également les inclure.

  • USERNAME: nom d'utilisateur du registre Docker privé, qui peut être spécifié en tant que secret ou directement.

  • PASSWORD: mot de passe du registre Docker privé, qui peut être spécifié en tant que secret (recommandé) ou directement.

    Par exemple, pour spécifier le mot de passe en tant que secret, définissez PASSWORD sur ce qui suit:

    projects/PROJECT_ID/secrets/SECRET_ID/versions/VERSION
    

    Remplacez les éléments suivants :

    • PROJECT_ID: ID de votre projet.

    • SECRET_NAME: nom d'un secret Secret Manager existant.

    • VERSION: version du secret spécifié contenant les données que vous souhaitez transmettre à la tâche. Il peut s'agir du numéro de version ou de latest.

Étapes suivantes