Vom Kunden verwaltete Verschlüsselungsschlüssel (Customer Managed Encryption Keys, CMEK) verwenden

Diese Seite beschreibt, wie Aufgaben im Zusammenhang mit kundenseitig verwalteten Verschlüsselungsschlüsseln (CMEK) für Cloud Firestore durchgeführt werden. Weitere Informationen zu CMEK und deren Aktivierung finden Sie in der Cloud KMS-Dokumentation.

CMEK-Schlüssel vorbereiten

Bevor Sie eine CMEK-geschützte Cloud Firestore-Datenbank erstellen können, müssen Sie die folgenden Schritte ausführen:

  1. Zugriff auf die CMEK-Funktion für Cloud Firestore anfordern
  2. Cloud Firestore-Dienst-Agent erstellen (oder abrufen)
  3. Erstellen Sie einen CMEK-Schlüssel.
  4. Konfigurieren Sie die IAM-Einstellungen für diesen Schlüssel.

Führen Sie diese Schritte für jedes Projekt durch, das CMEK-geschützte Cloud Firestore-Datenbanken enthalten soll. Wenn Sie später einen neuen CMEK-Schlüssel erstellen, müssen Sie die IAM-Einstellungen für diesen Schlüssel konfigurieren.

Zugriff anfordern

Bevor Sie einen Cloud Firestore-Dienstagenten erstellen, fordern Sie Zugriff auf die CMEK-Funktion an, indem Sie dieses Formular ausfüllen.

Erstellen Sie einen Cloud Firestore-Dienstagenten

Zum Erstellen eines CMEK-Schlüssels benötigen Sie einen Cloud Firestore-Dienst-Agent. Dies ist ein von Google verwaltetes Dienstkonto, das von Cloud Firestore für den Zugriff auf den Schlüssel verwendet wird.

Führen Sie den Befehl services identity create aus, um den Dienst-Agent zu erstellen, den Cloud Firestore für den Zugriff auf den CMEK-Schlüssel in Ihrem Namen verwendet. Mit diesem Befehl wird das Dienstkonto erstellt, falls es noch nicht vorhanden ist, und es wird angezeigt.

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

Ersetzen Sie FIRESTORE_PROJECT durch das Projekt, das Sie für Ihre Cloud Firestore-Datenbanken verwenden möchten.

Der Befehl zeigt die Dienst-Agent-ID an, die wie eine E-Mail-Adresse formatiert ist. Zeichnen Sie den Ausgabe-E-Mail-String auf, da Sie ihn in einem späteren Schritt benötigen.

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

Schlüssel erstellen

Sie können einen Schlüssel verwenden, der direkt in Cloud KMS erstellt wurde, oder einen extern verwalteten Schlüssel, den Sie mit Cloud External Key Manager zur Verfügung stellen.

Der Speicherort des Cloud KMS-Schlüssels muss mit dem Speicherort der Cloud Firestore-Datenbank übereinstimmen, mit der er verwendet wird.

  • Verwenden Sie für regionale Datenbankstandorte denselben Standortnamen für Schlüsselbund, Schlüssel und Datenbank, da die Standortnamen eine Eins-zu-eins-Zuordnung haben.

    Wenn Sie beispielsweise eine CMEK-geschützte Datenbank in us-west1 erstellen möchten, erstellen Sie einen Schlüsselbund und einen Schlüssel in us-west1.

  • Verwenden Sie für multiregionale Datenbankstandorte den Standortnamen des multiregionalen KMS-Standorts:

    • Verwenden Sie den multiregionalen Cloud KMS-Standort us für den multiregionalen Standort Cloud Firestore nam5.
    • Verwenden Sie den multiregionalen Cloud KMS-Standort europe für den multiregionalen Standort Cloud Firestore eur3.

Führen Sie im Google Cloud-Projekt, in dem Sie Ihre Schlüssel verwalten möchten, die folgenden Schritte aus:

  1. Aktivieren Sie die Cloud KMS API.

  2. Erstellen Sie einen Schlüsselbund und einen Schlüssel mit einer der folgenden Optionen:

IAM-Einstellungen für den Schlüssel konfigurieren

Console

So weisen Sie Ihrem Dienst-Agent eine Cloud KMS-Rolle zu. Sie können auch eine Berechtigung auf Schlüssel- oder Schlüsselbundebene gewähren, wenn Sie einen niedrigeren Detaillierungsgrad benötigen.

  1. Öffnen Sie in der Google Cloud Console die Seite IAM.

    Zur Seite "IAM"

  2. Klicken Sie auf Hinzufügen.

  3. Geben Sie die wie eine E‑Mail-Adresse formatierte ID für den Cloud Firestore-Dienst-Agent ein.

  4. Wählen Sie die Rolle Cloud KMS CryptoKey-Verschlüsseler/Entschlüsseler aus.

  5. Klicken Sie auf Speichern.

gcloud

Weisen Sie Ihrem Dienst-Agent die Rolle cloudkms.cryptoKeyEncrypterDecrypter zu:

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

Ersetzen Sie Folgendes:

  • KMS_KEY durch den Namen, den Sie dem Schlüssel zugewiesen haben
  • KMS_KEYRING durch den KMS-Schlüsselbund, der den Schlüssel enthält
  • KMS_LOCATION durch die Region, die den Schlüsselbund enthält
  • SERVICE_AGENT_EMAIL durch die wie eine E-Mail-Adresse formatierte Kennzeichnung für den Dienst-Agent, dem Sie Zugriff gewähren
  • KMS_PROJECT durch das Projekt, das den Schlüssel enthält

Im Terminal sollte eine Antwort wie die folgende angezeigt werden:

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

Erstellen Sie eine CMEK-fähige Datenbank

Nachdem Ihre CMEK-Schlüssel erstellt und konfiguriert wurden, können Sie eine CMEK-geschützte Datenbank erstellen. Vorhandene Cloud Firestore-Datenbanken, die durch die Standardverschlüsselung von Google geschützt werden, können nicht für die Verwendung von CMEK konvertiert werden.

Sie können einen Verschlüsselungstyp und einen Schlüssel nur auswählen, wenn Sie eine CMEK-fähige Datenbank erstellen.

Console

  1. Rufen Sie in der Google Cloud Console die Seite Datenbanken auf.

    Gehe zur Datenbankseite

  2. Klicken Sie auf Datenbank erstellen.

  3. Wählen Sie den Datenbankmodus aus. Klicken Sie auf Weiter.

  4. Geben Sie auf der Seite Datenbank konfigurieren eine Datenbank-ID ein.

  5. Wählen Sie eine Zielregion aus.

  6. Klicken Sie auf Verschlüsselungsoptionen anzeigen und wählen Sie dann Cloud KMS-Schlüssel aus.

  7. Wählen Sie den Ressourcennamen für den CMEK-Schlüssel aus, den Sie für die Datenbank verwenden möchten, oder geben Sie ihn ein.

  8. Die Liste der Schlüssel ist auf das aktuelle Google Cloud-Projekt und den von Ihnen ausgewählten Datenbankstandort beschränkt. Wenn Sie einen Schlüssel aus einem anderen Google Cloud-Projekt verwenden möchten, klicken Sie auf Projekt wechseln oder Schlüssel manuell eingeben.

  9. Wenn Sie aufgefordert werden, dem Cloud Firestore-Dienstkonto die Schlüsselberechtigung zu erteilen, klicken Sie auf Erteilen. Damit Sie eine CMEK-Datenbank erstellen können, muss Ihrem Cloud Firestore-Dienstkonto die Rolle cloudkms.cryptoKeyEncrypterDecrypter zugewiesen sein.

  10. Wählen Sie Sicherheitsregeln für mobile und Webclients aus.

  11. Klicken Sie auf Datenbank erstellen.

Nachdem die Datenbank erstellt wurde, können Sie prüfen, ob CMEK für die Datenbank aktiviert ist. Rufen Sie dazu die Datenbankdetails auf:

  • Wenn Ihre Datenbank durch CMEK geschützt ist, wird im Feld Verschlüsselungstyp der Wert Kundenseitig verwaltet angezeigt und im Feld Verschlüsselungsschlüssel werden der entsprechende Cloud KMS und die Schlüsselversion aufgeführt, die zum Schutz dieser Datenbank verwendet wird.
  • Wenn Ihre Datenbank nicht durch CMEK geschützt ist, wird im Feld Verschlüsselungstyp der Wert Google-verwaltet angezeigt.

gcloud

Bevor Sie eine CMEK-fähige Datenbank mit Google Cloud CLI erstellen, installieren Sie die neueste Version und autorisieren Sie gcloud CLI. Weitere Informationen finden Sie unter gcloud CLI installieren.

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

Ersetzen Sie Folgendes:

  • FIRESTORE_DATABASE_LOCATION durch den Cloud Firestore-Speicherort für die Datenbank
  • DATABASE_ID mit einer ID für die Datenbank
  • KMS_KEY_NAME durch den Namen, den Sie dem Schlüssel zugewiesen haben. Verwenden Sie für den Schlüssel den vollständigen Ressourcennamen im folgenden Format:

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

  • FIRESTORE_PROJECT durch das Projekt, das für Ihre Cloud Firestore-Datenbank verwendet werden soll

REST API

HTTP-Anfrage:

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

Konfigurieren Sie im Anfragetext CMEK im Feld cmek_config.kms_key_name.

Wird auf die vollständige Ressourcen-ID eines Cloud KMS-Schlüssels festgelegt. Es ist nur ein Schlüssel am selben Speicherort wie diese Datenbank zulässig.

Dieser Wert sollte die Cloud KMS-Schlüsselressourcen-ID im Format projects/{KMS_PROJECT}/locations/{KMS_LOCATION}/keyRings/{KMS_KEYRING_ID}/cryptoKeys/{KMS_KEY_ID} sein.

Weitere Informationen zu anderen Feldern finden Sie auf der Seite zu database create.

Beispielanfrage:

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

Wenn Sie eine CMEK-fähige Datenbank erstellen möchten, verwenden Sie das Feld KMS Key Name (KMS-Schlüsselname). Wenn Sie den Parameter --kms-key-name nicht angeben, erstellt Cloud Firestore standardmäßig eine Datenbank ohne 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

Ersetzen Sie Folgendes:

  • DATABASE_ID durch die ID Ihrer Datenbank
  • LOCATION durch den Speicherort Ihrer Datenbank
  • KMS_PROJECT durch das Projekt, das Ihren CMEK-Schlüssel enthält
  • KMS_LOCATION durch den Speicherort, der Ihren CMEK-Schlüssel und -Schlüsselbund enthält
  • KMS_KEYRING_ID durch die ID Ihres CMEK-Schlüsselbunds
  • FIRESTORE_PROJECT durch das Projekt, das für Ihre Cloud Firestore-Datenbank verwendet werden soll

Prüfen Sie, ob Ihre Cloud Firestore-Datenbank mit der Firebase CLI geschützt ist:

firebase firestore:databases:get DATABASE_ID --project FIRESTORE_PROJECT

Die folgenden CMEK-Informationen werden in der Antwortnachricht angezeigt:

  • Das Feld KMS Key Name (KMS-Schlüsselname) enthält den vollständigen Schlüsselressourcennamen, der zum Verschlüsseln Ihrer Cloud Firestore-CMEK-Datenbank verwendet wird.
  • Das Feld Aktive Schlüsselversionen enthält eine Liste aller Schlüsselversionen, die derzeit von dieser CMEK-Datenbank verwendet werden. Während der Schlüsselrotation können mehrere aktive Schlüsselversionen vorhanden sein.

Terraform

Verwenden Sie zum Erstellen einer CMEK-fähigen Datenbank die Ressource google_firestore_database. Weitere Informationen und Beispiele finden Sie unter 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"
  }
}

Ersetzen Sie Folgendes:

  • FIRESTORE_PROJECT durch das Projekt, das für Ihre Cloud Firestore-Datenbank verwendet werden soll
  • DATABASE_ID durch eine ID für die Datenbank
  • FIRESTORE_DATABASE_LOCATION mit dem Cloud Firestore Speicherort für die Datenbank
  • DATABASE_TYPE entweder mit FIRESTORE_NATIVE für den nativen Modus oder DATASTORE_MODE für den Datenspeichermodus.
  • KMS_KEY_NAME durch den Namen, den Sie dem Schlüssel zugewiesen haben. Verwenden Sie den vollständigen Ressourcennamen für den Schlüssel im folgenden Format:

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

Auf eine CMEK-geschützte Datenbank zugreifen

Alle Lese-, Schreib- und Abfragevorgänge, die an eine CMEK-geschützte Datenbank gesendet werden, sollten genauso funktionieren wie bei einer von Google standardmäßig verschlüsselten Datenbank. Sie müssen beispielsweise nicht für jede Anfrage einen Schlüssel angeben.

CMEK-geschützte Datenbank wiederherstellen

Bevor Sie eine CMEK-geschützte Datenbank aus einer Sicherung wiederherstellen:

  • Entscheiden Sie, ob Sie die Datenbank mit CMEK-Verschlüsselung, mit der Google-Standardverschlüsselung (nicht CMEK) oder mit derselben Verschlüsselung wie die Sicherung wiederherstellen möchten.
  • Bereiten Sie den Schlüssel (primäre Version) und die Schlüsselversion vor, die Sie zum Verschlüsseln der Sicherung verwendet haben. Aktivieren Sie sowohl den Schlüssel als auch die Schlüsselversion.

gcloud

Wiederherstellung einer CMEK-geschützten Datenbank unter CMEK-Verschlüsselung

Wenn Sie die CMEK-Verschlüsselung wiederherstellen möchten, führen Sie den Befehl gcloud firestore databases restore mit den optionalen Flags encryption-type und kms-key-name aus, um den Verschlüsselungstyp für die wiederhergestellte Datenbank zu konfigurieren. Wenn Sie den Verschlüsselungstyp nicht angeben, verwendet die wiederhergestellte Datenbank dieselbe Verschlüsselungskonfiguration wie die Sicherung.

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

Ersetzen Sie KMS_KEY_NAME durch den Namen, den Sie dem Schlüssel zugewiesen haben. Verwenden Sie den vollständigen Ressourcennamen für den Schlüssel im folgenden Format:

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

CMEK-geschützte Datenbank in Standardverschlüsselung wiederherstellen

Wenn Sie die Standardverschlüsselung von Google (nicht CMEK) wiederherstellen möchten, legen Sie das Flag encryption-type so fest:

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

CMEK-geschützte Datenbank mit demselben Verschlüsselungstyp wie die Sicherung wiederherstellen

Wenn Sie die Sicherung mit demselben Verschlüsselungstyp wie die Sicherung wiederherstellen möchten, legen Sie das Flag encryption-type so fest:

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

Firebase CLI

Wiederherstellung einer CMEK-geschützten Datenbank unter CMEK-Verschlüsselung

Um die CMEK-Verschlüsselung wiederherzustellen, verwenden Sie die optionalen Flags encryption-type und kms-key-name. Wenn Sie den Verschlüsselungstyp nicht angeben, verwendet die wiederhergestellte Datenbank dieselbe Verschlüsselungskonfiguration wie die Sicherung.

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

Ersetzen Sie Folgendes:

  • DATABASE_ID mit der ID Ihrer Datenbank
  • FIRESTORE_PROJECT mit dem Projekt, das Sie für Ihre Cloud Firestore Datenbank verwenden können
  • FIRESTORE_LOCATION mit dem Speicherort Ihrer Cloud Firestore Datenbank
  • BACKUP_ID mit der ID Ihres Backups
  • KMS_PROJECT mit dem Projekt, das Ihren CMEK-Schlüssel enthält
  • KMS_LOCATION durch den Speicherort, der Ihren CMEK-Schlüssel und -Schlüsselbund enthält
  • KMS_KEYRING_ID mit der ID Ihres CMEK-Schlüsselrings

Bestätigen Sie, dass Ihre wiederhergestellte Cloud Firestore-Datenbank CMEK-verschlüsselt ist:

firebase firestore:databases:get DATABASE_ID --project FIRESTORE_PROJECT

Eine CMEK-geschützte Datenbank auf die Standardverschlüsselung zurücksetzen

Um wiederherzustellenGoogles Standardverschlüsselung (nicht CMEK), stellen Sie dieencryption-type Flagge auf folgende Weise:

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

Ersetzen Sie Folgendes:

  • DATABASE_ID mit der ID Ihrer Datenbank
  • FIRESTORE_PROJECT mit dem Projekt, das Sie für Ihre Cloud Firestore Datenbank verwenden können
  • FIRESTORE_LOCATION mit dem Speicherort Ihrer Cloud Firestore Datenbank
  • BACKUP_ID mit der ID Ihres Backups

Eine CMEK-geschützte Datenbank mit demselben Verschlüsselungstyp wie die Sicherung wiederherstellen.

Um den gleichen Verschlüsselungstyp wie beim Backup wiederherzustellen, setzen Sie das Flag encryption-type wie folgt:

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

Ersetzen Sie Folgendes:

  • DATABASE_ID mit der ID Ihrer Datenbank
  • FIRESTORE_PROJECT mit dem Projekt, das Sie für Ihre Cloud Firestore Datenbank verwenden können
  • FIRESTORE_LOCATION mit dem Speicherort Ihrer Cloud Firestore Datenbank
  • BACKUP_ID mit der ID Ihres Backups

Klonen einer CMEK-geschützten Datenbank

Bevor Sie eine CMEK-geschützte Datenbank klonen:

  • Entscheiden Sie, ob Sie die Datenbank mit CMEK-Verschlüsselung klonen möchten.Googles Standardverschlüsselung (non-CMEK) oder mit der gleichen Verschlüsselung wie die Quelldatenbank.
  • Bereiten Sie den Schlüssel (Primärversion) und die Schlüsselversion vor, die Sie zum Verschlüsseln der Quelldatenbank verwendet haben. Aktivieren Sie sowohl den Schlüssel als auch die Schlüsselversion.

gcloud

CMEK-geschützte Datenbank für CMEK-Verschlüsselung klonen

Führen Sie den Befehl gcloud firestore databases clone mit den optionalen Flags encryption-type und kms-key-name aus, um die CMEK-Verschlüsselung zu klonen und den Verschlüsselungstyp für die geklonte Datenbank zu konfigurieren. Wenn Sie den Verschlüsselungstyp nicht angeben, wird für die geklonte Datenbank dieselbe Verschlüsselungskonfiguration wie für die Quelldatenbank verwendet.

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

Ersetzen Sie KMS_KEY_NAME durch den Namen, den Sie dem Schlüssel zugewiesen haben. Verwenden Sie für den Schlüssel den vollständigen Ressourcennamen im folgenden Format:

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

CMEK-geschützte Datenbank in eine Datenbank mit Standardverschlüsselung klonen

Wenn Sie in die Standardverschlüsselung von Google (nicht CMEK) klonen möchten, legen Sie das Flag encryption-type so fest:

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

Eine CMEK-geschützte Datenbank mit demselben Verschlüsselungstyp wie die Quelldatenbank klonen

Wenn Sie die Quelldatenbank mit demselben Verschlüsselungstyp klonen möchten, legen Sie das Flag encryption-type so fest:

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

Das ist auch das Standardverhalten, wenn --encryption-type nicht angegeben ist.

Firebase CLI

CMEK-geschützte Datenbank für CMEK-Verschlüsselung klonen

Führen Sie den Befehl firebase firestore:databases:clone mit den optionalen Flags encryption-type und kms-key-name aus, um die CMEK-Verschlüsselung zu klonen und den Verschlüsselungstyp für die geklonte Datenbank zu konfigurieren. Wenn Sie den Verschlüsselungstyp nicht angeben, verwendet die geklonte Datenbank dieselbe Verschlüsselungskonfiguration wie die Quelldatenbank.

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

Ersetzen Sie KMS_KEY_NAME durch den Namen, den Sie dem Schlüssel zugewiesen haben. Verwenden Sie den vollständigen Ressourcennamen für den Schlüssel im folgenden Format:

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

CMEK-geschützte Datenbank in eine Datenbank mit Standardverschlüsselung klonen

Wenn Sie in die Standardverschlüsselung von Google (nicht CMEK) klonen möchten, legen Sie das Flag encryption-type so fest:

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

Klonen Sie eine CMEK-geschützte Datenbank mit demselben Verschlüsselungstyp wie die Quelldatenbank.

Wenn Sie die Quelldatenbank mit demselben Verschlüsselungstyp klonen möchten, legen Sie das Flag encryption-type so fest:

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

Das ist auch das Standardverhalten, wenn --encryption-type nicht angegeben ist.

Verwendeten Schlüssel anzeigen

gcloud

Sie können den Befehl databases describe gcloud CLI verwenden, um die CMEK-Konfiguration der Datenbank zu bestätigen:

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

In der Antwort sollten Sie im Feld cmekConfig CMEK-Informationen sehen, die in etwa wie folgt aussehen:

      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

Die Antwort enthält die folgenden Informationen:

  • kmsKeyName: Der vollständige Schlüsselressourcenname des Schlüssels, der zum Verschlüsseln Ihrer CMEK-geschützten Datenbank verwendet wird.
  • activeKeyVersion: Eine Liste aller Schlüsselversionen, die derzeit von der CMEK-geschützten Datenbank verwendet werden. Während der Schlüsselrotation können mehrere aktive Schlüsselversionen vorhanden sein. Sowohl die alte als auch die neue Schlüsselversion müssen während der Schlüsselrotation verfügbar sein. Deaktivieren Sie die alte Schlüsselversion erst, wenn sie nicht mehr im Feld activeKeyVersion angezeigt wird.

REST API

HTTP-Anfrage:

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

Konfigurieren Sie CMEK im Anfragetext im Feld cmek_config.kms_key_name. Wird auf die vollständige Ressourcen-ID eines Cloud KMS-Schlüssels festgelegt. Es ist nur ein Schlüssel am selben Speicherort wie diese Datenbank zulässig.

Dieser Wert sollte die Cloud KMS-Schlüsselressourcen-ID im Format projects/{KMS_PROJECT}/locations/{KMS_LOCATION}/keyRings/{KMS_KEYRING_ID}/cryptoKeys/{KMS_KEY_ID} sein.

Weitere Informationen zu anderen Bereichen finden Sie auf der Seite database create.

Beispiel für Anfrage und Antwort:

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

Schlüssel deaktivieren

So deaktivieren Sie einen Schlüssel, der mit einer Datenbank verknüpft ist:

  1. Verwendete Schlüsselversionen für eine Datenbank ansehen
  2. Diese verwendeten Schlüsselversionen deaktivieren
  3. Warten Sie, bis die Änderung wirksam wird, und prüfen Sie, ob die Daten nicht mehr zugänglich sind. Änderungen werden normalerweise innerhalb weniger Minuten wirksam, es kann jedoch auch bis zu 3 Stunden dauern.

Wenn ein von einer Datenbank verwendeter Schlüssel deaktiviert wird, erhalten Sie eine FAILED_PRECONDITION-Ausnahme mit zusätzlichen Details in der Fehlermeldung, z. B.:

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

Schlüssel aktivieren

So aktivieren Sie einen Schlüssel, der mit einer Datenbank verknüpft ist, wieder:

  1. Verwendete Schlüsselversionen für eine Datenbank ansehen
  2. Aktivieren Sie diese Schlüsselversionen in der Verwendung
  3. Warten Sie, bis die Änderung wirksam wird, und prüfen Sie, ob die Daten nicht mehr zugänglich sind. Änderungen werden normalerweise innerhalb weniger Minuten wirksam, es kann jedoch auch bis zu 3 Stunden dauern.

Audit-Logs für einen Cloud KMS-Schlüssel aufrufen

Bevor Sie Audit-Logs für den Cloud KMS-Datenzugriff aktivieren, sollten Sie mit Cloud-Audit-Logs vertraut sein.

Audit-Logs für Cloud KMS-Datenzugriff zeigen an, wann Cloud Firestore oder andere Produkte, die für die Verwendung Ihres CMEK-Schlüssels konfiguriert wurden, Aufrufe zum Verschlüsseln oder Entschlüsseln an Cloud KMS senden. Cloud Firestore gibt nicht bei jeder Datenanforderung einen Aufruf zum Verschlüsseln oder Entschlüsseln aus, sondern verwendet einen Poller, der den Schlüssel regelmäßig prüft. Die Abfrageergebnisse werden in den Audit-Logs angezeigt.

Sie können die Audit-Logs in der Google Cloud Console einrichten und mit ihnen interagieren:

  1. Achten Sie darauf, dass für die Cloud KMS API in Ihrem Projekt Logging aktiviert ist.

  2. Rufen Sie in der Google Cloud Console Cloud Logging auf.

    Zu Cloud Logging wechseln

  3. Beschränken Sie die Logeinträge auf Ihren Cloud KMS-Schlüssel, indem Sie dem Query Builder die folgenden Zeilen hinzufügen:

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

    Ersetzen Sie Folgendes:

    • KMS_KEY durch den Namen des CMEK-Schlüssels
    • KMS_KEYRING durch den KMS-Schlüsselbund, der den Schlüssel enthält
    • KMS_LOCATION durch den Speicherort des Schlüssels und des Schlüsselbunds

    Das Log enthält einige Logeinträge etwa alle fünf Minuten pro Datenbank. Die Logeinträge sehen in etwa so aus:

    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"
    

Weitere Informationen zum Auswerten von Audit-Logs finden Sie unter Audit-Logs verstehen.

CMEK-Organisationsrichtlinie konfigurieren

Wenn Sie Anforderungen für die Verschlüsselungscompliance für Cloud Firestore-Datenbanken in Ihrer Organisation angeben möchten, verwenden Sie eine CMEK-Organisationsrichtlinieneinschränkung.

CMEK-Schutz erforderlich

Konfigurieren Sie constraints/gcp.restrictNonCmekServices so, dass für die Erstellung von Cloud Firestore-Datenbanken CMEK erforderlich ist. Legen Sie die Einschränkung auf deny fest und fügen Sie firestore.googleapis.com der Ablehnungsliste hinzu, z. B.:

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

Ersetzen Sie FIRESTORE_PROJECT durch das Projekt, das eingeschränkt werden soll.

Weitere Informationen zum Konfigurieren von Organisationsrichtlinien finden Sie unter Richtlinien erstellen und bearbeiten.

Nachdem die Richtlinie in Kraft getreten ist, erhalten Sie eine FAILED_PRECONDITION-Ausnahme und eine Fehlermeldung, wenn Sie versuchen, eine Nicht-CMEK-Datenbank im betroffenen Projekt zu erstellen. Eine Ausnahme sieht beispielsweise so aus:

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

Beschränken Sie die Verwendung von Schlüsseln für CMEK

Wenn Sie einschränken möchten, welche Cloud KMS-Schlüssel für den CMEK-Schutz verwendet werden, konfigurieren Sie die Einschränkung constraints/gcp.restrictCmekCryptoKeyProjects.

Als Listenbeschränkung sind die zulässigen Werte Indikatoren der Ressourcenhierarchie (z. B. projects/PROJECT_ID, under:folders/FOLDER_ID und under:organizations/ORGANIZATION_ID). Um diese Beschränkung zu verwenden, konfigurieren Sie eine Liste von Indikatoren der Ressourcenhierarchie und setzen Sie die Beschränkung auf Zulassen. Diese Konfiguration beschränkt die unterstützten Dienste, sodass CMEK-Schlüssel nur aus den aufgelisteten Projekten, Ordnern und Organisationen ausgewählt werden können. Anfragen zum Erstellen von CMEK-geschützten Ressourcen in konfigurierten Diensten sind ohne einen Cloud Firestore-Schlüssel aus einer der zulässigen Ressourcen nicht erfolgreich.

Im folgenden Beispiel sind nur Schlüssel aus ALLOWED_KEY_PROJECT_ID für CMEK-geschützte Datenbanken im angegebenen Projekt zulässig:

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

Sobald die Richtlinie in Kraft tritt, erhalten Sie eine FAILED_PRECONDITION-Ausnahme und eine Fehlermeldung, wenn Sie gegen die Einschränkung verstoßen. Eine Ausnahme sieht folgendermaßen aus:

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

Nächste Schritte