本文档介绍如何使用 Secret Manager 密钥保护要为批量作业指定的敏感数据。
Secret Manager Secret 通过加密来保护敏感数据。在 Batch 作业中,您可以指定一个或多个现有 Secret 来安全地传递它们包含的敏感数据,这些数据可用于执行以下操作:
安全地定义包含敏感数据的自定义环境变量。
安全地指定 Docker Registry 的登录凭据,以允许作业的可运行对象访问其私有容器映像。
准备工作
- 如果您之前未使用过 Batch,请查看 Batch 使用入门,并在满足项目和用户的前提条件以启用 Batch。
- 为您要安全为作业指定的敏感数据创建 Secret 或标识 Secret。
-
如需获取创建作业所需的权限,请让管理员授予您以下 IAM 角色:
-
项目的 Batch Job Editor (
roles/batch.jobsEditor
) -
对作业的服务帐号拥有的 Service Account User (
roles/iam.serviceAccountUser
),默认为默认的 Compute Engine 服务帐号
如需详细了解如何授予角色,请参阅管理访问权限。
-
项目的 Batch Job Editor (
-
为了确保该作业的服务帐号具有访问 Secret 的必要权限,请让管理员向作业的服务帐号授予 Secret 的 Secret Manager Secret Accessor (
roles/secretmanager.secretAccessor
) IAM 角色。
安全地将敏感数据传递给自定义环境变量
如需安全地将 Secret Manager Secret 中的敏感数据传递给自定义环境变量,您必须在环境的 Secret 变量 (secretVariables
) 子字段中定义每个环境变量,并为每个值指定 Secret。每次在作业中指定 Secret 时,都必须将其格式设置为 Secret 版本的路径:projects/PROJECT_ID/secrets/SECRET_ID/versions/VERSION
。
您可以使用 gcloud CLI 或 Batch API 创建用于定义 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"
}
}
替换以下内容:
安全地访问需要 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
创建一个 JSON 文件,用于指定作业的配置详细信息。 对于使用私有 Docker Registry 中的映像的任何容器可运行对象,请在
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(推荐)指定,也可以直接指定。例如,如需将密码指定为 Secret,请将
PASSWORD
设置为以下内容:projects/PROJECT_ID/secrets/SECRET_ID/versions/VERSION
替换以下内容:
PROJECT_ID
:您的项目 ID。SECRET_NAME
:现有 Secret Manager Secret 的名称。VERSION
:指定 Secret 的版本,其中包含要传递给作业的数据。这可以是版本号或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 Registry 中的映像的任何容器可运行对象,请在 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(推荐)指定,也可以直接指定。例如,如需将密码指定为 Secret,请将
PASSWORD
设置为以下内容:projects/PROJECT_ID/secrets/SECRET_ID/versions/VERSION
替换以下内容:
PROJECT_ID
:您的项目 ID。SECRET_NAME
:现有 Secret Manager Secret 的名称。VERSION
:指定 Secret 的版本,其中包含要传递给作业的数据。这可以是版本号或latest
。
后续步骤
如果您在创建或运行作业时遇到问题,请参阅问题排查。
详细了解环境变量。
详细了解 Secret Manager。
详细了解作业创建选项。