На этой странице описано, как выполнять задачи, связанные с управляемыми клиентом ключами шифрования (CMEK) для Cloud Firestore . Более подробную информацию о CMEK в целом, включая случаи, когда и зачем его включать, см. в документации Cloud KMS .
Подготовьте ключи CMEK.
Прежде чем создавать базу данных Cloud Firestore , защищенную с помощью CMEK, необходимо выполнить следующие шаги:
- Запросите доступ к функции Cloud Firestore CMEK .
- Create (or retrieve) a Cloud Firestore service agent .
- Создайте ключ CMEK .
- Настройте параметры IAM для этого ключа .
Выполните эти шаги для каждого проекта, который будет содержать базы данных Cloud Firestore защищенные с помощью CMEK. Если вы позже создадите новый ключ CMEK, вам необходимо будет настроить параметры IAM для этого ключа.
Запросить доступ
Прежде чем создавать агента службы Cloud Firestore , запросите доступ к функции CMEK, заполнив эту форму .
Создайте агента службы Cloud Firestore
Before you create a CMEK key, you must have a Cloud Firestore service agent , which is a type of Google-managed service account that Cloud Firestore uses to access the key.
Выполните команду 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 .
The Cloud KMS key location must be the same as the location of the Cloud Firestore database that it will be used with.
Для региональных расположений баз данных используйте одно и то же имя расположения для связки ключей, ключа и базы данных, поскольку имена расположений имеют однозначное соответствие.
Например, если вы хотите создать базу данных, защищенную CMEK, в
us-west1, создайте связку ключей и ключ вus-west1.Для баз данных, расположенных в нескольких регионах , используйте имя расположения базы данных KMS для нескольких регионов :
- Use the Cloud KMS
usmulti-region location for the Cloud Firestorenam5multi-region location. - Для подключения к многорегиональному расположению Cloud Firestore
eur3используйтеeuropeрасположение Cloud KMS.
- Use the Cloud KMS
В проекте Google Cloud , где вы хотите управлять ключами, выполните следующие действия:
Создайте связку ключей и сам ключ, используя один из следующих вариантов:
- Create the key ring and key directly in Cloud KMS .
- Используйте ключ, управляемый извне. Создайте внешний ключ , а затем создайте ключ Cloud EKM , чтобы сделать его доступным через Cloud KMS.
Настройте параметры IAM для ключа.
Консоль
To grant an Cloud KMS role to your service agent, do the following. You are also able to grant permission at the key or key-ring level if you want lower granularity.
В консоли Google Cloud перейдите на страницу IAM .
Нажмите «Добавить» .
Введите идентификатор агента службы Cloud Firestore в формате электронной почты.
Select the Cloud KMS CryptoKey Encrypter/Decrypter role.
Нажмите « Сохранить ».
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_KEYwith the name that you assigned to the key -
KMS_KEYRINGсодержит связку ключей KMS, в которой находится ключ. -
KMS_LOCATIONрегион, в котором находится связка ключей. - Укажите в поле
SERVICE_AGENT_EMAILидентификатор сервисного агента в формате электронной почты, которому вы предоставляете доступ. -
KMS_PROJECTwith the project that contains the key
На экране терминала должен отобразиться ответ, аналогичный следующему:
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 перейдите на страницу «Базы данных» .
Нажмите «Создать базу данных» .
Выберите режим работы базы данных. Нажмите «Продолжить» .
On the Configure your database page, enter a database ID.
Выберите местоположение.
Нажмите «Показать параметры шифрования» , а затем выберите ключ Cloud KMS .
Выберите или введите имя ресурса для ключа CMEK, который вы хотите использовать для базы данных.
Список ключей ограничен текущим проектом Google Cloud и выбранным вами расположением базы данных. Чтобы использовать ключ из другого проекта Google Cloud , нажмите «Переключить проект» или «Ввести ключ вручную» .
Если появится запрос на предоставление прав доступа к ключу для учетной записи службы Cloud Firestore , нажмите «Предоставить» . Для создания базы данных CMEK вашей учетной записи службы Cloud Firestore должна быть предоставлена роль
cloudkms.cryptoKeyEncrypterDecrypter.Select security rules for mobile and web clients.
Нажмите «Создать базу данных» .
После создания базы данных вы можете убедиться в ее поддержке 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_LOCATIONwith the Cloud Firestore location for the database -
DATABASE_ID— идентификатор базы данных. В
KMS_KEY_NAMEукажите имя, присвоенное ключу. Используйте полное имя ресурса для ключа в следующем формате:projects/ KMS_PROJECT /locations/ KMS_LOCATION /keyRings/ KMS_KEYRING_ID /cryptoKeys/ KMS_KEY_IDFIRESTORE_PROJECTwith the project to use for your Cloud Firestore database
REST API
HTTP-запрос:
POST https://firestore.googleapis.com/v1/projects/{FIRESTORE_PROJECT}/databases
In the request body configure CMEK in the cmek_config.kms_key_name field.
Установите значение, равное полному идентификатору ресурса ключа Cloud KMS. Допускается использование только ключа, расположенного в том же месте, что и эта база данных.
Это значение должно представлять собой идентификатор ресурса ключа Cloud KMS в формате projects/{KMS_PROJECT}/locations/{KMS_LOCATION}/keyRings/{KMS_KEYRING_ID}/cryptoKeys/{KMS_KEY_ID}
For more information about other fields, see the database create page .
Пример запроса:
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_PROJECTwith the project that contains your CMEK key -
KMS_LOCATIONместоположение, содержащее ваш ключ CMEK и связку ключей. -
KMS_KEYRING_IDсодержит идентификатор вашего брелока CMEK. -
FIRESTORE_PROJECTсодержит название проекта, который будет использоваться для вашей базы данных Cloud Firestore
Убедитесь, что ваша база данных Cloud Firestore защищена с помощью Firebase CLI:
firebase firestore:databases:get DATABASE_ID --project FIRESTORE_PROJECT
The following CMEK information appears in the response message:
- The KMS Key Name field provides the full key resource name that is used to encrypt your Cloud Firestore CMEK database.
- В поле «Активные версии ключей» представлен список всех версий ключей, используемых в данный момент данной базой данных CMEK. Во время ротации ключей может быть несколько активных версий ключей.
Терраформирование
To create a CMEK-enabled database, use the google_firestore_database resource. For more information and examples, see 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_PROJECTwith the project to use for your Cloud Firestore database -
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.
Before you restore CMEK-protected database from a backup:
- Решите, хотите ли вы восстановить базу данных с использованием шифрования CMEK, шифрования по умолчанию от Google (не CMEK) или того же шифрования, что и в резервной копии.
Prepare the key (primary-version) and the key version that you used to encrypt the backup. Enable both the key and the key 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
Replace KMS_KEY_NAME with the name that you assigned to the key. Use the full resource name for the key in the following format:
projects/ KMS_PROJECT /locations/ KMS_LOCATION /keyRings/ KMS_KEYRING_ID /cryptoKeys/ KMS_KEY_ID
Restore a CMEK-protected database to default encryption
Чтобы восстановить шифрование по умолчанию от Google (не CMEK), установите флаг encryption-type следующим образом:
gcloud firestore databases restore
--encryption-type=google-default-encryption
Restore a CMEK-protected database to the same encryption type as the backup
To restore to the same encryption type as the backup, set the encryption-type flag in the following way:
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_PROJECTwith the project that contains your CMEK key -
KMS_LOCATIONwith the location that contains your CMEK key and key ring -
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_LOCATIONwith the location of your Cloud Firestore database -
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_LOCATIONwith the location of your Cloud Firestore database -
BACKUP_IDсодержит идентификатор вашей резервной копии.
Клонируйте базу данных, защищенную CMEK.
Перед клонированием базы данных, защищенной CMEK:
- Решите, хотите ли вы клонировать базу данных с использованием шифрования CMEK, с использованием шифрования по умолчанию от Google (не CMEK) или с использованием того же шифрования, что и в исходной базе данных.
Prepare the key (primary-version) and the key version that you used to encrypt the source database. Enable both the key and the key version.
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
Clone a CMEK-protected database to default encryption
Чтобы клонировать систему с использованием шифрования по умолчанию от 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 CLI
Clone a CMEK-protected database to CMEK encryption
Для клонирования с использованием шифрования 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
Clone a CMEK-protected database to default encryption
Чтобы клонировать систему с использованием шифрования по умолчанию от Google (не CMEK), установите флаг encryption-type следующим образом:
firebase firestore:databases:clone \
SOURCE_DATABASE \
DESTINATION_DATABASE \
--encryption-type=GOOGLE_DEFAULT_ENCRYPTION
Clone a CMEK-protected database to the same encryption type as the source database
Чтобы клонировать базу данных с тем же типом шифрования, что и в исходной базе данных, установите флаг encryption-type следующим образом:
firebase firestore:databases:clone \
SOURCE_DATABASE \
DESTINATION_DATABASE \
--encryption-type=USE_SOURCE_ENCRYPTION
Это также поведение по умолчанию, если --encryption-type не указан.
Посмотреть используемый ключ
gcloud
Для подтверждения конфигурации CMEK для базы данных можно использовать команду CLI ` databases describe gcloud CLI :
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
В ответе содержится следующая информация:
-
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"
]
},
……
}
Отключить клавишу
To disable a key associated with a database, complete the following:
- Просмотрите ключевые версии, используемые для базы данных .
- Отключите используемые версии ключей .
- Дождитесь, пока изменения вступят в силу, и проверьте, не стали ли данные недоступны. Изменения обычно вступают в силу в течение нескольких минут, но могут занять до 3 часов.
When a key used by a database is disabled, expect to receive a FAILED_PRECONDITION exception with additional details in the error message, for example:
{ "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
Before you enable Cloud KMS Data Access audit logs, you should be familiar with Cloud Audit Logs .
Журналы аудита доступа к данным Cloud KMS показывают, когда Cloud Firestore или любые другие продукты, настроенные на использование вашего ключа CMEK, выполняют запросы шифрования/дешифрования к Cloud KMS. Cloud Firestore не выполняет запрос шифрования/дешифрования при каждом запросе данных, а вместо этого поддерживает опрашивающий модуль, который периодически проверяет ключ. Результаты опроса отображаются в журналах аудита.
You can set up and interact with the audit logs in the Google Cloud console :
Убедитесь, что в вашем проекте включено логирование для API Cloud KMS.
Перейдите в Cloud Logging в консоли Google Cloud.
Ограничьте количество записей в журнале только вашим ключом 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содержит информацию о местонахождении ключа и брелока.
The log shows a couple log entries about every five minutes per database. The log entries look similar to these examples:
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 в список deny, например:
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 ). Для использования этого ограничения необходимо настроить список индикаторов иерархии ресурсов и установить значение параметра Allow . Эта конфигурация ограничивает поддерживаемые сервисы таким образом, чтобы ключи CMEK можно было выбирать только из перечисленных проектов, папок и организаций. Запросы на создание ресурсов, защищенных CMEK, в настроенных сервисах не будут выполнены без ключа Cloud Firestore из одного из разрешенных ресурсов.
The following example allows only keys from the ALLOWED_KEY_PROJECT_ID for CMEK-protected databases in the specified project:
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." } ] } ] } }