本文档介绍了如何使用 Secret Manager 密钥保护您要为批处理作业指定的敏感数据。
Secret Manager Secret 通过加密来保护敏感数据。在批处理作业中,您可以指定一个或多个现有 Secret,以安全地传递其中包含的敏感数据,这些数据可用于执行以下操作:
安全地定义包含敏感数据的自定义环境变量。
安全地指定 Docker 注册表的登录凭据,以便作业的可运行实例访问其私有容器映像。
准备工作
- 如果您之前未使用过批处理功能,请参阅开始使用批处理,并完成适用于项目和用户的前提条件,以启用批处理功能。
- 为您要为作业安全指定的敏感数据创建密文或指定密文。
-
如需获得创建作业所需的权限,请让您的管理员为您授予以下 IAM 角色:
-
项目的 Batch Job Editor (
roles/batch.jobsEditor
) -
作业的服务账号(默认为默认的 Compute Engine 服务账号)上的 Service Account User (
roles/iam.serviceAccountUser
)
如需详细了解如何授予角色,请参阅管理对项目、文件夹和组织的访问权限。
-
项目的 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、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
:指定 Secret 的版本,其中包含要传递给作业的数据。此值可以是版本号或latest
。
Java
Node.js
Python
安全地访问需要 Docker 注册表凭据的容器映像
如需使用私有 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 注册表中的映像的任何容器可运行项,请在
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 注册表中的映像的任何容器可运行项,请在 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。
不妨详细了解作业创建选项。