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 normale 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, 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, 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

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 tuoi dati possono essere esportati dalla tabella o decriptati con una query SQL.
  • "Controllo doppio dell'accesso" dei 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 sulla tabella
Autorizzazioni per la chiave Leggere e decriptare i dati criptati. Nessun accesso.
Nessuna autorizzazione sulla 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. Utenti puoi anche utilizzare Cloud KMS API REST o interfaccia a riga di comando 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 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 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 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 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 viene eseguito l'accesso utilizzando la funzione nella query in esecuzione nella tabella.

immagine

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.

immagine

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)

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 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 e first_level_keyset della funzione KEYSET_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 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 i dati solo nelle colonne a cui hanno accesso.

    • 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, funzioni deterministiche e non deterministiche di Cloud KMS, se non l'hai già fatto, devi:

  1. Creare un progetto Google Cloud.

  2. Crea un set di dati BigQuery.

  3. Crea un keyring Cloud KMS.

  4. Crea una chiave Cloud KMS per una colonna criptata con il software Livello di protezione Hardware Security Module (HSM).

  5. Concedi agli utenti le autorizzazioni per lavorare con le chiavi, la crittografia e la decrittografia di Cloud KMS.

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 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 a KMS_KEY, ma in questo formato:

    projects/PROJECT_ID/locations/LOCATION_ID/keyRings/KEY_RING_ID/cryptoKeys/KEY_ID
  • KEYSET_DECODED: un set di tasti decodificato sotto forma di sequenza BYTES. L'output è simile a quello di un set di chiavi con wrapping decodificato.

    Sebbene le funzioni dei set di chiavi restituiscano set 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 insieme di chiavi codificato come STRING. L'output è simile a quello di un set 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 sequenza BYTES. 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 come STRING. 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 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.

Crea 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 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')

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 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 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'))

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)

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')

Genera 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 Set di chiavi con wrapping di Cloud KMS per produrre un set di chiavi non elaborato, completa i seguenti passaggi.

  1. Crea un set di chiavi con wrapping.

  2. 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 formato KEYSET_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 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.

  1. Crea un set di chiavi non elaborato.

  2. 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 formato WRAPPED_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, hai bisogno di una chiave di crittografia, che poi utilizzerai per ottenere una chiave con wrapping.

  1. 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 da 16 byte:

    openssl rand 16 > rand.key.16.bin
    
  2. 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
    
  3. Ora puoi ottenere il letterale BYTES della chiave con wrapping o il formato base64 della chiave con 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 è 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.

  1. Se stai utilizzando un set di chiavi con wrapping, generare un set di chiavi non elaborato.

  2. 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 la seguente query per visualizzare una rappresentazione JSON di un insieme di chiavi non elaborato.

  1. Se stai utilizzando un set di chiavi con wrapping, generare un set di chiavi non elaborato.

  2. Esegui questa query con il set di chiavi non elaborato:

    SELECT KEYS.KEYSET_TO_JSON(KEYSET_DECODED);

Crittografia e decriptazione

Puoi utilizzare insiemi di chiavi non elaborati o incapsulati 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 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 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.

  1. Crea un set di chiavi con wrapping.

  2. 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 determinante una colonna con un set 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. 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

Crittografare una colonna in modo non deterministico con un insieme 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 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. 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.