根據預設, Google Cloud 系統會自動使用 Google 代管的加密金鑰,加密靜態資料。如果您在保護資料的金鑰方面有特定的法規遵循或監管要求,可以為 Cloud Healthcare API 資料集使用客戶管理的加密金鑰 (CMEK)。您可以在 Cloud Key Management Service (Cloud KMS) 中控制及管理金鑰,而不是由 Google 擁有及管理用來保護您資料的加密金鑰,並使用該金鑰加密 Cloud Healthcare API 資料集。
如要進一步瞭解 CMEK,包括啟用時機和原因,請參閱「客戶自行管理的加密金鑰 (CMEK)」。
事前準備
決定 Cloud Healthcare API 資料集和 Cloud KMS 要放在同一個 Google Cloud 專案還是不同專案。如需相關指引,請參閱「權責劃分」。
為方便說明,本文的範例將採用下列慣例:
PROJECT_ID
:Cloud Healthcare API 專案 IDKMS_PROJECT_ID
:執行 Cloud KMS 的專案 ID,可能與PROJECT_ID
相同
如要瞭解 Google Cloud 專案 ID 和專案編號,請參閱「識別專案」。
限制
- 您只能在建立 Cloud Healthcare API 資料集時使用 Cloud KMS 金鑰。您無法在現有的 Cloud Healthcare API 資料集上啟用、變更或停用 Cloud KMS 金鑰。
- CMEK 加密資料集僅支援 FHIR、DICOM 和 HL7v2 儲存庫。CMEK 保護機制適用於資料集中的 DICOM、FHIR 和 HL7v2 儲存庫及其資源。
- 您無法對 CMEK 加密資源去識別化。
CMEK 作業
建立、讀取、更新或刪除以 CMEK 加密的資源時,以及執行帳單或確保金鑰可用等作業時,系統會使用 Cloud KMS 金鑰。
外部金鑰注意事項
如要瞭解如何使用透過支援的外部金鑰管理合作夥伴系統代管的金鑰來保護Google Cloud中的資料,請參閱 Cloud External Key Manager。
如果您遺失在 Google Cloud外部管理的金鑰,Google 無法復原您的資料。
金鑰無法使用和資料遺失
如果資料集是以金鑰加密,且該金鑰無法使用,Cloud Healthcare API 會停用並最終刪除該資料集。有時,如果金鑰遭停用或損毀,或是因權限遭撤銷而無法存取,金鑰就會無法使用,但如果金鑰因任何原因無法使用,就會發生這種情況。金鑰的防護等級或是否為外部金鑰,都不會影響這項行為。外部金鑰也可能無法預測地無法使用。舉例來說,您的Google Cloud 資源和 EKM 之間可能會發生連線問題。
以下程序說明如何檢查金鑰可用性,以及如何停用及刪除資料集:
建立以 CMEK 加密的 Cloud Healthcare API 資料集後,Cloud Healthcare API 會每五分鐘檢查金鑰狀態,確保金鑰可用。如果金鑰無法使用,Cloud Healthcare API 最多會繼續支援資料集要求一小時。
如果一小時後,Cloud Healthcare API 仍無法連線至 Cloud KMS,Cloud Healthcare API 資料集就會停用,以做為保護措施。如要重新啟用 Cloud Healthcare API 資料集,請與支援代表聯絡。
停用後,您只能將
datasets.get
和datasets.delete
要求傳送至 Cloud Healthcare API 資料集。其他要求會因400 FAILED_PRECONDITION
錯誤而失敗。如果 Cloud Healthcare API 資料集無法使用超過 30 天,系統就會永久刪除該資料集。 資料集中的所有 DICOM、FHIR 和 HL7v2 儲存庫及其相關資料也會一併刪除。刪除後就無法復原。
建立金鑰
以下各節說明如何建立 Cloud KMS 金鑰環和金鑰。僅支援 Cloud KMS 對稱式加密金鑰。
支援的地點
Cloud KMS 金鑰可在 Cloud Healthcare API 位置中使用。 在與 Cloud Healthcare API 資料集區域或多區域相符的位置建立金鑰環。
所有多區域 Cloud Healthcare API 資料集都必須使用相符位置的多區域金鑰環。舉例來說,
us
地區中的 Cloud Healthcare API 資料集必須使用來自us
地區的金鑰環加以保護,eu
地區中的 Cloud Healthcare API 資料集則必須使用europe
地區的金鑰環加以保護。地區 Cloud Healthcare API 資料集必須使用相符的地區金鑰。舉例來說,
asia-northeast1
地區的 Cloud Healthcare API 資料集必須使用asia-northeast1
地區的金鑰環來保護。為 Cloud Healthcare API 資料集設定 CMEK 時,無法使用
global
區域。
詳情請參閱 Cloud Healthcare API 位置和 Cloud KMS 位置。
建立金鑰環和金鑰
在執行 Cloud KMS 的 Google Cloud 專案中完成下列步驟:
授予加密和解密權限
如要使用 Cloud KMS 金鑰保護 Cloud Healthcare API 資料,請將該金鑰的 CryptoKey 加密者/解密者 (roles/cloudkms.cryptoKeyEncrypterDecrypter
) 角色授予 Cloud Healthcare Service Agent 服務帳戶。如需操作說明,請參閱「資料集 CMEK 權限」。
將角色授予服務帳戶後,Cloud Healthcare API 就能加密及解密以 CMEK 加密的資源。應用程式讀取或寫入資料時,不需要指定鍵。Cloud Healthcare API 會處理加密作業。
如果要求者讀取或寫入使用 Cloud KMS 金鑰加密的物件,如同平常一樣存取物件即可。要求期間,服務代理程式會自動加密或解密要求的物件,前提是必須符合下列條件:
- 服務代理仍具備必要權限。
- 金鑰可用且已啟用。
建立經過 CMEK 加密的 Cloud Healthcare API 資料集
下列範例說明如何建立 CMEK 加密資料集。
建立資料集時,您必須指定 Cloud KMS 金鑰資源 ID。這個鍵區分大小寫,且採用下列格式:
projects/KMS_PROJECT_ID/locations/LOCATION/keyRings/KEY_RING/cryptoKeys/KEY_NAME
如要查看 Cloud KMS 金鑰資源 ID,請參閱「取得 Cloud KMS 資源 ID」。
控制台
前往 Google Cloud 控制台的「Browser」頁面。
按一下 add_box「建立資料集」。系統隨即會顯示「建立資料集」頁面。
在「名稱」欄位中,輸入資料集的 ID,並遵守資料集允許的字元和大小限制。
選取下列其中一種地點類型:
區域。資料集會永久存放在一個 Google Cloud 區域中。 選取這個選項後,請在「區域」欄位中輸入或選取位置。
多區域。資料集會永久存放在跨越多個 Google Cloud 區域的位置。選取這個選項後,請在「多區域」欄位中輸入或選取多區域位置。
在「Encryption」(加密) 區段中,選取下列其中一種加密類型:
Google-managed encryption key:預設加密方法。 如果您希望 Google 管理加密金鑰,保護這個 Cloud Healthcare API 資料集中的資料,請使用這個方法。
Cloud KMS 金鑰:使用客戶自行管理的加密金鑰 (CMEK)。
按一下「建立」,系統隨即會顯示「瀏覽器」頁面。新的資料集會顯示在資料集清單中。
gcloud
使用 gcloud healthcare datasets create
指令建立資料集。
使用下方的任何指令資料之前,請先替換以下項目:
DATASET_ID
:受資料集允許的字元和大小限制約束的 IDLOCATION
:資料集的支援位置KEY_RESOURCE_ID
:Cloud KMS 金鑰的資源 ID,格式為projects/KMS_PROJECT_ID/locations/LOCATION/keyRings/KEY_RING/cryptoKeys/KEY_NAME
執行下列指令:
Linux、macOS 或 Cloud Shell
gcloud healthcare datasets create DATASET_ID \ --location=LOCATION \ --encryption-key=KEY_RESOURCE_ID
Windows (PowerShell)
gcloud healthcare datasets create DATASET_ID ` --location=LOCATION ` --encryption-key=KEY_RESOURCE_ID
Windows (cmd.exe)
gcloud healthcare datasets create DATASET_ID ^ --location=LOCATION ^ --encryption-key=KEY_RESOURCE_ID
您應該會收到類似以下的回應:
Create request issued for: [DATASET_ID] Waiting for operation [projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/operations/OPERATION_ID] to complete... Created dataset [DATASET_ID].
REST
使用
datasets.create
方法建立資料集。使用任何要求資料之前,請先替換以下項目:
PROJECT_ID
:您的 Google Cloud 專案 IDDATASET_ID
:受資料集允許的字元和大小限制約束的 IDLOCATION
:資料集的支援位置KEY_RESOURCE_ID
:Cloud KMS 金鑰的資源 ID,格式為projects/KMS_PROJECT_ID/locations/LOCATION/keyRings/KEY_RING/cryptoKeys/KEY_NAME
JSON 要求主體:
{ "encryptionSpec": { "kmsKeyName": "KEY_RESOURCE_ID" } }
如要傳送要求,請選擇以下其中一個選項:
curl
將要求主體儲存在名為
request.json
的檔案中。 在終端機中執行下列指令,在目前目錄中建立或覆寫這個檔案:cat > request.json << 'EOF' { "encryptionSpec": { "kmsKeyName": "KEY_RESOURCE_ID" } } EOF
接著,請執行下列指令來傳送 REST 要求:
curl -X POST \
-H "Authorization: Bearer $(gcloud auth print-access-token)" \
-H "Content-Type: application/json; charset=utf-8" \
-d @request.json \
"https://healthcare.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION/datasets?datasetId=DATASET_ID"PowerShell
將要求主體儲存在名為
request.json
的檔案中。 在終端機中執行下列指令,在目前目錄中建立或覆寫這個檔案:@' { "encryptionSpec": { "kmsKeyName": "KEY_RESOURCE_ID" } } '@ | Out-File -FilePath request.json -Encoding utf8
接著,請執行下列指令來傳送 REST 要求:
$cred = gcloud auth print-access-token
$headers = @{ "Authorization" = "Bearer $cred" }
Invoke-WebRequest `
-Method POST `
-Headers $headers `
-ContentType: "application/json; charset=utf-8" `
-InFile request.json `
-Uri "https://healthcare.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION/datasets?datasetId=DATASET_ID" | Select-Object -Expand ContentAPIs Explorer
複製要求內文並開啟方法參考資料頁面。系統會在頁面右側開啟 APIs Explorer 面板。您可以使用這項工具來傳送要求。將要求內文貼到這項工具中,並填妥其他必填欄位,然後按一下「Execute」(執行)。
OPERATION_ID
的值。您會在下一個步驟中用到這個值。使用
projects.locations.datasets.operations.get
方法取得長時間執行的作業狀態。使用任何要求資料之前,請先替換以下項目:
PROJECT_ID
:您的 Google Cloud 專案 IDLOCATION
:資料集位置DATASET_ID
:資料集 IDOPERATION_ID
:長時間執行的作業傳回的 ID
如要傳送要求,請選擇以下其中一個選項:
curl
執行下列指令:
curl -X GET \
-H "Authorization: Bearer $(gcloud auth print-access-token)" \
"https://healthcare.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/operations/OPERATION_ID"PowerShell
執行下列指令:
$cred = gcloud auth print-access-token
$headers = @{ "Authorization" = "Bearer $cred" }
Invoke-WebRequest `
-Method GET `
-Headers $headers `
-Uri "https://healthcare.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/operations/OPERATION_ID" | Select-Object -Expand ContentAPIs Explorer
開啟方法參考頁面。系統會在頁面右側開啟 APIs Explorer 面板。您可以使用這項工具來傳送要求。完成任何必填欄位,然後按一下「執行」。
"done": true
,表示長時間執行的作業已完成。
判斷資料集是否受 Cloud KMS 保護
針對您建立的每個金鑰,或是用來保護 Cloud Healthcare API 資料集的金鑰,您都可以透過金鑰使用情形追蹤功能,查看該金鑰保護的資源。詳情請參閱「查看金鑰用量」。
金鑰輪替
Cloud KMS 支援自動和手動金鑰輪替至新版本。
輪替金鑰會導致下列情況:
- 輪替後建立的 Cloud Healthcare API 資料集會使用新金鑰版本進行加密和所有作業。
- 使用金鑰加密的現有資料集資源,不會自動以新的主要金鑰版本重新加密。
如要加密,所有金鑰版本都必須可用。 否則 Cloud Healthcare API 資料集會遭到停用,且所有對資料集的請求都會失敗。詳情請參閱「外部鍵注意事項」和「已停用的資料集和永久刪除資料集」。
移除 Cloud Healthcare API 對 Cloud KMS 金鑰的存取權
您可以控管金鑰,並停用、刪除或撤銷金鑰的權限,讓 Cloud Healthcare API 無法存取以 CMEK 加密的資料。銷毀與 Cloud Healthcare API 資料集相關聯的金鑰或金鑰版本後,以該金鑰或金鑰版本加密的所有資料都會永久遺失。
停用金鑰或金鑰版本後,會有延遲時間,之後就無法再使用。此外,您撤銷金鑰的 Cloud Healthcare 服務代理人服務帳戶權限後,該帳戶仍可存取金鑰一段時間。詳情請參閱 Cloud KMS 資源一致性。
將資料匯出及匯入至已啟用 CMEK 的執行個體
如要在匯出作業期間,使用客戶自行管理的金鑰加密資料,您必須在開始匯出前,在儲存空間目的地設定 CMEK。從非 CMEK 或 CMEK 加密儲存空間匯入資料時,匯入 CMEK 加密資料集沒有特殊規定或限制。
限制
- 系統不支援搭配 Cloud External Key Manager 使用金鑰存取依據。
- 每個專案在 30 天內最多只能有 10 個 CMEK 資料集。這項配額是由
cmek_datasets
配額指標強制執行。 - 不支援搭配 CMEK 使用 VPC Service Controls。
- 不支援 CMEK 組織政策。
定價
無論資料集是否經過 CMEK 加密,計費方式都相同。詳情請參閱 Cloud Healthcare API 定價。
Cloud KMS 會向您收取金鑰費用,以及對該金鑰執行的任何加密編譯作業費用。當 Cloud Healthcare API 使用金鑰進行加密或解密時,就會發生這些作業。根據 Cloud Healthcare API 產生的預期加密作業次數,這些費用應該會很低。詳情請參閱 Cloud KMS 定價。
Cloud KMS 配額和 Cloud Healthcare API
在 Cloud Healthcare API 中使用 CMEK 時,專案可能會耗用 Cloud KMS 密碼編譯要求配額。採用 CMEK 加密的 Cloud Healthcare API 資料集及其 DICOM、FHIR 和 HL7v2 儲存庫,除了 datasets.get
以外的所有作業都會消耗這些配額。使用 CMEK 金鑰進行加密和解密作業時,只有在您使用硬體 (Cloud HSM) 或外部 (Cloud EKM) 金鑰時,才會影響 Cloud KMS 配額。詳情請參閱「Cloud KMS 配額」。
後續步驟
- 如要進一步瞭解 CMEK,包括啟用時機和原因,請參閱「客戶自行管理的加密金鑰 (CMEK)」。