Używanie kluczy szyfrowania zarządzanych przez klienta (CMEK)

Na tej stronie opisujemy, jak wykonywać zadania związane z kluczami szyfrowania zarządzanymi przez klienta (CMEK) w przypadku Cloud Firestore. Więcej informacji o kluczach CMEK, w tym o tym, kiedy i dlaczego warto je włączyć, znajdziesz w dokumentacji Cloud KMS.

Przygotowywanie kluczy CMEK

Zanim utworzysz bazę danych Cloud Firestore chronioną przez klucz CMEK, musisz wykonać te czynności:

  1. Poproś o dostęp do funkcji Cloud Firestore CMEK.
  2. Utwórz (lub pobierz) Cloud Firestore agenta usługi.
  3. Utwórz klucz CMEK.
  4. Skonfiguruj ustawienia uprawnień dla tego klucza.

Wykonaj te czynności w przypadku każdego projektu, który będzie zawierać bazy danych chronione przez klucze CMEK.Cloud Firestore Jeśli później utworzysz nowy klucz CMEK, musisz skonfigurować ustawienia IAM dla tego klucza.

Poproś o dostęp

Przed utworzeniem agenta usługi Cloud Firestore poproś o dostęp do funkcji CMEK, wypełniając ten formularz.

Utwórz agenta usługi Cloud Firestore

Zanim utworzysz klucz CMEK, musisz mieć Cloud Firestore agenta usługi, czyli zarządzane przez Google konto usługi, które Cloud Firestoresłuży do uzyskiwania dostępu do klucza.

Uruchom polecenie services identity create, aby utworzyć agenta usługi, który Cloud Firestore używa do uzyskiwania w Twoim imieniu dostępu do klucza CMEK. To polecenie tworzy konto usługi, jeśli jeszcze nie istnieje, a następnie je wyświetla.

gcloud beta services identity create \
    --service=firestore.googleapis.com \
    --project FIRESTORE_PROJECT

Zastąp FIRESTORE_PROJECT projektem, którego planujesz użyć dla baz danych Cloud Firestore.

Polecenie wyświetla identyfikator agenta usługi, który jest sformatowany jak adres e-mail. Zapisz ciąg znaków adresu e-mail, ponieważ będziesz go używać w kolejnym kroku.

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

Utwórz klucz

Możesz użyć klucza utworzonego bezpośrednio w usłudze Cloud KMS lub klucza zarządzanego zewnętrznie, który udostępniasz za pomocą Cloud External Key Manager.

Lokalizacja klucza Cloud KMS musi być taka sama jak lokalizacja bazy danych Cloud Firestore, z którą będzie używany.

  • W przypadku lokalizacji baz danych regionalnych należy użyć tej samej nazwy lokalizacji dla pęku kluczy, klucza i bazy danych, ponieważ nazwy lokalizacji mają odwzorowanie jeden do jednego.

    Na przykład, jeśli chcesz utworzyć bazę danych chronioną kluczem CMEK w us-west1, utwórz pęk kluczy i wpisz klucz w us-west1.

  • W przypadku lokalizacji baz danych obejmujących wiele regionów użyj nazwy lokalizacji lokalizacji KMS obejmującej wiele regionów:

    • Użyj lokalizacji wieloregionowej Cloud KMS us dla lokalizacji wieloregionowej Cloud Firestore nam5.
    • Użyj lokalizacji wieloregionalnej Cloud KMS europe dla lokalizacji wieloregionalnej Cloud Firestore eur3.

W projekcie Google Cloud, w którym chcesz zarządzać kluczami, wykonaj następujące czynności:

  1. Włącz interfejs Cloud KMS API.

  2. Utwórz brelok i klucz, korzystając z jednej z następujących opcji:

Skonfiguruj ustawienia IAM dla klucza

Konsola

Aby przypisać rolę Cloud KMS do agenta usługi, wykonaj te czynności. Jeśli chcesz uzyskać mniejszą szczegółowość, możesz również przyznać uprawnienia na poziomie klucza lub pęku kluczy.

  1. W konsoli Google Cloud otwórz stronę Uprawnienia.

    Przejdź do strony IAM

  2. Kliknij Dodaj.

  3. Wprowadź identyfikator w formacie e-mail swojego agenta obsługi klienta Cloud Firestore.

  4. Wybierz rolę Szyfrujący/deszyfrujący klucz CryptoKey w usłudze Cloud KMS.

  5. Kliknij Zapisz.

gcloud

Przypisz rolę cloudkms.cryptoKeyEncrypterDecrypter do agenta usługi:

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

Zastąp następujące elementy:

  • KMS_KEY z nazwą przypisaną do klucza.
  • KMS_KEYRING z pękiem kluczy KMS zawierającym klucz.
  • KMS_LOCATION z regionem, w którym znajduje się pęk kluczy.
  • SERVICE_AGENT_EMAIL z identyfikatorem w formacie adresu e-mail agenta usługi, któremu przyznajesz dostęp.
  • KMS_PROJECT z projektem zawierającym klucz.

Terminal powinien wyświetlić odpowiedź podobną do tej:

Updated IAM policy for key KMS_KEY.
bindings:
- members:
- serviceAccount:
service-{project-number}@gcp-sa-firestore.iam.gserviceaccount.com
role: roles/cloudkms.cryptoKeyEncrypterDecrypter

Utwórz bazę danych obsługującą CMEK

Po utworzeniu i skonfigurowaniu kluczy CMEK możesz utworzyć bazę danych chronioną kluczem CMEK. Istniejących baz danych Cloud Firestore chronionych domyślnym szyfrowaniem Google nie można przekonwertować na używanie kluczy CMEK.

Typ szyfrowania i klucz możesz wybrać tylko podczas tworzenia bazy danych z obsługą CMEK.

Konsola

  1. W konsoli Google Cloud otwórz stronę Bazy danych.

    Otwórz stronę Bazy danych

  2. Kliknij Utwórz bazę danych.

  3. Wybierz tryb bazy danych. Kliknij Dalej.

  4. Na stronie Skonfiguruj bazę danych wpisz identyfikator bazy danych.

  5. Wybierz lokalizację.

  6. Kliknij Pokaż opcje szyfrowania, a następnie wybierz Klucz Cloud KMS.

  7. Wybierz lub wpisz nazwę zasobu klucza CMEK, którego chcesz używać w bazie danych.

  8. Lista kluczy jest ograniczona do bieżącego Google Cloud projektu i wybranej lokalizacji bazy danych. Aby użyć klucza z innego Google Cloud projektu, kliknij Przełącz projekt lub Wpisz klucz ręcznie.

  9. Jeśli pojawi się prośba o przyznanie uprawnień do klucza kontu usługi Cloud Firestore, kliknij Przyznaj. Aby utworzyć bazę danych CMEK, Twoje konto usługi Cloud Firestore musi mieć przypisaną rolę cloudkms.cryptoKeyEncrypterDecrypter.

  10. Wybierz reguły zabezpieczeń dla klientów mobilnych i internetowych.

  11. Kliknij Utwórz bazę danych.

Po utworzeniu bazy danych możesz sprawdzić, czy obsługuje ona klucze CMEK, wyświetlając szczegóły bazy danych:

  • Jeśli baza danych jest chroniona przez CMEK, w polu Typ szyfrowania wyświetla się wartość Zarządzane przez klienta, a w polu Klucz szyfrowania znajduje się odpowiedni Cloud KMS i wersja klucza używana do ochrony tej bazy danych.
  • Jeśli baza danych nie jest chroniona przez CMEK, w polu Typ szyfrowania wyświetla się wartość Zarządzane przez Google.

gcloud

Zanim utworzysz bazę danych obsługującą klucze CMEK za pomocą Google Cloud CLI, zainstaluj najnowszą wersję i autoryzuj gcloud CLI. Więcej informacji znajdziesz w artykule Instalowanie interfejsu wiersza poleceń gcloud.

gcloud firestore databases create --location=FIRESTORE_DATABASE_LOCATION \
      --database=DATABASE_ID \
      --kms-key-name=KMS_KEY_NAME \
      --project=FIRESTORE_PROJECT

Zastąp następujące elementy:

  • FIRESTORE_DATABASE_LOCATION z lokalizacją Cloud Firestore bazy danych.
  • DATABASE_ID z identyfikatorem bazy danych
  • KMS_KEY_NAME z nazwą przypisaną do klucza. Użyj pełnej nazwy zasobu klucza w tym formacie:

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

  • FIRESTORE_PROJECT z projektem, aby używać go w bazie danych Cloud Firestore

Interfejs API typu REST

Żądanie HTTP:

POST https://firestore.googleapis.com/v1/projects/{FIRESTORE_PROJECT}/databases

W treści żądania skonfiguruj klucz CMEK w polu cmek_config.kms_key_name.

Ustaw pełny identyfikator zasobu klucza Cloud KMS. Dozwolony jest tylko klucz w tej samej lokalizacji co ta baza danych.

Ta wartość powinna być identyfikatorem zasobu klucza Cloud KMS w formacie projects/{KMS_PROJECT}/locations/{KMS_LOCATION}/keyRings/{KMS_KEYRING_ID}/cryptoKeys/{KMS_KEY_ID}

Więcej informacji o innych polach znajdziesz na database create stronie.

Przykładowe żądanie:

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"
  }
}'

wiersz poleceń Firebase

Aby utworzyć bazę danych z włączonym szyfrowaniem CMEK, użyj pola Nazwa klucza KMS. Jeśli nie określisz parametru --kms-key-name, Cloud Firestore domyślnie utworzy bazę danych inną niż 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

Zastąp następujące elementy:

  • DATABASE_ID z identyfikatorem bazy danych.
  • LOCATION z lokalizacją bazy danych.
  • KMS_PROJECT z projektem zawierającym klucz CMEK
  • KMS_LOCATION z lokalizacją zawierającą klucz CMEK i pęk kluczy
  • KMS_KEYRING_ID identyfikatorem pierścienia kluczy CMEK;
  • FIRESTORE_PROJECT z projektem, aby używać go w bazie danych Cloud Firestore

Sprawdź, czy Cloud Firestore baza danych jest chroniona za pomocą wiersza poleceń Firebase:

firebase firestore:databases:get DATABASE_ID --project FIRESTORE_PROJECT

W wiadomości z odpowiedzią pojawią się te informacje o kluczu CMEK:

  • Pole Nazwa klucza KMS zawiera pełną nazwę zasobu klucza, która jest używana do szyfrowania bazy danych Cloud Firestore CMEK.
  • Pole Aktywne wersje klucza zawiera listę wszystkich wersji klucza, które są obecnie używane przez tę bazę danych CMEK. Podczas rotacji kluczy możesz mieć kilka aktywnych wersji klucza.

Terraform

Aby utworzyć bazę danych obsługującą CMEK, użyj zasobu google_firestore_database. Więcej informacji i przykładów znajdziesz w artykule 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"
  }
}

Zastąp następujące elementy:

  • FIRESTORE_PROJECT z projektem, aby używać go w bazie danych Cloud Firestore
  • DATABASE_ID z ID bazy danych
  • FIRESTORE_DATABASE_LOCATION z lokalizacją Cloud Firestore dla bazy danych
  • DATABASE_TYPE z FIRESTORE_NATIVE dla trybu natywnego lub DATASTORE_MODE dla trybu magazynu danych.
  • KMS_KEY_NAME z nazwą przypisaną do klucza. Użyj pełnej nazwy zasobu dla klucza w formacie:

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

Dostęp do bazy danych chronionej przez klucz CMEK

Wszystkie operacje odczytu, zapisu i zapytania wysyłane do bazy danych chronionej przez klucz CMEK powinny działać tak samo jak w przypadku bazy danych szyfrowanej domyślnie przez Google. Na przykład nie musisz podawać klucza dla każdego żądania.

Przywracanie bazy danych chronionej kluczem CMEK

Przed przywróceniem bazy danych chronionej kluczem CMEK z kopii zapasowej:

  • Zdecyduj, czy chcesz przywrócić bazę danych do szyfrowania CMEK, do domyślnego szyfrowania Google (bez CMEK) czy do tego samego szyfrowania co w przypadku kopii zapasowej.
  • Przygotuj klucz (wersję podstawową) i wersję klucza, których użyto do zaszyfrowania kopii zapasowej. Włącz zarówno klucz, jak i wersję klucza.

gcloud

Przywracanie bazy danych chronionej kluczem CMEK do szyfrowania CMEK

Aby przywrócić szyfrowanie CMEK, uruchom polecenie gcloud firestore databases restore z opcjonalnymi flagami encryption-typekms-key-name, aby skonfigurować typ szyfrowania przywróconej bazy danych. Jeśli nie określisz typu szyfrowania, przywrócona baza danych będzie używać tej samej konfiguracji szyfrowania co kopia zapasowa.

  gcloud firestore databases restore
  --encryption-type=customer-managed-encryption
  --kms-key-name=KMS_KEY_NAME

Zastąp KMS_KEY_NAME nazwą przypisaną do klucza. Użyj pełnej nazwy zasobu dla klucza w następującym formacie:

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

Przywracanie bazy danych chronionej kluczem CMEK do domyślnego szyfrowania

Aby przywrócić domyślne szyfrowanie Google (bez CMEK), ustaw flagę encryption-type w ten sposób:

  gcloud firestore databases restore
  --encryption-type=google-default-encryption

Przywróć bazę danych chronioną kluczem CMEK do tego samego typu szyfrowania, co kopia zapasowa

Aby przywrócić ten sam typ szyfrowania, co w kopii zapasowej, ustaw flagę encryption-type w następujący sposób:

  gcloud firestore databases restore --encryption-type=use-source-encryption

wiersz poleceń Firebase

Przywracanie bazy danych chronionej kluczem CMEK do szyfrowania CMEK

Aby przywrócić szyfrowanie CMEK, użyj opcjonalnych flag encryption-type i kms-key-name. Jeśli nie określisz typu szyfrowania, przywrócona baza danych użyje tej samej konfiguracji szyfrowania, co kopia zapasowa.

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

Zastąp następujące elementy:

  • DATABASE_ID z ID Twojej bazy danych
  • FIRESTORE_PROJECT z projektem do wykorzystania w bazie danych Cloud Firestore
  • FIRESTORE_LOCATION z lokalizacją Twojej bazy danych Cloud Firestore
  • BACKUP_ID z identyfikatorem kopii zapasowej
  • KMS_PROJECT z projektem zawierającym klucz CMEK
  • KMS_LOCATION z lokalizacją zawierającą klucz CMEK i pęk kluczy
  • KMS_KEYRING_ID z identyfikatorem Twojego pęku kluczy CMEK

Potwierdź, że przywrócona baza danych Cloud Firestore jest zaszyfrowana kluczem CMEK:

firebase firestore:databases:get DATABASE_ID --project FIRESTORE_PROJECT

Przywracanie bazy danych chronionej kluczem CMEK do domyślnego szyfrowania

Aby przywrócić domyślne szyfrowanie Google (bez CMEK), ustaw flagę encryption-type w ten sposób:

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

Zastąp następujące elementy:

  • DATABASE_ID z ID Twojej bazy danych
  • FIRESTORE_PROJECT z projektem do wykorzystania w bazie danych Cloud Firestore
  • FIRESTORE_LOCATION z lokalizacją Twojej bazy danych Cloud Firestore
  • BACKUP_ID z identyfikatorem kopii zapasowej

Przywróć bazę danych chronioną kluczem CMEK do tego samego typu szyfrowania, co kopia zapasowa

Aby przywrócić dane z kopii zapasowej z tym samym typem szyfrowania, ustaw flagę encryption-type w ten sposób:

firebase firestore:databases:restore \
--database DATABASE_IDD \
--backup 'projects/FIRESTORE_PROJECT/locations/FIRESTORE_LOCATION/backups/BACKUP_ID' \
--encryption-type USE_SOURCE_ENCRYPTION

Zastąp następujące elementy:

  • DATABASE_ID z ID Twojej bazy danych
  • FIRESTORE_PROJECT z projektem do wykorzystania w bazie danych Cloud Firestore
  • FIRESTORE_LOCATION z lokalizacją Twojej bazy danych Cloud Firestore
  • BACKUP_ID z identyfikatorem kopii zapasowej.

Klonowanie bazy danych chronionej kluczem CMEK

Zanim sklonujesz bazę danych chronioną za pomocą klucza CMEK:

  • Zdecyduj, czy chcesz sklonować bazę danych do szyfrowania CMEK, do domyślnego szyfrowania Google (bez CMEK) czy do tego samego szyfrowania co źródłowa baza danych.
  • Przygotuj klucz (wersję podstawową) i wersję klucza, której użyto do zaszyfrowania bazy danych źródłowej. Włącz zarówno klucz, jak i wersję klucza.

gcloud

Klonowanie bazy danych chronionej za pomocą klucza CMEK w celu szyfrowania CMEK

Aby sklonować bazę danych do szyfrowania CMEK, uruchom polecenie gcloud firestore databases clone z opcjonalnymi flagami encryption-typekms-key-name, aby skonfigurować typ szyfrowania sklonowanej bazy danych. Jeśli nie określisz typu szyfrowania, sklonowana baza danych będzie używać tej samej konfiguracji szyfrowania co źródłowa baza danych.

gcloud firestore databases clone \
--encryption-type=customer-managed-encryption \
--kms-key-name=KMS_KEY_NAME

Zastąp KMS_KEY_NAME nazwą przypisaną do klucza. Użyj pełnej nazwy zasobu klucza w tym formacie:

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

Klonowanie bazy danych chronionej za pomocą klucza CMEK do domyślnego szyfrowania

Aby sklonować do domyślnego szyfrowania Google (bez CMEK), ustaw flagę encryption-type w ten sposób:

gcloud firestore databases clone \
--encryption-type=google-default-encryption

Klonowanie bazy danych chronionej za pomocą klucza CMEK do tego samego typu szyfrowania co źródłowa baza danych

Aby sklonować bazę danych z tym samym typem szyfrowania co źródłowa baza danych, ustaw flagę encryption-type w ten sposób:

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

Jest to też działanie domyślne, jeśli parametr --encryption-type nie jest określony.

wiersz poleceń Firebase

Klonowanie bazy danych chronionej za pomocą klucza CMEK w celu szyfrowania CMEK

Aby sklonować bazę danych do szyfrowania CMEK, uruchom polecenie firebase firestore:databases:clone z opcjonalnymi flagami encryption-typekms-key-name, aby skonfigurować typ szyfrowania sklonowanej bazy danych. Jeśli nie określisz typu szyfrowania, sklonowana baza danych będzie używać tej samej konfiguracji szyfrowania co źródłowa baza danych.

firebase firestore:databases:clone \
SOURCE_DATABASE \
DESTINATION_DATABASE \
--encryption-type=CUSTOMER_MANAGED_ENCRYPTION \
--kms-key-name=KMS_KEY_NAME

Zastąp KMS_KEY_NAME nazwą przypisaną do klucza. Użyj pełnej nazwy zasobu dla klucza w następującym formacie:

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

Klonowanie bazy danych chronionej protokołem CMEK do domyślnego szyfrowania

Aby sklonować do domyślnego szyfrowania Google'a (bez CMEK), ustaw flagę encryption-type w następujący sposób:

firebase firestore:databases:clone \
SOURCE_DATABASE \
DESTINATION_DATABASE \
--encryption-type=GOOGLE_DEFAULT_ENCRYPTION

Klonuj bazę danych chronioną kluczem CMEK, stosując ten sam typ szyfrowania, co baza danych źródłowa

Aby sklonować bazę danych z tym samym typem szyfrowania co źródłowa baza danych, ustaw flagę encryption-type w ten sposób:

firebase firestore:databases:clone \
SOURCE_DATABASE \
DESTINATION_DATABASE \
--encryption-type=USE_SOURCE_ENCRYPTION

Jest to również domyślne zachowanie, jeśli --encryption-type nie jest określony.

Zobacz klucz w użyciu

gcloud

Aby potwierdzić konfigurację CMEK bazy danych, możesz użyć polecenia databases describe gcloud CLI:

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

W polu cmekConfig w odpowiedzi powinny znaleźć się informacje CMEK podobne do poniższego:

      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

Odpowiedź zawiera te informacje:

  • kmsKeyName: pełna nazwa zasobu klucza, który służy do szyfrowania bazy danych chronionej kluczem CMEK.
  • activeKeyVersion: lista wszystkich wersji klucza aktualnie używanych przez bazę danych chronioną kluczem CMEK. Podczas rotacji kluczy możesz mieć kilka aktywnych wersji klucza. Podczas rotacji kluczy muszą być dostępne zarówno stara, jak i nowa wersja klucza. Nie wyłączaj starej wersji klucza, dopóki nie będzie ona już wyświetlana w polu activeKeyVersion.

Interfejs API typu REST

Żądanie HTTP:

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

W treści żądania skonfiguruj klucz CMEK w polu cmek_config.kms_key_name. Ustaw pełny identyfikator zasobu klucza Cloud KMS. Dozwolony jest tylko klucz w tej samej lokalizacji co ta baza danych.

Ta wartość powinna być identyfikatorem zasobu klucza Cloud KMS w formacie projects/{KMS_PROJECT}/locations/{KMS_LOCATION}/keyRings/{KMS_KEYRING_ID}/cryptoKeys/{KMS_KEY_ID}

Aby uzyskać więcej informacji na temat innych pól, zobaczdatabase create strona.

Przykładowe żądanie i odpowiedź:

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"
    ]
  },
  ……
}

Wyłącz klucz

Aby wyłączyć klucz powiązany z bazą danych, wykonaj te czynności:

  1. Wyświetlanie wersji kluczy używanych w bazie danych
  2. Wyłącz te używane wersje klucza.
  3. Poczekaj, aż zmiana zostanie wprowadzona, i sprawdź, czy dane nie są już dostępne. Zmiany zazwyczaj wchodzą w życie w ciągu kilku minut, ale ich wprowadzenie może potrwać do 3 godzin.

Gdy klucz używany przez bazę danych zostanie wyłączony, należy spodziewać się wyjątku FAILED_PRECONDITION z dodatkowymi szczegółami w komunikacie o błędzie, na przykład:

{
  "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)"
      }
    ]
  }
}

Włącz klucz

Aby ponownie włączyć klucz skojarzony z bazą danych, wykonaj następujące czynności:

  1. Wyświetlanie wersji klucza używanych w bazie danych
  2. Włącz te używane wersje klucza
  3. Poczekaj, aż zmiana zostanie wprowadzona, i sprawdź, czy dane nie są już dostępne. Zmiany zwykle zaczynają obowiązywać w ciągu kilku minut, ale ich zastosowanie może potrwać do 3 godzin.

Wyświetlanie dzienników audytu dla klucza Cloud KMS

Zanim włączysz dzienniki audytu dostępu do danych Cloud KMS, powinieneś zapoznać się z dziennikami audytu Cloud.

Dzienniki audytu dostępu do danych Cloud KMS pokazują, kiedy usługa Cloud Firestore lub inne usługi skonfigurowane do używania klucza CMEK wykonują wywołania szyfrowania/odszyfrowywania w Cloud KMS. Cloud Firestore nie wysyła wywołania szyfrowania/odszyfrowywania przy każdym żądaniu danych, ale utrzymuje moduł sprawdzający, który okresowo sprawdza klucz. Wyniki sondy pojawią się w dziennikach kontrolnych.

Dzienniki kontrolne możesz skonfigurować i z nimi wchodzić w interakcje w konsoli Google Cloud:

  1. Upewnij się, że w Twoim projekcie rejestrowanie jest włączone dla interfejsu API Cloud KMS.

  2. Przejdź do Cloud Logging w konsoli Google Cloud.

    Otwórz Cloud Logging

  3. Ogranicz wpisy dziennika do klucza Cloud KMS, dodając do narzędzia do tworzenia zapytań te wiersze:

    resource.type="cloudkms_cryptokey"
    resource.labels.key_ring_id = KMS_KEYRING
    resource.labels.crypto_key_id = KMS_KEY
    resource.labels.location=KMS_LOCATION
    

    Zastąp następujące elementy:

    • KMS_KEY z nazwą klucza CMEK.
    • KMS_KEYRING z brelokiem KMS zawierającym klucz
    • KMS_LOCATION z lokalizacją klucza i pęku kluczy.

    Dziennik zawiera kilka wpisów co około 5 minut dla każdej bazy danych. Wpisy w logu wyglądają podobnie do tych przykładów:

    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"
    

Więcej informacji o interpretowaniu dzienników kontrolnych znajdziesz w artykule Omówienie dzienników kontrolnych.

Konfigurowanie zasady organizacji dotyczącej kluczy CMEK

Aby określić wymagania dotyczące zgodności szyfrowania w Cloud Firestorebazach danych w organizacji, użyj ograniczenia zasad organizacji dotyczących CMEK.

Wymaganie ochrony za pomocą klucza CMEK

Skonfiguruj constraints/gcp.restrictNonCmekServices tak, aby wymagał CMEK do utworzenia bazy danych Cloud Firestore. Ustaw ograniczenie na deny i dodaj firestore.googleapis.com do listy odrzuconych, na przykład:

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

Zastąp FIRESTORE_PROJECT projektem, do którego chcesz ograniczyć dostęp.

Więcej informacji o konfigurowaniu zasad organizacji znajdziesz w artykule Tworzenie i edytowanie zasad.

Gdy zasady zaczną obowiązywać, otrzymasz FAILED_PRECONDITION wyjątek i komunikat o błędzie, jeśli spróbujesz utworzyć bazę danych bez klucza CMEK w projekcie, którego dotyczą zasady. Wyjątek może wyglądać np. tak:

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

Ograniczanie użycia kluczy CMEK

Aby ograniczyć klucze Cloud KMS używane do zabezpieczenia za pomocą klucza CMEK, skonfiguruj ograniczenie constraints/gcp.restrictCmekCryptoKeyProjects.

W przypadku ograniczenia listy akceptowane wartości to wskaźniki hierarchii zasobów (np. projects/PROJECT_ID, under:folders/FOLDER_IDunder:organizations/ORGANIZATION_ID). Aby użyć tego ograniczenia, skonfiguruj listę wskaźników hierarchii zasobów i ustaw ograniczenie na Zezwalaj. Ta konfiguracja ogranicza obsługiwane usługi tak, że klucze CMEK można wybierać wyłącznie z wymienionych projektów, folderów i organizacji. Żądania utworzenia zasobów chronionych kluczem CMEK w skonfigurowanych usługach nie powiodą się bez klucza Cloud Firestore z jednego z dozwolonych zasobów.

Poniższy przykład zezwala na używanie wyłącznie kluczy z ALLOWED_KEY_PROJECT_ID w przypadku baz danych chronionych kluczem CMEK w określonym projekcie:

gcloud resource-manager org-policies allow gcp.restrictCmekCryptoKeyProjects \
under:projects/ALLOWED_KEY_PROJECT_ID \
--project=FIRESTORE_PROJECT

Po wejściu w życie zasad otrzymasz wyjątek FAILED_PRECONDITION i komunikat o błędzie, jeśli naruszysz ograniczenie. Wyjątek wygląda następująco:

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

Co dalej?