使用加密資源

本頁說明如何在建構要求中使用加密資源。您可以使用檔案或變數等加密資源,將機密資訊 (例如授權憑證) 傳送至您的建構步驟。

您可以使用 Cloud Key Management Service (Cloud KMS) 加密編譯金鑰加密及解密資源,這樣可以讓您輕鬆透過彈性的方式管理加密金鑰的存取權及輪替。 加密編譯金鑰儲存於金鑰環中,這是用於機構目的之加密編譯金鑰。

您必須先完成 Cloud KMS 快速入門導覽課程,才能熟悉 Cloud KMS 並啟用 Cloud KMS API。

建立 Cloud KMS 金鑰環與加密編譯金鑰

您可以使用 gcloud kms keyrings creategcloud kms keys create 指令建立金鑰環與加密編譯金鑰。

如要建立金鑰環,請在殼層或終端機視窗中執行以下指令:

gcloud kms keyrings create [KEYRING-NAME] \
  --location=global

如要建立加密編譯金鑰:

gcloud kms keys create [KEY-NAME] \
  --location=global \
  --keyring=[KEYRING-NAME] \
  --purpose=encryption

其中:

  • [KEYRING-NAME] 是要建立的金鑰環名稱
  • [KEY-NAME] 是要建立的加密編譯金鑰名稱

授予 Cloud Build 服務帳戶對於加密編譯金鑰的存取權

如要在建構期間解密資源,您必須授予 Cloud Build 服務帳戶對於加密編譯金鑰的存取權限。如果只需要解密檔案,則只需要授予解密權限。

如要授予權限:

主控台

  1. 造訪 GCP 主控台「IAM」選單
  2. 複製 Cloud Build 服務帳戶電子郵件地址,包含 @cloudbuild.gserviceaccount.com
  3. 造訪 GCP 主控台「加密金鑰」選單
  4. 從清單中選取金鑰環,然後按一下 [Permissions] (權限)
  5. 在 [Add members] (新增成員) 欄位中填入服務帳戶電子郵件地址。
  6. 從「Roles」(角色) 下拉式選單中,選擇 [Cloud KMS CrptoKey Decrypter] (Cloud KMS 加密編譯金鑰解密者)
  7. 按一下 [Add] (新增)。

gcloud

從殼層或終端機視窗執行下列指令:

gcloud kms keys add-iam-policy-binding \
    [KEY-NAME] --location=global --keyring=[KEYRING-NAME] \
    --member=serviceAccount:[PROJECT_NUMBER]@cloudbuild.gserviceaccount.com \
    --role=roles/cloudkms.cryptoKeyDecrypter

如要進一步瞭解此指令,請參閱 gcloud kms keys 文件

如果您不知道您的 Cloud Build 服務帳戶電子郵件地址,請造訪 Google Cloud Platform 主控台「IAM」選單。服務帳戶電子郵件地址包含 @cloudbuild.gserviceaccount.com

如要進一步瞭解如何授予對金鑰的存取權,請參閱 Cloud KMS 說明文件中的搭配 Cloud KMS 使用 IAM

使用加密編譯金鑰加密檔案

如要加密檔案,請在殼層或終端機視窗中執行下列指令:

gcloud kms encrypt \
  --plaintext-file=secrets.json \
  --ciphertext-file=secrets.json.enc \
  --location=global \
  --keyring=[KEYRING-NAME] \
  --key=[KEY-NAME]

這樣會產生名為 secrets.json.enc 的加密檔案,其中包含 secrets.json 的內容。

儲存加密檔案

加密檔案之後,便可將檔案儲存在與原始碼相同的位置,例如 Cloud Source Repository 或連線的 GitHub 或 Bitbucket 存放區。

例如,如要新增加密檔案並提交至您的 Git 存放區:

git add secrets.json.enc
git commit -am "Add encrypted secrets.json.enc"
git push

如要避免將純文字 secrets.json 檔案提交至您的存放區,請為存放區的 .gitignore 檔案新增檔案名稱。

echo "secrets.json" >> .gitignore
git commit -am "Add secrets.json to .gitignore"
git push

在建構期間解密檔案

現在您的檔案已經使用建構工具服務帳戶能夠存取的加密金鑰加密,您可以新增建構步驟來解密加密檔案的內容。

在您的建構要求中,在與解密 secrets.json 檔案互動的任何建構步驟之前,請新增建構步驟,呼叫 gcloud 建構工具使用加密金鑰解密 secrets.json.enc。這個建構步驟與用來加密檔案的指令類似。

steps:
- name: gcr.io/cloud-builders/gcloud
  args:
  - kms
  - decrypt
  - --ciphertext-file=secrets.json.enc
  - --plaintext-file=secrets.json
  - --location=global
  - --keyring=[KEYRING-NAME]
  - --key=[KEY-NAME]
# more steps here

當此步驟完成時,任何後續步驟都可以在工作空間目錄中使用解密的 secrets.json 檔案。

例如,您可以使用這個檔案中的密碼擷取外部依附元件,或在您建構的 Docker 容器映像檔中包含密鑰憑證。

使用 CryptoKey 加密環境變數

如要加密環境變數,請在您的殼層或終端機視窗中執行下列指令:

echo -n $MY_SECRET | gcloud kms encrypt \
  --plaintext-file=- \  # - reads from stdin
  --ciphertext-file=- \  # - writes to stdout
  --location=global \
  --keyring=[KEYRING-NAME] \
  --key=[KEY-NAME] | base64

這個指令會使用 CryptoKey 加密環境變數 $MY_SECRET 的值。加密值為 base64 編碼的字串,因此您可以輕鬆將該值包含到建構要求中。

在建構要求中使用加密的變數

在您的建構要求中包含 secrets 欄位可指定加密值,以及用來解密該值的加密編譯金鑰:

secrets:
- kmsKeyName: projects/[PROJECT-ID]/locations/global/keyRings/[KEYRING-NAME]/cryptoKeys/[KEY-NAME]
  secretEnv:
    MY_SECRET: <base64-encoded encrypted secret>

在您的建構步驟中,指定解密值應可做為環境變數使用:

steps:
- name: 'my-builder-image'
  args: ['my', 'args']
  env: ['FOO=foo', 'BAR=bar']
  secretEnv: ['MY_SECRET']

使用加密變數建構要求的範例

下列建構要求範例使用加密的 Dockerhub 密碼將 Docker 映像檔推送至 Dockerhub:

steps:

# Pull a public image from Dockerhub.
- name: 'gcr.io/cloud-builders/docker'
  args: ['pull', 'ubuntu']

# Retag the image into a user's repository.
- name: 'gcr.io/cloud-builders/docker'
  args: ['tag', 'ubuntu', '[MY-USER]/myubuntu']

# Login to provide credentials for the push.
# PASSWORD is decrypted before this step runs.
# Note: You need a shell to resolve environment variables with $$
- name: 'gcr.io/cloud-builders/docker'
  entrypoint: 'bash'
  args: ['-c', 'docker login --username=[MY-USER] --password=$$PASSWORD']
  secretEnv: ['PASSWORD']

# Push the image to Dockerhub.
- name: 'gcr.io/cloud-builders/docker'
  args: ['push', '[MY-USER]/myubuntu']

secrets:
- kmsKeyName: projects/[PROJECT-ID]/locations/global/keyRings/[KEYRING-NAME]/cryptoKeys/[KEY-NAME]
  secretEnv:
    PASSWORD: <base64-encoded encrypted Dockerhub password>

在此範例中,docker login 步驟會使用指定的使用者名稱與解密的 Dockerhub 密碼登入 Dockerhub,使下一個步驟能夠使用這些憑證將映像檔從使用者存放區 docker push 到 Dockerhub。

後續步驟

本頁內容對您是否有任何幫助?請提供意見:

傳送您對下列選項的寶貴意見...

這個網頁
Cloud Build 說明文件