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 verwaltete Verschlüsselungsschlüssel (CMEKs) für Firestore 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 müssen Sie die folgenden Schritte ausführen:
- Zugriff auf das Firestore-CMEK-Feature anfordern
- Firestore-Dienst-Agent erstellen (oder abrufen)
- Erstellen Sie einen CMEK-Schlüssel.
- Konfigurieren Sie die IAM-Einstellungen für diesen Schlüssel.
Führen Sie diese Schritte für jedes Projekt aus, das CMEK-geschützt enthalten wird Firestore-Datenbanken 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 den CMEK-Feature durch Ausfüllen dieses Abschnitts .
Firestore-Dienst-Agent erstellen
Bevor Sie einen CMEK-Schlüssel erstellen, benötigen Sie einen Firestore Dienst-Agent, eine Art von von Google verwaltetes Dienstkonto, das Firestore verwendet den Schlüssel für den Zugriff auf den Schlüssel.
Führen Sie den Befehl services Identity create aus, um Dienst-Agent erstellen, den Firestore für den Zugriff auf den CMEK verwendet für Sie generieren. 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 geplante Projekt.
für Ihre Firestore-Datenbanken.
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 der dem Standort der Firestore-Datenbank entspricht, die sie verwenden wird mit.
Für regionale Datenbankstandorte verwenden Sie denselben Standortnamen für Schlüsselbund, Schlüssel und Datenbank, eine 1:1-Zuordnung.
Wenn Sie beispielsweise eine CMEK-geschützte Datenbank in
us-west1
, erstellen Sie inus-west1
einen Schlüsselbund und einen Schlüssel.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-Standortnam5
. - Verwenden Sie den multiregionalen Cloud KMS-Standort
europe
für den multiregionalen Firestore-Standorteur3
.
- Verwenden Sie den multiregionalen Cloud KMS-Standort
Führen Sie in dem Google Cloud-Projekt, in dem Sie Ihre Schlüssel verwalten möchten, die folgenden Schritte aus:
Erstellen Sie einen Schlüsselbund und einen Schlüssel mit einer der folgenden Optionen:
- Erstellen Sie den Schlüsselbund und den Schlüssel direkt in Cloud KMS.
- Verwenden Sie einen extern verwalteten Schlüssel. Erstellen Sie den externen Schlüssel und erstellen Sie dann einen Cloud EKM-Schlüssel, um den Schlüssel über Cloud KMS verfügbar zu machen.
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.
Öffnen Sie in der Google Cloud Console die Seite IAM.
Klicken Sie auf Hinzufügen.
Geben Sie die ID im E-Mail-Format für Firestore ein Dienst-Agent.
Wählen Sie die Rolle Cloud KMS CryptoKey-Verschlüsseler/Entschlüsseler aus.
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
Machen Sie folgende Angaben:
KMS_KEY
: Name, den Sie dem Schlüssel zugewiesen habenKMS_KEYRING
: Der KMS-Schlüsselbund, der den Schlüssel enthältKMS_LOCATION
: Region, die den Schlüsselbund enthältSERVICE_AGENT_EMAIL
: die wie eine E-Mail-Adresse formatierte Kennzeichnung für den Dienst-Agent, dem Sie Zugriff gewährenKMS_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 Ihre CMEK-Schlüssel erstellt und konfiguriert wurden, können Sie einen CMEK-geschützten Datenbank. Vorhandene Firestore-Datenbank, die geschützt wird durch Die Google-Standardverschlüsselung kann nicht in einen CMEK konvertiert werden. können Sie nur Verschlüsselungstyp und -schlüssel zum Zeitpunkt der Erstellung.
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 DatenbankDATABASE_ID
: eine ID für die DatenbankKMS_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 Ihr Firestore-Datenbank
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. Nur ein Schlüssel im selben Speicherort, da diese Datenbank zulässig ist.
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}
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 den 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 Ihr Firestore-DatenbankDATABASE_ID
: eine ID für die DatenbankFIRESTORE_DATABASE_LOCATION
: der Firestore-Standort für die DatenbankDATABASE_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 funktioniert genauso wie eine standardmäßig verschlüsselte Google-Datenbank. So müssen Sie beispielsweise nicht für jede Anfrage einen Schlüssel angeben.
Verwendeten Schlüssel anzeigen
gcloud
Sie können die gcloud CLI mit databases describe Befehl zur Bestätigung der Datenbank-CMEK-Konfiguration:
gcloud firestore databases describe --database=DATABASE_ID --project=FIRESTORE_PROJECT
In der Antwort sollten im Feld cmekConfig
CMEK-Informationen angezeigt werden
etwa so:
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 Ressourcenname des Schlüssels, der zum Verschlüsseln verwendet wird Ihre CMEK-geschützte Datenbank.activeKeyVersion
: eine Liste aller derzeit verwendeten Schlüsselversionen durch die CMEK-geschützte Datenbank. Während der Schlüsselrotation gibt es mehrere aktive Schlüsselversionen sein können.
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. Nur ein Schlüssel im selben
Speicherort, da diese Datenbank zulässig ist.
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}
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:
- Die für eine Datenbank verwendeten Schlüsselversionen aufrufen
- Diese Schlüsselversionen deaktivieren
- Warten Sie, bis die Änderung wirksam wird, und prüfen Sie, ob die Daten nicht mehr zugänglich zu machen. Änderungen werden normalerweise innerhalb weniger Minuten wirksam. kann jedoch bis zu 3 Stunden dauern.
Wenn ein von einer Datenbank verwendeter Schlüssel deaktiviert ist, erwarten Sie, dass Sie eine
FAILED_PRECONDITION
Ausnahme mit zusätzlichen Details in der Fehlermeldung,
Beispiel:
{ "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:
- Die für eine Datenbank verwendeten Schlüsselversionen aufrufen
- Diese Schlüsselversionen aktivieren
- Warten Sie, bis die Änderung wirksam wird, und prüfen Sie, ob die Daten nicht mehr zugänglich zu machen. Änderungen werden normalerweise innerhalb weniger Minuten wirksam. kann jedoch 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 zum Cloud KMS-Datenzugriff zeigen Ihnen, wann Firestore oder andere Produkte, die für die Verwendung Ihres Mit einem CMEK-Schlüssel werden Aufrufe an Cloud KMS verschlüsselt/entschlüsselt. Firestore führt nicht für alle Daten einen Verschlüsselungs-/Entschlüsselungsaufruf aus. -Anforderung verwendet, unterhält stattdessen aber einen Abfragedienst, der den Schlüssel regelmäßig überprü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:
Achten Sie darauf, dass für die Cloud KMS API in Ihrem Projekt Logging aktiviert ist.
Rufen Sie in der Google Cloud Console Cloud Logging auf.
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üsselsKMS_KEYRING
: Der KMS-Schlüsselbund, der den Schlüssel enthältKMS_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
So legen Sie Complianceanforderungen für die Verschlüsselung für Firestore fest Datenbanken in Ihrer Organisation eine Einschränkung für CMEK-Organisationsrichtlinien.
CMEK-Schutz verlangen
Konfigurieren Sie constraints/gcp.restrictNonCmekServices
so, dass CMEK erforderlich ist für
Firestore-Datenbank erstellen 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
So begrenzen Sie, welche Cloud KMS-Schlüssel für den CMEK-Schutz verwendet werden:
Konfigurieren Sie die Einschränkung constraints/gcp.restrictCmekCryptoKeyProjects
.
Als Listeneinschränkung sind die zulässigen Werte Indikatoren der Ressourcenhierarchie (für
Beispiel: projects/PROJECT_ID
, under:folders/FOLDER_ID
und
under:organizations/ORGANIZATION_ID
. Verwenden Sie diese Einschränkung, indem Sie ein
Liste mit Indikatoren für die Ressourcenhierarchie und durch Festlegen der Einschränkung auf Zulassen.
In dieser Konfiguration werden unterstützte Dienste eingeschränkt, sodass CMEK-Schlüssel ausgewählt werden können
nur aus den aufgeführten Projekten, Ordnern und Organisationen ausgewählt werden. Anfragen zum Erstellen
CMEK-geschützte Ressourcen in konfigurierten Diensten sind ohne eine
Firestore-Schlüssel aus einer der zulässigen Ressourcen.
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, erhältst du eine FAILED_PRECONDITION
-Ausnahme
und eine Fehlermeldung erhalten, wenn Sie gegen die Beschränkung verstoßen. 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." } ] } ] } }