Utilizzo delle chiavi di crittografia gestite dal cliente (CMEK)

In questa pagina viene descritto come eseguire attività relative a: chiavi di crittografia gestite dal cliente (CMEK) per Firestore. Per ulteriori informazioni su CMEK in generale, inclusi quando e e scopri perché abilitarlo, consulta la documentazione di Cloud KMS.

Prepara le chiavi CMEK

Prima di poter creare un database Firestore protetto da CMEK, devi completare questi passaggi:

  1. Richiedi l'accesso alla funzionalità Firestore CMEK.
  2. Crea (o recupera) un agente di servizio Firestore.
  3. Crea una chiave CMEK.
  4. Configura le impostazioni IAM per la chiave.

Completa questi passaggi per ogni progetto che conterrà la protezione CMEK e Firestore. Se in un secondo momento crei una nuova chiave CMEK, devi configurare le impostazioni IAM per quella chiave.

Richiedi l’accesso

Prima di creare un agente di servizio Firestore, richiedi l'accesso al funzionalità CMEK compilando questo modulo.

Crea un agente di servizio Firestore

Prima di creare una chiave CMEK, devi avere un Firestore agente di servizio, un tipo di account di servizio gestito da Google Firestore utilizza per accedere alla chiave.

Esegui il comando services identity create per creare l'agente di servizio utilizzato da Firestore per accedere alla chiave CMEK per tuo conto. Questo comando crea l'account di servizio se non esiste già e lo mostra.

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

Sostituisci FIRESTORE_PROJECT con il progetto che prevedi da utilizzare per i tuoi database Firestore.

Il comando mostra l'ID agente di servizio, che è formato come un indirizzo email. Prendi nota della stringa email di output, poiché la utilizzerai in un passaggio successivo.

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

Crea una chiave

Puoi utilizzare una chiave creata direttamente in Cloud KMS o esternamente chiave gestita che rendi disponibile con Cloud External Key Manager.

La posizione della chiave Cloud KMS deve essere uguale alla posizione del database Firestore con cui verrà utilizzata.

  • Per le località di database regionali, utilizza lo stesso nome di località per keyring, chiave e database perché i nomi delle località una mappatura one-to-one.

    Ad esempio, se vuoi creare un database protetto da CMEK in us-west1, crea un keyring e una chiave in us-west1.

  • Per le località dei database multiregione, utilizza il nome della località della località multiregione KMS:

    • Utilizza la località multiregione us di Cloud KMS per la località multiregione nam5 di Firestore.
    • Utilizza la località multiregione europe di Cloud KMS per la località multiregione eur3 di Firestore.

Nel progetto Google Cloud in cui vuoi gestire le tue chiavi, completa quanto segue:

  1. Abilita l'API Cloud KMS.

  2. Crea un mazzo di chiavi e una chiave utilizzando una delle seguenti opzioni:

Configura le impostazioni IAM per la chiave

Console

Per concedere un ruolo Cloud KMS all'agente di servizio, procedi nel seguente modo. Puoi anche concedere l'autorizzazione a livello di chiave o portachiavi se vuoi una granularità inferiore.

  1. Nella console Google Cloud, vai alla pagina IAM.

    Vai alla pagina IAM

  2. Fai clic su Aggiungi.

  3. Inserisci l'ID in formato email dell'agente di servizio Firestore.

  4. Seleziona il ruolo Autore crittografia/decrittografia CryptoKey Cloud KMS.

  5. Fai clic su Salva.

gcloud

Concedi il ruolo cloudkms.cryptoKeyEncrypterDecrypter all'agente di servizio:

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

Sostituisci quanto segue:

  • KMS_KEY con il nome che hai assegnato alla chiave
  • KMS_KEYRING con il keyring KMS che contiene la chiave
  • KMS_LOCATION con la regione che contiene il keyring
  • SERVICE_AGENT_EMAIL con l'identificatore in formato email dell'agente di servizio a cui stai concedendo l'accesso
  • KMS_PROJECT con il progetto che contiene la chiave

Il terminale dovrebbe mostrare una risposta simile alla seguente:

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

Creare un database compatibile con CMEK

Dopo aver creato e configurato le chiavi CMEK, puoi creare una protezione CMEK per configurare un database. Database Firestore esistenti protetti da Non è possibile convertire la crittografia predefinita di Google per utilizzare CMEK.

Puoi scegliere un tipo di crittografia e una chiave solo quando crei un database compatibile con CMEK.

Console

  1. Nella console Google Cloud, vai alla pagina Database.

    Vai alla pagina Database

  2. Fai clic su Crea database.

  3. Seleziona la modalità del database. Fai clic su Continua.

  4. Nella pagina Configura il database, inserisci un ID database.

  5. Seleziona una località.

  6. Fai clic su Mostra opzioni di crittografia, quindi seleziona Chiave Cloud KMS.

  7. Seleziona o inserisci il nome della risorsa per la chiave CMEK che vuoi utilizzare per il database.

  8. L'elenco delle chiavi è limitato al progetto Google Cloud corrente e alla posizione del database selezionata. Per utilizzare una chiave di un altro progetto Google Cloud, fai clic su Cambia progetto o Inserisci la chiave manualmente.

  9. Se ti viene chiesto di concedere l'autorizzazione per le chiavi all'account di servizio Firestore, fai clic su Concedi. Per creare un database CMEK, devi concedere al tuo account di servizio Firestore il ruolo cloudkms.cryptoKeyEncrypterDecrypter.

  10. Seleziona le regole di sicurezza per i client mobile e web.

  11. Fai clic su Crea database.

Dopo aver creato il database, puoi verificare che sia abilitato per CMEK visualizzando Dettagli del database:

  • Se il database è protetto da CMEK, il campo Tipo di crittografia viene visualizzato come Gestito dal cliente e il campo Chiave di crittografia elenca il Cloud KMS corrispondente e la versione della chiave utilizzata per proteggere questo database.
  • Se il database non è protetto da CMEK, il campo Tipo di crittografia viene visualizzato come Gestito da Google.

gcloud

Prima di creare un database compatibile con CMEK con Google Cloud CLI, installa la versione più recente e autorizza l'interfaccia a riga di comando gcloud. Per ulteriori informazioni, consulta Installare gcloud CLI.

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

Sostituisci quanto segue:

  • FIRESTORE_DATABASE_LOCATION con la località Firestore per il database
  • DATABASE_ID con un ID per il database
  • KMS_KEY_NAME con il nome che hai assegnato alla chiave. Utilizza il nome completo della risorsa per la chiave nel seguente formato:

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

  • FIRESTORE_PROJECT con il progetto da utilizzare per Database Firestore

API REST

Richiesta HTTP:

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

Nel corpo della richiesta, configura CMEK nel campo cmek_config.kms_key_name.

Impostato sull'ID risorsa completo di una chiave Cloud KMS. È consentita solo una chiave nella stessa posizione di questo database.

Questo valore deve essere l'ID risorsa della chiave Cloud KMS nel formato projects/{KMS_PROJECT}/locations/{KMS_LOCATION}/keyRings/{KMS_KEYRING_ID}/cryptoKeys/{KMS_KEY_ID}

Per ulteriori dettagli sugli altri campi, consulta la pagina database create.

Esempio di richiesta:

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

interfaccia a riga di comando di Firebase

Per creare un database abilitato per CMEK, utilizza il campo Nome chiave KMS. Se non specifichi il parametro --kms-key-name, Firestore crea per impostazione predefinita un database 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

Sostituisci quanto segue:

  • DATABASE_ID con l'ID del tuo database
  • LOCATION con la località del database
  • KMS_PROJECT con il progetto che contiene la chiave CMEK
  • KMS_LOCATION con la posizione contenente la chiave e il keyring CMEK
  • KMS_KEYRING_ID con l'ID del tuo portachiavi CMEK
  • FIRESTORE_PROJECT con il progetto da utilizzare per il database Firestore

Verifica che il database Firestore sia protetto con Firebase CLI:

firebase firestore:databases:get DATABASE_ID --project FIRESTORE_PROJECT

Nel messaggio di risposta vengono visualizzate le seguenti informazioni CMEK:

  • Il campo Nome chiave KMS fornisce il nome completo della risorsa della chiave utilizzato per criptare il database CMEK Firestore.
  • Il campo Versioni della chiave attive fornisce un elenco di tutte le versioni della chiave attualmente utilizzate da questo database CMEK. Durante la rotazione delle chiavi, puoi avere più versioni attive della chiave.

Terraform

Per creare un database abilitato per CMEK, utilizza la risorsa google_firestore_database. Per ulteriori informazioni ed esempi, consulta 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"
  }

}

Sostituisci quanto segue:

  • FIRESTORE_PROJECT con il progetto da utilizzare per il database Firestore
  • DATABASE_ID con un ID per il database
  • FIRESTORE_DATABASE_LOCATION con la località Firestore per il database
  • DATABASE_TYPE con FIRESTORE_NATIVE per la modalità Native o DATASTORE_MODE per la modalità Datastore.
  • KMS_KEY_NAME con il nome che hai assegnato alla chiave. Utilizza il nome completo della risorsa per la chiave nel formato:

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

Accedere a un database protetto tramite CMEK

Tutte le operazioni di lettura, scrittura e query inviate a un database protetto da CMEK dovrebbero funzionare come con un database criptato predefinito di Google. Ad esempio, non è necessario fornire una chiave per ogni richiesta.

Ripristina un database protetto da CMEK

Prima di ripristinare il database protetto da CMEK da un backup:

  • Decidi se ripristinare il database con la crittografia CMEK, con la crittografia predefinita di Google (non CMEK) o con la stessa crittografia del backup.
  • Prepara la chiave (versione primaria) e la versione della chiave che hai utilizzato per criptare il backup. Abilita sia la chiave sia la versione della chiave.

gcloud

Ripristinare un database protetto da CMEK con la crittografia CMEK

Per ripristinare la crittografia CMEK, esegui i database gcloud firestore ripristino con i flag facoltativi encryption-type e kms-key-name per configurare per il database ripristinato. Se non specifichi di crittografia, il database ripristinato utilizzerà la stessa crittografia configurazione come backup.

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

Sostituisci KMS_KEY_NAME con il nome assegnato alla chiave. Utilizza il nome completo della risorsa per la chiave nel seguente formato:

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

Ripristinare un database protetto da CMEK alla crittografia predefinita

Per ripristinare la crittografia predefinita di Google (non CMEK), imposta il flag encryption-type nel seguente modo:

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

Ripristinare un database protetto da CMEK con lo stesso tipo di crittografia del backup

Per ripristinare lo stesso tipo di crittografia del backup, imposta il flag encryption-type nel seguente modo:

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

interfaccia a riga di comando di Firebase

Ripristina un database protetto da CMEK alla crittografia CMEK

Per ripristinare la crittografia CMEK, utilizza i flag facoltativi encryption-type e kms-key-name. Se non specifichi il tipo di crittografia, il database ripristinato utilizzerà la classe la stessa configurazione di crittografia del backup.

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

Sostituisci quanto segue:

  • DATABASE_ID con l'ID del tuo database
  • FIRESTORE_PROJECT con il progetto da utilizzare per il database Firestore
  • FIRESTORE_LOCATION con la posizione del database Firestore
  • BACKUP_ID con l'ID del tuo backup
  • KMS_PROJECT con il progetto che contiene la chiave CMEK
  • KMS_LOCATION con la posizione contenente la chiave e il keyring CMEK
  • KMS_KEYRING_ID con l'ID del tuo portachiavi CMEK

Verifica che il database Firestore ripristinato sia criptato con CMEK:

firebase firestore:databases:get DATABASE_ID --project FIRESTORE_PROJECT

Ripristina un database protetto da CMEK alla crittografia predefinita

Per ripristinare la crittografia predefinita di Google (non CMEK), imposta il flag encryption-type nel seguente modo:

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

Sostituisci quanto segue:

  • DATABASE_ID con l'ID del tuo database
  • FIRESTORE_PROJECT con il progetto da utilizzare per il database Firestore
  • FIRESTORE_LOCATION con la posizione del database Firestore
  • BACKUP_ID con l'ID del tuo backup

Ripristinare un database protetto da CMEK con lo stesso tipo di crittografia del backup

Per ripristinare lo stesso tipo di crittografia del backup, imposta il flag encryption-type nel seguente modo:

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

Sostituisci quanto segue:

  • DATABASE_ID con l'ID del tuo database
  • FIRESTORE_PROJECT con il progetto da utilizzare per il database Firestore
  • FIRESTORE_LOCATION con la posizione del database Firestore
  • BACKUP_ID con l'ID del tuo backup

Visualizzare la chiave in uso

gcloud

Puoi utilizzare il comando gcloud CLI databases describe per confermare la configurazione della crittografia gestita dal cliente del database:

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

Dovresti vedere le informazioni CMEK nel campo cmekConfig della risposta simile al seguente:

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 risposta include le seguenti informazioni:

  • kmsKeyName: il nome completo della risorsa della chiave utilizzata per criptare del tuo database protetto da CMEK.
  • activeKeyVersion: un elenco di tutte le versioni della chiave attualmente in uso dal database protetto da CMEK. Durante la rotazione delle chiavi, puoi avere più versioni attive della chiave. Durante la rotazione della chiave devono essere disponibili entrambe le versioni della chiave precedente e nuova. Non disattivare la versione precedente della chiave finché non scompare nel campo activeKeyVersion.

API REST

Richiesta HTTP:

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

Nel corpo della richiesta, configura CMEK nel campo cmek_config.kms_key_name. Impostato sull'ID risorsa completo di una chiave Cloud KMS. Solo una chiave nello stesso località in quanto questo database è consentito.

Questo valore deve essere l'ID risorsa della chiave Cloud KMS nel formatoprojects/{KMS_PROJECT}/locations/{KMS_LOCATION}/keyRings/{KMS_KEYRING_ID}/cryptoKeys/{KMS_KEY_ID}

Per maggiori dettagli sugli altri campi, consulta la pagina database create.

Esempio di richiesta e risposta:

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

Disattivare una chiave

Per disattivare una chiave associata a un database:

  1. Visualizzare le versioni delle chiavi in uso per un database
  2. Disabilitare le versioni della chiave
  3. Attendi che la modifica venga applicata e controlla se i dati non sono più accessibili. In genere le modifiche diventano effettive entro pochi minuti ma l'operazione può richiedere fino a tre ore.

Quando una chiave utilizzata da un database è disattivata, dovresti ricevere un'eccezione FAILED_PRECONDITION con ulteriori dettagli nel messaggio di errore, ad esempio:

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

Abilita una chiave

Per riattivare una chiave associata a un database:

  1. Visualizza le versioni della chiave in uso per un database
  2. Abilita le versioni della chiave
  3. Attendi che la modifica venga applicata e controlla se i dati non sono più accessibili. In genere l'applicazione delle modifiche richiede pochi minuti, ma in alcuni casi può richiedere fino a 3 ore.

Visualizzare gli audit log per una chiave Cloud KMS

Prima di abilitare gli audit log di accesso ai dati di Cloud KMS, è bene familiarità con Cloud Audit Logs.

I log di controllo dell'accesso ai dati di Cloud KMS mostrano quando Firestore o altri prodotti configurati per utilizzare la tua chiave CMEK effettuano chiamate di crittografia/decrittografia a Cloud KMS. Firestore non emette una chiamata di crittografia/decrittografia per ogni richiesta di dati, ma gestisce un poller che controlla la chiave periodicamente. I risultati del polling vengono visualizzati nei log di controllo.

Puoi configurare e interagire con gli audit log nella console Google Cloud:

  1. Assicurati che il logging sia abilitato per l'API Cloud KMS nel tuo progetto.

  2. Vai a Cloud Logging nella console Google Cloud.

    Vai a Cloud Logging

  3. Limita le voci di log alla chiave Cloud KMS aggiungendo il token seguenti righe a Query Builder:

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

    Sostituisci quanto segue:

    • KMS_KEY con il nome della chiave CMEK
    • KMS_KEYRING con il keyring KMS contenente la chiave
    • KMS_LOCATION con la posizione del chiave e del keyring

    Il log mostra un paio di voci di log ogni cinque minuti circa per database. Le voci di log sono simili a questi esempi:

    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"
    

Per informazioni dettagliate sull'interpretazione dei log di controllo, consulta Informazioni sugli audit log.

Configura un criterio dell'organizzazione CMEK

Per specificare i requisiti di conformità alla crittografia per i database Firestore della tua organizzazione, utilizza un vincolo del criterio dell'organizzazione CMEK.

Richiedere la protezione CMEK

Configura constraints/gcp.restrictNonCmekServices in modo che richieda CMEK per la creazione del database Firestore. Imposta il vincolo su deny e aggiungi firestore.googleapis.com all'elenco di tipi non consentiti, ad esempio:

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

Sostituisci FIRESTORE_PROJECT con il progetto da limitare.

Per scoprire di più sulla configurazione dei criteri dell'organizzazione, consulta Creare e modificare i criteri.

Dopo l'applicazione del criterio, se provi a creare un database non CMEK nel progetto interessato, ricevi un'eccezione FAILED_PRECONDITION e un messaggio di errore. Ad esempio, un'eccezione ha il seguente aspetto:

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

Limitare l'utilizzo delle chiavi per CMEK

Per limitare le chiavi Cloud KMS utilizzate per la protezione CMEK, configura il vincolo constraints/gcp.restrictCmekCryptoKeyProjects.

Come vincolo dell'elenco, i valori accettati sono indicatori della gerarchia delle risorse (ad esempio projects/PROJECT_ID, under:folders/FOLDER_ID e under:organizations/ORGANIZATION_ID). Utilizza questo vincolo configurando un elenco di indicatori della gerarchia delle risorse e impostando il vincolo su Consenti. Questa configurazione limita i servizi supportati in modo che sia possibile scegliere le chiavi CMEK solo dai progetti, dalle cartelle e dalle organizzazioni elencati. Le richieste di creazione di risorse protette da CMEK nei servizi configurati non vanno a buon fine senza una chiave Firestore di una delle risorse consentite.

L'esempio seguente consente solo le chiavi di ALLOWED_KEY_PROJECT_ID per i database protetti tramite CMEK nel progetto specificato:

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

Una volta entrate in vigore le norme, riceverai un'eccezione (FAILED_PRECONDITION) e un messaggio di errore se violi il vincolo. Un'eccezione è simile al seguente:

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

Passaggi successivi