Crittografia a livello di colonna con Cloud KMS
Puoi utilizzare Cloud Key Management Service (Cloud KMS) per criptare le chiavi che a loro volta criptano i valori all'interno delle tabelle BigQuery. Puoi utilizzare le funzioni di crittografia AEAD con i set di chiavi o i set di chiavi con wrapping di Cloud KMS per fornire un secondo livello di protezione a livello di colonna.
Introduzione
Per fornire un ulteriore livello di protezione, Cloud KMS cripta la chiave di crittografia dei dati (DEK) con una seconda chiave di crittografia della chiave (KEK). In BigQuery, fare riferimento a un insieme di chiavi criptato anziché a un insieme di chiavi in testo non cifrato contribuisce a ridurre il rischio di esposizione delle chiavi. La KEK è un insieme di chiavi di crittografia simmetrica archiviato in modo sicuro in Cloud KMS e gestito utilizzando i ruoli e le autorizzazioni di Identity and Access Management (IAM).
BigQuery supporta le funzioni di crittografia deterministica e non deterministica. Con la crittografia deterministica, se sia i dati archiviati sia i dati autenticati aggiuntivi (facoltativi) sono identici, il testo cifrato è identico. Ciò consente di supportare l'aggregazione e le unioni in base alla colonna criptata. Con la crittografia non deterministica, il testo cifrato archiviato è univoco indipendentemente dai dati criptati, il che impedisce il clustering, l'aggregazione e le unioni.
Al momento dell'esecuzione della query, fornisci il percorso della risorsa Cloud KMS della chiave KEK e il testo cifrato della chiave DEK sottoposta a wrapping. BigQuery chiama Cloud KMS per scompattare la DEK e poi utilizza questa chiave per decriptare i dati nella query. La versione non con wrapping della DEK viene archiviata in memoria solo per la durata della query, dopodiché viene distrutta.
Se utilizzi Cloud KMS in un'area geografica in cui è supportato Cloud External Key Manager, puoi utilizzare le chiavi basate su Cloud EKM in Cloud KMS.
Casi d'uso
Ecco alcuni casi d'uso per la crittografia con le chiavi Cloud KMS:
- Dati con crittografia esterna che devono essere archiviati in BigQuery senza archiviare il set di chiavi in testo non cifrato. I dati possono quindi essere esportati dalla tabella o decriptati con una query SQL.
- "Doppio controllo dell'accesso" sui dati criptati in BigQuery. Per leggere i dati in testo non cifrato, a un utente deve essere concessa l'autorizzazione sia per la tabella sia per la chiave di crittografia.
Matrice delle autorizzazioni utente | ||
---|---|---|
Autorizzazione nella tabella | Nessuna autorizzazione nella tabella | |
Autorizzazioni per la chiave | Leggere e decriptare i dati criptati. | Nessun accesso. |
Nessuna autorizzazione per la chiave | Leggere i dati criptati. | Nessun accesso. |
Se un utente ha l'autorizzazione per accedere alla chiave KMS e ha accesso al set di chiavi con wrapping, le funzioni SQL possono svolgere il wrapping del set di chiavi e decriptare il testo cifrato. Gli utenti possono anche utilizzare l'API REST o l'CLI di Cloud KMS per scompattare il set di chiavi.
Il seguente esempio di query utilizza le funzioni SQL di KMS per decriptare il testo cifrato non deterministico:
SELECT AEAD.DECRYPT_STRING( KEYS.KEYSET_CHAIN(@kms_resource_name, @first_level_keyset), ciphertext, additional_authenticated_data) FROM ciphertext_table WHERE ...
Esempio di caso d'uso
Supponiamo un'implementazione in cui i codici postali sono considerati informazioni sensibili. I dati del codice postale possono essere inseriti nella tabella BigQuery utilizzando la funzione di crittografia AEAD, in modo da criptare la colonna Zipcode
. In questo esempio utilizziamo la funzione
AEAD.ENCRYPT
con la funzione di gestione del set di chiavi con wrapping. La funzione KEYS.KEYSET_CHAIN
cripta la chiave di crittografia digitale con la KEK e la funzione AEAD.ENCRYPT
passa le informazioni a KMS.
La catena di set di chiavi per la crittografia e la decrittografia garantisce che la chiave di crittografia dei dati (DEK) sia criptata o sottoposta a wrapping con una KEK e trasmessa con questa KEK. La DEK con wrapping viene decriptata o smembrata all'interno della funzione SQL e poi utilizzata per criptare o decriptare i dati.
La funzione non deterministica AEAD può decriptare i dati quando viene eseguito l'accesso utilizzando la funzione nella query in esecuzione nella tabella.
La funzione deterministica AEAD può decriptare i dati quando viene eseguito l'accesso utilizzando la funzione nella query in esecuzione sulla tabella e supporta l'aggregazione e le unioni utilizzando i dati criptati.
Sintassi della funzione non deterministica
La sintassi supportata per l'utilizzo di funzioni non deterministiche include quanto segue:
AEAD.ENCRYPT( KEYS.KEYSET_CHAIN(kms_resource_name, first_level_keyset), plaintext, additional_authenticated_data)
AEAD.DECRYPT_STRING( KEYS.KEYSET_CHAIN(kms_resource_name, first_level_keyset), ciphertext, additional_authenticated_data)
AEAD.DECRYPT_BYTES( KEYS.KEYSET_CHAIN(kms_resource_name, first_level_keyset), ciphertext, additional_authenticated_data)
Consulta la sintassi delle funzioni AEAD.DECRYPT_BYTES
,
AEAD.ENCRYPT
,
AEAD.DECRYPT_STRING
e KEYS.KEYSET_CHAIN
.
Sintassi della funzione deterministica
La sintassi supportata per l'utilizzo di funzioni deterministiche include quanto segue:
DETERMINISTIC_ENCRYPT( KEYS.KEYSET_CHAIN(kms_resource_name, first_level_keyset), plaintext, additional_data)
DETERMINISTIC_DECRYPT_STRING( KEYS.KEYSET_CHAIN(kms_resource_name, first_level_keyset), ciphertext, additional_data)
DETERMINISTIC_DECRYPT_BYTES( KEYS.KEYSET_CHAIN(kms_resource_name, first_level_keyset), ciphertext, additional_data)
Consulta la sintassi delle funzioni DETERMINISTIC_DECRYPT_BYTES
,
DETERMINISTIC_ENCRYPT
,
DETERMINISTIC_DECRYPT_STRING
e KEYS.KEYSET_CHAIN
.
Ruoli e autorizzazioni
Per un elenco dei ruoli per Cloud KMS, consulta Autorizzazioni e ruoli di Cloud KMS.
Limitazioni
La crittografia con Cloud KMS presenta le seguenti limitazioni e limitazioni:
Le chiavi Cloud KMS sono limitate alla stessa regione o a più regioni della query. L'utilizzo di chiavi Cloud KMS globali non è consentito per motivi di affidabilità.
Non è possibile ruotare un insieme di chiavi con wrapping utilizzando la funzione
KEYS.ROTATE_KEYSET
.I parametri costanti in una query BigQuery sono visibili agli utenti nel piano di query di diagnostica. Questo fattore può influire sui parametri
kms_resource_name
efirst_level_keyset
della funzioneKEYSET_CHAIN
. Le chiavi non vengono mai esposte in testo normale e per decriptare il set di chiavi con wrapping è necessaria l'autorizzazione alla chiave Cloud KMS. Questo approccio garantisce che le chiavi non vengano esposte tramite il piano di query di diagnostica, a meno che l'utente non abbia l'autorizzazione per decriptare il set di chiavi.La crittografia a livello di colonna presenta le seguenti limitazioni se utilizzata con le classificazioni di sicurezza basate sul tipo:
Sicurezza a livello di colonna: gli utenti possono decriptare o criptare i dati solo nelle colonne a cui hanno accesso.
Sicurezza a livello di riga: gli utenti possono decriptare i dati solo nelle righe a cui è consentito accedere.
Le funzioni SQL a livello di colonna non hanno un impatto significativo sulle prestazioni rispetto alle funzioni di crittografia non elaborata in cui i dati della chiave vengono inviati in testo non cifrato.
Prima di iniziare
Per utilizzare chiavi, set di chiavi, tabelle criptate, funzioni deterministiche e non deterministiche di Cloud KMS, se non l'hai già fatto, devi:
Crea una chiave Cloud KMS per una colonna criptata con il livello di protezione software o Hardware Security Module (HSM).
Tieni presente i seguenti concetti, a cui viene fatto riferimento nelle sezioni successive:
PROJECT_ID
: il nome del progetto Google Cloud.DATASET_NAME
: il nome del set di dati BigQuery.LOCATION_ID
: la posizione del set di dati BigQuery.TABLE_NAME
: il nome della tabella BigQuery.KEY_RING_ID
: il nome della raccolta di chiavi Cloud KMS.KEY_ID
: il nome della chiave Cloud KMS.KMS_KEY
: chiave Cloud KMS (KEK) in questo formato:'gcp-kms://projects/PROJECT_ID/locations/LOCATION_ID/keyRings/KEY_RING_ID/cryptoKeys/KEY_ID'
Ecco un esempio di chiave Cloud KMS:
'gcp-kms://projects/myProject/locations/us/keyRings/myKeyRing/cryptoKeys/myKeyName'
KMS_KEY_SHORT
: simile aKMS_KEY
, ma in questo formato:projects/PROJECT_ID/locations/LOCATION_ID/keyRings/KEY_RING_ID/cryptoKeys/KEY_ID
KEYSET_DECODED
: un set di chiavi decodificato sotto forma di sequenzaBYTES
. L'output è simile a quello di un set di chiavi con wrapping decodificato.Sebbene le funzioni di insiemi di chiavi restituiscano insiemi di chiavi come byte, l'output dell'utente viene visualizzato come stringa codificata. Per convertire un insieme di chiavi codificato in un insieme di chiavi decodificato, consulta Decodificare un insieme di chiavi Cloud KMS
KEYSET_ENCODED
: un set di chiavi codificato comeSTRING
. L'output è simile a quello di un insieme di chiavi con wrapping codificato.Per convertire un insieme di chiavi codificato in un insieme di chiavi decodificato, consulta Decodificare un insieme di chiavi Cloud KMS
WRAPPED_KEYSET_DECODED
: un insieme di chiavi con wrapping decodificato sotto forma di sequenzaBYTES
. Ecco un esempio di output:b'\x0a$\x00\xa6\xee\x12Y\x8d|l"\xf7\xfa\xc6\xeafM\xdeefy\xe9\x7f\xf2z\xb3M\ xf6"\xd0\xe0Le\xa8\x8e\x0fR\xed\x12\xb7\x01\x00\xf0\xa80\xbd\xc1\x07Z\\ \xd0L<\x80A0\x9ae\xfd(9\x1e\xfa\xc8\x93\xc7\xe8\...'
Sebbene le funzioni del set di chiavi con wrapping restituiscano set di chiavi con wrapping come byte, l'output dell'utente viene visualizzato come stringa codificata. Per convertire un insieme di chiavi con wrapping codificato in un insieme di chiavi con wrapping decodificato, consulta Decodificare un insieme di chiavi Cloud KMS.
WRAPPED_KEYSET_ENCODED
: un insieme di chiavi con wrapping codificato comeSTRING
. Ecco un esempio di output:'CiQApu4SWTozQ7lNwITxpEvGlo5sT2rv1tyuSv3UAMtoTq/lhDwStwEA8KgwvX7CpVVzhWWMkRw WZNr3pf8uBIlzHeunCy8ZsQ6CofQYFpiBRBB6k/QqATbiFV+3opnDk/6dBL/S8OO1WoDC+DdD9 uzEFwqt5D20lTXCkGWFv1...'
Per convertire un insieme di chiavi con wrapping codificato in un insieme di chiavi con wrapping decodificato, consulta Decodificare un insieme di chiavi Cloud KMS
Gestione delle chiavi
Le sezioni seguenti contengono attività comuni che puoi eseguire con le chiavi Cloud KMS.
Crea un set di chiavi
Puoi creare insiemi di chiavi con wrapping o insiemi di chiavi non elaborati. Per farlo, completa i passaggi riportati nelle sezioni seguenti.
Creare un set di chiavi non elaborato
Esegui la seguente query per creare un insieme di chiavi con una chiave di tipo
DETERMINISTIC_AEAD_AES_SIV_CMAC_256
.
SELECT KEYS.NEW_KEYSET('DETERMINISTIC_AEAD_AES_SIV_CMAC_256') AS raw_keyset
Creare un set di chiavi con wrapping
Esegui la seguente query per creare un insieme di chiavi con wrapping Cloud KMS con una chiave di tipo DETERMINISTIC_AEAD_AES_SIV_CMAC_256
.
SELECT KEYS.NEW_WRAPPED_KEYSET( KMS_KEY, 'DETERMINISTIC_AEAD_AES_SIV_CMAC_256')
Decodificare un set di chiavi
Sebbene le funzioni SQL che restituiscono insiemi di chiavi producano insiemi di chiavi in formato BYTES
, il risultato visualizzato dall'utente viene codificato e visualizzato in formato STRING
. Se vuoi convertire questa stringa codificata in una sequenza di byte decodificata che puoi utilizzare come funzioni di crittografia delle chiavi letterali, utilizza la seguente query.
Decodificare un set di chiavi con wrapping
Esegui la seguente query per decodificare un insieme di chiavi con wrapping Cloud KMS.
SELECT FORMAT('%T', FROM_BASE64(WRAPPED_KEYSET_ENCODED'))
Decodificare un set di chiavi non elaborato
Esegui la seguente query per decodificare un set di chiavi non elaborato.
SELECT FORMAT('%T', FROM_BASE64(KEYSET_ENCODED'))
Eseguire nuovamente il wrapping di un insieme di chiavi con wrapping
Esegui la seguente query per eseguire nuovamente il wrapping di un insieme di chiavi con wrapping Cloud KMS con una nuova chiave Cloud KMS. KMS_KEY_CURRENT
rappresenta il nuovo KMS_KEY
utilizzato per criptare il set di chiavi. KMS_KEY_NEW
rappresenta il nuovo KMS_KEY
utilizzato per criptare il set di chiavi.
SELECT KEYS.REWRAP_KEYSET( KMS_KEY_CURRENT, KMS_KEY_NEW, WRAPPED_KEYSET_DECODED)
Ruotare un insieme di chiavi con wrapping
Esegui la seguente query per ruotare un insieme di chiavi con wrapping Cloud KMS con una chiave di tipo DETERMINISTIC_AEAD_AES_SIV_CMAC_256
.
SELECT KEYS.ROTATE_WRAPPED_KEYSET( KMS_KEY, WRAPPED_KEYSET_DECODED, 'DETERMINISTIC_AEAD_AES_SIV_CMAC_256')
Generare un set di chiavi non elaborato da un set di chiavi con wrapping
Alcune funzioni di crittografia richiedono un insieme di chiavi non elaborato. Per decriptare un insieme di chiavi con wrapping Cloud KMS e produrre un insieme di chiavi non elaborato, completa i seguenti passaggi.
Nello strumento a riga di comando bq, inserisci i seguenti comandi per salvare un insieme di chiavi con wrapping in un file denominato
keyset_to_unwrap
, decriptare l'insieme di chiavi con wrapping e produrre l'output nel formatoKEYSET_DECODED
:echo WRAPPED_KEYSET_ENCODED | base64 -d > /tmp/decoded_wrapped_key
gcloud kms decrypt \ --ciphertext-file=/tmp/decoded_wrapped_key \ --key=KMS_KEY_SHORT \ --plaintext-file=/tmp/keyset_to_unwrap.dec \ --project=PROJECT_ID
od -An --format=o1 /tmp/keyset_to_unwrap.dec | tr ' ' '\'
Generare un set di chiavi con wrapping da un set di chiavi non elaborato
Alcune funzioni di crittografia richiedono un insieme di chiavi con wrapping Cloud KMS. Per criptare un insieme di chiavi non elaborato in modo da produrre un insieme di chiavi con wrapping, completa i seguenti passaggi.
Nello strumento a riga di comando bq, inserisci i seguenti comandi per salvare un insieme di chiavi non elaborato in un file denominato
keyset_to_wrap
, criptarlo e produrre l'output nel formatoWRAPPED_KEYSET_DECODED
:echo KEYSET_ENCODED | base64 -d > /tmp/decoded_key
gcloud kms encrypt \ --plaintext-file=/tmp/decoded_key \ --key=KMS_KEY_SHORT \ --ciphertext-file=/tmp/keyset_to_wrap.dec \ --project=PROJECT_ID
od -An --format=o1 /tmp/keyset_to_wrap.dec | tr ' ' '\'
Generare una chiave con wrapping per una funzione DLP
Per le funzioni DLP, hai bisogno di una chiave di crittografia, che poi utilizzerai per ottenere una chiave con wrapping.
Per generare una nuova chiave crittografica, sulla riga di comando, esegui il seguente comando. La dimensione della chiave può essere di 16, 24 o 32 byte. L'esempio seguente utilizza una chiave di 16 byte:
openssl rand 16 > rand.key.16.bin
Esegui il wrapping della chiave di 16 byte generata con una chiave KMS. Vedi il seguente esempio:
KEYRING=projects/myproject/locations/us/keyRings/kms-test KEY=projects/myproject/locations/us/keyRings/kms-test/cryptoKeys/test-Kek PROJECT="myproject" gcloud kms encrypt --project $PROJECT --location us --keyring $KEYRING --key $KEY --plaintext-file ./rand.key.16.bin --ciphertext-file ./rand.key.16.wrapped
Ora puoi ottenere il letterale
BYTES
della chiave con wrapping o il formato base64 della chiave con wrapping.Valore letterale in byte
username:~/tmp$ od -b ./rand.key.16.wrapped | cut -d ' ' -f 2- | head -n -1 | sed -e 's/^/ /' | tr ' ' '\'
L'output è il seguente:
\012\044\000\325\155\264\153\246\071\172\130\372\305\103\047\342\356\061\077\014\030\126\147\041\126\150\012\036\020\202\215\044\267\310\331\014\116\233\022\071\000\363\344\230\067\274\007\340\273\016\212\151\226\064\200\377\303\207\103\147\052\267\035\350\004\147\365\251\271\133\062\251\246\152\177\017\005\270\044\141\211\116\337\043\035\263\122\340\110\333\266\220\377\247\204\215\233
Formato Base64
username:~/tmp$ base64 ./rand.key.16.wrapped
L'output è il seguente:
CiQA1W20a6Y5elj6xUMn4u4xPwwYVmchVmgKHhCCjSS3yNkMTpsSOQDz5Jg3vAfguw6KaZY0gP/Dh0NnKrcd6ARn9am5WzKppmp/DwW4JGGJTt8jHbNS4EjbtpD/p4SNmw==
Ottenere il numero di chiavi in un insieme di chiavi
Esegui la seguente query per ottenere il numero di chiavi in un insieme di chiavi non elaborato.
Se utilizzi un insieme di chiavi con wrapping, genera prima un insieme di chiavi non elaborato.
Esegui questa query con il set di chiavi non elaborato:
SELECT KEYS.KEYSET_LENGTH(KEYSET_DECODED) as key_count;
Ottenere una rappresentazione JSON di un insieme di chiavi
Esegui la seguente query per visualizzare una rappresentazione JSON di un insieme di chiavi non elaborato.
Se utilizzi un insieme di chiavi con wrapping, genera prima un insieme di chiavi non elaborato.
Esegui questa query con il set di chiavi non elaborato:
SELECT KEYS.KEYSET_TO_JSON(KEYSET_DECODED);
Crittografia e decrittografia
Puoi utilizzare insiemi di chiavi non elaborati o insiemi di chiavi con wrapping per criptare una colonna in una tabella. Puoi anche scegliere di utilizzare la crittografia deterministica o non deterministica per le colonne. Gli esempi in questa sezione utilizzano insiemi di chiavi con wrapping, ma puoi sostituirli con insiemi di chiavi non elaborati.
Crittografare in modo deterministico una colonna con un insieme di chiavi con wrapping
Esegui la seguente query per creare una tabella e archiviare un insieme di chiavi con wrapping Cloud KMS con crittografia deterministica in una colonna denominata encrypted_content
.
Crittografa una colonna con il set di chiavi con wrapping.
CREATE OR REPLACE TABLE DATASET_NAME.TABLE_NAME AS SELECT DETERMINISTIC_ENCRYPT( KEYS.KEYSET_CHAIN(KMS_KEY, WRAPPED_KEYSET_DECODED), 'plaintext', '') AS encrypted_content
Decriptare in modo deterministico una colonna con un insieme di chiavi con wrapping
Esegui la seguente query per decriptare in modo deterministico una colonna che contiene contenuti criptati utilizzando un insieme di chiavi con wrapping Cloud KMS. Questa query presuppone che tu stia facendo riferimento a una tabella con una colonna denominata encrypted_content
.
SELECT DETERMINISTIC_DECRYPT_STRING( KEYS.KEYSET_CHAIN(KMS_KEY, WRAPPED_KEYSET_DECODED), encrypted_content, '') FROM DATASET_NAME.TABLE_NAME
Crittografare una colonna in modo non deterministico con un insieme di chiavi con wrapping
Consulta la sezione Eseguire la crittografia deterministica di una colonna con un insieme di chiavi con wrapping, ma sostituisci DETERMINISTIC_ENCRYPT
con AEAD.ENCRYPT
. Assicurati che il set di chiavi sia di tipo AEAD_AES_GCM_256
.
Decriptare una colonna in modo non deterministico con un insieme di chiavi con wrapping
Consulta la sezione Decriptare in modo deterministico una colonna con un set di chiavi con wrapping, ma sostituisci DETERMINISTIC_DECRYPT_STRING
con AEAD.DECRYPT_STRING
. Assicurati
che l'insieme di chiavi sia di tipo AEAD_AES_GCM_256
.
Passaggi successivi
- Scopri di più su Cloud KMS. Questo argomento include informazioni concettuali sulla crittografia a livello di colonna per Google Cloud.
- Scopri di più sulla crittografia AEAD per BigQuery. Questo argomento include informazioni concettuali sulla crittografia a livello di colonna specificamente per BigQuery.
- Scopri di più sulle funzioni di crittografia AEAD per BigQuery. Questo argomento contiene tutte le funzioni SQL che puoi utilizzare per la crittografia a livello di colonna in BigQuery.