通过 Batch 使用 Secret Manager 保护敏感数据

本文档介绍如何使用 Secret Manager 密钥保护要为批量作业指定的敏感数据。

Secret Manager Secret 通过加密来保护敏感数据。在 Batch 作业中,您可以指定一个或多个现有 Secret 来安全地传递它们包含的敏感数据,这些数据可用于执行以下操作:

准备工作

安全地将敏感数据传递给自定义环境变量

如需安全地将 Secret Manager Secret 中的敏感数据传递给自定义环境变量,您必须在环境的 Secret 变量 (secretVariables) 子字段中定义每个环境变量,并为每个值指定 Secret。每次在作业中指定 Secret 时,都必须将其格式设置为 Secret 版本的路径:projects/PROJECT_ID/secrets/SECRET_ID/versions/VERSION

您可以使用 gcloud CLI 或 Batch API 创建用于定义 Secret 变量的作业。 以下示例说明了如何创建一个作业,为所有可运行对象的环境(taskSpecenvironment 子字段)定义并使用 Secret 变量。

gcloud

  1. 创建一个 JSON 文件,该文件指定作业的配置详细信息,并包含一个或多个环境的 secretVariables 子字段。

    例如,如需创建一个基本脚本作业,以在所有可运行项目中使用环境中的 Secret 变量,请创建一个 JSON 文件,其中包含以下内容:

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

    替换以下内容:

    • SECRET_VARIABLE_NAMESecret 变量的名称。按照惯例,环境变量名称采用大写形式

      如需安全地通过变量的 Secret Manager 密钥访问敏感数据,请在此作业的可运行对象中指定此变量名称。位于您定义 Secret 变量的同一环境中的所有可运行对象均可访问 Secret 变量。

    • PROJECT_ID:您的项目 ID

    • SECRET_NAME现有 Secret Manager Secret 的名称。

    • VERSION:指定 Secret 的版本,其中包含要传递给作业的数据。这可以是版本号或 latest

  2. 如需创建并运行作业,请使用 gcloud batch jobs submit 命令

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

    替换以下内容:

    • JOB_NAME:作业的名称。

    • LOCATION:作业的位置

    • JSON_CONFIGURATION_FILE:包含作业配置详细信息的 JSON 文件的路径。

API

jobs.create 方法发出 POST 请求,为一个或多个环境指定 secretVariables 子字段。

例如,如需创建一个基本脚本作业以在所有可运行对象中使用环境中的 Secret 变量,请发出以下请求:

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

替换以下内容:

  • PROJECT_ID:您的项目 ID

  • LOCATION:作业的位置

  • JOB_NAME:作业的名称。

  • SECRET_VARIABLE_NAMESecret 变量的名称。按照惯例,环境变量名称采用大写形式

    如需安全地通过变量的 Secret Manager 密钥访问敏感数据,请在此作业的可运行对象中指定此变量名称。位于您定义 Secret 变量的同一环境中的所有可运行对象均可访问 Secret 变量。

  • SECRET_NAME现有 Secret Manager Secret 的名称。

  • VERSION:指定 Secret 的版本,其中包含要传递给作业的数据。这可以是版本号或 latest

安全地访问需要 Docker Registry 凭据的容器映像

如需使用私有 Docker 注册表中的容器映像,可运行对象必须指定允许其访问该 Docker 注册表的登录凭据。具体而言,对于将映像 URI (imageUri) 字段设置为私有 Docker 注册表中的映像的任何可运行的容器,您必须使用用户名 (username) 字段密码 (password) 字段指定访问该 Docker 注册表所需的任何凭据。

您可以指定包含相应信息的现有 Secret,而不是直接定义这些字段,从而保护 Docker 注册表的任何敏感凭据。每次在作业中指定 Secret 时,都必须将其格式设置为 Secret 版本的路径:projects/PROJECT_ID/secrets/SECRET_ID/versions/VERSION

您可以通过 gcloud CLI 或 Batch API 创建使用私有 Docker 注册表中的容器映像的作业。以下示例说明了如何通过直接指定用户名和密码作为 Secret,来创建使用私有 Docker 注册表中的容器映像的作业。

gcloud

  1. 创建一个 JSON 文件,用于指定作业的配置详细信息。 对于使用私有 Docker Registry 中的映像的任何容器可运行对象,请在 usernamepassword 字段中添加访问该映像所需的所有凭据。

    例如,如需创建一个基本容器作业来指定私有 Docker 注册表中的映像,请创建一个包含以下内容的 JSON 文件:

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

    替换以下内容:

    • PRIVATE_IMAGE_URI:私有 Docker 注册表中的容器映像的映像 URI。如果此映像需要任何其他容器设置,您还必须添加这些设置。

    • USERNAME:私有 Docker 注册表的用户名,可以作为 Secret 指定,也可以直接指定。

    • PASSWORD:私有 Docker 注册表的密码,可以作为 Secret(推荐)指定,也可以直接指定。

      例如,如需将密码指定为 Secret,请将 PASSWORD 设置为以下内容:

      projects/PROJECT_ID/secrets/SECRET_ID/versions/VERSION
      

      替换以下内容:

  2. 如需创建并运行作业,请使用 gcloud batch jobs submit 命令

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

    替换以下内容:

    • JOB_NAME:作业的名称。

    • LOCATION:作业的位置

    • JSON_CONFIGURATION_FILE:包含作业配置详细信息的 JSON 文件的路径。

API

jobs.create 方法发出 POST 请求。对于使用私有 Docker Registry 中的映像的任何容器可运行对象,请在 usernamepassword 字段中添加访问该映像所需的所有凭据。

例如,如需创建一个基本容器作业来指定私有 Docker 注册表中的映像,请发出以下请求:

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

替换以下内容:

  • PROJECT_ID:您的项目 ID

  • LOCATION:作业的位置

  • JOB_NAME:作业的名称。

  • PRIVATE_IMAGE_URI:私有 Docker 注册表中的容器映像的映像 URI。如果此映像需要任何其他容器设置,您还必须添加这些设置。

  • USERNAME:私有 Docker 注册表的用户名,可以作为 Secret 指定,也可以直接指定。

  • PASSWORD:私有 Docker 注册表的密码,可以作为 Secret(推荐)指定,也可以直接指定。

    例如,如需将密码指定为 Secret,请将 PASSWORD 设置为以下内容:

    projects/PROJECT_ID/secrets/SECRET_ID/versions/VERSION
    

    替换以下内容:

后续步骤