本頁說明如何執行與 Cloud Firestore 的客戶自行管理的加密金鑰 (CMEK) 相關工作。如要進一步瞭解 CMEK,包括啟用時機和原因,請參閱 Cloud KMS 說明文件。
準備好您的 CMEK 金鑰
如要建立受 CMEK 保護的 Cloud Firestore 資料庫,請先完成下列步驟:
對於每個將包含 CMEK 保護的 Cloud Firestore 資料庫的項目,請完成下列步驟。如果之後建立新的 CMEK 金鑰,請務必為該金鑰設定 IAM 設定。
要求存取權
建立 Cloud Firestore 服務代理程式前,請先填寫這份表單,申請 CMEK 功能的存取權。
建立一個 Cloud Firestore 服務代理
建立 CMEK 金鑰前,您必須擁有Cloud Firestore 服務代理程式,這是 Google 代管的服務帳戶類型,Cloud Firestore用於存取金鑰。
執行 services identity create 指令,建立服務代理程式,代表您存取 CMEK 金鑰。Cloud Firestore如果服務帳戶尚不存在,這項指令會加以建立,然後顯示該帳戶。
gcloud beta services identity create \
--service=firestore.googleapis.com \
--project FIRESTORE_PROJECT
將 FIRESTORE_PROJECT 替換為您打算用於 Cloud Firestore 資料庫的專案。
該指令會顯示服務代理 ID,格式類似電子郵件地址。記錄輸出的電子郵件字串,因為您將在後續步驟中使用它。
Service identity created: service-xxx@gcp-sa-firestore.iam.gserviceaccount.com
建立金鑰
您可以使用直接在 Cloud KMS 中建立的金鑰,也可以使用透過 Cloud External Key Manager 提供的外部管理金鑰。
Cloud KMS 金鑰位置必須與要搭配使用的 Cloud Firestore 資料庫位置相同。
如果是區域資料庫位置,請為金鑰環、金鑰和資料庫使用相同的位置名稱,因為位置名稱具有一對一的對應關係。
舉例來說,如要在
us-west1中建立受 CMEK 保護的資料庫,請在us-west1中建立金鑰環和金鑰。對於 多區域資料庫位置,使用 KMS 多區域位置 的位置名稱:
- 使用 Cloud KMS
us多重區域位置作為 Cloud Firestorenam5多區域位置。 - 使用 Cloud KMS
europe多重區域位置作為 Cloud Firestoreeur3多區域位置。
- 使用 Cloud KMS
在要管理金鑰的 Google Cloud 專案中,完成下列步驟:
您可以選擇以下任何一種方式製作鑰匙圈和鑰匙:
- 直接在 Cloud KMS 中建立金鑰環和金鑰。
- 使用外部代管金鑰。建立外部金鑰,然後建立雲 EKM 金鑰,使金鑰可透過雲 KMS 使用。
設定金鑰的 IAM 設定
主控台
如要將 Cloud KMS 角色授予服務代理,請按照下列步驟操作。如要降低精細度,您也可以在金鑰或金鑰環層級授予權限。
前往 Google Cloud 控制台的「IAM」(身分與存取權管理) 頁面。
按一下 [新增]。
請輸入您的Cloud Firestore服務代理的電子郵件格式 ID。
選擇 雲端 KMS 加密金鑰加密器/解密器 角色。
按一下 [儲存]。
gcloud
將 cloudkms.cryptoKeyEncrypterDecrypter 角色授予服務代理:
gcloud kms keys add-iam-policy-binding KMS_KEY \
--keyring KMS_KEYRING\
--location KMS_LOCATION \
--member serviceAccount:SERVICE_AGENT_EMAIL \
--role roles/cloudkms.cryptoKeyEncrypterDecrypter \
--project KMS_PROJECT
請替換下列項目:
KMS_KEY,其中是您指派給金鑰的名稱KMS_KEYRING替換為包含金鑰的 KMS 金鑰環- 將
KMS_LOCATION替換為包含金鑰環的地區 SERVICE_AGENT_EMAIL,並以電子郵件格式的 ID 指定要授予存取權的服務代理KMS_PROJECT,其中包含金鑰
終端機應顯示類似如下的響應:
Updated IAM policy for key KMS_KEY.
bindings:
- members:
- serviceAccount:
service-{project-number}@gcp-sa-firestore.iam.gserviceaccount.com
role: roles/cloudkms.cryptoKeyEncrypterDecrypter
建立支援 CMEK 的資料庫
建立及設定 CMEK 金鑰後,即可建立受 CMEK 保護的資料庫。受 Google 預設加密保護的現有 Cloud Firestore 資料庫無法轉換為使用 CMEK。
只有在建立啟用 CMEK 的資料庫時,才能選擇加密類型和金鑰。
主控台
前往 Google Cloud 控制台的「資料庫」頁面。
按一下 [Create Database] (建立資料庫)。
選取資料庫模式。按一下「繼續」。
在配置您的資料庫頁面,輸入資料庫 ID。
選取位置。
按一下 顯示加密選項,然後選擇 雲端 KMS 金鑰。
選取或輸入要用於資料庫的 CMEK 金鑰資源名稱。
金鑰清單僅限於您選取的目前 Google Cloud 專案和資料庫位置。如要使用其他Google Cloud專案的金鑰,請按一下「切換專案」或「手動輸入金鑰」。
如果系統提示您授予 Cloud Firestore 服務帳戶金鑰權限,請按一下 授予。若要建立 CMEK 資料庫,您的 Cloud Firestore 服務帳戶必須被授予
cloudkms.cryptoKeyEncrypterDecrypter角色。為行動和網路用戶端選取安全性規則。
按一下 [Create Database] (建立資料庫)。
建立資料庫後,您可以查看「資料庫詳細資料」,確認資料庫是否已啟用 CMEK:
- 如果您的資料庫受 CMEK 保護,則 加密類型 欄位顯示為 客戶管理,而 加密金鑰 欄位列出對應的雲端 KMS 和用於保護此資料庫的金鑰版本。
- 如果您的資料庫未受 CMEK 保護,則 加密類型 欄位顯示為 Google 管理的。
gcloud
在使用 Google Cloud CLI 建立啟用 CMEK 的資料庫之前,請安裝最新版本並授權 gcloud CLI。有關更多信息,請參閱安裝 gcloud CLI。
gcloud firestore databases create --location=FIRESTORE_DATABASE_LOCATION \
--database=DATABASE_ID \
--kms-key-name=KMS_KEY_NAME \
--project=FIRESTORE_PROJECT
請替換下列項目:
FIRESTORE_DATABASE_LOCATION,另有 Cloud Firestore 個獨立稅率地區DATABASE_ID帶有資料庫 IDKMS_KEY_NAME,使用您為金鑰指定的名稱。請使用金鑰的完整資源名稱,格式如下:projects/KMS_PROJECT/locations/KMS_LOCATION/keyRings/KMS_KEYRING_ID/cryptoKeys/KMS_KEY_IDFIRESTORE_PROJECT,以便用於專案的 Cloud Firestore 資料庫
REST API
HTTP 要求:
POST https://firestore.googleapis.com/v1/projects/{FIRESTORE_PROJECT}/databases
在要求主體中,於 cmek_config.kms_key_name 欄位設定 CMEK。
設為 Cloud KMS 金鑰的完整資源 ID。只能使用與這個資料庫位於相同位置的金鑰。
這個值應為 Cloud KMS 金鑰資源 ID,格式為 projects/{KMS_PROJECT}/locations/{KMS_LOCATION}/keyRings/{KMS_KEYRING_ID}/cryptoKeys/{KMS_KEY_ID}
如要進一步瞭解其他欄位,請參閱 database create 頁面。
要求範例:
curl -X POST 'https://firestore.googleapis.com/v1/projects/FIRESTORE_PROJECT/databases?databaseId={DATABASE_ID}' \
-H "Authorization: Bearer $(gcloud auth print-access-token)" \
-H "Content-type: application/json" \
-d '{
"type":"FIRESTORE_NATIVE",
"locationId":"{FIRESTORE_DATABASE_LOCATION}",
"cmekConfig": {
"kmsKeyName":"projects/KMS_PROJECT/locations/KMS_LOCATION/keyRings/KMS_KEYRING_ID/cryptoKeys/KMS_KEY_ID"
}
}'
Firebase CLI
如要建立啟用 CMEK 的資料庫,請使用「KMS 金鑰名稱」欄位。如果您不指定 --kms-key-name 參數,則 Cloud Firestore 預設會建立一個非 CMEK 資料庫。
firebase firestore:databases:create DATABASE_ID
--location LOCATION
--kms-key-name projects/KMS_PROJECT/locations/KMS_LOCATION/keyRings/KMS_KEYRING_ID/cryptoKeys/KMS_KEY_ID
--project FIRESTORE_PROJECT
請替換下列項目:
- 將
DATABASE_ID替換為資料庫的 ID LOCATION以及您的資料庫位置KMS_PROJECT,其中包含您的 CMEK 金鑰KMS_LOCATION替換為包含 CMEK 金鑰和金鑰環的位置- 將
KMS_KEYRING_ID替換為 CMEK 金鑰環的 ID FIRESTORE_PROJECT以及用於您的 Cloud Firestore 資料庫的項目
請確認您的 Cloud Firestore 資料庫已使用 Firebase CLI 進行保護:
firebase firestore:databases:get DATABASE_ID --project FIRESTORE_PROJECT
回應訊息中會顯示下列 CMEK 資訊:
Terraform
如要建立啟用 CMEK 的資料庫,請使用 google_firestore_database
資源。如需更多資訊和範例,請參閱google_firestore_database。
resource "google_firestore_database" "database" {
project = "FIRESTORE_PROJECT"
name = "DATABASE_ID"
location_id = "FIRESTORE_DATABASE_LOCATION"
type = "DATABASE_TYPE"
cmek_config {
kms_key_name = "KMS_KEY_NAME"
}
}
請替換下列項目:
FIRESTORE_PROJECT以及用於您的 Cloud Firestore 資料庫的項目DATABASE_ID,並提供資料庫的 IDFIRESTORE_DATABASE_LOCATION與資料庫的 Cloud Firestore 位置DATABASE_TYPE,其中FIRESTORE_NATIVE代表原生模式,DATASTORE_MODE則代表 Datastore 模式。KMS_KEY_NAME改成您指派給金鑰的名稱。請使用完整的資源名稱作為鍵,格式如下:projects/KMS_PROJECT/locations/KMS_LOCATION/keyRings/KMS_KEYRING_ID/cryptoKeys/KMS_KEY_ID
存取受 CMEK 保護的資料庫
發送到受 CMEK 保護的資料庫的所有讀取、寫入和查詢操作都應該與 Google 預設加密資料庫的功能相同。 例如,您無需為每個請求提供金鑰。
恢復受 CMEK 保護的資料庫
從備份還原受 CMEK 保護的資料庫前,請注意下列事項:
- 決定要將資料庫還原為 CMEK 加密、Google 的預設加密 (非 CMEK),還是與備份相同的加密方式。
準備好用於加密備份的金鑰 (主要版本) 和金鑰版本。啟用密鑰及其版本。
gcloud
將受 CMEK 保護的資料庫還原為 CMEK 加密狀態
若要還原到 CMEK 加密,請執行 gcloud firestore databases restore 指令,並使用可選的 encryption-type 和 kms-key-name 標誌來設定還原資料庫的加密類型。如果您不指定加密類型,則還原的資料庫將使用與備份相同的加密配置。
gcloud firestore databases restore
--encryption-type=customer-managed-encryption
--kms-key-name=KMS_KEY_NAME
將 KMS_KEY_NAME 替換為您指派給金鑰的名稱。請使用金鑰的完整資源名稱,格式如下:
projects/KMS_PROJECT/locations/KMS_LOCATION/keyRings/KMS_KEYRING_ID/cryptoKeys/KMS_KEY_ID
將受 CMEK 保護的資料庫還原為預設加密。
若要恢復到 Google 的預設加密(非 CMEK),請以下列方式設定 encryption-type 標誌:
gcloud firestore databases restore
--encryption-type=google-default-encryption
將受 CMEK 保護的資料庫還原為與備份相同的加密類型
若要還原至與備份相同的加密類型,請以下列方式設定 encryption-type 標誌:
gcloud firestore databases restore --encryption-type=use-source-encryption
Firebase CLI
將受 CMEK 保護的資料庫還原為 CMEK 加密狀態
如要還原為 CMEK 加密,請使用選用的 encryption-type 和 kms-key-name 旗標。如未指定加密類型,還原的資料庫會使用與備份相同的加密設定。
firebase firestore:databases:restore \
--database DATABASE_ID \
--backup 'projects/FIRESTORE_PROJECT/locations/FIRESTORE_LOCATION/backups/BACKUP_ID' \
--encryption-type CUSTOMER_MANAGED_ENCRYPTION \
--kms-key-name projects/KMS_PROJECT/locations/KMS_LOCATION/keyRings/KMS_KEYRING_ID/cryptoKeys/KMS_KEY_ID \
--project FIRESTORE_PROJECT
請替換下列項目:
- 將
DATABASE_ID替換為資料庫的 ID FIRESTORE_PROJECT,以便用於專案的 Cloud Firestore 資料庫FIRESTORE_LOCATION以及您的 Cloud Firestore 資料庫的位置BACKUP_ID以及您的備份 IDKMS_PROJECT,其中包含您的 CMEK 金鑰KMS_LOCATION替換為包含 CMEK 金鑰和金鑰環的位置- 將
KMS_KEYRING_ID替換為 CMEK 金鑰環的 ID
確認還原的 Cloud Firestore 資料庫已採用 CMEK 加密:
firebase firestore:databases:get DATABASE_ID --project FIRESTORE_PROJECT
將受 CMEK 保護的資料庫還原為預設加密
如要還原為 Google 預設加密機制 (非 CMEK),請依下列方式設定 encryption-type 旗標:
firebase firestore:databases:restore \
--database DATABASE_ID \
--backup 'projects/FIRESTORE_PROJECT/locations/FIRESTORE_LOCATION/backups/BACKUP_ID' \
--encryption-type GOOGLE_DEFAULT_ENCRYPTION \
--project FIRESTORE_PROJECT
請替換下列項目:
- 將
DATABASE_ID替換為資料庫的 ID FIRESTORE_PROJECT,以便用於專案的 Cloud Firestore 資料庫FIRESTORE_LOCATION以及您的 Cloud Firestore 資料庫的位置- 將
BACKUP_ID替換為備份 ID
將受 CMEK 保護的資料庫還原為與備份相同的加密類型
如要還原為與備份相同的加密類型,請按照下列方式設定 encryption-type 標記:
firebase firestore:databases:restore \
--database DATABASE_IDD \
--backup 'projects/FIRESTORE_PROJECT/locations/FIRESTORE_LOCATION/backups/BACKUP_ID' \
--encryption-type USE_SOURCE_ENCRYPTION
請替換以下內容:
- 將
DATABASE_ID替換為資料庫的 ID FIRESTORE_PROJECT,以便用於專案的 Cloud Firestore 資料庫FIRESTORE_LOCATION以及您的 Cloud Firestore 資料庫的位置- 將
BACKUP_ID替換為備份 ID
複製受 CMEK 保護的資料庫
複製受 CMEK 保護的資料庫前,請注意下列事項:
- 決定是否要將資料庫複製為 CMEK 加密、Google 的預設加密(非 CMEK)或與來源資料庫相同的加密方式。
準備金鑰 (主要版本) 和用於加密來源資料庫的金鑰版本。啟用金鑰和金鑰版本。
gcloud
將受 CMEK 保護的資料庫複製到 CMEK 加密
若要複製到 CMEK 加密,請執行 gcloud firestore databases clone 指令,並使用可選的 encryption-type 和 kms-key-name 標誌來設定複製資料庫的加密類型。如未指定加密類型,複製的資料庫會採用與來源資料庫相同的加密設定。
gcloud firestore databases clone \
--encryption-type=customer-managed-encryption \
--kms-key-name=KMS_KEY_NAME
將 KMS_KEY_NAME 替換為您為該金鑰指定的名稱。請使用以下格式的完整資源名稱作為按鍵:
projects/KMS_PROJECT/locations/KMS_LOCATION/keyRings/KMS_KEYRING_ID/cryptoKeys/KMS_KEY_ID
將受 CMEK 保護的資料庫複製到預設加密
如要複製到 Google 的預設加密機制 (非 CMEK),請依下列方式設定 encryption-type 旗標:
gcloud firestore databases clone \
--encryption-type=google-default-encryption
將受 CMEK 保護的資料庫複製到與來源資料庫相同的加密類型。
如要複製到與來源資料庫相同的加密類型,請依下列方式設定 encryption-type 標記:
gcloud firestore databases clone \
--encryption-type=use-source-encryption
如果未指定 --encryption-type,這也是預設行為。
Firebase CLI
將受 CMEK 保護的資料庫複製到 CMEK 加密資料庫
若要複製到 CMEK 加密,請執行 firebase firestore:databases:clone 命令,並可選擇性地使用 encryption-type 和 kms-key-name 標誌來配置複製資料庫的加密類型。如未指定加密類型,複製的資料庫會採用與來源資料庫相同的加密設定。
firebase firestore:databases:clone \
SOURCE_DATABASE \
DESTINATION_DATABASE \
--encryption-type=CUSTOMER_MANAGED_ENCRYPTION \
--kms-key-name=KMS_KEY_NAME
將 KMS_KEY_NAME 替換為您指派給金鑰的名稱。請使用金鑰的完整資源名稱,格式如下:
projects/KMS_PROJECT/locations/KMS_LOCATION/keyRings/KMS_KEYRING_ID/cryptoKeys/KMS_KEY_ID
將受 CMEK 保護的資料庫複製到預設加密
如要複製到 Google 的預設加密機制 (非 CMEK),請依下列方式設定 encryption-type 旗標:
firebase firestore:databases:clone \
SOURCE_DATABASE \
DESTINATION_DATABASE \
--encryption-type=GOOGLE_DEFAULT_ENCRYPTION
將受 CMEK 保護的資料庫複製到與來源資料庫相同的加密類型。
如要複製到與來源資料庫相同的加密類型,請依下列方式設定 encryption-type 標記:
firebase firestore:databases:clone \
SOURCE_DATABASE \
DESTINATION_DATABASE \
--encryption-type=USE_SOURCE_ENCRYPTION
如果未指定 --encryption-type,這也是預設行為。
查看使用中的關鍵訊息
gcloud
您可以使用 databases describe gcloud CLI 指令來確認資料庫 CMEK 設定:
gcloud firestore databases describe --database=DATABASE_ID --project=FIRESTORE_PROJECT
您應該在回應的 cmekConfig 欄位中看到類似於以下內容的 CMEK 資訊:
cmekConfig:
activeKeyVersion:
- projects/PROJECT_ID/locations/us/keyRings/KEYRING_NAME/cryptoKeys/KEY_NAME/cryptoKeyVersions/1
kmsKeyName: projects/PROJECT_ID/locations/us/keyRings/KEYRING_NAME/cryptoKeys/KEY_NAME
locationId: nam5
name: projects/PROJECT_ID/databases/DATABASE_ID
回覆內容包含下列資訊:
REST API
HTTP 請求:
GET https://firestore.googleapis.com/v1/{name=projects/FIRESTORE_PROJECT/databases/DATABASE_ID}
在請求正文中,在 cmek_config.kms_key_name 欄位中配置 CMEK。
設為 Cloud KMS 金鑰的完整資源 ID。只允許使用與此資料庫位於相同位置的金鑰。
此值應為 Cloud KMS 金鑰資源 ID,格式為 projects/{KMS_PROJECT}/locations/{KMS_LOCATION}/keyRings/{KMS_KEYRING_ID}/cryptoKeys/{KMS_KEY_ID}
有關其他欄位的更多信息,請參閱database create頁。
請求和回應範例:
curl 'https://firestore.googleapis.com/v1/projects/FIRESTORE_PROJECT/databases/{DATABASE_ID}' \
-H "Authorization: Bearer $(gcloud auth print-access-token)" \
-H "Content-type: application/json"
—----------------------------------------- Response —--------------------------------------------
{
"name": "projects/FIRESTORE_PROJECT/databases/{DATABASE_ID}",
"locationId": "{FIRESTORE_DATABASE_LOCATION}",
"type": "FIRESTORE_NATIVE",
"cmekConfig": {
"kmsKeyName": "projects/{KMS_PROJECT}/locations/{KMS_LOCATION}/keyRings/{KMS_KEYRING_ID}/cryptoKeys/{KMS_KEY_ID}",
"activeKeyVersion": [
"projects/{KMS_PROJECT}/locations/{KMS_LOCATION}/keyRings/{KMS_KEYRING_ID}/cryptoKeys/{KMS_KEY_ID}/cryptoKeyVersions/1"
]
},
……
}
停用按鍵
如要停用與資料庫相關聯的金鑰,請完成下列步驟:
- 查看資料庫正在使用的關鍵版本。
- 停用這些正在使用的關鍵版本。
- 等待變更生效,並確認資料是否無法再存取。變更通常會在幾分鐘內生效,但也可能需要 3 小時。
當資料庫使用的某個鍵被停用時,預計會收到一個 FAILED_PRECONDITION 異常,錯誤訊息中包含更多詳細信息,例如:
{ "error": { "code": 400, "message": "The customer-managed encryption key required by the requested resource is not accessible. Error reason: generic::permission_denied: Permission 'cloudkms.cryptoKeyVersions.useToEncrypt' denied on resource 'projects/FIRESTORE_PROJECT/locations/{KMS_LOCATION}/keyRings/{KMS_KEYRING_ID}/cryptoKeys/{KMS_KEY_ID}' (or it may not exist).", "status": "FAILED_PRECONDITION", "details": [ { "@type": "type.googleapis.com/google.rpc.DebugInfo", "detail": "The customer-managed encryption key required by the requested resource is not accessible. Error reason: generic::permission_denied: Permission 'cloudkms.cryptoKeyVersions.useToEncrypt' denied on resource 'projects/FIRESTORE_PROJECT/locations/{KMS_LOCATION}/keyRings/{KMS_KEYRING_ID}/cryptoKeys/{KMS_KEY_ID}' (or it may not exist)" } ] } }
啟用金鑰
如要重新啟用與資料庫相關聯的金鑰,請完成下列步驟:
- 查看資料庫正在使用的關鍵版本
- 啟用這些正在使用的金鑰版本
- 等待變更生效,並確認資料是否無法再存取。變更通常會在幾分鐘內生效,但也可能需要 3 小時。
查看 Cloud KMS 金鑰的稽核記錄
在啟用雲端 KMS 資料存取稽核日誌之前,您應該熟悉 雲端稽核日誌。
Cloud KMS 資料存取稽核日誌 會顯示當 Cloud Firestore 或任何其他已設定為使用您的 CMEK 金鑰的產品向 Cloud KMS 發出加密/解密呼叫。 Cloud Firestore 不會在每個資料要求中發出加密/解密呼叫,而是維護輪詢器,定期檢查金鑰。輪詢結果會顯示在稽核記錄中。
您可以在 Google Cloud 控制台 中設定和操作審核日誌:
請確保專案中的 Cloud KMS API 已啟用 logging。
前往 Google Cloud 控制台中的 Cloud Logging。
透過在查詢建構器中新增以下行,將日誌條目限制為您的 Cloud KMS 金鑰:
resource.type="cloudkms_cryptokey" resource.labels.key_ring_id = KMS_KEYRING resource.labels.crypto_key_id = KMS_KEY resource.labels.location=KMS_LOCATION請替換下列項目:
KMS_KEY,名稱為 CMEK 金鑰KMS_KEYRING帶有 KMS 鑰匙環,該鑰匙KMS_LOCATION鑰匙和鑰匙圈的位置
記錄檔每隔五分鐘左右,就會顯示每個資料庫的幾個記錄項目。 記錄項目類似下列範例:
Info 2021-03-20 08:02:24.869 EDT Cloudkms.googleapis.com Decrypt projects/cloud-kms-project/locations/us-central1/keyRings/firestore-keys/cryptoKeys/my-cmek-key service-123456789123@gcp-sa-firestore.iam.gserviceaccount.com audit_log, method: "Decrypt", principal_email: "service-1234567891011@gcp-sa-firestore.iam.gserviceaccount.com" Info 2021-03-20 08:02:24.913 EDT Cloudkms.googleapis.com Encrypt projects/cloud-kms-project/locations/us-central1/keyRings/firestore-keys/cryptoKeys/my-cmek-key service-123456789123@gcp-sa-firestore.iam.gserviceaccount.com audit_log, method: "Encrypt", principal_email: "service-123456789123@gcp-sa-firestore.iam.gserviceaccount.com"
有關解釋審計日誌的詳細信息,請參閱以瞭解審計日誌。
設定 CMEK 機構政策
若要為組織中的 Cloud Firestore 資料庫指定加密合規性要求,請使用 CMEK 組織策略約束。
要求使用 CMEK 保護
設定「constraints/gcp.restrictNonCmekServices」,要求建立「Cloud Firestore」資料庫時必須使用 CMEK。將限制設為 deny,並將 firestore.googleapis.com 新增至拒絕清單,例如:
gcloud resource-manager org-policies deny gcp.restrictNonCmekServices is:firestore.googleapis.com --project=FIRESTORE_PROJECT
將 FIRESTORE_PROJECT 替換為要限制的專案。
如要進一步瞭解如何設定機構政策,請參閱「建立及編輯政策」。
政策生效後,如果您嘗試在受影響的專案下建立非 CMEK 資料庫,系統會傳回 FAILED_PRECONDITION 例外狀況和錯誤訊息。舉例來說,例外狀況如下所示:
{ "error": { "code": 400, "message": "Constraint 'constraints/gcp.restrictNonCmekServices' violated for 'projects/FIRESTORE_PROJECT' attempting to perform the operation 'google.firestore.admin.v1.FirestoreAdmin.CreateDatabase' with violated value 'firestore.googleapis.com'. See https://cloud.google.com/resource-manager/docs/organization-policy/org-policy-constraints for more information.", "status": "FAILED_PRECONDITION", "details": [ { "@type": "type.googleapis.com/google.rpc.PreconditionFailure", "violations": [ { "type": "constraints/gcp.restrictNonCmekServices", "subject": "orgpolicy:projects/FIRESTORE_PROJECT", "description": "Constraint 'constraints/gcp.restrictNonCmekServices' violated for 'projects/FIRESTORE_PROJECT' attempting to perform the operation 'google.firestore.admin.v1.FirestoreAdmin.CreateDatabase' with violated value 'firestore.googleapis.com'. See https://cloud.google.com/resource-manager/docs/organization-policy/org-policy-constraints for more information." } ]
限制 CMEK 金鑰的使用
如要限制用於 CMEK 保護措施的 Cloud KMS 金鑰,請設定 constraints/gcp.restrictCmekCryptoKeyProjects 限制。
做為清單限制,可接受的值為資源階層指標 (例如 projects/PROJECT_ID、under:folders/FOLDER_ID 和 under:organizations/ORGANIZATION_ID)。如要使用這項限制,請設定資源階層指標清單,並將限制設為「允許」。這項設定會限制支援的服務,因此只能從列出的專案、資料夾和機構中選擇 CMEK 金鑰。如要在已設定的服務中建立受 CMEK 保護的資源,必須使用允許資源的 Cloud Firestore 金鑰,否則要求會失敗。
以下範例僅允許使用指定項目中受 CMEK 保護的資料庫的 ALLOWED_KEY_PROJECT_ID 中的金鑰:
gcloud resource-manager org-policies allow gcp.restrictCmekCryptoKeyProjects \ under:projects/ALLOWED_KEY_PROJECT_ID \ --project=FIRESTORE_PROJECT
政策生效後,如果您違反了約束條件,您將收到 FAILED_PRECONDITION 異常和錯誤訊息。例外狀況如下所示:
{ "error": { "code": 400, "message": "Constraint 'constraints/gcp.restrictCmekCryptoKeyProjects' violated for 'projects/FIRESTORE_PROJECT' attempting to perform the operation 'google.firestore.admin.v1.FirestoreAdmin.CreateDatabase' with violated value 'projects/{NOT_ALLOWED_KEY_PROJECT}'. See https://cloud.google.com/resource-manager/docs/organization-policy/org-policy-constraints for more information.", "status": "FAILED_PRECONDITION", "details": [ { "@type": "type.googleapis.com/google.rpc.PreconditionFailure", "violations": [ { "type": "constraints/gcp.restrictCmekCryptoKeyProjects", "subject": "orgpolicy:projects/FIRESTORE_PROJECT", "description": "Constraint 'constraints/gcp.restrictCmekCryptoKeyProjects' violated for 'projects/FIRESTORE_PROJECT' attempting to perform the operation 'google.firestore.admin.v1.FirestoreAdmin.CreateDatabase' with violated value 'projects/{NOT_ALLOWED_KEY_PROJECT}'. See https://cloud.google.com/resource-manager/docs/organization-policy/org-policy-constraints for more information." } ] } ] } }