本指南說明如何為 Dataform 使用 CMEK,並逐步介紹如何啟用 Dataform 存放區的 CMEK 加密功能。
根據預設,Dataform 會加密靜態儲存的客戶內容。Dataform 會為您處理加密作業,您不必採取任何其他動作。這項做法稱為「Google 預設加密」。
如要控管加密金鑰,您可以在 Cloud KMS 中使用客戶自行管理的加密金鑰 (CMEK),並搭配 Dataform 等整合 CMEK 的服務。使用 Cloud KMS 金鑰可控管保護等級、位置、輪換時間表、使用權限和存取權,以及加密範圍。 使用 Cloud KMS 還能追蹤金鑰用量、查看稽核記錄,以及控管金鑰生命週期。 您可以在 Cloud KMS 中控制及管理用來保護資料的對稱金鑰加密金鑰 (KEK),而不是由 Google 擁有及管理這些金鑰。
使用 CMEK 設定資源後,存取 Dataform 資源的體驗與使用 Google 預設加密機制類似。如要進一步瞭解加密選項,請參閱客戶管理的加密金鑰 (CMEK)。
存放區資料的 CMEK 加密
將 CMEK 加密套用至 Dataform 存放區後,該存放區中所有由 Dataform 管理的客戶資料都會使用為存放區設定的 CMEK 保護金鑰進行靜態加密。這類資料包括:
- Dataform 存放區及其工作區的 Git 存放區內容
- 已編譯的 SQL 查詢和編譯錯誤
- 工作流程動作的已儲存 SQL 查詢
- 已執行的工作流程動作錯誤詳細資料
Dataform 會在下列情況使用 CMEK 保護金鑰:
- 在每次需要解密靜態儲存客戶資料的作業期間。這些作業包括但不限於:
- 使用者查詢的回覆,例如
compilationResults.query
。 - 建立需要先前建立的加密存放區資料的 Dataform 資源,例如工作流程叫用。
- 更新遠端存放區的 Git 作業,例如推送 Git 修訂版本。
- 使用者查詢的回覆,例如
- 在每次需要儲存靜態客戶資料的作業期間。這些作業包括但不限於:
- 使用者查詢的回覆,例如
compilationResults.create
。 - 對工作區執行 Git 作業,例如提取 Git 修訂版本。
- 使用者查詢的回覆,例如
Dataform 只會管理與 Dataform 資源相關聯的客戶資料加密作業。透過執行 Dataform 工作流程在 BigQuery 中建立的客戶資料,Dataform 不會管理這類資料的加密作業。如要加密在 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
您可以在 Dataform 中使用 Cloud HSM 和 Cloud EKM 金鑰。在 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 金鑰。您必須指定 Google Cloud 專案的位置,做為預設 Dataform CMEK 金鑰。每個 Google Cloud 專案只能設定一個預設 CMEK 金鑰。
設定預設 Dataform CMEK 金鑰後,Dataform 會預設將金鑰套用至 Google Cloud 專案位置中建立的所有新存放區。建立存放區時,您可以使用預設金鑰,也可以選取其他 CMEK 金鑰。
如何處理無法使用的金鑰狀態
在罕見情況下 (例如 Cloud KMS 無法使用時),Dataform 可能無法從 Cloud KMS 擷取金鑰狀態。
如果 Dataform 無法與 Cloud KMS 通訊,且您的 Dataform 存放區受到當時啟用的金鑰保護,加密的存放區資料就會無法存取。
在 Dataform 重新連線至 Cloud KMS,且 Cloud KMS 回應金鑰處於啟用狀態前,加密的存放區資料仍無法存取。
反之,如果 Dataform 存放區受金鑰保護,而 Dataform 首次無法與 Cloud KMS 通訊時,該金鑰已停用,則加密的存放區資料會保持無法存取狀態,直到 Dataform 重新連上 Cloud KMS,且您重新啟用金鑰為止。
記錄
如果您已在專案中啟用稽核記錄,即可在 Cloud Logging 中稽核 Dataform 代表您傳送至 Cloud KMS 的要求。這些 Cloud KMS 記錄項目會顯示在 Cloud Logging 中。詳情請參閱「查看記錄」。
事前準備
決定您要在不同的專案還是同一個專案中執行 Dataform 和 Cloud KMS。建議您使用不同的專案,以便更精細地控管權限。如要瞭解 Google Cloud 專案 ID 和專案編號,請參閱「識別專案」。
針對執行 Cloud KMS 的 Google Cloud 專案:
- 啟用 Cloud Key Management Service API。
- 按照建立金鑰環和金鑰一文的指示建立金鑰環和金鑰。請在與您 Dataform 存放區位置相符的位置建立金鑰環:
-
存放區必須使用相符的地區金鑰。舉例來說,
asia-northeast3
地區中的存放區必須使用asia-northeast3
地區金鑰環的金鑰加以保護。 -
global
區域無法與 Dataform 搭配使用。
-
存放區必須使用相符的地區金鑰。舉例來說,
啟用 CMEK
將 Cloud KMS CryptoKey Encrypter/Decrypter (roles/cloudkms.cryptoKeyEncrypterDecrypter
) 角色授予預設 Dataform 服務帳戶後,Dataform 就能代表您存取金鑰。
預設 Dataform 服務帳戶 ID 的格式如下:
service-YOUR_PROJECT_NUMBER@gcp-sa-dataform.iam.gserviceaccount.com
如要將 CryptoKey Encrypter/Decrypter 角色授予預設 Dataform 服務帳戶,請按照下列步驟操作:
主控台
在 Google Cloud 控制台中開啟「Key Management」(金鑰管理) 頁面。
按一下包含金鑰的金鑰環名稱。
按一下要新增角色的加密金鑰核取方塊。系統會開啟「權限」分頁。
按一下「新增成員」。
輸入服務帳戶的電子郵件地址
- 如果服務帳戶已在成員清單中,表示已獲指派角色。請按一下服務帳戶目前的角色下拉式清單。
依序按一下「選取角色」下拉式清單 >「Cloud KMS」>「Cloud KMS 加密編譯金鑰加密者/解密者」角色。
按一下「儲存」,將角色套用至服務帳戶。
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 的專案 ID Google CloudSERVICE_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 分鐘才會生效。
考量現有資源
現有資源不受新建立的機構政策影響。 舉例來說,機構政策不會追溯套用至現有存放區。您仍可存取這些資源,且如果適用,系統仍會使用現有金鑰加密。
確認設定機構政策的必要權限
您可能難以取得設定或更新機構政策的權限,以進行測試。您必須獲授予機構政策管理員角色,這個角色只能在機構層級授予 (而非專案或資料夾層級)。
雖然必須在機構層級授予角色,但仍可指定僅適用於特定專案或資料夾的政策。
為所有新的 Dataform 存放區要求使用 CMEK
您可以使用 constraints/gcp.restrictNonCmekServices
限制,要求使用 CMEK 保護機構中的所有新 Dataform 存放區。
如果設定這項機構政策,所有未指定 Cloud KMS 金鑰的資源建立要求都會失敗。
設定這項政策後,只會套用至專案中的新存放區。如果現有存放區未套用 Cloud KMS 金鑰,仍可繼續存在並正常存取。
主控台
前往 Google Cloud 控制台的「Organization policies」(組織政策) 頁面。
使用「篩選器」搜尋下列限制:
constraints/gcp.restrictNonCmekServices
在「名稱」欄中,按一下「限制哪些服務可以在沒有 CMEK 的情況下建立資源」。
按一下「管理政策」圖示
。在「編輯政策」頁面的「政策來源」下方,選取「覆寫父項政策」。
在「規則」下方,按一下「新增規則」。
在「政策值」清單中,選取「自訂」。
在「政策類型」清單中,選取「拒絕」。
在「自訂值」欄位中輸入下列內容:
is:dataform.googleapis.com
依序按一下「完成」和「設定政策」。
gcloud
建立暫存檔案
/tmp/policy.yaml
來儲存政策:name: projects/PROJECT_ID/policies/gcp.restrictNonCmekServices spec: rules: - values: deniedValues: - is:dataform.googleapis.com
將
PROJECT_ID
替換為要套用這項限制的專案 ID。請執行
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-keys
或 projects/team-specific-keys
。」
主控台
前往 Google Cloud 控制台的「Organization policies」(組織政策) 頁面。
使用「篩選器」搜尋下列限制:
constraints/gcp.restrictCmekCryptoKeyProjects
在「名稱」欄中,按一下「限制哪些專案可提供 CMEK 的 KMS CryptoKey」。
按一下「管理政策」圖示
。在「編輯政策」頁面的「政策來源」下方,選取「覆寫父項政策」。
在「規則」下方,按一下「新增規則」。
在「政策值」清單中,選取「自訂」。
在「政策類型」清單中,選取「允許」。
在「自訂值」欄位中輸入下列內容:
under:projects/KMS_PROJECT_ID
將
KMS_PROJECT_ID
替換為您要使用的 Cloud KMS 金鑰所在專案的 ID。例如
under:projects/my-kms-project
。依序按一下「完成」和「設定政策」。
gcloud
建立暫存檔案
/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。
請執行
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 金鑰
如要檢查專案是否已設定預設 Dataform CMEK 金鑰,請在下列要求中呼叫 Dataform API: Google Cloud
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 套用至存放區
您可以在建立存放區時,對 Dataform 存放區套用 CMEK 保護。
如要將 CMEK 加密套用至 Dataform 存放區,請選取使用預設 Dataform CMEK 金鑰加密,或在建立存放區時指定專屬的 Cloud KMS 金鑰。如需操作說明,請參閱「建立存放區」。
建立 Dataform 存放區後,就無法變更存放區的加密機制。
詳情請參閱「限制」一節。
後續步驟
- 如要進一步瞭解 CMEK,請參閱 CMEK 總覽。
- 如要進一步瞭解 Cloud KMS 配額,請參閱「Cloud KMS 配額」。
- 如要進一步瞭解 Cloud KMS 定價,請參閱「Cloud KMS 定價」。
- 如要進一步瞭解 Dataform 存放區,請參閱「建立存放區」。