Utilizzo delle chiavi di crittografia gestite dal cliente (CMEK)
Questa pagina descrive come eseguire le attività relative alle chiavi di crittografia gestite dal cliente (CMEK) per Firestore. Per saperne di più su CMEK in generale, incluso quando e perché abilitarla, consulta la documentazione di Cloud KMS.
Prepara le chiavi CMEK
Prima di poter creare un database Firestore protetto da CMEK, devi completare i seguenti passaggi:
- Richiedi l'accesso alla funzionalità CMEK di Firestore.
- Crea (o recupera) un service agent Firestore.
- Crea una chiave CMEK.
- Configura le impostazioni IAM per la chiave.
Completa questi passaggi per ogni progetto che conterrà database Firestore protetti da CMEK. Se in un secondo momento crei una nuova chiave CMEK, devi configurare le impostazioni IAM per questa chiave.
Richiedi l'accesso
Prima di creare un service agent Firestore, richiedi l'accesso alla funzionalità CMEK compilando questo modulo.
Crea un service agent Firestore
Prima di creare una chiave CMEK, devi disporre di un service agent Firestore, ovvero un tipo di account di servizio gestito da Google che Firestore utilizza per accedere alla chiave.
Esegui il comando services identity create per creare l'agente di servizio che Firestore utilizza per accedere alla chiave CMEK per tuo conto. Questo comando crea il account di servizio se non esiste già, quindi lo visualizza.
gcloud beta services identity create \
--service=firestore.googleapis.com \
--project FIRESTORE_PROJECT
Sostituisci FIRESTORE_PROJECT con il progetto che prevedi
di utilizzare per i tuoi database Firestore.
Il comando visualizza l'ID service agent, che ha il formato di un indirizzo email. Registra la stringa dell'email di output, perché 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 una chiave con gestione esterna che rendi disponibile con Cloud External Key Manager.
La posizione della chiave Cloud KMS deve essere la stessa della posizione del database Firestore con cui verrà utilizzata.
Per le posizioni dei database regionali, utilizza lo stesso nome della località per il portachiavi, la chiave e il database perché i nomi delle località hanno una mappatura uno a uno.
Ad esempio, se vuoi creare un database protetto da CMEK in
us-west1, crea una chiave automatizzata e una chiave inus-west1.Per le posizioni dei database multiregionali, utilizza il nome della posizione multiregionale di KMS:
- Utilizza la località multiregionale
usdi Cloud KMS per la località multiregionalenam5di Firestore. - Utilizza la località multiregionale
europedi Cloud KMS per la località multiregionaleeur3di Firestore.
- Utilizza la località multiregionale
Nel progetto Google Cloud in cui vuoi gestire le chiavi, completa quanto segue:
Crea chiavi automatizzate e una chiave utilizzando una delle seguenti opzioni:
- Crea le chiavi automatizzate e la chiave direttamente in Cloud KMS.
- Utilizza una chiave gestita esternamente. Crea la chiave esterna e poi crea una chiave Cloud EKM per rendere la chiave disponibile tramite Cloud KMS.
Configura le impostazioni IAM per la chiave
Console
Per concedere un ruolo Cloud KMS al tuo service agent, procedi nel seguente modo. Puoi anche concedere l'autorizzazione a livello di chiave o portachiavi se vuoi una granularità inferiore.
Nella console Google Cloud vai alla pagina IAM.
Fai clic su Aggiungi.
Inserisci l'ID in formato email per l'agente di servizio Firestore.
Seleziona il ruolo Cloud KMS CryptoKey Encrypter/Decrypter.
Fai clic su Salva.
gcloud
Concedi il ruolo cloudkms.cryptoKeyEncrypterDecrypter al tuo
service agent:
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_KEYcon il nome che hai assegnato alla chiaveKMS_KEYRINGcon le chiavi automatizzate KMS che contengono la chiaveKMS_LOCATIONcon la regione che contiene le chiavi automatizzateSERVICE_AGENT_EMAILcon l'identificatore in formato email del service agent a cui stai concedendo l'accessoKMS_PROJECTcon il progetto che contiene la chiave
Il terminale dovrebbe visualizzare 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
Crea un database abilitato per CMEK
Dopo aver creato e configurato le chiavi CMEK, puoi creare un database protetto da CMEK. I database Firestore esistenti protetti dalla crittografia predefinita di Google non possono essere convertiti per utilizzare CMEK.
Puoi scegliere un tipo di crittografia e una chiave solo quando crei un database abilitato a CMEK.
Console
Nella console Google Cloud , vai alla pagina Database.
Fai clic su Crea database.
Seleziona la modalità del database. Fai clic su Continua.
Nella pagina Configura il database, inserisci un ID database.
Seleziona una località.
Fai clic su Mostra opzioni di crittografia, quindi seleziona Chiave Cloud KMS.
Seleziona o inserisci il nome risorsa della chiave CMEK che vuoi utilizzare per il database.
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 chiave manualmente.
Se ti viene chiesto di concedere l'autorizzazione della chiave al account di servizio Firestore, fai clic su Concedi. Per creare un database CMEK, al account di servizio Firestore deve essere concesso il ruolo
cloudkms.cryptoKeyEncrypterDecrypter.Seleziona le regole di sicurezza per i client mobile e web.
Fai clic su Crea database.
Una volta creato il database, puoi verificare che sia abilitato per CMEK visualizzando i dettagli del database:
- Se il tuo database è protetto da CMEK, il campo Tipo di crittografia viene visualizzato come Gestita dal cliente e il campo Chiave di crittografia elenca Cloud KMS 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 Gestita da Google.
gcloud
Prima di creare un database abilitato a CMEK con Google Cloud CLI, installa l'ultima versione e autorizza gcloud CLI. Per saperne di più, consulta Installa 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_LOCATIONcon la località Firestore per il databaseDATABASE_IDcon un ID per il databaseKMS_KEY_NAMEcon 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_IDFIRESTORE_PROJECTcon il progetto da utilizzare per il tuo database Firestore
API REST
Richiesta HTTP:
POST https://firestore.googleapis.com/v1/projects/{FIRESTORE_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 informazioni 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 un database non CMEK per impostazione predefinita.
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: l'ID del tuo databaseLOCATIONcon la posizione del tuo databaseKMS_PROJECTcon il progetto che contiene la chiave CMEKKMS_LOCATIONcon la posizione che contiene la chiave CMEK e le chiavi automatizzateKMS_KEYRING_IDcon l'ID del tuo keyring CMEKFIRESTORE_PROJECTcon il progetto da utilizzare per il tuo database Firestore
Verifica che il database Firestore sia protetto con l'interfaccia a riga di comando di Firebase:
firebase firestore:databases:get DATABASE_ID --project FIRESTORE_PROJECT
Nel messaggio di risposta vengono visualizzate le seguenti informazioni su CMEK:
- Il campo Nome chiave KMS fornisce il nome completo della risorsa chiave utilizzata per criptare il database Firestore CMEK.
- 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 di chiavi attive.
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_PROJECTcon il progetto da utilizzare per il tuo database FirestoreDATABASE_IDcon un ID per il databaseFIRESTORE_DATABASE_LOCATIONcon la località Firestore per il databaseDATABASE_TYPEconFIRESTORE_NATIVEper la modalità Native oDATASTORE_MODEper la modalità Datastore.KMS_KEY_NAMEcon 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 da CMEK
Tutte le operazioni di lettura, scrittura e query inviate a un database protetto da CMEK devono funzionare allo stesso modo di un database criptato predefinito di Google. Ad esempio, non è necessario fornire una chiave per ogni richiesta.
Ripristinare un database protetto da CMEK
Prima di ripristinare il database protetto da CMEK da un backup:
- Decidi se vuoi 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 (primary-version) e la versione della chiave che hai utilizzato per criptare il backup. Abilita sia la chiave che la versione della chiave.
gcloud
Ripristinare un database protetto da CMEK alla crittografia CMEK
Per eseguire il ripristino con la crittografia CMEK, esegui il comando
gcloud firestore databases restore
con i flag facoltativi encryption-type e kms-key-name per configurare il
tipo di crittografia per il database ripristinato. Se non specifichi il tipo di crittografia, il database ripristinato utilizzerà la stessa configurazione di crittografia del backup.
gcloud firestore databases restore
--encryption-type=customer-managed-encryption
--kms-key-name=KMS_KEY_NAME
Sostituisci 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
Ripristinare un database protetto da CMEK alla crittografia predefinita
Per eseguire il ripristino alla 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 eseguire il ripristino con lo stesso tipo di crittografia del backup, imposta il flag encryption-type nel seguente modo: