本文說明如何使用 Secret Manager 密鑰,保護要為 Batch 工作指定的機密資料。
Secret Manager 密碼 會透過加密保護私密資料。 在批次工作中,您可以指定一或多個現有密鑰,安全地傳遞其中包含的機密資料,並用於執行下列操作:
安全地定義含有機密資料的自訂環境變數。
安全地指定 Docker Registry 的登入憑證,讓工作可執行檔存取私人容器映像檔。
事前準備
- 如果您從未使用過 Batch,請參閱「開始使用 Batch」,並完成專案和使用者的必要條件,啟用 Batch。
- 建立密鑰或找出密鑰,以安全地為工作指定機密資料。
-
如要取得建立作業所需的權限,請要求管理員授予下列 IAM 角色:
-
批次工作編輯者 (
roles/batch.jobsEditor
) 專案 -
服務帳戶使用者 (
roles/iam.serviceAccountUser
) 在作業的服務帳戶上,預設為預設 Compute Engine 服務帳戶
如要進一步瞭解如何授予角色,請參閱「管理專案、資料夾和機構的存取權」。
-
批次工作編輯者 (
-
為確保作業的服務帳戶具備存取密鑰的必要權限,請要求管理員將密鑰的 Secret Manager 密鑰存取者 (
roles/secretmanager.secretAccessor
) IAM 角色授予作業的服務帳戶。
安全地將機密資料傳遞至自訂環境變數
如要將 Secret Manager 密碼中的機密資料安全地傳遞至自訂環境變數,您必須在環境的密碼變數 (secretVariables
) 子欄位中定義每個環境變數,並為每個值指定密碼。在工作中指定密鑰時,必須將密鑰格式設為密鑰版本的路徑:projects/PROJECT_ID/secrets/SECRET_ID/versions/VERSION
。
您可以使用 gcloud CLI、Batch API、Java、Node.js 或 Python,建立定義密鑰變數的工作。以下範例說明如何建立工作,為所有可執行檔的環境 (taskSpec
的 environment
子欄位) 定義及使用密鑰變數。
gcloud
建立 JSON 檔案,指定工作的設定詳細資料,並為一或多個環境加入
secretVariables
子欄位。舉例來說,如要建立基本指令碼作業,在環境中為所有可執行檔使用密鑰變數,請建立內容如下的 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
子欄位。
舉例來說,如要建立基本指令碼工作,在所有可執行檔的環境中使用密鑰變數,請發出下列要求:
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"
}
}
更改下列內容:
Java
Node.js
Python
安全存取需要 Docker 登錄憑證的容器映像檔
如要使用私人 Docker 登錄檔中的容器映像檔,可執行檔必須指定登入憑證,才能存取該 Docker 登錄檔。具體來說,如果任何可執行的容器的映像檔 URI (imageUri
) 欄位設為來自私人 Docker 登錄檔的映像檔,您必須使用使用者名稱 (username
) 欄位和密碼 (password
) 欄位,指定存取該 Docker 登錄檔所需的任何憑證。
您可以指定含有資訊的現有密碼,而非直接定義這些欄位,藉此保護 Docker 登錄檔的任何機密憑證。在工作中指定密鑰時,必須將密鑰格式設為密鑰版本的路徑:projects/PROJECT_ID/secrets/SECRET_ID/versions/VERSION
。
您可以使用 gcloud CLI 或 Batch API,建立使用私人 Docker 登錄檔中容器映像檔的工作。以下範例說明如何建立工作,直接指定使用者名稱並將密碼設為密鑰,藉此使用私人 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 登錄檔的使用者名稱,可指定為密鑰或直接指定。PASSWORD
:私人 Docker 登錄檔的密碼,可指定為密鑰 (建議) 或直接指定。舉例來說,如要將密碼指定為密鑰,請將
PASSWORD
設為下列值:projects/PROJECT_ID/secrets/SECRET_ID/versions/VERSION
更改下列內容:
PROJECT_ID
:專案的專案 ID。SECRET_NAME
:現有 Secret Manager 密鑰的名稱。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 登錄檔的使用者名稱,可指定為密鑰或直接指定。PASSWORD
:私人 Docker 登錄檔的密碼,可指定為密鑰 (建議) 或直接指定。舉例來說,如要將密碼指定為密鑰,請將
PASSWORD
設為下列值:projects/PROJECT_ID/secrets/SECRET_ID/versions/VERSION
更改下列內容:
PROJECT_ID
:專案的專案 ID。SECRET_NAME
:現有 Secret Manager 密鑰的名稱。VERSION
:指定密碼的版本,其中包含要傳遞至作業的資料。可以是版本號碼或latest
。
後續步驟
如果無法建立或執行工作,請參閱「疑難排解」。
進一步瞭解環境變數。
進一步瞭解 Secret Manager。
進一步瞭解工作建立選項。