本文档介绍了如何使用 Secret Manager Secret 保护您要为 Batch 作业指定的敏感数据。
Secret Manager Secret 通过加密来保护敏感数据。在 Batch 作业中,您可以指定一个或多个现有 Secret 来安全地传递其中包含的敏感数据,这些数据可用于执行以下操作:
安全地定义包含敏感数据的自定义环境变量。
安全地指定 Docker 注册表的登录凭据,以便作业的可运行对象访问其私有容器映像。
准备工作
- 如果您之前未使用过 Batch,请查看开始使用 Batch 并完成项目和用户的前提条件,以启用 Batch。
- 为要为作业安全指定的敏感数据创建密文或标识密文。
-
如需获得创建作业所需的权限,请让您的管理员为您授予以下 IAM 角色:
-
项目的 Batch Job Editor (
roles/batch.jobsEditor
) -
服务账号用户 (
roles/iam.serviceAccountUser
) 作业的服务账号(默认情况下为默认 Compute Engine 服务账号)
如需详细了解如何授予角色,请参阅管理对项目、文件夹和组织的访问权限。
-
项目的 Batch Job Editor (
-
如需确保作业的服务账号具有访问 Secret 所需的权限,请让您的管理员为作业的服务账号授予针对 Secret 的 Secret Manager Secret Accessor (
roles/secretmanager.secretAccessor
) IAM 角色。
安全地将敏感数据传递给自定义环境变量
如需将敏感数据从 Secret Manager Secret 安全地传递到自定义环境变量,您必须在环境的 Secret 变量 (secretVariables
) 子字段中定义每个环境变量,并为每个值指定一个 Secret。
无论何时在作业中指定密文,都必须将其格式设置为密文版本的路径:projects/PROJECT_ID/secrets/SECRET_ID/versions/VERSION
。
您可以使用 gcloud CLI、Batch API、Java、Node.js 或 Python 创建定义了 Secret 变量的作业。以下示例说明了如何创建一项作业,该作业可为所有可运行对象的环境(taskSpec
的 environment
子字段)定义并使用 Secret 变量。
gcloud
创建一个 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" } }
替换以下内容:
如需创建并运行作业,请使用
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_NAME
:Secret 变量的名称。 按照惯例,环境变量名称采用大写。如需安全地访问变量的 Secret Manager Secret 中的敏感数据,请在此作业的可运行对象中指定此变量名称。在定义 Secret 变量的同一环境中,所有可运行对象都可以访问该 Secret 变量。
SECRET_NAME
:现有 Secret Manager Secret 的名称。VERSION
:指定密文的版本,其中包含您要传递给作业的数据。可以是版本号或latest
。
Java
Node.js
Python
安全访问需要 Docker 注册表凭据的容器映像
如需使用私有 Docker 注册表中的容器映像,可运行对象必须指定登录凭据,以便访问该 Docker 注册表。具体而言,对于任何可通过将映像 URI (imageUri
) 字段设置为私有 Docker 注册表中的映像来运行的容器,您必须使用用户名 (username
) 字段和密码 (password
) 字段指定访问相应 Docker 注册表所需的任何凭据。
您可以通过指定包含相应信息的现有 Secret 来保护 Docker 注册表的任何敏感凭据,而不是直接定义这些字段。
无论何时在作业中指定密文,都必须将其格式设置为密文版本的路径:projects/PROJECT_ID/secrets/SECRET_ID/versions/VERSION
。
您可以使用 gcloud CLI 或 Batch API 创建使用专用 Docker 注册表中容器映像的作业。以下示例说明了如何通过直接指定用户名并将密码指定为 Secret 来创建使用私有 Docker 注册表中的容器映像的作业。
gcloud
创建一个 JSON 文件,用于指定作业的配置详细信息。 对于使用私有 Docker 注册表中的映像的任何可运行容器,请在
username
和password
字段中添加访问该注册表所需的任何凭据。例如,如需创建指定私有 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(推荐)或直接指定。例如,如需将密码指定为密文,请将
PASSWORD
设置为以下值:projects/PROJECT_ID/secrets/SECRET_ID/versions/VERSION
替换以下内容:
PROJECT_ID
:您的项目的项目 ID。SECRET_NAME
:现有 Secret Manager Secret 的名称。VERSION
:指定密文的版本,其中包含您要传递给作业的数据。 可以是版本号或latest
。
如需创建并运行作业,请使用
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 注册表中的映像的任何可运行容器,请在 username
和 password
字段中添加访问该注册表所需的任何凭据。
例如,如需创建指定了私有 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(推荐)或直接指定。例如,如需将密码指定为密文,请将
PASSWORD
设置为以下值:projects/PROJECT_ID/secrets/SECRET_ID/versions/VERSION
替换以下内容:
PROJECT_ID
:您的项目的项目 ID。SECRET_NAME
:现有 Secret Manager Secret 的名称。VERSION
:指定密文的版本,其中包含您要传递给作业的数据。 可以是版本号或latest
。
后续步骤
如果您在创建或运行作业时遇到问题,请参阅问题排查。
详细了解环境变量。
详细了解 Secret Manager。
了解更多作业创建选项。