Protege datos sensibles con Secret Manager con Batch

En este documento, se describe cómo proteger los datos sensibles que quieres especificar para un trabajo por lotes mediante secretos de Secret Manager.

Los secretos de Secret Manager protegen los datos sensibles mediante encriptación. En un trabajo por lotes, puedes especificar uno o más secretos existentes para pasar de forma segura los datos sensibles que contienen, lo que puedes usar para hacer lo siguiente:

  • Define de forma segura variables de entorno personalizadas que contengan datos sensibles.

  • Especifica de forma segura las credenciales de acceso para un Registro de Docker a fin de permitir que los ejecutables de un trabajo accedan a sus imágenes de contenedor privadas.

Antes de comenzar

Pasa datos sensibles a variables de entorno personalizadas de forma segura

Para pasar datos sensibles de los secretos de Secret Manager a las variables de entorno personalizadas de forma segura, debes definir cada variable de entorno en el subcampo de variables secretas (secretVariables) de un entorno y especificar un secreto para cada valor. Siempre que especifiques un secreto en un trabajo, debes formatearlo como una ruta de acceso a una versión del secreto: projects/PROJECT_ID/secrets/SECRET_ID/versions/VERSION.

Puedes crear un trabajo que defina variables secretas mediante gcloud CLI o la API de Batch. En el siguiente ejemplo, se explica cómo crear un trabajo que defina y use una variable secreta para el entorno de todos los ejecutables (subcampo environment de taskSpec).

gcloud

  1. Crea un archivo JSON que especifique los detalles de configuración del trabajo y, además, incluye el subcampo secretVariables para uno o más entornos.

    Por ejemplo, si quieres crear un trabajo básico de secuencia de comandos que use una variable secreta en el entorno para todos los ejecutables, crea un archivo JSON con el siguiente contenido:

    {
      "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"
      }
    }
    

    Reemplaza lo siguiente:

    • SECRET_VARIABLE_NAME: Es el nombre de la variable secreta. Por convención, los nombres de variable de entorno llevan mayúsculas.

      Para acceder de forma segura a los datos sensibles desde el Secret de Secret Manager de la variable, especifica el nombre de esta variable en los ejecutables del trabajo. La variable secreta es accesible para todos los ejecutables que se encuentran en el mismo entorno en el que defines la variable secreta.

    • PROJECT_ID: Es el ID de tu proyecto.

    • SECRET_NAME: Es el nombre de un secreto de Secret Manager existente.

    • VERSION: Es la versión del secreto especificado que contiene los datos que deseas pasar al trabajo. Puede ser el número de versión o latest.

  2. Para crear y ejecutar el trabajo, usa el comando gcloud batch jobs submit:

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

    Reemplaza lo siguiente:

    • JOB_NAME: Es el nombre del trabajo.

    • LOCATION: Es la ubicación del trabajo.

    • JSON_CONFIGURATION_FILE: Es la ruta de acceso a un archivo JSON con los detalles de configuración del trabajo.

API

Realiza una solicitud POST al método jobs.create que especifique el subcampo secretVariables para uno o más entornos.

Por ejemplo, si quieres crear un trabajo básico de secuencia de comandos que use una variable secreta en el entorno para todos los ejecutables, haz la siguiente solicitud:

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

Reemplaza lo siguiente:

  • PROJECT_ID: Es el ID de tu proyecto.

  • LOCATION: Es la ubicación del trabajo.

  • JOB_NAME: Es el nombre del trabajo.

  • SECRET_VARIABLE_NAME: Es el nombre de la variable secreta. Por convención, los nombres de variable de entorno llevan mayúsculas.

    Para acceder de forma segura a los datos sensibles desde el Secret de Secret Manager de la variable, especifica el nombre de esta variable en los ejecutables del trabajo. La variable secreta es accesible para todos los ejecutables que se encuentran en el mismo entorno en el que defines la variable secreta.

  • SECRET_NAME: Es el nombre de un secreto de Secret Manager existente.

  • VERSION: Es la versión del secreto especificado que contiene los datos que deseas pasar al trabajo. Puede ser el número de versión o latest.

Accede de forma segura a las imágenes de contenedor que requieren credenciales de registro de Docker

Para usar una imagen de contenedor de un registro privado de Docker, un ejecutable debe especificar las credenciales de acceso que le permitan acceder a ese registro de Docker. En particular, para cualquier contenedor que se pueda ejecutar con el campo de URI de imagen (imageUri) configurado como una imagen de un registro privado de Docker, debes especificar las credenciales necesarias para acceder a ese registro de Docker mediante el campo de nombre de usuario (username) y el campo de contraseña (password).

Puedes proteger cualquier credencial sensible de un registro de Docker si especificas los secretos existentes que contengan la información en lugar de definir estos campos directamente. Siempre que especifiques un secreto en un trabajo, debes formatearlo como una ruta de acceso a una versión del secreto: projects/PROJECT_ID/secrets/SECRET_ID/versions/VERSION.

Puedes crear un trabajo que use imágenes de contenedor de un registro privado de Docker mediante gcloud CLI o la API de Batch. En el siguiente ejemplo, se explica cómo crear un trabajo que usa una imagen de contenedor de un registro privado de Docker mediante la especificación directa del nombre de usuario y la contraseña como secreto.

gcloud

  1. Crea un archivo JSON que especifique los detalles de configuración del trabajo. Para cualquier contenedor ejecutable que use imágenes de un registro privado de Docker, incluye las credenciales necesarias para acceder a él en los campos username y password.

    Por ejemplo, para crear un trabajo de contenedor básico que especifique una imagen de un registro privado de Docker, crea un archivo JSON con el siguiente contenido:

    {
      "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"
      }
    }
    

    Reemplaza lo siguiente:

    • PRIVATE_IMAGE_URI: Es el URI de la imagen de una imagen de contenedor de un registro privado de Docker. Si esta imagen requiere alguna otra configuración de contenedor, también debes incluirla.

    • USERNAME: Es el nombre de usuario del registro privado de Docker, que se puede especificar como secreto o directamente.

    • PASSWORD: Es la contraseña del registro privado de Docker, que se puede especificar como secreto (recomendado) o directamente.

      Por ejemplo, para especificar la contraseña como secreto, configura PASSWORD de la siguiente manera:

      projects/PROJECT_ID/secrets/SECRET_ID/versions/VERSION
      

      Reemplaza lo siguiente:

  2. Para crear y ejecutar el trabajo, usa el comando gcloud batch jobs submit:

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

    Reemplaza lo siguiente:

    • JOB_NAME: Es el nombre del trabajo.

    • LOCATION: Es la ubicación del trabajo.

    • JSON_CONFIGURATION_FILE: Es la ruta de acceso a un archivo JSON con los detalles de configuración del trabajo.

API

Realiza una solicitud POST al método jobs.create. Para cualquier contenedor ejecutable que use imágenes de un registro privado de Docker, incluye las credenciales necesarias para acceder a él en los campos username y password.

Por ejemplo, para crear un trabajo de contenedor básico que especifique una imagen de un registro privado de Docker, realiza la siguiente solicitud:

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

Reemplaza lo siguiente:

  • PROJECT_ID: Es el ID de tu proyecto.

  • LOCATION: Es la ubicación del trabajo.

  • JOB_NAME: Es el nombre del trabajo.

  • PRIVATE_IMAGE_URI: Es el URI de la imagen de una imagen de contenedor de un registro privado de Docker. Si esta imagen requiere alguna otra configuración de contenedor, también debes incluirla.

  • USERNAME: Es el nombre de usuario del registro privado de Docker, que se puede especificar como secreto o directamente.

  • PASSWORD: Es la contraseña del registro privado de Docker, que se puede especificar como secreto (recomendado) o directamente.

    Por ejemplo, para especificar la contraseña como secreto, configura PASSWORD de la siguiente manera:

    projects/PROJECT_ID/secrets/SECRET_ID/versions/VERSION
    

    Reemplaza lo siguiente:

¿Qué sigue?