Crittografia a livello di colonna con Cloud KMS
Puoi utilizzare Cloud Key Management Service (Cloud KMS). per crittografare le chiavi che a loro volta crittografano i valori all'interno di e tabelle BigQuery. Puoi utilizzare lo Crittografia AEAD con i set di chiavi di Cloud KMS o set di chiavi a capo per fornire un secondo livello di protezione a livello di colonna.
Introduzione
Per offrire un ulteriore livello di protezione, Cloud KMS cripta i tuoi chiave di crittografia dei dati (DEK, data Encryption Key) con una seconda chiave di crittografia della chiave (KEK). In BigQuery, fare riferimento a un set di chiavi criptato anziché a il set di chiavi in testo non crittografato contribuisce a ridurre il rischio di esposizione delle chiavi. La KEK è una simmetrica un set di chiavi di crittografia archiviato in modo sicuro in Cloud KMS e gestito utilizzando ruoli e autorizzazioni di Identity and Access Management (IAM).
BigQuery supporta la crittografia deterministica e non deterministica funzioni. Con la crittografia deterministica, se sia i dati archiviati che i dati autenticati aggiuntivi (facoltativo) sono identici, il testo crittografato sono identici. Ciò consente di supportare l'aggregazione e i join in base alla colonna criptata. Con la crittografia non deterministica, gli oggetti archiviati il testo crittografato è univoco indipendentemente dai dati criptati, il che impedisce come clustering, aggregazione e join.
Al momento dell'esecuzione della query, devi fornire il percorso della risorsa Cloud KMS del KEK e il testo crittografato della DEK incorporata. Chiamate BigQuery Cloud KMS per decriptare la DEK e poi utilizza questa chiave per decriptare i dati nella query. La versione senza wrapping della DEK viene archiviata in memoria solo per la durata della query, per poi eliminarlo.
Se utilizzi Cloud KMS in una regione in cui Cloud External Key Manager è supportato. Puoi utilizzare le chiavi basate su Cloud EKM in di Cloud KMS.
Casi d'uso
I casi d'uso per la crittografia con le chiavi Cloud KMS includono quanto segue:
- Dati criptati esternamente che devono essere archiviati in BigQuery senza archiviare il set di chiavi in testo non crittografato. I tuoi dati possono essere esportati dalla tabella o decriptati con una query SQL.
- "Controllo doppio dell'accesso" dei dati criptati in BigQuery. R all'utente deve essere concessa l'autorizzazione sia per la tabella che per la chiave di crittografia leggere i dati in chiaro.
Matrice delle autorizzazioni utente | ||
---|---|---|
Autorizzazione sulla tabella | Nessuna autorizzazione sulla tabella | |
Autorizzazioni sulla chiave | Leggere e decriptare i dati criptati. | Nessun accesso. |
Nessuna autorizzazione sulla chiave | Leggere i dati criptati. | Nessun accesso. |
Se un utente dispone dell'autorizzazione per accedere alla chiave KMS e del servizio
set di chiavi, le funzioni SQL possono decriptare il set di chiavi e decriptare il testo crittografato. Utenti
puoi anche utilizzare Cloud KMS
API REST
o
CLI
per annullare il wrapping del set di chiavi.
Il seguente esempio di query utilizza le funzioni SQL KMS per decriptare i dati non deterministici
testo crittografato:
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
Ipotizza un'implementazione in cui vengono presi in considerazione i codici postali
informazioni sensibili. I dati del codice postale possono essere inseriti
tabella BigQuery che utilizza la funzione di crittografia AEAD,
criptando la colonna Zipcode
. In questo esempio, utilizziamo
Funzione AEAD.ENCRYPT
con la funzione di gestione dei set di chiavi con wrapping. La
La funzione KEYS.KEYSET_CHAIN
cripta la chiave di crittografia digitale con la KEK,
e la funzione AEAD.ENCRYPT
passa le informazioni al KMS.
La catena del set di chiavi per la crittografia e la decriptazione garantisce che la crittografia dei dati chiave (DEK) è criptata o sottoposta a wrapping con una KEK e passata con quella KEK. La la DEK con wrapping viene decriptata o decriptata all'interno della funzione SQL, quindi usata criptare o decriptare i dati.
La funzione non deterministica AEAD può decriptare i dati quando vi si accede utilizzando la funzione nella query eseguita sulla tabella.
La funzione deterministica AEAD può decriptare i dati quando vi si accede utilizzando la funzione nella query che viene eseguita sulla tabella e supporta l'aggregazione e i join utilizzando i dati criptati.
Sintassi delle funzioni non deterministiche
La sintassi supportata per l'utilizzo di funzioni non deterministiche include seguenti:
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)
Vedi AEAD.DECRYPT_BYTES
,
AEAD.ENCRYPT
,
AEAD.DECRYPT_STRING
,
e KEYS.KEYSET_CHAIN
la sintassi della funzione.
Sintassi della funzione deterministica
La sintassi supportata per l'utilizzo delle funzioni deterministiche include la seguenti:
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)
Vedi DETERMINISTIC_DECRYPT_BYTES
,
DETERMINISTIC_ENCRYPT
,
DETERMINISTIC_DECRYPT_STRING
,
e KEYS.KEYSET_CHAIN
la sintassi della funzione.
Ruoli e autorizzazioni
Per un elenco di ruoli per Cloud KMS, consulta Autorizzazioni e ruoli di Cloud KMS.
Limitazioni
La crittografia con Cloud KMS presenta le seguenti limitazioni e restrizioni:
Le chiavi Cloud KMS sono limitate allo stesso una o più regioni come query. L'utilizzo di chiavi Cloud KMS globali non è consentito per per motivi di affidabilità.
Non è possibile ruotare un set di chiavi con wrapping utilizzando
KEYS.ROTATE_KEYSET
personalizzata.I parametri costanti in una query BigQuery sono visibili agli utenti nel piano di query di diagnostica. Questo fattore può influire su
kms_resource_name
efirst_level_keyset
parametri della funzioneKEYSET_CHAIN
. Le chiavi non vengono mai esposte in è necessario il testo non crittografato e l'autorizzazione per la chiave Cloud KMS e il set di chiavi con wrapping. Questo approccio garantisce che le chiavi non siano esposte tramite il piano di query di diagnostica, a meno che l'utente non disponga dell'autorizzazione per decriptare il set di chiavi.Se utilizzata con la crittografia a livello di colonna, sono previste le seguenti limitazioni le classificazioni di sicurezza basate sul tipo:
Sicurezza a livello di colonna: gli utenti possono decriptare o criptare solo i dati delle colonne a cui possono accedere.
Sicurezza a livello di riga: gli utenti possono decriptare i dati solo nelle righe che autorizzati ad accedere.
Le funzioni SQL a livello di colonna non hanno un impatto significativo sulle prestazioni quando rispetto alle prestazioni delle funzioni di crittografia non elaborate in cui i dati chiave vengono inviato in testo non crittografato.
Prima di iniziare
Per utilizzare chiavi, set di chiavi, tabelle criptate, set di chiavi di Cloud KMS, funzioni deterministiche e non deterministiche, devi fare quanto segue se non hai già fatto:
Crea una chiave Cloud KMS per una colonna criptata con il software Livello di protezione Hardware Security Module (HSM).
Concedi agli utenti le autorizzazioni per lavorare con Cloud KMS, crittografia, e la decrittografia.
Prendi nota dei seguenti concetti, come verranno citati nel prossimo video. sezioni:
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 del keyring di Cloud KMS.KEY_ID
: il nome della chiave Cloud KMS.KMS_KEY
: chiave Cloud KMS (KEK) nel formato seguente:'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 sembra in modo simile a quello di un set di chiavi con wrapping decodificato.Anche se le funzioni set di chiavi restituiscono set di chiavi come byte, l'output utente viene visualizzato come stringa codificata. Per convertire un modello di conversione a un set di chiavi decodificato, vedi Decodifica un set di chiavi Cloud KMS
KEYSET_ENCODED
: un set di chiavi codificato comeSTRING
. L'output è simile a quello di un set di chiavi con wrapping codificato.Per convertire un set di chiavi codificato in un set di chiavi decodificato, consulta la sezione Decodifica un set di chiavi Cloud KMS
WRAPPED_KEYSET_DECODED
: un set 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\...'
Anche se le funzioni dei set di chiavi con wrapping restituiscono set di chiavi con wrapping come byte, l'output utente viene visualizzato come stringa codificata. Per convertire un modello di conversione con wrapping di un set di chiavi con wrapping a un set di chiavi con wrapping decodificato, consulta Decodifica un set di chiavi Cloud KMS
WRAPPED_KEYSET_ENCODED
: un set di chiavi con wrapping codificato comeSTRING
. Ecco un esempio di output:'CiQApu4SWTozQ7lNwITxpEvGlo5sT2rv1tyuSv3UAMtoTq/lhDwStwEA8KgwvX7CpVVzhWWMkRw WZNr3pf8uBIlzHeunCy8ZsQ6CofQYFpiBRBB6k/QqATbiFV+3opnDk/6dBL/S8OO1WoDC+DdD9 uzEFwqt5D20lTXCkGWFv1...'
Per convertire un set di chiavi con wrapping codificato in un set di chiavi con wrapping decodificato, consulta Decodifica un set di chiavi Cloud KMS
Gestione delle chiavi
Le seguenti sezioni contengono le attività comuni che puoi eseguire con Chiavi Cloud KMS.
Crea un set di chiavi
Puoi creare set di chiavi con wrapping o set di chiavi non elaborate. Per farlo, completa i passaggi riportati di seguito nelle sezioni seguenti.
Crea un set di chiavi non elaborato
Esegui questa query per creare un set 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
Crea un set di chiavi con wrapping
Esegui questa query per creare un set di chiavi con wrapping di Cloud KMS con un
chiave di tipo DETERMINISTIC_AEAD_AES_SIV_CMAC_256
.
SELECT KEYS.NEW_WRAPPED_KEYSET( KMS_KEY, 'DETERMINISTIC_AEAD_AES_SIV_CMAC_256')
Decodifica di un set di chiavi
Anche se le funzioni SQL che restituiscono set di chiavi producono i set di chiavi in
formato BYTES
, il risultato visualizzato dall'utente è codificato e visualizzato
STRING
. Se desideri convertire questa stringa codificata in un
una sequenza di byte decodificata che puoi usare come funzioni di crittografia a chiave letterale,
usa la seguente query.
Decodifica un set di chiavi con wrapping
Esegui questa query per decodificare un set di chiavi con wrapping di Cloud KMS.
SELECT FORMAT('%T', FROM_BASE64(WRAPPED_KEYSET_ENCODED'))
Decodifica un set di chiavi non elaborato
Esegui questa query per decodificare un set di chiavi non elaborato.
SELECT FORMAT('%T', FROM_BASE64(KEYSET_ENCODED'))
Riavvolgi un set di chiavi con wrapping
Esegui questa query per aggregare un set di chiavi con wrapping di Cloud KMS con un nuovo
Chiave Cloud KMS. KMS_KEY_CURRENT
rappresenta il nuovo KMS_KEY
, ovvero
utilizzato per criptare il set di chiavi. KMS_KEY_NEW
rappresenta il nuovo KMS_KEY
, ovvero
utilizzato per criptare il set di chiavi.
SELECT KEYS.REWRAP_KEYSET( KMS_KEY_CURRENT, KMS_KEY_NEW, WRAPPED_KEYSET_DECODED)
Ruota un set di chiavi con wrapping
Esegui questa query per ruotare un set di chiavi con wrapping di Cloud KMS con
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')
Genera un set di chiavi non elaborato da un set di chiavi con wrapping
Alcune funzioni di crittografia richiedono un set di chiavi non elaborato. Per decriptare un Set di chiavi con wrapping di Cloud KMS per produrre un set di chiavi non elaborato, completa i seguenti passaggi.
Nello strumento a riga di comando bq, inserisci i seguenti comandi per salvare un set di chiavi aggregato un file chiamato
keyset_to_unwrap
, decriptare il set di chiavi con wrapping e genera 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 ' ' '\'
Genera un set di chiavi con wrapping da un set di chiavi non elaborato
Alcune funzioni di crittografia richiedono un set di chiavi con wrapping di Cloud KMS. A crittografare un set di chiavi non elaborato per produrre un set di chiavi con wrapping, completa i seguenti passaggi.
Nello strumento a riga di comando bq, inserisci i seguenti comandi per salvare un set di chiavi non elaborato un file chiamato
keyset_to_wrap
, cripta il set di chiavi non elaborato e genera 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 sottoposta a wrapping per una funzione DLP
Per le funzioni DLP, puoi: c'è bisogno di una chiave di crittografia e la useremo per ottenere una chiave con wrapping.
Per generare una nuova chiave di crittografia, nella riga di comando: esegui questo comando. La dimensione della chiave può essere 16, 24 o 32 byte. L'esempio seguente utilizza una chiave da 16 byte:
openssl rand 16 > rand.key.16.bin
Aggrega la chiave da 16 byte generata con una chiave KMS. Vedi l'esempio che segue:
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 valore letterale
BYTES
della chiave con wrapping o il formato base64 della chiave sottoposta a wrapping.Byte letterali
username:~/tmp$ od -b ./rand.key.16.wrapped | cut -d ' ' -f 2- | head -n -1 | sed -e 's/^/ /' | tr ' ' '\'
L'output è simile al 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 è simile al seguente:
CiQA1W20a6Y5elj6xUMn4u4xPwwYVmchVmgKHhCCjSS3yNkMTpsSOQDz5Jg3vAfguw6KaZY0gP/Dh0NnKrcd6ARn9am5WzKppmp/DwW4JGGJTt8jHbNS4EjbtpD/p4SNmw==
Visualizza il numero di chiavi in un set di chiavi
Esegui questa query per ottenere il numero di chiavi in un set di chiavi non elaborato.
Se stai utilizzando un set di chiavi con wrapping, generare un set 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 set di chiavi
Esegui questa query per visualizzare una rappresentazione JSON di un set di chiavi non elaborato.
Se stai utilizzando un set di chiavi con wrapping, generare un set 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 set di chiavi non elaborati o set di chiavi con wrapping per criptare una colonna in una tabella. Tu puoi anche scegliere di utilizzare la crittografia deterministica o non deterministica sui tuoi colonne. Gli esempi in questa sezione utilizzano set di chiavi con wrapping, ma puoi sostituire i set di tasti avvolti con set di tasti grezzi.
Cripta in modo determinante una colonna con un set di chiavi con wrapping
Esegui questa query per creare una tabella e archiviare un
Set di chiavi con wrapping di Cloud KMS con crittografia deterministica in una colonna
chiamato encrypted_content
.
Cripta 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 determinante una colonna con un set di chiavi con wrapping
Esegui questa query per decriptare in modo deterministico una colonna che
include contenuti criptati utilizzando un set di chiavi con wrapping di Cloud KMS. Questo
query presuppone che tu faccia 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
Cripta in modo non deterministico una colonna con un set di chiavi con wrapping
Vedi Criptare in modo determinante una colonna con un set di chiavi con wrapping per
ma sostituisci DETERMINISTIC_ENCRYPT
con AEAD.ENCRYPT
. Assicurati che i tuoi
il set di chiavi è di tipo AEAD_AES_GCM_256
.
Decriptare in modo non deterministico una colonna con un set di chiavi con wrapping
Vedi Decriptare in modo determinante una colonna con un set di chiavi con wrapping.
ma sostituisci DETERMINISTIC_DECRYPT_STRING
con AEAD.DECRYPT_STRING
. Assicurati che
che il set 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. in particolare 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.