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

本指南說明如何使用 Dataform 的 CMEK,並逐步引導您啟用 Dataform 存放區的 CMEK 加密功能。

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

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

使用 CMEK 設定資源後,存取 Dataform 資源的體驗就會類似使用 Google 預設加密功能。如要進一步瞭解加密選項,請參閱「客戶管理的加密金鑰 (CMEK)」。

存放區資料的 CMEK 加密

將 CMEK 加密功能套用至 Dataform 存放區時,系統會使用存放區的 CMEK 保護金鑰組,為該存放區中的所有 Dataform 管理客戶資料進行靜態加密。這類資料包括:

  • Dataform 存放區及其工作區的 Git 存放區內容
  • 已編譯的 SQL 查詢和編譯錯誤
  • 工作流程動作的已儲存 SQL 查詢
  • 已執行的工作流程動作錯誤詳細資料

Dataform 會在下列情況下使用 CMEK 保護金鑰:

Dataform 會管理僅與 Dataform 資源相關聯的客戶資料加密作業。Dataform 不會管理透過執行 Dataform 工作流程,在 BigQuery 中建立的客戶資料加密作業。如要加密在 BigQuery 中建立及儲存的資料,請為 BigQuery 設定 CMEK

支援的鍵

Dataform 支援下列類型的 CMEK 金鑰:

按鍵的供應情形會因按鍵類型和地區而異。如要進一步瞭解 CMEK 金鑰的地理位置可用性,請參閱 Cloud KMS 位置

限制

Dataform 支援 CMEK,但有下列限制:

  • CMEK 加密存放區的大小上限為 512 MB。
  • CMEK 加密存放區中工作區的大小上限為 512 MB。
  • 存放區建立後,您就無法將 CMEK 保護金鑰套用至該存放區。您只能在建立存放區時套用 CMEK 加密。
  • 您無法從存放區中移除 CMEK 保護金鑰。
  • 您無法變更存放區的 CMEK 保護金鑰。
  • 如果您為 Google Cloud 專案設定預設 Dataform CMEK 金鑰,則在 Google Cloud 專案位置建立的所有新存放區都必須使用 CMEK 加密。在 Google Cloud 專案位置建立新存放區時,您可以套用預設 Dataform CMEK 金鑰或其他 CMEK 金鑰,但無法套用預設靜態資料加密
  • 如果您變更預設 Dataform CMEK 金鑰的值,先前的值會套用至先前建立的存放區,而更新後的值則會套用至變更後建立的存放區。
  • 每個 Google Cloud 專案存放區只能設定一個預設的 Dataform CMEK 金鑰。
  • 無法使用 CMEK 機構政策
  • 使用 Cloud HSM 和 Cloud EKM 金鑰需視情況而定。如要進一步瞭解各個位置的金鑰可用性,請參閱 Cloud KMS 位置

Cloud KMS 配額和 Dataform

您可以搭配使用 Cloud HSM 和 Cloud EKM 金鑰與 Dataform。在 Dataform 中使用 CMEK 時,專案可以使用 Cloud KMS 密碼編譯要求配額。舉例來說,如果 Dataform 存放區使用 CMEK 加密,則每次變更存放區內容時,就會消耗這些配額。只有在使用硬體 (Cloud HSM) 或外部 (Cloud EKM) 金鑰時,使用 CMEK 金鑰進行加密和解密作業才會影響 Cloud KMS 配額。詳情請參閱「Cloud KMS 配額」。

管理車鑰

請使用 Cloud KMS 執行所有金鑰管理作業。在 Cloud KMS 傳播任何金鑰變更之前,Dataform 無法偵測或對任何金鑰變更採取行動。部分作業 (例如停用或刪除金鑰) 可能需要最多三小時才能生效。權限變更通常會更快傳播。

建立存放區後,Dataform 會呼叫 Cloud KMS,確保在對加密存放區資料執行每項作業時,金鑰仍有效。

如果 Dataform 偵測到 Cloud KMS 金鑰已停用或刪除,則無法存取儲存在對應存放區的所有資料。

如果 Dataform 對 Cloud KMS 的呼叫偵測到先前已停用的金鑰已重新啟用,Dataform 會自動還原存取權。

透過 Cloud EKM 使用外部金鑰

除了使用 Cloud KMS 中的金鑰,您也可以使用支援的外部金鑰管理合作夥伴代管的金鑰。如要這麼做,請使用 Cloud External Key Manager (Cloud EKM) 建立及管理外部金鑰,也就是指向位於 Google Cloud之外的金鑰的指標。詳情請參閱「Cloud External Key Manager」。

使用 Cloud EKM 建立外部金鑰後,您可以在建立存放區時提供該金鑰的 ID,將金鑰套用至新的 Dataform 存放區。這個程序與將 Cloud KMS 金鑰套用至新存放區的程序相同。

使用 Dataform 預設的 CMEK 金鑰

如要使用相同的 CMEK 金鑰加密多個 Dataform 存放區,您可以為 Google Cloud 專案設定預設的 Dataform CMEK 金鑰。您必須為預設 Dataform CMEK 金鑰指定 Google Cloud 專案的位置。每個 Google Cloud 專案只能設定一個預設 CMEK 金鑰。

設定預設 Dataform CMEK 金鑰後,Dataform 會將金鑰套用至預設在 Google Cloud 專案位置建立的所有新存放區。建立存放區時,您可以使用預設金鑰,或選取其他 CMEK 金鑰。

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

在少數情況下 (例如 Cloud KMS 無法使用期間),Dataform 可能無法從 Cloud KMS 擷取金鑰狀態。

如果 Dataform 存放區受到金鑰保護,而該金鑰是在 Dataform 無法與 Cloud KMS 通訊時啟用,則無法存取已加密的存放區資料。

在 Dataform 重新連線至 Cloud KMS,並收到 Cloud KMS 回應金鑰已啟用前,使用者仍無法存取加密的存放區資料。

反之,如果 Dataform 存放區受到金鑰保護,而該金鑰在 Dataform 首次無法與 Cloud KMS 通訊時遭到停用,則在重新連結 Cloud KMS 並重新啟用金鑰前,您將無法存取加密的存放區資料。

記錄

如果您已為專案中的 Cloud KMS API 啟用稽核記錄,就可以在 Cloud Logging 中稽核 Dataform 代您傳送至 Cloud KMS 的要求。這些 Cloud KMS 記錄項目會顯示在 Cloud Logging 中。詳情請參閱「查看記錄」。

事前準備

  • 決定您要在不同的專案或同一個專案中執行 Dataform 和 Cloud KMS。建議您使用不同的專案,以便更妥善地控管權限。如要瞭解 Google Cloud 專案 ID 和專案編號,請參閱「識別專案」一節。

  • 針對執行 Cloud KMS 的 Google Cloud 專案:

    1. 啟用 Cloud Key Management Service API
    2. 按照建立金鑰環和金鑰一文的指示建立金鑰環和金鑰。請在與 Dataform 存放區位置相符的位置建立金鑰環:
      • 存放區必須使用相符地區金鑰。舉例來說,asia-northeast3 區域中的存放區必須使用 asia-northeast3 區域金鑰環中的金鑰加以保護。
      • global 區域無法與 Dataform 搭配使用。
      如要進一步瞭解 Dataform 和 Cloud KMS 支援的位置,請參閱 Cloud 據點

啟用 CMEK

將 Cloud KMS CryptoKey 加密者/解密者 (roles/cloudkms.cryptoKeyEncrypterDecrypter) 角色授予預設 Dataform 服務帳戶後,Dataform 就能代表您存取金鑰。

預設 Dataform 服務帳戶 ID 的格式如下:

service-YOUR_PROJECT_NUMBER@gcp-sa-dataform.iam.gserviceaccount.com

如要將 CryptoKey 加密者/解密者角色授予預設 Dataform 服務帳戶,請按照下列步驟操作:

主控台

  1. 在 Google Cloud 控制台中開啟「Key Management」(金鑰管理) 頁面。

    開啟「金鑰管理」頁面

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

  3. 找出要新增角色的加密金鑰,然後勾選核取方塊。系統會開啟「Permissions」分頁。

  4. 按一下「新增成員」

  5. 輸入服務帳戶的電子郵件地址

    • 如果服務帳戶已在成員清單中,表示已獲指派角色。請按一下服務帳戶目前的角色下拉式清單。
  6. 依序點選「選取角色」下拉式清單 >「Cloud KMS」>「Cloud KMS CryptoKey Encrypter/Decrypter」角色。

  7. 按一下「儲存」,將角色套用至服務帳戶。

gcloud

您可以使用 Google Cloud CLI 指派角色:

gcloud kms keys add-iam-policy-binding \
    --project=KMS_PROJECT_ID \
    --member serviceAccount:SERVICE_ACCOUNT \
    --role roles/cloudkms.cryptoKeyEncrypterDecrypter \
    --location=KMS_KEY_LOCATION \
    --keyring=KMS_KEY_RING \
    KMS_KEY

更改下列內容:

  • KMS_PROJECT_ID:執行 Cloud KMS 的 Google Cloud專案 ID
  • SERVICE_ACCOUNT:預設 Dataform 服務帳戶的電子郵件地址
  • KMS_KEY_LOCATION:Cloud KMS 金鑰的位置名稱
  • KMS_KEY_RING:Cloud KMS 金鑰的金鑰環名稱
  • KMS_KEY:Cloud KMS 金鑰的金鑰名稱

套用 CMEK 機構政策

Dataform 已整合兩項組織政策限制,協助確保整個組織的 CMEK 使用情形:

  • constraints/gcp.restrictNonCmekServices 可用於要求 CMEK 保護措施。
  • constraints/gcp.restrictCmekCryptoKeyProjects 用於限制用於 CMEK 保護措施的 Cloud KMS 金鑰。

這項整合功能可讓您為貴機構的 Dataform 存放區指定下列加密法規遵循要求:

套用機構政策的注意事項

在套用任何 CMEK 組織政策之前,請先瞭解下列事項。

準備等待更新傳播

設定或更新機構政策後,新政策最多可能需要 15 分鐘才會生效。

考量現有資源

現有資源不受新建立的機構政策約束。舉例來說,機構政策不會追溯套用至現有存放區。即使沒有 CMEK,您仍可存取這些資源,且如果適用,仍會使用現有金鑰加密。

驗證設定機構政策所需的權限

您可能很難取得設定或更新機構政策的權限,以便進行測試。您必須獲授機構政策管理員角色,但只能在機構層級 (而非專案或資料夾層級) 授予。

雖然必須在機構層級授予角色,但仍可指定只套用於特定專案或資料夾的政策。

要求所有新 Dataform 存放區都使用 CMEK

您可以使用 constraints/gcp.restrictNonCmekServices 限制條件,要求使用 CMEK 保護機構內所有新的 Dataform 存放區。

如果設定這項機構政策,所有未指定 Cloud KMS 金鑰的資源建立要求都會失敗。

設定這項政策後,它只會套用至專案中的新存放區。任何未套用 Cloud KMS 金鑰的現有存放區仍會存在,且可正常存取。

主控台

  1. 在 Google Cloud 控制台中,前往「Organization policies」(機構政策) 頁面。

    前往「機構政策」

  2. 使用「Filter」搜尋下列限制條件:

    constraints/gcp.restrictNonCmekServices
    
  3. 在「Name」(名稱) 欄中,按一下「Restrict which services may create resources without CMEK」(限制哪些服務可以在沒有 CMEK 的情況下建立資源)

  4. 按一下 「管理政策」

  5. 在「Edit policy」(編輯政策) 頁面的「Policy source」(政策來源) 下方,選取「Override parent's policy」(覆寫父項政策)

  6. 在「規則」下方,點選「新增規則」

  7. 在「Policy values」清單中,選取「Custom」

  8. 在「政策類型」清單中,選取「拒絕」

  9. 在「自訂值」欄位中輸入以下內容:

    is:dataform.googleapis.com
    
  10. 依序點選「完成」和「設定政策」

gcloud

  1. 建立臨時檔案 /tmp/policy.yaml 來儲存政策:

      name: projects/PROJECT_ID/policies/gcp.restrictNonCmekServices
      spec:
        rules:
        - values:
            deniedValues:
            - is:dataform.googleapis.com

    PROJECT_ID 替換為您要套用這項限制的專案 ID。

  2. 請執行 org-policies set-policy 指令。

    gcloud org-policies set-policy /tmp/policy.yaml

如要確認政策是否已成功套用,您可以嘗試在專案中建立 Dataform 存放區。除非指定 Cloud KMS 金鑰,否則程序會失敗。

限制 Dataform 專案的 Cloud KMS 金鑰

您可以使用 constraints/gcp.restrictCmekCryptoKeyProjects 限制條件,限制可用於保護 Dataform 專案中存放區的 Cloud KMS 金鑰。

舉例來說,您可以指定類似以下的規則:「對於 projects/my-company-data-project 中的所有 Dataform 存放區,這個專案中使用的 Cloud KMS 金鑰必須來自 projects/my-company-central-keysprojects/team-specific-keys。」

主控台

  1. 在 Google Cloud 控制台中,前往「Organization policies」(機構政策) 頁面。

    前往「機構政策」

  2. 使用「Filter」搜尋下列限制條件:

    constraints/gcp.restrictCmekCryptoKeyProjects
    
  3. 在「Name」(名稱) 欄中,按一下「Restrict which projects may supply KMS CryptoKeys for CMEK」(限制哪些專案可提供 CMEK 的 KMS CryptoKey)

  4. 按一下 「管理政策」

  5. 在「Edit policy」(編輯政策) 頁面的「Policy source」(政策來源) 下方,選取「Override parent's policy」(覆寫父項政策)

  6. 在「規則」下方,點選「新增規則」

  7. 在「Policy values」清單中,選取「Custom」

  8. 在「政策類型」清單中,選取「允許」

  9. 在「自訂值」欄位中輸入以下內容:

    under:projects/KMS_PROJECT_ID
    

    KMS_PROJECT_ID 替換為您要使用的 Cloud KMS 金鑰所在專案的 ID。

    例如 under:projects/my-kms-project

  10. 依序點選「完成」和「設定政策」

gcloud

  1. 建立臨時檔案 /tmp/policy.yaml 來儲存政策:

      name: projects/PROJECT_ID/policies/gcp.restrictCmekCryptoKeyProjects
      spec:
        rules:
        - values:
            allowedValues:
            - under:projects/KMS_PROJECT_ID

    請將下列

    • PROJECT_ID:您要套用這項限制的專案 ID。
    • KMS_PROJECT_ID:您要使用的 Cloud KMS 金鑰所在專案的 ID。
  2. 請執行 org-policies set-policy 指令。

    gcloud org-policies set-policy /tmp/policy.yaml

如要確認政策已成功套用,您可以嘗試使用其他專案中的 Cloud KMS 金鑰建立 Dataform 存放區。這項程序將會失敗。

設定預設的 Dataform CMEK 金鑰

為 Google Cloud 專案設定預設 Dataform CMEK 金鑰,即可使用相同的 CMEK 金鑰加密多個存放區。詳情請參閱「使用 Dataform 存放區的預設鍵」一文。

如要設定或編輯預設的 CMEK 金鑰,請在下列要求中呼叫 Dataform API:

curl -X PATCH \
-H "Content-Type: application/json" \
-d '{"defaultKmsKeyName":"projects/PROJECT_ID/locations/PROJECT_LOCATION/keyRings/KMS_KEY_RING/cryptoKeys/KMS_KEY"}' \
https://dataform.googleapis.com/v1beta1/projects/PROJECT_ID/locations/PROJECT_LOCATION/config

更改下列內容:

  • KMS_KEY_RING:Cloud KMS 金鑰的金鑰環名稱。
  • KMS_KEY:Cloud KMS 金鑰名稱。
  • PROJECT_ID: Google Cloud 專案的 ID。
  • PROJECT_LOCATION: Google Cloud 專案的位置名稱。

移除預設的 Dataform CMEK 金鑰

如要從 Google Cloud 專案中移除預設的 Dataform CMEK 金鑰,請在以下要求中呼叫 Dataform API:

curl -X PATCH \
-H "Content-Type: application/json" \
-d '{"defaultKmsKeyName":""}' \
https://dataform.googleapis.com/v1beta1/projects/PROJECT_ID/locations/PROJECT_LOCATION/config

更改下列內容:

  • PROJECT_ID: Google Cloud 專案的 ID。
  • PROJECT_LOCATION:您想取消設定預設 CMEK 的 Google Cloud 專案位置名稱。

檢查是否已設定預設 Dataform CMEK 金鑰

如要檢查是否已為 Google Cloud 專案設定預設 Dataform CMEK 金鑰,請在以下要求中呼叫 Dataform API:

curl -X GET \
-H "Content-Type: application/json" \
https://dataform.googleapis.com/v1beta1/projects/PROJECT_ID/locations/PROJECT_LOCATION/config

更改下列內容:

  • PROJECT_ID: Google Cloud 專案的 ID。
  • PROJECT_LOCATION: Google Cloud 專案的位置名稱。

將 CMEK 套用至存放區

您可以在建立存放區時,將 CMEK 保護套用至 Dataform 存放區。

如要將 CMEK 加密機制套用至 Dataform 存放區,請在建立存放區時選取使用預設 Dataform CMEK 金鑰的加密機制,或指定專屬的 Cloud KMS 金鑰。如需操作說明,請參閱「建立存放區」。

建立資料表格存放區後,就無法變更其加密機制。

詳情請參閱「限制」。

後續步驟