Utiliser des clés de chiffrement gérées par le client (CMEK)

Cette page explique comment effectuer des tâches liées aux clés de chiffrement gérées par le client (CMEK) pour Firestore en mode Datastore. Pour plus d'informations sur la 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 en mode Datastore protégée par une clé CMEK, vous devez effectuer les étapes suivantes:

  1. Demandez l'accès à la fonctionnalité CMEK en mode Datastore.
  2. Créez (ou récupérez) un agent de service en mode Datastore.
  3. Créez une clé CMEK.
  4. Configurez les paramètres IAM pour cette clé.

Procédez comme suit pour chaque projet contenant des bases de données Firestore protégées par des clés CMEK. Si vous créez ultérieurement une clé CMEK, vous devez configurer les paramètres IAM pour cette clé.

Demander l'accès

Avant de créer un agent de service en mode Datastore, demandez l'accès à la fonctionnalité CMEK en remplissant ce formulaire.

Créer un agent de service en mode Datastore

Avant de créer une clé CMEK, vous devez disposer d'un agent de service en mode Datastore, qui est un type de compte de service géré par Google et utilisé par le mode Datastore pour accéder à la clé.

Exécutez la commande services identity create pour créer l'agent de service utilisé par le mode Datastore 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 en mode Datastore.

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 en mode Datastore avec laquelle elle sera utilisée.

  • Pour les emplacements de base 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 sont mappés individuellement.

    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é dans us-west1.

  • Pour les emplacements de bases de données multirégionaux, utilisez le nom de l'emplacement multirégional KMS:

    • Utilisez l'emplacement multirégional us de Cloud KMS pour l'emplacement multirégional nam5 du mode Datastore.
    • Utilisez l'emplacement multirégional europe de Cloud KMS pour l'emplacement multirégional eur3 du mode Datastore.

Dans le projet Google Cloud dans lequel vous souhaitez gérer vos clés, procédez comme suit:

  1. Activez l'API Cloud KMS.

  2. Créez un trousseau de clés et une clé à l'aide de l'une des options suivantes :

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.

  1. Dans la console Google Cloud, accédez à la page IAM.

    Accédez à la page IAM.

  2. Cliquez sur Ajouter.

  3. Saisissez l'ID au format adresse e-mail de votre agent de service en mode Datastore.

  4. Sélectionnez le rôle Chiffreur/Déchiffreur de clés cryptographiques Cloud KMS.

  5. 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_KEY par le nom que vous avez attribué à la clé
  • KMS_KEYRING par le trousseau de clés KMS contenant la clé.
  • KMS_LOCATION par la région contenant le trousseau de clés.
  • SERVICE_AGENT_EMAIL avec l'identifiant au format adresse e-mail de l'agent de service auquel vous accordez l'accès
  • KMS_PROJECT par le projet contenant la clé

Le terminal doit 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 existantes en mode Datastore protégées par le chiffrement par défaut de Google ne peuvent pas être converties en vue d'une utilisation avec les CMEK.

Vous ne pouvez choisir un type de chiffrement et une clé que lorsque vous créez une base de données compatible avec CMEK.

Console

  1. Dans la console Google Cloud, accédez à la page Base de données.

    Accéder à la page "Bases de données"

  2. Cliquez sur Créer une base de données.

  3. Sélectionnez votre mode de base de données. Cliquez sur Continuer.

  4. Sur la page Configurer votre base de données, saisissez un ID de base de données.

  5. Sélectionnez un lieu.

  6. Cliquez sur Afficher les options de chiffrement, puis sélectionnez Clé Cloud KMS.

  7. Sélectionnez ou saisissez le nom de ressource de la clé CMEK que vous souhaitez utiliser pour la base de données.

  8. 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é provenant d'un autre projet Google Cloud, cliquez sur Changer de projet ou sur Saisir la clé manuellement.

  9. Si vous êtes invité à accorder l'autorisation de clé au compte de service en mode Datastore, cliquez sur Accorder. Pour créer une base de données CMEK, vous devez attribuer le rôle cloudkms.cryptoKeyEncrypterDecrypter à votre compte de service en mode Datastore.

  10. Sélectionnez des règles de sécurité pour les clients mobiles et Web.

  11. 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 avec CMEK en consultant les 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 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 avec CMEK avec Google Cloud CLI, installez la dernière version et autorisez la gcloud CLI. Pour en savoir plus, consultez Installer 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_LOCATION avec l'emplacement en mode Datastore de la base de données
  • DATABASE_ID avec un ID de base de données
  • 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

  • FIRESTORE_PROJECT avec le projet à utiliser pour votre base de données en mode Datastore

API REST

Requête HTTP :

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

Dans le corps de la requête, configurez CMEK dans le champ cmek_config.kms_key_name.

Défini sur 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 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 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 avec CMEK, utilisez le champ Nom de la clé KMS. Si vous ne spécifiez pas le paramètre --kms-key-name, le mode Datastore crée une base de données non CMEK par défaut.

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_ID par l'ID de votre base de données
  • LOCATION par l'emplacement de votre base de données
  • KMS_PROJECT par le projet contenant votre clé CMEK.
  • KMS_LOCATION avec l'emplacement contenant votre clé CMEK et votre trousseau de clés
  • KMS_KEYRING_ID avec l'ID de votre trousseau de clés CMEK
  • FIRESTORE_PROJECT avec le projet à utiliser pour votre base de données en mode Datastore

Vérifiez que votre base de données en mode Datastore est protégée avec la CLI Firebase:

firebase firestore:databases:get DATABASE_ID --project FIRESTORE_PROJECT

Les informations CMEK suivantes s'affichent dans le message de réponse:

  • Le champ Nom de la clé KMS fournit le nom complet de la ressource de clé utilisée pour chiffrer votre base de données CMEK en mode Datastore.
  • 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és actives.

Terraform

Pour créer une base de données compatible avec CMEK, utilisez la ressource google_firestore_database. Pour en savoir plus et obtenir des exemples, consultez 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_PROJECT avec le projet à utiliser pour votre base de données en mode Datastore
  • DATABASE_ID avec un ID de base de données
  • FIRESTORE_DATABASE_LOCATION avec l'emplacement en mode Datastore de la base de données
  • DATABASE_TYPE avec FIRESTORE_NATIVE pour le mode natif ou DATASTORE_MODE pour le mode Datastore.
  • 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

Accéder à une base de données protégée par CMEK

Toutes les opérations de lecture, d'écriture et de requête envoyées à une base de données protégée par CMEK doivent 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:

  • Indiquez si vous souhaitez restaurer la base de données avec le chiffrement CMEK, le chiffrement par défaut de Google (non CMEK) ou le même chiffrement que la sauvegarde.
  • Préparez la clé (primary-version) et la version de clé que vous avez utilisée pour chiffrer la sauvegarde. Activez 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 options encryption-type et kms-key-name facultatives 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

Restaurer le chiffrement par défaut d'une base de données protégée par CMEK

Pour restaurer le chiffrement par défaut de Google (non-CMEK), définissez l'indicateur encryption-type comme suit:

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

Restaurer 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 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 encryption-type et kms-key-name facultatives. 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_ID par l'ID de votre base de données
  • FIRESTORE_PROJECT avec le projet à utiliser pour votre base de données en mode Datastore
  • FIRESTORE_LOCATION avec l'emplacement de votre base de données en mode Datastore
  • BACKUP_ID par l'ID de votre sauvegarde
  • KMS_PROJECT par le projet contenant votre clé CMEK.
  • KMS_LOCATION avec l'emplacement contenant votre clé CMEK et votre trousseau de clés
  • KMS_KEYRING_ID avec l'ID de votre trousseau de clés CMEK

Vérifiez que votre base de données restaurée en mode Datastore est chiffrée avec CMEK:

firebase firestore:databases:get DATABASE_ID --project FIRESTORE_PROJECT

Restaurer le chiffrement par défaut d'une base de données protégée par CMEK

Pour restaurer le chiffrement par défaut de Google (non-CMEK), définissez l'indicateur encryption-type comme suit:

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_ID par l'ID de votre base de données
  • FIRESTORE_PROJECT avec le projet à utiliser pour votre base de données en mode Datastore
  • FIRESTORE_LOCATION avec l'emplacement de votre base de données en mode Datastore
  • BACKUP_ID par l'ID de votre sauvegarde

Restaurer 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 la sauvegarde, définissez l'indicateur encryption-type comme suit:

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_ID par l'ID de votre base de données
  • FIRESTORE_PROJECT avec le projet à utiliser pour votre base de données en mode Datastore
  • FIRESTORE_LOCATION avec l'emplacement de votre base de données en mode Datastore
  • BACKUP_ID par l'ID de votre sauvegarde

Afficher la clé utilisée

gcloud

Vous pouvez utiliser la commande gcloud CLI databases describe pour confirmer la configuration CMEK de la base de données:

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

Des informations CMEK doivent s'afficher 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 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és actives. L'ancienne et la nouvelle version de clé doivent être disponibles lors de la rotation des clés. Ne désactivez pas l'ancienne version de la clé tant qu'elle n'apparaît plus dans le champ activeKeyVersion.

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éfini sur 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 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 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:

  1. Afficher les versions de clé utilisées pour une base de données
  2. Désactiver ces versions de clé
  3. Attendez que le changement soit appliqué, puis vérifiez si les données ne sont plus accessibles. En principe, les modifications prennent effet en quelques minutes, mais un délai maximal de trois heures peut être nécessaire.

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:

  1. Afficher les versions de clé utilisées pour une base de données
  2. Activer ces versions de clé
  3. Attendez que le changement soit appliqué, puis vérifiez si les données ne sont plus accessibles. En principe, les modifications prennent effet en quelques minutes, mais un délai maximal de trois heures peut être 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 de l'accès aux données Cloud KMS vous indiquent quand le mode Datastore ou tout autre produit configuré pour une utilisation avec votre clé CMEK effectue des appels de chiffrement/déchiffrement vers Cloud KMS. Le mode Datastore n'émet pas d'appel de chiffrement/déchiffrement pour chaque requête de données, mais conserve un service d'interrogation qui vérifie régulièrement la clé. 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 :

  1. Assurez-vous de l'activation de la journalisation pour l'API Cloud KMS dans votre projet.

  2. Accédez à Cloud Logging dans la console Google Cloud.

    Accéder à CloudLogging

  3. 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_LOCATION
    

    Remplacez les éléments suivants :

    • KMS_KEY par le nom de la clé CMEK
    • KMS_KEYRING par le trousseau de clés KMS contenant la clé.
    • KMS_LOCATION par l'emplacement de la clé et du trousseau de clés

    Le journal affiche quelques entrées de journal 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 des exigences de conformité en matière de chiffrement pour les bases de données en mode Datastore de votre organisation, utilisez une contrainte de règle d'administration CMEK.

Exiger la protection CMEK

Configurez constraints/gcp.restrictNonCmekServices pour exiger CMEK pour la création de bases de données en mode Datastore. 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 règles d'administration, consultez la section Créer et modifier des règles.

Une fois la règle appliquée, vous recevez une exception FAILED_PRECONDITION et un message d'erreur si vous essayez de créer une base de données autre que CMEK dans le projet concerné. Par exemple, une exception se présente comme suit:

{
  "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 le chiffrement 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 Allow (Autoriser). Cette configuration limite les services compatibles 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 ne réussissent pas sans clé de mode Datastore 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."
          }
        ]
      }
    ]
  }
}

Étape suivante