使用客戶自行管理的加密金鑰 (CMEK)
本頁說明如何執行與 Firestore 客戶自行管理的加密金鑰 (CMEK) 相關的工作。如要進一步瞭解 CMEK,包括啟用時機和原因,請參閱 Cloud KMS 說明文件。
準備 CMEK 金鑰
如要建立受 CMEK 保護的 Firestore 資料庫,請先完成下列步驟:
針對每個包含受 CMEK 保護 Firestore 資料庫的專案,完成下列步驟。如果之後建立新的 CMEK 金鑰,請務必為該金鑰設定 IAM 設定。
要求存取權
建立 Firestore 服務代理程式前,請先填寫這份表單,申請存取 CMEK 功能。
建立 Firestore 服務代理
建立 CMEK 金鑰前,您必須擁有 Firestore 服務代理程式,這是 Firestore 用來存取金鑰的 Google 代管服務帳戶類型。
執行 services identity create 指令,建立 Firestore 用來代表您存取 CMEK 金鑰的服務代理程式。如果服務帳戶尚不存在,這項指令會加以建立,然後顯示該帳戶。
gcloud beta services identity create \ --service=firestore.googleapis.com \ --project FIRESTORE_PROJECT
將 FIRESTORE_PROJECT
替換為您打算用於 Firestore 資料庫的專案。
該指令會顯示服務代理 ID,格式類似電子郵件地址。請記下輸出內容中的電子郵件字串,因為後續步驟會用到。
Service identity created: service-xxx@gcp-sa-firestore.iam.gserviceaccount.com
建立金鑰
您可以直接在 Cloud KMS 中建立金鑰,也可以使用透過 Cloud External Key Manager 提供的外部代管金鑰。
Cloud KMS 金鑰位置必須與要搭配使用的 Firestore 資料庫位置相同。
如果是區域資料庫位置,請為金鑰環、金鑰和資料庫使用相同的位置名稱,因為位置名稱具有一對一的對應關係。
舉例來說,如要在
us-west1
中建立受 CMEK 保護的資料庫,請在us-west1
中建立金鑰環和金鑰。如要使用多區域資料庫位置,請使用 KMS 多區域位置的位置名稱:
- Firestore
nam5
多區域位置使用 Cloud KMSus
多區域位置。 - Firestore
eur3
多區域位置使用 Cloud KMSeurope
多區域位置。
- Firestore
在要管理金鑰的 Google Cloud 專案中,完成下列步驟:
使用下列其中一種方式建立金鑰環和金鑰:
- 直接在 Cloud KMS 中建立金鑰環和金鑰。
- 使用外部代管金鑰。建立外部金鑰,然後建立 Cloud EKM 金鑰,透過 Cloud KMS 提供金鑰。
設定金鑰的 IAM 設定
主控台
如要將 Cloud KMS 角色授予服務代理,請按照下列步驟操作。如要降低精細度,您也可以在金鑰或金鑰環層級授予權限。
前往 Google Cloud 控制台的「IAM」頁面。
按一下「新增」。
輸入 Firestore 服務代理程式的電子郵件格式 ID。
選取「Cloud KMS CryptoKey Encrypter/Decrypter」(Cloud 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 預設加密保護的現有 Firestore 資料庫,無法轉換為使用 CMEK。
只有在建立啟用 CMEK 的資料庫時,才能選擇加密類型和金鑰。
主控台
前往 Google Cloud 控制台的「Databases」頁面。
按一下 [Create Database] (建立資料庫)。
選取資料庫模式。按一下「繼續」。
在「設定資料庫」頁面中,輸入資料庫 ID。
選取地點。
按一下「顯示加密選項」,然後選取「Cloud KMS 金鑰」。
選取或輸入要用於資料庫的 CMEK 金鑰資源名稱。
金鑰清單僅限於您選取的目前 Google Cloud 專案和資料庫位置。如要使用其他 Google Cloud 專案的金鑰,請按一下「切換專案」或「手動輸入金鑰」。
如果系統提示您授予 Firestore 服務帳戶金鑰權限,請按一下「授予」。如要建立 CMEK 資料庫,必須授予 Firestore 服務帳戶
cloudkms.cryptoKeyEncrypterDecrypter
角色。為行動和網路用戶端選取安全性規則。
按一下 [Create Database] (建立資料庫)。
建立資料庫後,您可以查看「資料庫詳細資料」,確認資料庫是否已啟用 CMEK:
- 如果資料庫受 CMEK 保護,「加密類型」欄位會顯示「客戶管理」,「加密金鑰」欄位則會列出對應的 Cloud 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
,並提供資料庫的 Firestore 位置DATABASE_ID
,並提供資料庫的 IDKMS_KEY_NAME
改成您指派給金鑰的名稱。請使用金鑰的完整資源名稱,格式如下:projects/KMS_PROJECT/locations/KMS_LOCATION/keyRings/KMS_KEYRING_ID/cryptoKeys/KMS_KEY_ID
FIRESTORE_PROJECT
,並在專案中用於 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
參數,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 金鑰環的 IDFIRESTORE_PROJECT
,並在專案中用於 Firestore 資料庫
確認 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
,並在專案中用於 Firestore 資料庫DATABASE_ID
,並提供資料庫的 IDFIRESTORE_DATABASE_LOCATION
,並提供資料庫的 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
,並在專案中用於 Firestore 資料庫FIRESTORE_LOCATION
,並提供 Firestore 資料庫的位置BACKUP_ID
,並提供備份 IDKMS_PROJECT
,其中包含您的 CMEK 金鑰KMS_LOCATION
替換為包含 CMEK 金鑰和金鑰環的位置KMS_KEYRING_ID
替換為 CMEK 金鑰環的 ID
確認還原的 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
,並在專案中用於 Firestore 資料庫FIRESTORE_LOCATION
,並提供 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
,並在專案中用於 Firestore 資料庫FIRESTORE_LOCATION
,並提供 Firestore 資料庫的位置BACKUP_ID
,並提供備份 ID
查看使用的金鑰
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 金鑰的稽核記錄
啟用 Cloud KMS 資料存取稽核記錄前,請先熟悉 Cloud 稽核記錄。
Cloud KMS 資料存取稽核記錄會顯示 Firestore 或任何其他設為使用 CMEK 金鑰的產品,何時對 Cloud KMS 發出加密/解密呼叫。Firestore 不會在每個資料要求中發出加密/解密呼叫,而是維護定期檢查金鑰的輪詢器。輪詢結果會顯示在稽核記錄中。
您可以在Google Cloud 控制台中設定稽核記錄並與之互動:
請確認專案中的 Cloud KMS API 已啟用記錄功能。
前往 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 機構政策
如要為貴機構的 Firestore 資料庫指定加密法規遵循要求,請使用 CMEK 機構政策限制。
要求使用 CMEK 保護措施
設定 constraints/gcp.restrictNonCmekServices
,要求建立 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 保護的資源,必須使用允許資源中的 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." } ] } ] } }