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

Na tej stronie znajdziesz informacje o wykonywaniu zadań związanych z kluczami szyfrowania zarządzanymi przez klienta (CMEK) w usłudze Cloud Firestore. Więcej informacji o kluczach CMEK, w tym o tym, kiedy i dlaczego warto je włączyć, znajdziesz w dokumentacji Cloud KMS.

Przygotuj klucze CMEK

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

  1. Wyślij prośbę o dostęp do funkcji CMEK Cloud Firestore.
  2. Utwórz (lub pobierz) agenta usługi Cloud Firestore.
  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ć chronione za pomocą CMEK bazy danych Cloud Firestore. Jeśli później utworzysz nowy klucz CMEK, musisz skonfigurować dla niego ustawienia IAM.

Poproś o dostęp

Zanim utworzysz Cloud Firestore agenta obsługi klienta, poproś o dostęp do funkcji CMK, wypełniając ten formularz.

Tworzenie agenta usługi Cloud Firestore

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

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

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

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

Polecenie wyświetla identyfikator agenta usługi, który jest sformatowany jak adres e-mail. Zapisz ciąg znaków e-maila wyjściowego, ponieważ będzie on potrzebny w następnym kroku.

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

Utwórz klucz

Możesz użyć klucza utworzonego bezpośrednio w Cloud KMS lub klucza zarządzanego zewnętrznie, który udostępnisz za pomocą menedżera zewnętrznych kluczy Cloud.

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

  • W przypadku regionalnych lokalizacji baz danych użyj tej samej nazwy lokalizacji dla klucza, klucza głównego i bazy danych, ponieważ nazwy lokalizacji są mapowane jeden do jednego.

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

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

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

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

  1. Włącz interfejs Cloud KMS API.

  2. Utwórz pęk kluczy i klucz, korzystając z jednej z tych opcji:

Konfigurowanie ustawień uprawnień klucza

Konsola

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

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

    Otwórz stronę Uprawnienia

  2. Kliknij Dodaj.

  3. Wpisz identyfikator w formacie adresu e-mail dla Cloud Firestore agenta usługi.

  4. Wybierz rolę szyfratora/deszyfratora klucza CryptoKey Cloud KMS.

  5. Kliknij Zapisz.

gcloud

Przypisz rolę cloudkms.cryptoKeyEncrypterDecrypter do swojego 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 peczkiem kluczy KMS zawierającym klucz
  • KMS_LOCATION z regionem zawierającym 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

Tworzenie bazy danych obsługującej klucze CMEK

Po utworzeniu i skonfigurowaniu kluczy CMEK możesz utworzyć bazę danych chronioną za pomocą klucza CMEK. Dotychczasowych baz danych Cloud Firestore chronionych przez domyślne szyfrowanie Google nie można przekształcić w bazy danych korzystające z kluczy CMEK.

Typ i klucz szyfrowania możesz wybrać tylko podczas tworzenia bazy danych z włączoną funkcją 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 projektu Google Cloud i wybranej przez Ciebie lokalizacji bazy danych. Aby użyć klucza z innego projektu Google Cloud, kliknij Przełącz projekt lub Wpisz klucz ręcznie.

  9. Jeśli pojawi się prośba o przyznanie uprawnień klucza do konta usługi Cloud Firestore, kliknij Przyznaj. Aby utworzyć bazę danych CMEK, musisz przypisać roli Cloud Firestore na koncie usługi 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. Aby to zrobić, przejdź do sekcji Szczegóły bazy danych:

  • Jeśli baza danych jest chroniona za pomocą klucza szyfrowania zarządzanego przez klienta, pole Typ szyfrowania będzie wyświetlać wartość Zarządzane przez klienta, a pole Klucz szyfrowania będzie zawierać odpowiedni klucz Cloud KMS i wersję klucza używaną do ochrony tej bazy danych.
  • Jeśli baza danych nie jest chroniona za pomocą CMEK, pole Typ szyfrowania będzie wyświetlać się jako Zarządzane przez Google.

gcloud

Zanim utworzysz bazę danych obsługującą 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 dla 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, którego chcesz użyć do bazy 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 na pełny identyfikator zasobu klucza Cloud KMS. Dozwolony jest tylko klucz znajdujący się w tym samym miejscu 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 pozostałych polach znajdziesz na stronie database create.

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łączoną funkcją 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ż CMK.

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ą Twojej 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 z identyfikatorem kółka klucza CMEK
  • FIRESTORE_PROJECT z projektem, którego chcesz użyć do bazy danych Cloud Firestore

Sprawdź, czy baza danych Cloud Firestore 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 CMEK:

  • Pole Nazwa klucza KMS zawiera pełną nazwę zasobu klucza, który służy do szyfrowania bazy danych Cloud Firestore CMEK.
  • Pole Aktywne wersje klucza zawiera listę wszystkich wersji klucza używanych obecnie przez tę bazę danych CMEK. Podczas rotacji kluczy może być aktywnych kilka wersji klucza.

Terraform

Aby utworzyć bazę danych z włączonym CMEK, użyj zasobu google_firestore_database. Więcej informacji i przykładów znajdziesz w sekcji 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, którego chcesz użyć do bazy danych Cloud Firestore
  • DATABASE_ID z identyfikatorem bazy danych
  • FIRESTORE_DATABASE_LOCATION z lokalizacją Cloud Firestore dla bazy danych
  • DATABASE_TYPE z wartością FIRESTORE_NATIVE dla trybu natywnego lub DATASTORE_MODE dla trybu Datastore.
  • KMS_KEY_NAME z nazwą przypisaną do klucza. Użyj pełnej nazwy zasobu klucza w formacie:

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

Dostęp do bazy danych chronionej za pomocą klucza CMEK

Wszystkie operacje odczytu, zapisu i wyszukiwania wysyłane do bazy danych chronionej za pomocą klucza CMEK powinny działać tak samo jak w przypadku domyślnie zaszyfrowanej bazy danych Google. Nie musisz na przykład podawać klucza dla każdego żądania.

Przywracanie bazy danych chronionej za pomocą klucza CMEK

Zanim przywrócisz z kopii zapasowej bazę danych chronioną za pomocą klucza CMEK:

  • Zdecyduj, czy chcesz przywrócić bazę danych z szyfrowaniem CMEK, domyślnym szyfrowaniem Google (nie CMEK) czy tym samym szyfrowaniem co kopia zapasowa.
  • Przygotuj klucz (primary-version) i wersję klucza, której użyto do zaszyfrowania kopii zapasowej. Włącz zarówno klucz, jak i wersję klucza.

gcloud

Przywracanie bazy danych chronionej za pomocą klucza CMEK do szyfrowania CMEK

Aby przywrócić szyfrowanie CMEK, uruchom polecenie gcloud firestore databases restore z opcjonalnymi flagami encryption-type i kms-key-name, aby skonfigurować typ szyfrowania dla przywracanej 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ą kluczowi. Użyj pełnej nazwy zasobu klucza w tym formacie:

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

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

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

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

Przywracanie bazy danych chronionej za pomocą klucza CMEK przy użyciu tego samego typu szyfrowania co kopia zapasowa

Aby przywrócić ten sam typ szyfrowania co kopia zapasowa, ustaw flagę encryption-type w ten sposób:

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

wiersz poleceń Firebase

Przywracanie bazy danych chronionej za pomocą klucza CMEK do szyfrowania CMEK

Aby przywrócić szyfrowanie CMEK, użyj opcjonalnej flagi encryption-type i kms-key-name. Jeśli nie określisz typu szyfrowania, przywracana 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 identyfikatorem bazy danych
  • FIRESTORE_PROJECT z projektem, którego chcesz użyć do bazy danych Cloud Firestore
  • FIRESTORE_LOCATION z lokalizacją 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 kółka klucza CMEK

Sprawdź, czy przywrócona baza danych Cloud Firestore jest szyfrowana za pomocą kluczy CMEK:

firebase firestore:databases:get DATABASE_ID --project FIRESTORE_PROJECT

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

Aby przywrócić domyślne szyfrowanie Google (inne niż 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 identyfikatorem bazy danych
  • FIRESTORE_PROJECT z projektem, którego chcesz użyć do bazy danych Cloud Firestore
  • FIRESTORE_LOCATION z lokalizacją bazy danych Cloud Firestore
  • BACKUP_ID z identyfikatorem kopii zapasowej

Przywracanie bazy danych chronionej za pomocą klucza CMEK przy użyciu tego samego typu szyfrowania co kopia zapasowa

Aby przywrócić ten sam typ szyfrowania co kopia zapasowa, 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 identyfikatorem bazy danych
  • FIRESTORE_PROJECT z projektem, którego chcesz użyć do bazy danych Cloud Firestore
  • FIRESTORE_LOCATION z lokalizacją bazy danych Cloud Firestore
  • BACKUP_ID z identyfikatorem kopii zapasowej

Wyświetlanie używanego klucza

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 pojawić się informacje CMEK podobne do tych:

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 za pomocą CMEK.
  • activeKeyVersion: lista wszystkich wersji klucza używanych obecnie przez bazę danych chronioną za pomocą klucza CMEK. Podczas rotacji kluczy może być aktywnych kilka wersji klucza. Podczas rotacji kluczy muszą być dostępne zarówno stara, jak i nowa wersja klucza. Nie wyłączaj starszej wersji klucza, dopóki nie zniknie ona z pola 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 na pełny identyfikator zasobu klucza Cloud KMS. Dozwolony jest tylko klucz znajdujący się w tym samym miejscu 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 pozostałych polach znajdziesz na stronie database create.

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łączanie klucza

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

  1. Wyświetl wersje kluczy używane w bazie danych.
  2. Wyłącz używane wersje klucza.
  3. Poczekaj, aż zmiana zacznie obowiązywać, i sprawdź, czy dane są już niedostępne. Zmiany zwykle zaczynają obowiązywać w ciągu kilku minut, ale ich zastosowanie może potrwać do 3 godzin.

Jeśli klucz używany przez bazę danych jest wyłączony, otrzymasz wyjątek FAILED_PRECONDITION z dodatkowymi informacjami 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łączanie klucza

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

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

Wyświetlanie dzienników kontrolnych klucza Cloud KMS

Zanim włączysz logi kontrolne dostępu do danych w usłudze Cloud KMS, zapoznaj się z logami kontrolnymi Cloud.

Dzienniki kontroli dostępu do danych Cloud KMS wskazują, kiedy Cloud Firestore lub inne usługi skonfigurowane do używania klucza szyfrowania zarządzanego przez klienta (CMEK) wykonują wywołania szyfrowania/odszyfrowania do Cloud KMS. Cloud Firestore nie wysyła wywołania szyfrowania/odszyfrowywania przy każdym żądaniu danych, ale zamiast tego utrzymuje program poller, który okresowo sprawdza klucz. Wyniki sondowania są widoczne w dziennikach kontrolnych.

Dzienniki kontrolne możesz konfigurować i z nimi pracować w konsoli Google Cloud:

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

  2. W konsoli Google Cloud otwórz Cloud Logging.

    Otwórz stronę Cloud Logging

  3. Ogranicz wpisy dziennika do klucza Cloud KMS, dodając do Kreatora 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 peczkiem kluczy KMS zawierającym klucz
    • KMS_LOCATION z lokalizacją klucza i pęku kluczy

    Wpisów w dzienniku jest kilka na każdą bazę danych co około 5 minut. Wpisy w logu wyglądają tak:

    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 interpretacji 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 z szyfrowaniem w przypadku baz danych Cloud Firestore w Twojej organizacji, użyj ograniczenia zasad organizacji dotyczącego klucza szyfrowania zarządzanego przez klienta.

Wymagaj zabezpieczenia za pomocą klucza CMEK

Skonfiguruj constraints/gcp.restrictNonCmekServices tak, aby wymagało ono kluczy CMEK do tworzenia 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 nazwą projektu, który chcesz ograniczyć.

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

Gdy zasada zacznie obowiązywać, jeśli spróbujesz utworzyć bazę danych bez kluczy CMEK w ramach danego projektu, zobaczysz wyjątek FAILED_PRECONDITION i komunikat o błędzie. Na przykład wyjątek wygląda 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 ochrony za pomocą klucza CMEK, skonfiguruj ograniczenie constraints/gcp.restrictCmekCryptoKeyProjects.

Jako ograniczenie listy akceptowane wartości to wskaźniki hierarchii zasobów (np. projects/PROJECT_ID, under:folders/FOLDER_ID i under: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, aby klucze CMEK można było wybierać tylko z wymienionych projektów, folderów i organizacji. Prośby o utworzenie zasobów chronionych kluczem CMEK w skonfigurowanych usługach nie będą realizowane bez klucza Cloud Firestore z jednego z dozwolonych zasobów.

W tym przykładzie zezwala się tylko na klucze z ALLOWED_KEY_PROJECT_ID w przypadku baz danych chronionych za pomocą klucza 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 oraz komunikat o błędzie, jeśli naruszysz ograniczenie. Wyjątek wygląda tak:

{
  "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?