Используйте ключи шифрования, управляемые клиентом (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 CryptoKey .

  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 , нажмите «Сменить проект» или «Ввести ключ вручную» .

  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» . Если параметр --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.
  • Поле «Активные версии ключей» содержит список всех версий ключей, используемых в настоящее время в этой базе данных 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 с идентификатором вашей резервной копии

Клонировать базу данных, защищенную CMEK

Перед клонированием базы данных, защищенной CMEK:

  • Решите, хотите ли вы клонировать базу данных с шифрованием CMEK, с шифрованием Google по умолчанию (не CMEK) или с тем же шифрованием, что и у исходной базы данных.
  • Подготовьте ключ (первичную версию) и версию ключа, которую вы использовали для шифрования исходной базы данных. Включите как ключ, так и версию ключа.

gcloud

Клонировать базу данных, защищенную CMEK, в шифрование CMEK

Чтобы клонировать базу данных с шифрованием CMEK, выполните команду gcloud alpha firestore databases clone с необязательными флагами encryption-type и kms-key-name чтобы настроить тип шифрования для клонированной базы данных. Если тип шифрования не указан, клонированная база данных будет использовать ту же конфигурацию шифрования, что и исходная.

gcloud alpha 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 alpha firestore databases clone \
--encryption-type=google-default-encryption

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

Чтобы клонировать с тем же типом шифрования, что и у исходной базы данных, установите флаг encryption-type следующим образом:

gcloud alpha firestore databases clone \
--encryption-type=use-source-encryption

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

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

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

Что дальше?