使用客戶自行管理的加密金鑰

根據預設,Workflows 會加密靜態儲存的客戶內容。Workflows 會為您處理加密作業,您不必採取任何其他動作。這項做法稱為「Google 預設加密」

如要控管加密金鑰,您可以在 Cloud KMS 中使用客戶自行管理的加密金鑰 (CMEK),搭配整合 CMEK 的服務 (包括 Workflows)。使用 Cloud KMS 金鑰可控管保護等級、位置、輪換時間表、使用權限和存取權,以及加密範圍。 使用 Cloud KMS 還能追蹤金鑰用量、查看稽核記錄,以及控管金鑰生命週期。 您可以在 Cloud KMS 中控制及管理用來保護資料的對稱金鑰加密金鑰 (KEK),而不是由 Google 擁有及管理這些金鑰。

使用 CMEK 設定資源後,存取 Workflows 資源的體驗與使用 Google 預設加密機制類似。如要進一步瞭解加密選項,請參閱客戶管理的加密金鑰 (CMEK)

您可以使用只有您能存取的加密金鑰,保護工作流程和相關靜態資料,並透過 Cloud KMS 控制及管理金鑰。

受 CMEK 保護的項目

部署工作流程時,您可以指定 Cloud KMS 金鑰。這個金鑰用於加密工作流程及其執行作業:

  • 工作流程需要包含有效工作流程定義的來源檔案。這個來源檔案會使用金鑰加密。

  • 工作流程執行會執行目前的工作流程定義 (特定工作流程修訂版本)。系統會使用部署時與工作流程修訂版本相關聯的金鑰,加密編譯後的工作流程,以及任何儲存的執行輸入、輸出和執行階段資料。包括執行引數、結果、錯誤和例外狀況;傳送 Eventarc 事件;以及回呼和 HTTP 要求與回應。

事前準備

在 Workflows 中使用 CMEK 前,請先完成下列步驟:

  1. 啟用 API。

    主控台

    1. Enable the Cloud KMS and Workflows APIs.

      Enable the APIs

    gcloud

    1. In the Google Cloud console, activate Cloud Shell.

      Activate Cloud Shell

      At the bottom of the Google Cloud console, a Cloud Shell session starts and displays a command-line prompt. Cloud Shell is a shell environment with the Google Cloud CLI already installed and with values already set for your current project. It can take a few seconds for the session to initialize.

    2. 更新 gcloud 元件。
      gcloud components update
    3. 針對要用來儲存加密金鑰的專案,啟用 Cloud KMS 和 Workflows API。
      gcloud services enable cloudkms.googleapis.com workflows.googleapis.com
  2. 當金鑰啟用、停用,或由 Workflows 資源用於加密及解密資料時,Cloud KMS 會產生 Cloud 稽核記錄。請確認專案已啟用記錄 Cloud KMS API,並決定哪些記錄專用權限和角色適用於您的用途。詳情請參閱「Cloud KMS 稽核記錄資訊」一文。

  3. 建立 Cloud KMS 金鑰環和金鑰

    您可以建立新的金鑰環,或使用現有的金鑰環。您可以在金鑰環中新增金鑰或使用現有金鑰。

    1. 建立金鑰環

    2. 為指定金鑰環建立金鑰

    擷取 Cloud KMS 金鑰的資源 ID

    為工作流程啟用 CMEK 時,需要 Cloud KMS 金鑰的資源 ID。請參閱本文的「為工作流程啟用 CMEK」。

    控制台

    1. 前往 Google Cloud 控制台的「金鑰管理」頁面。

      前往「金鑰管理」

    2. 按一下包含金鑰的金鑰環。

    3. 找到您要擷取資源 ID 的金鑰環,按一下「更多」

    4. 按一下「複製資源名稱」

      金鑰的資源 ID 會複製到剪貼簿。格式如下所示:

      projects/PROJECT_NAME/locations/LOCATION/keyRings/KEY_RING/cryptoKeys/KEY_NAME
      
    5. 一個金鑰可以包含零或多個金鑰版本。金鑰版本的資源 ID 是金鑰 ID,加上斜線 (/) 和版本 ID。如要列出金鑰的所有版本,請執行下列操作:

      1. 按一下金鑰名稱。
      2. 如要查看特定版本,請按一下「更多」圖示
      3. 按一下「複製資源名稱」

    gcloud

    1. 列出特定金鑰環上的所有金鑰:

      gcloud kms keys list --keyring RING_NAME --location LOCATION
      

      更改下列內容:

      • RING_NAME:金鑰環的名稱
      • LOCATION:金鑰環的區域

      輸出結果會列出每個金鑰的資源 ID。例如:

      NAME: projects/PROJECT_NAME/locations/LOCATION/keyRings/RING_NAME/cryptoKeys/KEY_NAME
      
    2. 一個金鑰可以有零或多個金鑰版本。金鑰版本的資源 ID 是金鑰 ID,加上斜線 (/) 和版本 ID。列出金鑰的所有版本:

      gcloud kms keys versions list --location LOCATION --keyring RING_NAME --key KEY_NAME
      

      輸出內容會列出每個金鑰版本的資源 ID。例如:

      NAME: projects/PROJECT_NAME/locations/LOCATION/keyRings/RING_NAME/cryptoKeys/KEY_NAME/2
      

    授予 Workflows 服務代理金鑰存取權

    您必須授予 Workflows 服務代理人 Cloud KMS CryptoKey Encrypter/Decrypter Identity and Access Management (IAM) 角色,才能存取 Cloud KMS 金鑰:

    主控台

    透過控制台為工作流程啟用 CMEK 時,系統會提示您將 Cloud KMS CryptoKey Encrypter/Decrypter 角色授予服務帳戶。如需更多資訊,請參閱本文中的「為工作流程啟用 CMEK」。

    gcloud

    gcloud kms keys add-iam-policy-binding KEY_NAME \
        --keyring RING_NAME \
        --location LOCATION \
        --member serviceAccount:service-PROJECT_NUMBER@gcp-sa-workflows.iam.gserviceaccount.com \
        --role roles/cloudkms.cryptoKeyEncrypterDecrypter

    更改下列內容:

    • KEY_NAME:金鑰名稱。例如:my-key
    • RING_NAME:金鑰環的名稱。例如:my-keyring
    • LOCATION:金鑰的位置。例如:us-central1
    • PROJECT_NUMBER:您的 Google Cloud 專案編號。您可以在 Google Cloud 控制台的「歡迎」頁面找到專案編號,也可以執行下列指令:

      export PROJECT=$(gcloud info --format='value(config.project)')
      gcloud projects describe ${PROJECT} --format="value(projectNumber)"

    只要服務代理具有 roles/cloudkms.cryptoKeyEncrypterDecrypter 角色,專案中的工作流程就能使用 CMEK 金鑰加密及解密資料。如果撤銷這項角色,或是停用/刪除 CMEK 金鑰,就無法存取該資料。請參閱本文的「停用 Cloud KMS」一節。

    為工作流程啟用 CMEK

    建立工作流程或事後更新時,您可以指定工作流程應使用的 Cloud KMS 金鑰,用於資料加密。

    主控台

    1. 前往 Google Cloud 控制台的「Workflows」頁面。

      前往「Workflows」頁面

    2. 按一下要更新的工作流程名稱。

      系統隨即會顯示「工作流程詳細資料」頁面。

    3. 按一下「編輯」圖示

    4. 選取「Cloud KMS 金鑰」

    5. 選取「金鑰類型」

      您可以手動管理金鑰,也可以使用 Autokey 視需要產生金鑰環和金鑰。如果 Autokey 選項停用,表示尚未與目前的資源類型整合。

    6. 在「選取 Cloud KMS 金鑰」清單中,選取或篩選 Cloud KMS 金鑰。

    7. 選用:如要手動輸入金鑰的資源名稱,請在「選取客戶代管的金鑰」清單中,按一下「手動輸入金鑰」,然後以指定格式輸入金鑰資源名稱。

    8. 如果系統提示,請將 cloudkms.cyptoKeyEncrypterDecrypter 角色指派給 Workflows 服務帳戶,並使用 workflows.serviceAgent 角色。

    9. 點選「下一步」

    10. 如要儲存變更並部署更新後的工作流程,請按一下「部署」

    gcloud

    gcloud workflows deploy WORKFLOW_NAME \
        --source=SOURCE_FILE \
        --kms-key=KEY \
        --location LOCATION \
        --service-account=SERVICE_ACCOUNT

    更改下列內容:

    • WORKFLOW_NAME:工作流程名稱
    • SOURCE_FILE:工作流程來源檔案,YAML 檔案的副檔名為 yaml,JSON 檔案的副檔名為 json,例如 myWorkflow.yaml
    • KEY:金鑰的資源 ID,格式為 projects/PROJECT_NAME/locations/LOCATION/keyRings/RING_NAME/cryptoKeys/KEY_NAME。您可以擷取金鑰 ID

    • LOCATION:工作流程的位置

    • SERVICE_ACCOUNT:工作流程用來存取其他 Google Cloud 服務的服務帳戶,例如 SERVICE_ACCOUNT_NAME@PROJECT_NAME.iam.gserviceaccount.com。強烈建議您使用僅具備必要權限的服務帳戶,存取所需資源。如果留空,系統會使用預設服務帳戶。詳情請參閱「授予工作流程權限,以便存取 Google Cloud 資源」。

    注意事項:

    • 工作流程修訂版本和執行作業會以部署時指定的金鑰加密;先前以舊金鑰加密的資源仍會以該金鑰加密。如果隨後編輯工作流程並指定新金鑰,該工作流程修訂版本就會以新金鑰加密,後續執行作業也會使用新金鑰。
    • 先前非 CMEK 加密的工作流程修訂版本和執行作業仍未加密。
    • 如果停用工作流程修訂版本的 CMEK,後續建立的任何執行作業都不會使用 CMEK 加密。請參閱本文的「為工作流程停用 CMEK」一節。現有的工作流程修訂版本和執行作業,仍會使用先前加密時的金鑰加密。

    驗證 Cloud KMS 整合

    您可以顯示工作流程的中繼資料,驗證 CMEK 整合。

    主控台

    1. 前往 Google Cloud 控制台的「Workflows」頁面。

      前往「Workflows」頁面

    2. 按一下要驗證的工作流程名稱。

      系統隨即會顯示「工作流程詳細資料」頁面。

    3. 按一下 [Details] (詳細資料) 分頁標籤。

      「Encryption」(加密) 值會顯示用來保護工作流程及其執行的 Cloud KMS 金鑰資源 ID。

    gcloud

    gcloud workflows describe WORKFLOW_NAME \
        --location=LOCATION

    畫面會顯示如下的輸出內容:

    createTime: '2022-08-10T19:57:58.233177709Z'
    cryptoKeyName: projects/PROJECT_NAME/locations/LOCATION/keyRings/RING_NAME/cryptoKeys/KEY_NAME
    name: projects/PROJECT_NAME/locations/LOCATION/workflows/WORKFLOW_NAME
    revisionCreateTime: '2022-11-18T19:44:04.933633237Z'
    revisionId: 000009-8be
    serviceAccount: projects/PROJECT_NAME/serviceAccounts/SA_NAME@PROJECT_NAME.iam.gserviceaccount.com
    sourceContents:
    [...]
    state: ACTIVE
    updateTime: '2022-11-18T19:44:05.171793128Z'
    

    cryptokeyName 值是 Cloud KMS 金鑰的資源 ID,用於保護工作流程及其執行作業。

    停用工作流程的 CMEK

    您可以停用工作流程的 CMEK,這樣工作流程就不會再使用相關聯的 Cloud KMS 金鑰。

    主控台

    1. 前往 Google Cloud 控制台的「Workflows」頁面。

      前往「Workflows」頁面

    2. 按一下要更新的工作流程名稱。

      系統隨即會顯示「工作流程詳細資料」頁面。

    3. 按一下「編輯」圖示

    4. 如要清除「Cloud KMS 金鑰」圓形按鈕,請選取 Google-managed encryption key

    5. 點選「下一步」

    6. 如要儲存變更並部署更新後的工作流程,請按一下「部署」

    gcloud

    gcloud workflows deploy WORKFLOW_NAME \
        --source=SOURCE_FILE \
        --clear-kms-key \
        --service-account=SERVICE_ACCOUNT

    這會停用目前工作流程修訂版本的 CMEK,後續建立的任何執行作業都不會使用 CMEK 加密。現有的工作流程修訂版本和執行作業,仍會使用先前加密時的金鑰加密。

    停用 Cloud KMS

    如要撤銷工作流程或工作流程執行的資料存取權,可以透過下列任一方式停用 Cloud KMS:

    • 停用刪除客戶管理加密金鑰的主要金鑰版本。停用 CMEK 金鑰版本後,您將無法存取受該金鑰版本保護的所有資料。刪除金鑰版本是這項動作的永久對應動作。兩者都只會影響與特定金鑰相關聯的工作流程和工作流程執行作業。您無法建立新的執行作業,也無法查看與停用或損毀金鑰相關聯的資源。所有有效執行作業都會失敗,並顯示相應的錯誤訊息。

    • 撤銷 Workflows 服務代理人的身分與存取權管理角色 cloudkms.cryptoKeyEncrypterDecrypter。這會影響Google Cloud 專案中支援使用 CMEK 加密的所有工作流程。您無法建立新的 CMEK 整合式工作流程和執行作業,也無法查看任何 CMEK 加密資源。所有有效執行作業都會失敗,並顯示相應的錯誤訊息。

    雖然這兩項作業都無法保證立即撤銷存取權,但 IAM 變更通常會更快傳播。詳情請參閱「Cloud KMS 資源一致性」和「存取權變更傳播」。

    疑難排解

    將 Cloud KMS 與 Workflows 搭配使用時,可能會發生錯誤。下表說明不同問題及解決方法。

    問題 說明
    權限「cloudkms.cryptoKeyVersions.useToEncrypt」遭拒 提供的 Cloud KMS 金鑰不存在,或是權限設定不正確。

    解決方法:

    金鑰版本未啟用 提供的 Cloud KMS 金鑰版本已停用。

    解決方法:重新啟用 Cloud KMS 金鑰版本

    金鑰環區域與要保護的資源不符 提供的 KMS 金鑰環區域與工作流程的區域不同。

    解決方案:使用來自相同區域的 Cloud KMS 金鑰環和受保護的工作流程。(請注意,這些資源可能位於不同專案中)。詳情請參閱 Cloud KMS 位置Workflows 位置

    超過 Cloud KMS 配額上限 您已達 Cloud KMS 要求配額上限。

    解決方法:限制 Cloud KMS 呼叫次數,或提高配額上限。詳情請參閱 Cloud KMS 配額

    如何處理無法使用的金鑰狀態

    如果 Cloud KMS 因故無法使用,Workflows 可能無法從 Cloud KMS 擷取金鑰狀態。

    如果金鑰狀態為「無法使用」,工作流程或其執行作業會在 stateError 欄位中傳回 state: UNAVAILABLE 值和相關詳細資料。

    如果金鑰狀態在工作流程執行期間變成無法使用 (例如在回呼期間撤銷權限),就會發生執行階段錯誤,傳回 state: FAILED 值,以及 error 欄位中的相關詳細資料。

    定價

    除了金鑰作業費用外,此整合功能不會產生額外的費用。金鑰作業費用會計入您的 Google Cloud 專案中。如要查看目前定價資訊,請參閱 Cloud KMS 定價