На этой странице описано, как выполнять задачи, связанные с ключами шифрования, управляемыми клиентом (CMEK), для Cloud Firestore. Дополнительную информацию о CMEK, в том числе о том, когда и зачем их включать, можно найти в документации по Cloud KMS.
Подготовьте ключи CMEK
Прежде чем создать базу данных Cloud Firestore, защищенную CMEK, выполните следующие действия:
- Запросите доступ к функции CMEK в Cloud Firestore.
- Создайте или получите сервисный агент Cloud Firestore.
- Создайте ключ CMEK.
- Настройте параметры 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 Firestorenam5. - Используйте мультирегиональное местоположение Cloud KMS
europeдля мультирегионального местоположения Cloud Firestoreeur3.
- Используйте мультирегиональное местоположение Cloud KMS
В проекте Google Cloud, в котором вы хотите управлять ключами, выполните следующие действия:
Создайте набор ключей и ключ, используя один из следующих вариантов:
- Создайте набор ключей и ключ непосредственно в Cloud KMS.
- Использовать ключ, управляемый извне. Создайте внешний ключ, а затем создайте ключ Cloud EKM, чтобы сделать ключ доступным через Cloud KMS.
Настройте параметры IAM для ключа
Консоль
Чтобы предоставить роль Cloud KMS агенту сервиса, выполните следующие действия: Вы также можете предоставить разрешение на уровне ключа или набора ключей, если вам нужна меньшая детализация.
В консоли Google Cloud перейдите на страницу IAM.
Нажмите Добавить.
Введите идентификатор сервисного агента Cloud Firestore в формате адреса электронной почты.
Выберите роль Шифровальщик/расшифровщик CryptoKey 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– идентификатор в формате адреса электронной почты для сервисного агента, которому вы предоставляете доступ.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.
Консоль
В консоли Google Cloud перейдите на страницу Databases (Базы данных).
Нажмите Create Database (Создать базу данных).
Выберите режим базы данных. Нажмите Продолжить.
На странице Configure your database (Настройка базы данных) введите идентификатор базы данных.
Выберите местоположение.
Нажмите Показать параметры шифрования и выберите Ключ Cloud KMS.
Выберите или введите название ресурса для ключа CMEK, который вы хотите использовать для базы данных.
Список ключей ограничен текущим проектом Google Cloud и выбранным местоположением базы данных. Чтобы использовать ключ из другого проекта Google Cloud, нажмите Сменить проект или Ввести ключ вручную.
Если появится запрос на предоставление разрешения на доступ к ключу для сервисного аккаунта Cloud Firestore, нажмите Предоставить. Чтобы создать базу данных CMEK, вашему сервисному аккаунту Cloud Firestore должна быть назначена роль
cloudkms.cryptoKeyEncrypterDecrypter.Выберите правила безопасности для мобильных и веб-клиентов.
Нажмите Create Database (Создать базу данных).
После создания базы данных вы можете проверить, включен ли CMEK, в разделе Database details (Сведения о базе данных).
- Если база данных защищена с помощью 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_IDFIRESTORE_PROJECTс проектом, чтобы использовать его для базы данных Cloud Firestore.
REST API
HTTP-запрос:
POST 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
Чтобы создать базу данных с поддержкой CMEK, используйте поле KMS Key Name (Название ключа 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:
firebase firestore:databases:get DATABASE_ID --project FIRESTORE_PROJECT
В ответе появится следующая информация о CMEK:
- В поле Название ключа KMS указано полное название ресурса ключа, который используется для шифрования базы данных CMEK Cloud Firestore.
- В поле Активные версии ключей перечислены все версии ключей, которые сейчас используются в этой базе данных 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с идентификатором базы данных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
Как восстановить базу данных, защищенную 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 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
Клонирование базы данных, защищенной 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
Чтобы проверить конфигурацию CMEK базы данных, используйте команду 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"
]
},
……
}
Как отключить ключ
Чтобы отключить ключ, связанный с базой данных, выполните следующие действия:
- Как посмотреть версии ключей, используемые для базы данных
- Отключить используемые версии ключей.
- Дождитесь, пока изменения вступят в силу, и проверьте, закрыт ли доступ к данным. Обычно изменения вступают в силу в течение нескольких минут, но иногда на это требуется до 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, ознакомьтесь с информацией о журналах аудита Google Cloud.
Журналы аудита доступа к данным 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 можно было выбирать только из перечисленных проектов, папок и организаций. Запросы на создание ресурсов, защищенных 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." } ] } ] } }