本页面介绍了如何执行与适用于 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 命令,以创建 Cloud Firestore 代表您访问 CMEK 密钥所需的服务代理。如果服务账号不存在,此命令将创建并显示该服务账号。
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 Firestore
nam5
多区域位置所对应的 Cloud KMSus
多区域位置用于配置。 - 将 Cloud Firestore
eur3
多区域位置所对应的 Cloud KMSeurope
多区域位置用于配置。
- 将 Cloud Firestore
在您要用于管理密钥的 Google Cloud 项目中,完成以下操作:
使用以下选项之一创建密钥环和密钥:
- 直接在 Cloud KMS 中创建密钥环和密钥。
- 使用由外部管理的密钥。 创建外部密钥,然后创建 Cloud EKM 密钥,以通过 Cloud KMS 来提供该密钥。
为密钥配置 IAM 设置
控制台
如需向您的服务代理授予 Cloud KMS 角色,请执行以下操作。如果需要更低的粒度级别,您也可以在密钥级层或密钥环级层授予权限。
在 Google Cloud 控制台中,前往 IAM 页面。
点击添加。
输入 Cloud Firestore 服务代理的邮件格式 ID。
选择 Cloud KMS CryptoKey Encrypter/Decrypter 角色。
点击保存。
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
替换为您要向其授予访问权限的服务代理的邮件格式标识符 - 将
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 控制台中,转到数据库页面。
点击创建数据库。
选择数据库模式。点击继续。
在配置数据库页面上,输入数据库 ID。
选择地理位置。
点击显示加密选项,然后选择 Cloud KMS 密钥。
选择或输入要用于数据库的 CMEK 密钥的资源名称。
密钥列表仅显示当前 Google Cloud 项目和您选择的数据库位置下的密钥。如需使用来自其他 Google Cloud 项目的密钥,请点击切换项目或手动输入密钥。
如果系统提示您向 Cloud Firestore 服务账号授予密钥权限,请点击授予。如需创建 CMEK 数据库,您的 Cloud Firestore 服务账号必须获得
cloudkms.cryptoKeyEncrypterDecrypter
角色。为移动客户端和 Web 客户端选择安全规则。
点击创建数据库。
创建数据库后,您可以通过查看数据库详细信息来验证该数据库是否为启用了 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
替换为数据库的 Cloud Firestore 位置 - 将
DATABASE_ID
替换为数据库的 ID 将
KMS_KEY_NAME
替换为您为密钥分配的名称。使用密钥的完整资源名称,格式如下:projects/KMS_PROJECT/locations/KMS_LOCATION/keyRings/KMS_KEYRING_ID/cryptoKeys/KMS_KEY_ID
将
FIRESTORE_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 数据库的项目
使用 Firebase CLI 确认您的 Cloud Firestore 数据库是否启用了保护:
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
替换为数据库的 ID - 将
FIRESTORE_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),还是恢复为与备份相同的加密方式。
准备您用于加密备份的密钥 (primary-version) 和密钥版本。同时启用密钥和密钥版本。
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
替换为您的备份 ID - 将
KMS_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
查看正在使用的密钥
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 Audit Logs。
Cloud KMS 数据访问审核日志显示 Cloud Firestore 或任何其他配置为使用您的 CMEK 密钥的产品何时对 Cloud KMS 进行加密/解密调用。Cloud 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 组织政策
如需为贵组织中的 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 的密钥
如需限制哪些 Cloud KMS 密钥可用于 CMEK 保护,请配置 constraints/gcp.restrictCmekCryptoKeyProjects
约束条件。
作为列表限制条件,它接受的值是资源层次结构指示符(例如 projects/PROJECT_ID
、under:folders/FOLDER_ID
和 under:organizations/ORGANIZATION_ID
)。要使用此限制条件,请配置资源层次结构指示符列表并将限制条件设置为允许。此配置会限制支持的服务,以便仅从列出的项目、文件夹和组织中选择 CMEK 密钥。如果没有来自允许资源之一的 Cloud Firestore 密钥,则无法在已配置的服务中成功创建受 CMEK 保护的资源。
以下示例仅允许为指定项目中受 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." } ] } ] } }