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

Auf dieser Seite wird beschrieben, wie Sie Aufgaben im Zusammenhang mit vom Kunden verwalteten Verschlüsselungsschlüsseln (CMEK) für Firestore ausführen. Weitere Informationen zu CMEK und deren Aktivierung finden Sie in der Cloud KMS-Dokumentation.

CMEK-Schlüssel vorbereiten

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

  1. Zugriff auf das Firestore-CMEK-Feature anfordern
  2. 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 aus, das CMEK-geschützte Firestore-Datenbanken enthält. 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 Firestore-Dienst-Agent erstellen, fordern Sie Zugriff auf das CMEK-Feature an. Füllen Sie dazu dieses Formular aus.

Firestore-Dienst-Agent erstellen

Bevor Sie einen CMEK-Schlüssel erstellen, benötigen Sie einen Firestore-Dienst-Agent. Dies ist ein von Google verwaltetes Dienstkonto, mit dem Firestore auf den Schlüssel zugreift.

Führen Sie den Befehl services Identity create aus, um den Dienst-Agent zu erstellen, den 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 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 Standort der 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 1:1-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 Firestore-Standort nam5.
    • Verwenden Sie den multiregionalen Cloud KMS-Standort europe für den multiregionalen Firestore-Standort eur3.

Führen Sie in dem 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 E-Mail-formatierte ID für den Firestore-Dienst-Agent ein.

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

  5. Klicken Sie auf Speichern.

gcloud

  1. 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
    

    Machen Sie folgende Angaben:

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

    Das Terminal sollte eine Antwort ähnlich der folgenden anzeigen:

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

CMEK-fähige Datenbank erstellen

Nachdem die CMEK-Schlüssel erstellt und konfiguriert wurden, können Sie eine CMEK-geschützte Datenbank erstellen. Vorhandene Firestore-Datenbanken, die durch die Google-Standardverschlüsselung geschützt sind, können nicht in die Verwendung eines CMEK konvertiert werden. Sie können nur zum Zeitpunkt der Erstellung einen Verschlüsselungstyp und einen Schlüssel auswählen.

gcloud

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

Machen Sie folgende Angaben:

  • FIRESTORE_DATABASE_LOCATION: der Firestore-Standort für die Datenbank
  • DATABASE_ID: eine ID für die Datenbank
  • KMS_KEY_NAME: der Name, 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

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

REST API

HTTP-Anfrage:

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

Konfigurieren Sie im Anfragetext einen CMEK im Feld cmek_config.kms_key_name.

Legen Sie als Wert die vollständige Ressourcen-ID eines Cloud KMS-Schlüssels fest. Es ist nur ein Schlüssel am selben Speicherort wie diese Datenbank zulässig.

Dieser Wert sollte die Ressourcen-ID des Cloud KMS-Schlüssels 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 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"
  }
}'

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

}

Machen Sie folgende Angaben:

  • FIRESTORE_PROJECT: das Projekt, das für Ihre Firestore-Datenbank verwendet werden soll
  • DATABASE_ID: eine ID für die Datenbank
  • FIRESTORE_DATABASE_LOCATION: der Firestore-Standort für die Datenbank
  • DATABASE_TYPE: entweder FIRESTORE_NATIVE für den nativen Modus oder DATASTORE_MODE für den Datastore-Modus.
  • KMS_KEY_NAME: der Name, 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 standardmäßig verschlüsselten Google-Datenbank. So müssen Sie beispielsweise nicht für jede Anfrage einen Schlüssel angeben.

Verwendeten Schlüssel anzeigen

gcloud

Mit dem gcloud CLI-Befehl Datenbanken beschreiben können Sie die CMEK-Konfiguration der Datenbank prüfen:

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

In der Antwort sollten im Feld cmekConfig CMEK-Informationen in etwa so 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 kann es mehrere aktive Schlüsselversionen geben.

REST API

HTTP-Anfrage:

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

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

Dieser Wert sollte die Ressourcen-ID des Cloud KMS-Schlüssels 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 database create.

Beispiel für eine 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 mit einer Datenbank verknüpften Schlüssel:

  1. Die für eine Datenbank verwendeten Schlüsselversionen aufrufen
  2. Diese 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 ist, können Sie mit der Ausnahme FAILED_PRECONDITION mit zusätzlichen Details in der Fehlermeldung rechnen, 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

Führen Sie die folgenden Schritte aus, um einen Schlüssel, der einer Datenbank zugeordnet ist, wieder zu aktivieren:

  1. Die für eine Datenbank verwendeten Schlüsselversionen aufrufen
  2. Diese Schlüsselversionen aktivieren
  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.

In Audit-Logs zum Cloud KMS-Datenzugriff wird angezeigt, wenn Firestore oder andere Produkte, die für die Verwendung Ihres CMEK-Schlüssels konfiguriert sind, Verschlüsselungs-/Entschlüsselungsaufrufe an Cloud KMS senden. Firestore führt nicht bei jeder Datenanfrage einen Verschlüsselungs-/Entschlüsselungsaufruf aus, sondern unterhält einen Abfragedienst, 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

  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
    

    Machen Sie folgende Angaben:

    • KMS_KEY: Name des CMEK-Schlüssels
    • KMS_KEYRING: Der KMS-Schlüsselbund, der den Schlüssel enthält
    • KMS_LOCATION: der Speicherort von Schlüssel und Schlüsselbund

    Das Log zeigt pro Datenbank etwa alle fünf Minuten einige Logeinträge an. 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

Verwenden Sie eine Einschränkung der CMEK-Organisationsrichtlinie, um Complianceanforderungen an die Verschlüsselung für Firestore-Datenbanken in Ihrer Organisation festzulegen.

CMEK-Schutz verlangen

Konfigurieren Sie constraints/gcp.restrictNonCmekServices so, dass ein CMEK für das Erstellen der Firestore-Datenbank erforderlich ist. Legen Sie die Einschränkung auf deny fest und fügen Sie firestore.googleapis.com der Sperrliste hinzu. Beispiel:

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

Ersetzen Sie FIRESTORE_PROJECT durch das einzuschränkende Projekt.

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

Nachdem die Richtlinie in Kraft getreten ist, wird die Ausnahme FAILED_PRECONDITION und die Fehlermeldung angezeigt, wenn Sie versuchen, im betroffenen Projekt eine nicht CMEK-Datenbank 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."
          }
        ]

Verwendung von Schlüsseln für CMEK beschränken

Konfigurieren Sie die Einschränkung constraints/gcp.restrictCmekCryptoKeyProjects, um einzuschränken, welche Cloud KMS-Schlüssel für den CMEK-Schutz verwendet werden.

Als Listeneinschränkung sind die zulässigen Werte Indikatoren für die Ressourcenhierarchie, z. B. projects/PROJECT_ID, under:folders/FOLDER_ID und under:organizations/ORGANIZATION_ID. Verwenden Sie diese Einschränkung, indem Sie eine Liste von Indikatoren für die Ressourcenhierarchie konfigurieren und die Einschränkung auf Zulassen festlegen. Durch diese Konfiguration werden unterstützte Dienste eingeschränkt, sodass CMEK-Schlüssel nur aus den aufgeführten Projekten, Ordnern und Organisationen ausgewählt werden können. Anfragen zum Erstellen von CMEK-geschützten Ressourcen in konfigurierten Diensten sind ohne einen Firestore-Schlüssel aus einer der zulässigen Ressourcen nicht erfolgreich.

Im folgenden Beispiel sind nur Schlüssel aus dem 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 getreten ist, erhalten Sie die Ausnahme FAILED_PRECONDITION und eine Fehlermeldung, wenn Sie gegen die Einschränkung verstoßen. Eine Ausnahme sieht so 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