Используйте ключи шифрования, управляемые клиентом (CMEK).

На этой странице описывается, как выполнять задачи, связанные с управляемыми клиентом ключами шифрования (CMEK) для Cloud Firestore . Для получения дополнительной информации о CMEK в целом, включая то, когда и зачем его включать, см. документацию Cloud KMS .

Подготовьте ключи CMEK

Прежде чем создать базу данных Cloud Firestore , защищенную с помощью CMEK, необходимо выполнить следующие шаги:

  1. Запросите доступ к функции Cloud Firestore CMEK .
  2. Создайте (или извлеките) агент службы Cloud Firestore .
  3. Создайте ключ CMEK .
  4. Настройте параметры IAM для этого ключа .

Выполните эти шаги для каждого проекта, который будет содержать базы данных Cloud Firestore , защищенные CMEK. Если вы позже создадите новый ключ 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 .

Команда отображает идентификатор агента сервиса, который отформатирован как адрес электронной почты. Запишите выходную строку электронной почты, поскольку она понадобится вам на более позднем этапе.

Service identity created:
service-xxx@gcp-sa-firestore.iam.gserviceaccount.com

Создать ключ

Вы можете использовать ключ, созданный непосредственно в Cloud KMS, или внешний управляемый ключ, который вы сделаете доступным с помощью Cloud External Key Manager .

Расположение ключа Cloud KMS должно совпадать с расположением базы данных Cloud Firestore , с которой он будет использоваться.

  • Для региональных расположений баз данных используйте одно и то же имя расположения для брелока, ключа и базы данных, поскольку имена расположений имеют однозначное соответствие.

    Например, если вы хотите создать базу данных, защищенную CMEK, в us-west1 , создайте связку ключей и ключ в us-west1 .

  • Для многорегиональных расположений баз данных используйте имя многорегионального расположения KMS :

    • Используйте многорегиональное расположение Cloud KMS us для многорегионального расположения Cloud Firestore nam5 .
    • Используйте многорегиональное расположение Cloud KMS europe для многорегионального расположения Cloud Firestore eur3 .

В проекте Google Cloud , где вы хотите управлять своими ключами, выполните следующие действия:

  1. Включите API Cloud KMS .

  2. Создайте связку ключей и ключ, используя один из следующих вариантов:

Настройте параметры IAM для ключа

Консоль

Чтобы предоставить роль Cloud KMS вашему сервисному агенту, выполните следующие действия. Вы также можете предоставить разрешение на уровне ключа или кольца ключей, если вам нужна более низкая степень детализации.

  1. В консоли Google Cloud перейдите на страницу IAM .

    Перейти на страницу IAM

  2. Нажмите Добавить .

  3. Введите идентификатор в формате адреса электронной почты для вашего агента службы Cloud Firestore .

  4. Выберите роль шифровальщика/дешифровальщика криптографических ключей Cloud KMS .

  5. Нажмите «Сохранить» .

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. Существующие базы данных Cloud Firestore , защищенные шифрованием Google по умолчанию, не могут быть преобразованы для использования CMEK.

Выбрать тип шифрования и ключ можно только при создании базы данных с поддержкой CMEK.

Консоль

  1. В консоли Google Cloud перейдите на страницу Базы данных .

    Перейти на страницу Базы данных

  2. Нажмите Создать базу данных .

  3. Выберите режим базы данных. Нажмите Продолжить .

  4. На странице «Настройка базы данных» введите идентификатор базы данных.

  5. Выберите местоположение.

  6. Нажмите Показать параметры шифрования , а затем выберите Ключ Cloud KMS .

  7. Выберите или введите имя ресурса для ключа CMEK, который вы хотите использовать для базы данных.

  8. Список ключей ограничен текущим проектом Google Cloud и выбранным вами расположением базы данных. Чтобы использовать ключ из другого проекта Google Cloud , нажмите Switch Project или Enter Key Manually .

  9. Если вам будет предложено предоставить разрешение на доступ к ключу учетной записи службы Cloud Firestore , нажмите Предоставить . Чтобы создать базу данных CMEK, вашей учетной записи службы Cloud Firestore должна быть предоставлена ​​роль cloudkms.cryptoKeyEncrypterDecrypter .

  10. Выберите правила безопасности для мобильных и веб-клиентов.

  11. Нажмите Создать базу данных .

После создания базы данных вы можете убедиться, что она поддерживает CMEK, просмотрев сведения о базе данных :

  • Если ваша база данных защищена CMEK, в поле «Тип шифрования» отображается значение «Управляется клиентом» , а в поле «Ключ шифрования» указывается соответствующий Cloud KMS и версия ключа, используемая для защиты этой базы данных.
  • Если ваша база данных не защищена CMEK, в поле Тип шифрования будет указано «Управляемая Google» .

gcloud

Перед созданием базы данных с поддержкой CMEK с помощью Google Cloud CLI установите последнюю версию и авторизуйте 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 с идентификатором базы данных
  • KMS_KEY_NAME с именем, которое вы назначили ключу. Используйте полное имя ресурса для ключа в следующем формате:

    projects/ KMS_PROJECT /locations/ KMS_LOCATION /keyRings/ KMS_KEYRING_ID /cryptoKeys/ KMS_KEY_ID

  • FIRESTORE_PROJECT с проектом, который будет использоваться для вашей базы данных Cloud Firestore

REST-API

HTTP-запрос:

ПОСТ https://firestore.googleapis.com/v1/projects/{FIRESTORE_PROJECT}/databases

В теле запроса настройте CMEK в поле cmek_config.kms_key_name .

Установите полный идентификатор ресурса ключа Cloud KMS. Разрешен только ключ в том же месте, что и эта база данных.

Это значение должно быть идентификатором ресурса ключа Cloud KMS в формате 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 Key Name . Если вы не укажете параметр --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 с идентификатором вашей базы данных
  • LOCATION с указанием местоположения вашей базы данных
  • KMS_PROJECT с проектом, содержащим ваш ключ CMEK
  • KMS_LOCATION с местоположением, в котором находится ваш ключ CMEK и брелок для ключей
  • KMS_KEYRING_ID с идентификатором вашего CMEK-брелка
  • FIRESTORE_PROJECT с проектом, который будет использоваться для вашей базы данных Cloud Firestore

Убедитесь, что ваша база данных Cloud Firestore защищена с помощью Firebase CLI:

firebase firestore:databases:get DATABASE_ID --project FIRESTORE_PROJECT

В ответном сообщении отображается следующая информация CMEK:

  • Поле «Имя ключа KMS» содержит полное имя ресурса ключа, который используется для шифрования базы данных Cloud Firestore CMEK.
  • Поле Active Key Versions содержит список всех версий ключей, используемых в настоящее время этой базой данных CMEK. Во время ротации ключей у вас может быть несколько активных версий ключей.

Терраформировать

Для создания базы данных с поддержкой 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 с идентификатором базы данных
  • FIRESTORE_DATABASE_LOCATION с расположением базы данных Cloud Firestore
  • DATABASE_TYPE с FIRESTORE_NATIVE для собственного режима или DATASTORE_MODE для режима хранилища данных.
  • 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 с идентификатором вашей базы данных
  • FIRESTORE_PROJECT с проектом, который будет использоваться для вашей базы данных Cloud Firestore
  • FIRESTORE_LOCATION с местоположением вашей базы данных Cloud Firestore
  • BACKUP_ID с идентификатором вашей резервной копии
  • KMS_PROJECT с проектом, содержащим ваш ключ CMEK
  • KMS_LOCATION с местоположением, в котором находится ваш ключ CMEK и брелок для ключей
  • KMS_KEYRING_ID с идентификатором вашего CMEK-брелка

Убедитесь, что восстановленная база данных 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 с идентификатором вашей базы данных
  • FIRESTORE_PROJECT с проектом, который будет использоваться для вашей базы данных Cloud Firestore
  • FIRESTORE_LOCATION с местоположением вашей базы данных Cloud Firestore
  • BACKUP_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 с идентификатором вашей базы данных
  • FIRESTORE_PROJECT с проектом, который будет использоваться для вашей базы данных Cloud Firestore
  • FIRESTORE_LOCATION с местоположением вашей базы данных Cloud Firestore
  • BACKUP_ID с идентификатором вашей резервной копии

Посмотреть используемый ключ

gcloud

Для подтверждения конфигурации базы данных CMEK можно использовать команду CLI databases describe gcloud CLI :

gcloud firestore databases describe --database=DATABASE_ID --project=FIRESTORE_PROJECT

Вы должны увидеть информацию CMEK в поле cmekConfig в ответе, аналогичном следующему:

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

Ответ содержит следующую информацию:

  • kmsKeyName : полное имя ресурса ключа, который используется для шифрования базы данных, защищенной CMEK.
  • activeKeyVersion : список всех версий ключей, которые в данный момент используются базой данных, защищенной CMEK. Во время ротации ключей у вас может быть несколько активных версий ключей. Во время ротации ключей должны быть доступны как старая, так и новая версии ключа. Не отключайте старую версию ключа, пока она не исчезнет из поля activeKeyVersion .

REST-API

HTTP-запрос:

GET https://firestore.googleapis.com/v1/{name=projects/FIRESTORE_PROJECT/databases/DATABASE_ID}

В теле запроса настройте CMEK в поле cmek_config.kms_key_name . Установите полный идентификатор ресурса ключа Cloud KMS. Разрешен только ключ в том же месте, что и эта база данных.

Это значение должно быть идентификатором ресурса ключа Cloud KMS в формате 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"
    ]
  },
  ……
}

Отключить клавишу

Чтобы отключить ключ, связанный с базой данных, выполните следующие действия:

  1. Просмотр основных версий, используемых для базы данных .
  2. Отключите эти используемые версии ключей .
  3. Подождите, пока изменения вступят в силу, и проверьте, не стали ли данные недоступны. Изменения обычно вступают в силу в течение нескольких минут, но это может занять до 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)"
      }
    ]
  }
}

Включить ключ

Чтобы повторно включить ключ, связанный с базой данных, выполните следующие действия:

  1. Просмотр основных версий, используемых для базы данных
  2. Включить эти версии ключей в использование
  3. Подождите, пока изменения вступят в силу, и проверьте, не стали ли данные недоступны. Изменения обычно вступают в силу в течение нескольких минут, но это может занять до 3 часов.

Просмотр журналов аудита для ключа Cloud KMS

Прежде чем включить журналы аудита доступа к данным Cloud KMS, вам следует ознакомиться с журналами аудита Cloud .

Журналы аудита доступа к данным Cloud KMS показывают, когда Cloud Firestore или любые другие продукты, настроенные на использование вашего ключа CMEK, выполняют вызовы шифрования/дешифрования в Cloud KMS. Cloud Firestore не отправляет вызов шифрования/дешифрования на каждый запрос данных, а вместо этого поддерживает опросчик, который периодически проверяет ключ. Результаты опроса отображаются в журналах аудита.

Вы можете настроить и взаимодействовать с журналами аудита в консоли Google Cloud :

  1. Убедитесь, что в вашем проекте включено ведение журнала для API Cloud KMS.

  2. Перейдите в Cloud Logging в консоли Google Cloud.

    Перейти к Cloud Logging

  3. Ограничьте записи журнала вашим ключом 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 , чтобы требовать CMEK для создания базы данных Cloud Firestore . Установите ограничение на deny и добавьте firestore.googleapis.com в список deny, например:

 gcloud resource-manager org-policies deny gcp.restrictNonCmekServices  is:firestore.googleapis.com --project=FIRESTORE_PROJECT

Замените FIRESTORE_PROJECT на проект, который необходимо ограничить.

Дополнительную информацию о настройке политик организации см. в разделе Создание и редактирование политик .

После вступления политики в силу вы получите исключение FAILED_PRECONDITION и сообщение об ошибке, если попытаетесь создать базу данных, отличную от CMEK, в затронутом проекте. Например, исключение выглядит так:

{
  "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 ). Используйте это ограничение, настроив список индикаторов иерархии ресурсов и установив ограничение на Allow . Эта конфигурация ограничивает поддерживаемые службы, так что ключи CMEK можно выбирать только из перечисленных проектов, папок и организаций. Запросы на создание ресурсов, защищенных CMEK, в настроенных службах не будут выполнены без ключа Cloud Firestore из одного из разрешенных ресурсов.

В следующем примере разрешены только ключи из ALLOWED_KEY_PROJECT_ID для баз данных, защищенных CMEK, в указанном проекте:

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."
          }
        ]
      }
    ]
  }
}

Что дальше?