Cette page explique comment effectuer des tâches liées aux clés de chiffrement gérées par le client (CMEK) pour Cloud Firestore. Pour en savoir plus sur CMEK en général, y compris quand et pourquoi l'activer, consultez la documentation Cloud KMS.
Préparer vos clés CMEK
Avant de pouvoir créer une base de données Cloud Firestore protégée par une clé CMEK, vous devez effectuer les étapes suivantes :
- Demandez l'accès à la fonctionnalité CMEK Cloud Firestore.
- Créer (ou récupérer) un Cloud Firestore agent de service.
- Créez une clé CMEK.
- Configurez les paramètres IAM pour cette clé.
Suivez ces étapes pour chaque projet qui contiendra des bases de données Cloud Firestore protégées par CMEK. Si vous créez une clé CMEK ultérieurement, vous devez configurer les paramètres IAM pour cette clé.
Demander l'accès
Avant de créer un agent de service Cloud Firestore, demandez l'accès à la fonctionnalité CMEK en remplissant ce formulaire.
Créer un agent de service Cloud Firestore
Avant de créer une clé CMEK, vous devez disposer d'un agent de service Cloud Firestore, qui est un type de compte de service géré par Google et utilisé par Cloud Firestore pour accéder à la clé.
Exécutez la commande services identity create pour créer l'agent de service utilisé par Cloud Firestore pour accéder à la clé CMEK en votre nom. Cette commande crée le compte de service s'il n'existe pas déjà, puis l'affiche.
gcloud beta services identity create \
--service=firestore.googleapis.com \
--project FIRESTORE_PROJECT
Remplacez FIRESTORE_PROJECT par le projet que vous prévoyez d'utiliser pour vos bases de données Cloud Firestore.
La commande affiche l'ID de l'agent de service, qui est formaté comme une adresse e-mail. Enregistrez la chaîne de l'e-mail de sortie, car vous en aurez besoin à une étape ultérieure.
Service identity created: service-xxx@gcp-sa-firestore.iam.gserviceaccount.com
Créer une clé
Vous pouvez utiliser une clé créée directement dans Cloud KMS ou une clé gérée en externe que vous rendez disponible avec Cloud External Key Manager.
L'emplacement de clé Cloud KMS doit être identique à celui de la base de données Cloud Firestore avec laquelle il sera utilisé.
Pour les emplacements de bases de données régionaux, utilisez le même nom d'emplacement pour le trousseau de clés, la clé et la base de données, car les noms d'emplacement ont une correspondance un-à-un.
Par exemple, si vous souhaitez créer une base de données protégée par une clé CMEK dans
us-west1, créez un trousseau de clés et une clé dansus-west1.Pour les emplacements de base de données multirégionaux, utilisez le nom de l'emplacement multirégional KMS :
- Utilisez l'emplacement multirégional
usde Cloud KMS pour l'emplacement multirégionalnam5de Cloud Firestore. - Utilisez l'emplacement multirégional
europede Cloud KMS pour l'emplacement multirégionaleur3de Cloud Firestore.
- Utilisez l'emplacement multirégional
Dans le projet Google Cloud où vous souhaitez gérer vos clés, veuillez compléter les informations suivantes :
Créez un trousseau de clés et une clé à l'aide de l'une des options suivantes :
- Créez le trousseau de clés et la clé directement dans Cloud KMS.
- Utilisez une clé gérée en externe. Créez la clé externe, puis créez une clé Cloud EKM permettant de la rendre disponible via Cloud KMS.
Configurer les paramètres IAM de la clé
Console
Pour attribuer un rôle Cloud KMS à votre agent de service, procédez comme suit : Vous pouvez également accorder une autorisation au niveau de la clé ou du trousseau si vous souhaitez bénéficier d'un niveau de précision inférieur.
Dans la console Google Cloud, accédez à la page IAM.
Cliquez sur Ajouter.
Saisissez l'ID au format adresse e-mail de votre agent de service Cloud Firestore.
Sélectionnez le rôle Chiffreur/Déchiffreur de clés cryptographiques Cloud KMS.
Cliquez sur Enregistrer.
gcloud
Attribuez le rôle cloudkms.cryptoKeyEncrypterDecrypter à votre agent de service :
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
Remplacez les éléments suivants :
KMS_KEYpar le nom que vous avez attribué à la clé.KMS_KEYRINGavec le porte-clés KMS qui contient la cléKMS_LOCATIONavec la région qui contient le porte-clésSERVICE_AGENT_EMAILavec l'identifiant au format adresse e-mail de l'agent de service auquel vous accordez l'accès.KMS_PROJECTavec le projet contenant la clé
Le terminal devrait afficher une réponse semblable à celle-ci :
Updated IAM policy for key KMS_KEY.
bindings:
- members:
- serviceAccount:
service-{project-number}@gcp-sa-firestore.iam.gserviceaccount.com
role: roles/cloudkms.cryptoKeyEncrypterDecrypter
Créer une base de données compatible avec les CMEK
Une fois les clés CMEK créées et configurées, vous pouvez créer une base de données protégée par une clé CMEK. Les bases de données Cloud Firestore existantes protégées par le chiffrement par défaut de Google ne peuvent pas être converties pour utiliser CMEK.
Vous ne pouvez choisir un type de chiffrement et une clé que lorsque vous créez une base de données compatible avec les CMEK.
Console
Dans la console Google Cloud, accédez à la page Base de données.
Cliquez sur Créer une base de données.
Sélectionnez votre mode de base de données. Cliquez sur Continuer.
Sur la page Configurez votre base de données, entrez un ID de base de données.
Sélectionnez une zone géographique.
Cliquez sur Afficher les options de chiffrement, puis sélectionnez Clé Cloud KMS.
Sélectionnez ou saisissez le nom de la ressource pour la clé CMEK que vous souhaitez utiliser pour la base de données.
La liste des clés est limitée au projet Google Cloud actuel et à l'emplacement de la base de données que vous avez sélectionné. Pour utiliser une clé d'un autre projet Google Cloud, cliquez sur Changer de projet ou Entrer la clé manuellement.
Si vous êtes invité à accorder une autorisation clé au compte de service Cloud Firestore, cliquez sur Accorder. Pour créer une base de données CMEK, le rôle
cloudkms.cryptoKeyEncrypterDecrypterdoit être attribué à votre compte de service Cloud Firestore.Sélectionnez des règles de sécurité pour les clients mobiles et Web.
Cliquez sur Créer une base de données.
Une fois la base de données créée, vous pouvez vérifier qu'elle est compatible CMEK en consultant Détails de la base de données :
- Si votre base de données est protégée par CMEK, le champ Type de chiffrement affiche Géré par le client et le champ Clé de chiffrement liste le Cloud KMS correspondant et la version de la clé utilisée pour protéger cette base de données.
- Si votre base de données n'est pas protégée par CMEK, le champ Type de chiffrement affiche Géré par Google.
gcloud
Avant de créer une base de données compatible CMEK avec Google Cloud CLI, installez la dernière version et autorisez gcloud CLI. Pour en savoir plus, consultez Installer la gcloud CLI.
gcloud firestore databases create --location=FIRESTORE_DATABASE_LOCATION \
--database=DATABASE_ID \
--kms-key-name=KMS_KEY_NAME \
--project=FIRESTORE_PROJECT
Remplacez les éléments suivants :
FIRESTORE_DATABASE_LOCATIONavec l'emplacement Cloud Firestore de la base de donnéesDATABASE_IDpar un ID pour la base de donnéesKMS_KEY_NAMEavec le nom que vous avez attribué à la clé. Utilisez le nom complet de la ressource pour la clé au format suivant :projects/KMS_PROJECT/locations/KMS_LOCATION/keyRings/KMS_KEYRING_ID/cryptoKeys/KMS_KEY_IDFIRESTORE_PROJECTavec le projet à utiliser pour votre base de données Cloud Firestore
API REST
Requête HTTP :
POST https://firestore.googleapis.com/v1/projects/{FIRESTORE_PROJECT}/databases
Dans le corps de la requête, configurez CMEK dans le champ cmek_config.kms_key_name.
Définissez l'ID de ressource complet d'une clé Cloud KMS. Seule une clé située au même emplacement que cette base de données est autorisée.
Cette valeur doit correspondre à l'ID de ressource de la clé Cloud KMS au format projects/{KMS_PROJECT}/locations/{KMS_LOCATION}/keyRings/{KMS_KEYRING_ID}/cryptoKeys/{KMS_KEY_ID}.
Pour plus d'informations sur les autres champs, consultez la page database create.
Exemple de requête :
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"
}
}'
CLI Firebase
Pour créer une base de données compatible CMEK, utilisez le champ KMS Key Name. Si vous ne spécifiez pas le paramètre --kms-key-name, Cloud Firestore crée par défaut une base de données non-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
Remplacez les éléments suivants :
DATABASE_IDavec l'identifiant de votre base de donnéesLOCATIONpar l'emplacement de votre base de donnéesKMS_PROJECTavec le projet qui contient votre clé CMEKKMS_LOCATIONavec l'emplacement qui contient votre clé CMEK et votre porte-clésKMS_KEYRING_IDpar l'ID de votre trousseau de clés CMEK.FIRESTORE_PROJECTpar le projet à utiliser pour votre base de données Cloud Firestore
Vérifiez que votre base de données Cloud Firestore est protégée avec Firebase CLI :
firebase firestore:databases:get DATABASE_ID --project FIRESTORE_PROJECT
Les informations CMEK suivantes apparaissent dans le message de réponse :
- Le champ KMS Key Name fournit le nom complet de la ressource de clé utilisée pour chiffrer votre base de données Cloud Firestore CMEK.
- Le champ Versions de clé actives fournit la liste de toutes les versions de clé actuellement utilisées par cette base de données CMEK. Lors de la rotation des clés, vous pouvez avoir plusieurs versions de clé actives.
Terraform
Pour créer une base de données compatible CMEK, utilisez la ressource google_firestore_database. Pour plus d'informations et d'exemples, voir 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"
}
}
Remplacez les éléments suivants :
FIRESTORE_PROJECTpar le projet à utiliser pour votre base de données Cloud FirestoreDATABASE_IDpar un ID pour la base de donnéesFIRESTORE_DATABASE_LOCATIONavec l'emplacement Cloud Firestore pour la base de donnéesDATABASE_TYPEavec soitFIRESTORE_NATIVEpour le mode natif, soitDATASTORE_MODEpour le mode Datastore.KMS_KEY_NAMEpar le nom que vous avez attribué à la clé. Utilisez le nom complet de la ressource pour la clé au format suivant :projects/KMS_PROJECT/locations/KMS_LOCATION/keyRings/KMS_KEYRING_ID/cryptoKeys/KMS_KEY_ID
Accéder à une base de données protégée par CMEK
Toutes les opérations de lecture, d'écriture et d'interrogation envoyées à une base de données protégée par CMEK devraient fonctionner de la même manière qu'avec une base de données chiffrée par défaut de Google. Par exemple, vous n'avez pas besoin de fournir une clé pour chaque requête.
Restaurer une base de données protégée par CMEK
Avant de restaurer une base de données protégée par CMEK à partir d'une sauvegarde :
- Décidez si vous souhaitez restaurer la base de données au chiffrement CMEK, àLe chiffrement par défaut de Google (non-CMEK), ou au même chiffrement que la sauvegarde.
Préparez la clé (version principale) et la version de clé que vous avez utilisée pour chiffrer la sauvegarde. Activez à la fois la clé et la version de clé.
gcloud
Restaurer une base de données protégée par CMEK avec le chiffrement CMEK
Pour restaurer le chiffrement CMEK, exécutez la commande gcloud firestore databases restore avec les indicateurs facultatifs encryption-type et kms-key-name pour configurer le type de chiffrement de la base de données restaurée. Si vous ne spécifiez pas le type de chiffrement, la base de données restaurée utilisera la même configuration de chiffrement que la sauvegarde.
gcloud firestore databases restore
--encryption-type=customer-managed-encryption
--kms-key-name=KMS_KEY_NAME
Remplacez KMS_KEY_NAME par le nom que vous avez attribué à la clé. Utilisez le nom complet de la ressource pour la clé au format suivant :
projects/KMS_PROJECT/locations/KMS_LOCATION/keyRings/KMS_KEYRING_ID/cryptoKeys/KMS_KEY_ID
Restaurez le chiffrement par défaut d'une base de données protégée par CMEK
Pour rétablirLe chiffrement par défaut de Google (non-CMEK), définissez leencryption-type signaler de la manière suivante :
gcloud firestore databases restore
--encryption-type=google-default-encryption
Restaurez une base de données protégée par CMEK avec le même type de chiffrement que la sauvegarde.
Pour restaurer le même type de chiffrement que celui de la sauvegarde, définissez l'indicateur encryption-type comme suit :
gcloud firestore databases restore --encryption-type=use-source-encryption
CLI Firebase
Restaurer une base de données protégée par CMEK avec le chiffrement CMEK
Pour restaurer le chiffrement CMEK, utilisez les options facultatives encryption-type et kms-key-name.
Si vous ne spécifiez pas le type de chiffrement, la base de données restaurée utilisera la même configuration de chiffrement que la sauvegarde.
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
Remplacez les éléments suivants :
DATABASE_IDavec l'identifiant de votre base de donnéesFIRESTORE_PROJECTpar le projet à utiliser pour votre base de données Cloud FirestoreFIRESTORE_LOCATIONpar l'emplacement de votre base de données Cloud FirestoreBACKUP_IDavec l'ID de votre sauvegardeKMS_PROJECTavec le projet qui contient votre clé CMEKKMS_LOCATIONavec l'emplacement qui contient votre clé CMEK et votre porte-clésKMS_KEYRING_IDpar l'ID de votre trousseau de clés CMEK.
Vérifiez que votre base de données Cloud Firestore restaurée est chiffrée avec CMEK :
firebase firestore:databases:get DATABASE_ID --project FIRESTORE_PROJECT
Restaurer une base de données protégée par une clé CMEK avec le chiffrement par défaut
Pour rétablirLe chiffrement par défaut de Google (non-CMEK), définissez leencryption-type signaler de la manière suivante :
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
Remplacez les éléments suivants :
DATABASE_IDavec l'identifiant de votre base de donnéesFIRESTORE_PROJECTpar le projet à utiliser pour votre base de données Cloud FirestoreFIRESTORE_LOCATIONpar l'emplacement de votre base de données Cloud FirestoreBACKUP_IDpar l'ID de votre sauvegarde ;
Restaurer une base de données protégée par une clé CMEK avec le même type de chiffrement que la sauvegarde
Pour restaurer le même type de chiffrement que la sauvegarde, définissez l'indicateur encryption-type de la manière suivante :
firebase firestore:databases:restore \
--database DATABASE_IDD \
--backup 'projects/FIRESTORE_PROJECT/locations/FIRESTORE_LOCATION/backups/BACKUP_ID' \
--encryption-type USE_SOURCE_ENCRYPTION
Remplacez les éléments suivants :
DATABASE_IDavec l'identifiant de votre base de donnéesFIRESTORE_PROJECTpar le projet à utiliser pour votre base de données Cloud FirestoreFIRESTORE_LOCATIONpar l'emplacement de votre base de données Cloud FirestoreBACKUP_IDpar l'ID de votre sauvegarde ;
Cloner une base de données protégée par CMEK
Avant de cloner une base de données protégée par CMEK :
- Décidez si vous souhaitez cloner la base de données avec le chiffrement CMEK, ouLe chiffrement par défaut de Google (non-CMEK), ou au même chiffrement que la base de données source.
Préparez la clé (version principale) et la version de clé que vous avez utilisée pour chiffrer la base de données source. Activez à la fois la clé et la version de clé.
gcloud
Cloner une base de données protégée par CMEK vers le chiffrement CMEK
Pour cloner vers le chiffrement CMEK, exécutez la commande gcloud firestore databases clone avec les indicateurs facultatifs encryption-type et kms-key-name pour configurer le type de chiffrement de la base de données clonée. Si vous ne spécifiez pas le type de chiffrement, la base de données clonée utilisera la même configuration de chiffrement que la base de données source.
gcloud firestore databases clone \
--encryption-type=customer-managed-encryption \
--kms-key-name=KMS_KEY_NAME
Remplacez KMS_KEY_NAME par le nom que vous avez attribué à la clé. Utilisez le nom complet de la ressource pour la clé au format suivant :
projects/KMS_PROJECT/locations/KMS_LOCATION/keyRings/KMS_KEYRING_ID/cryptoKeys/KMS_KEY_ID
Cloner une base de données protégée par CMEK avec chiffrement par défaut
Pour cloner vers le chiffrement par défaut de Google (non-CMEK), définissez l'indicateur encryption-type de la manière suivante :
gcloud firestore databases clone \
--encryption-type=google-default-encryption
Cloner une base de données protégée par CMEK vers le même type de chiffrement que la base de données source
Pour cloner la base de données source avec le même type de chiffrement, définissez l'indicateur encryption-type comme suit :
gcloud firestore databases clone \
--encryption-type=use-source-encryption
Il s'agit également du comportement par défaut si --encryption-type n'est pas spécifié.
CLI Firebase
Cloner une base de données protégée par CMEK vers le chiffrement CMEK
Pour cloner vers le chiffrement CMEK, exécutez la commande firebase firestore:databases:clone avec les options facultatives encryption-type et kms-key-name pour configurer le type de chiffrement de la base de données clonée. Si vous ne spécifiez pas le type de chiffrement, la base de données clonée utilisera la même configuration de chiffrement que la base de données source.
firebase firestore:databases:clone \
SOURCE_DATABASE \
DESTINATION_DATABASE \
--encryption-type=CUSTOMER_MANAGED_ENCRYPTION \
--kms-key-name=KMS_KEY_NAME
Remplacez KMS_KEY_NAME par le nom que vous avez attribué à la clé. Utilisez le nom complet de la ressource pour la clé au format suivant :
projects/KMS_PROJECT/locations/KMS_LOCATION/keyRings/KMS_KEYRING_ID/cryptoKeys/KMS_KEY_ID
Cloner une base de données protégée par CMEK avec chiffrement par défaut
Cloner àLe chiffrement par défaut de Google (non-CMEK), définissez leencryption-type signaler de la manière suivante :
firebase firestore:databases:clone \
SOURCE_DATABASE \
DESTINATION_DATABASE \
--encryption-type=GOOGLE_DEFAULT_ENCRYPTION
Cloner une base de données protégée par CMEK vers le même type de chiffrement que la base de données source
Pour cloner la base de données source avec le même type de chiffrement, définissez l'indicateur encryption-type comme suit :
firebase firestore:databases:clone \
SOURCE_DATABASE \
DESTINATION_DATABASE \
--encryption-type=USE_SOURCE_ENCRYPTION
Il s'agit également du comportement par défaut si --encryption-type n'est pas spécifié.
Afficher la clé utilisée
gcloud
Vous pouvez utiliser la commande databases describe gcloud CLI pour confirmer la configuration CMEK de la base de données :
gcloud firestore databases describe --database=DATABASE_ID --project=FIRESTORE_PROJECT
Vous devriez voir des informations CMEK dans le champ cmekConfig de la réponse, comme suit :
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
La réponse inclut les informations suivantes :
kmsKeyName: nom complet de la ressource de clé utilisée pour chiffrer votre base de données protégée par une clé CMEK.activeKeyVersion: liste de toutes les versions de clé actuellement utilisées par la base de données protégée par CMEK. Lors de la rotation des clés, vous pouvez avoir plusieurs versions de clé actives. L'ancienne et la nouvelle version de clé doivent être disponibles lors de la rotation de clé. Ne désactivez pas l'ancienne version de la clé tant qu'elle apparaît dans le champactiveKeyVersion.
API REST
Requête HTTP :
GET https://firestore.googleapis.com/v1/{name=projects/FIRESTORE_PROJECT/databases/DATABASE_ID}
Dans le corps de la requête, configurez CMEK dans le champ cmek_config.kms_key_name.
Définissez l'ID de ressource complet d'une clé Cloud KMS. Seule une clé située au même emplacement que cette base de données est autorisée.
Cette valeur doit correspondre à l'ID de ressource de la clé Cloud KMS au format projects/{KMS_PROJECT}/locations/{KMS_LOCATION}/keyRings/{KMS_KEYRING_ID}/cryptoKeys/{KMS_KEY_ID}.
Pour en savoir plus sur les autres champs, consultez la page concernant database create.
Exemple de requête et de réponse :
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"
]
},
……
}
Désactiver une clé
Pour désactiver une clé associée à une base de données, procédez comme suit :
- Affichez les versions de clé utilisées pour une base de données.
- Désactivez ces versions de clé en cours d'utilisation.
- Attendez que la modification soit prise en compte et vérifiez si les données ne sont plus accessibles. Les modifications prennent généralement effet en quelques minutes, mais cela peut prendre jusqu'à 3 heures.
Lorsqu'une clé utilisée par une base de données est désactivée, vous devez vous attendre à recevoir une exception FAILED_PRECONDITION avec des informations supplémentaires dans le message d'erreur, par exemple :
{ "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)" } ] } }
Activer une clé
Pour réactiver une clé associée à une base de données, procédez comme suit :
- Afficher les versions de clé utilisées pour une base de données
- Activer ces versions de clé en cours d'utilisation
- Attendez que la modification prenne effet et vérifiez si les données ne sont plus accessibles. En principe, les modifications prennent effet en quelques minutes, mais un délai de trois heures est parfois nécessaire.
Afficher les journaux d'audit d'une clé Cloud KMS
Avant d'activer les journaux d'audit d'accès aux données Cloud KMS, vous devez vous familiariser avec les journaux d'audit Cloud.
Les journaux d'audit d'accès aux données de Cloud KMS vous indiquent quand Cloud Firestore ou tout autre produit configuré pour utiliser votre clé CMEK effectue des appels de chiffrement/déchiffrement vers Cloud KMS. Cloud Firestore n'émet pas d'appel de chiffrement/déchiffrement sur chaque requête de données, mais maintient plutôt un système de surveillance qui vérifie la clé périodiquement. Les résultats s'affichent dans les journaux d'audit.
Vous pouvez configurer les journaux d'audit dans la console Google Cloud et interagir avec ces éléments :
Assurez-vous de l'activation de la journalisation pour l'API Cloud KMS dans votre projet.
Accédez à Cloud Logging dans la console Google Cloud.
Limitez les entrées de journal à votre clé Cloud KMS en ajoutant les lignes suivantes au générateur de requêtes :
resource.type="cloudkms_cryptokey" resource.labels.key_ring_id = KMS_KEYRING resource.labels.crypto_key_id = KMS_KEY resource.labels.location=KMS_LOCATIONRemplacez les éléments suivants :
KMS_KEYavec le nom de la clé CMEKKMS_KEYRINGpar le trousseau de clés KMS contenant la cléKMS_LOCATIONpar l'emplacement de la clé et du trousseau de clés.
Le journal affiche quelques entrées environ toutes les cinq minutes par base de données. Les entrées du journal se présentent comme suit :
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"
Pour en savoir plus sur l'interprétation des journaux d'audit, consultez la section Comprendre les journaux d'audit.
Configurer une règle d'administration CMEK
Pour spécifier les exigences de conformité de chiffrement pour les bases de données Cloud Firestore de votre organisation, utilisez une contrainte de stratégie d'organisation CMEK.
Nécessite une protection CMEK
Configurez constraints/gcp.restrictNonCmekServices pour exiger CMEK pour la création de la base de données Cloud Firestore. Définissez la contrainte sur deny et ajoutez firestore.googleapis.com à la liste de refus, par exemple :
gcloud resource-manager org-policies deny gcp.restrictNonCmekServices is:firestore.googleapis.com --project=FIRESTORE_PROJECT
Remplacez FIRESTORE_PROJECT par le projet à restreindre.
Pour en savoir plus sur la configuration des politiques d'organisation, voir Création et modification des politiques.
Une fois la règle appliquée, vous recevrez une exception FAILED_PRECONDITION et un message d'erreur si vous essayez de créer une base de données non CMEK dans le projet concerné. Par exemple, une exception ressemble à ceci :
{ "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." } ]
Limiter l'utilisation des clés pour CMEK
Pour limiter les clés Cloud KMS utilisées pour la protection CMEK, configurez la contrainte constraints/gcp.restrictCmekCryptoKeyProjects.
En tant que contrainte de liste, les valeurs acceptées sont des indicateurs de hiérarchie des ressources (par exemple, projects/PROJECT_ID, under:folders/FOLDER_ID et under:organizations/ORGANIZATION_ID). Utilisez cette contrainte en configurant une liste d'indicateurs de hiérarchie des ressources et en définissant la contrainte sur Autoriser.
Cette configuration limite les services pris en charge afin que les clés CMEK ne puissent être choisies que parmi les projets, dossiers et organisations listés. Les requêtes de création de ressources protégées par CMEK dans les services configurés échouent sans clé Cloud Firestore provenant de l'une des ressources autorisées.
L'exemple suivant n'autorise que les clés de ALLOWED_KEY_PROJECT_ID pour les bases de données protégées par CMEK dans le projet spécifié :
gcloud resource-manager org-policies allow gcp.restrictCmekCryptoKeyProjects \ under:projects/ALLOWED_KEY_PROJECT_ID \ --project=FIRESTORE_PROJECT
Une fois la règle appliquée, vous recevez une exception FAILED_PRECONDITION et un message d'erreur si vous ne respectez pas la contrainte. Une exception se présente comme suit :
{ "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." } ] } ] } }