Verschlüsselung auf Spaltenebene mit Cloud KMS

Sie können Cloud Key Management Service (Cloud KMS) verwenden, um die Schlüssel zu verschlüsseln, die wiederum die Werte in BigQuery-Tabellen verschlüsseln. Sie können die AEAD-Verschlüsselungsfunktionen mit Cloud KMS-Schlüsselsätzen oder verpackten Schlüsselsätzen verwenden, um eine zweite Schutzebene auf Spaltenebene bereitzustellen.

Einführung

Als zusätzliche Schutzmaßnahme verschlüsselt Cloud KMS Ihren Datenverschlüsselungsschlüssel (Data Encryption Key, DEK) mit einem zweiten Schlüsselverschlüsselungsschlüssel (Key Encryption Key, KEK). In BigQuery reduziert der Verweis auf einen verschlüsselten Schlüsselsatz anstelle eines Klartextschlüsselsatzes das Risiko der Schlüsselfreigabe. Der KEK ist ein symmetrischer Verschlüsselungs-Schlüsselsatz, der sicher in Cloud KMS gespeichert und mit IAM-Rollen und -Berechtigungen (Identity and Access Management) verwaltet wird.

BigQuery unterstützt deterministische und nicht deterministische Verschlüsselungsfunktionen. Bei der deterministischen Verschlüsselung sind die Geheimtext identisch, wenn sowohl die gespeicherten Daten als auch die zusätzlichen authentifizierten Daten (optional) identisch sind. Dies ermöglicht die Unterstützung von Aggregationen und Joins auf Basis der verschlüsselten Spalte. Bei der nicht deterministischen Verschlüsselung ist der gespeicherte Geheimtext unabhängig von den verschlüsselten Daten eindeutig, wodurch Clustering, Aggregation und Joins verhindert werden.

Zum Zeitpunkt der Abfrageausführung geben Sie den Cloud KMS-Ressourcenpfad des KEK und den Geheimtext aus dem verpackten DEK an. BigQuery ruft Cloud KMS auf, um den DEK zu entpacken, und verwendet diesen Schlüssel dann zum Entschlüsseln der Daten in Ihrer Abfrage. Die entpackte Version des DEK wird nur für die Dauer der Abfrage im Arbeitsspeicher gespeichert und dann gelöscht.

Wenn Sie Cloud KMS in einer Region verwenden, in der der Cloud External Key Manager unterstützt wird, können Sie Cloud EKM-basierte Schlüssel in Cloud KMS verwenden.

Anwendungsfälle

Anwendungsfälle für die Verschlüsselung mit Cloud KMS-Schlüsseln umfassen Folgendes:

  • Extern verschlüsselte Daten, die in BigQuery gespeichert werden müssen, ohne den Schlüsselsatz als Klartext zu speichern. Ihre Daten können dann aus der Tabelle exportiert oder mit einer SQL-Abfrage entschlüsselt werden.
  • "Doppelte Zugriffssteuerung" für verschlüsselte Daten in BigQuery. Ein Nutzer muss Zugriff sowohl auf die Tabelle als auch auf den Verschlüsselungsschlüssel erhalten, um Daten als Klartext lesen zu können.
Nutzerberechtigungsmatrix
Berechtigung für Tabelle Keine Berechtigung für Tabelle
Berechtigungen für Schlüssel Verschlüsselte Daten lesen und entschlüsseln. Kein Zugriff.
Keine Berechtigungen für Schlüssel Verschlüsselte Daten lesen. Kein Zugriff.

Wenn ein Nutzer Zugriff auf den KMS-Schlüssel und auf den verpackten Schlüsselsatz hat, können SQL-Funktionen den Schlüsselsatz entpacken und den Geheimtext entschlüsseln. Nutzer können auch die Cloud KMS REST API oder die Befehlszeile verwenden, um den Schlüsselsatz zu entpacken.
Im folgenden Abfragebeispiel werden KMS-SQL-Funktionen verwendet, um nicht deterministischen Geheimtext zu entschlüsseln:

SELECT
  AEAD.DECRYPT_STRING(
    KEYS.KEYSET_CHAIN(@kms_resource_name, @first_level_keyset),
    ciphertext,
    additional_authenticated_data)
FROM
  ciphertext_table
WHERE
  ...

Beispiel für einen Anwendungsfall

Gehen Sie von einer Implementierung aus, bei der Postleitzahlen als vertrauliche Informationen gelten. Postleitzahlsdaten können mithilfe der AEAD-Verschlüsselungsfunktion in die BigQuery-Tabelle eingefügt werden, wodurch die Spalte Zipcode verschlüsselt wird. In diesem Beispiel verwenden wir die Funktion AEAD.ENCRYPT mit der Verwaltungsfunktion für verpackte Schlüsselsätze. Die Funktion KEYS.KEYSET_CHAIN verschlüsselt den digitalen Verschlüsselungsschlüssel mit dem KEK. Die Funktion AEAD.ENCRYPT übergibt die Informationen dann an KMS.

Die Schlüsselsatzkette für die Verschlüsselung und Entschlüsselung sorgt dafür, dass der Datenverschlüsselungsschlüssel (Data Encryption Key, DEK) verschlüsselt oder mit einem KEK verpackt wird und mit diesem KEK übergeben wird. Der verpackte DEK wird innerhalb der SQL-Funktion entschlüsselt oder ausgepackt und dann zum Verschlüsseln oder Entschlüsseln von Daten verwendet.

Die nicht deterministische AEAD-Funktion kann Daten entschlüsseln, wenn sie mit der Funktion in der Abfrage aufgerufen werden, die in der Tabelle ausgeführt wird.

Image

Die deterministische AEAD-Funktion kann Daten entschlüsseln, wenn auf sie mit der Funktion in der Abfrage zugegriffen wird, die auf der Tabelle ausgeführt wird. Außerdem wird die Aggregation und Joins mithilfe der verschlüsselten Daten unterstützt.

Image

Nicht deterministische Funktionssyntax

Folgende Syntax wird für die Verwendung nicht deterministischer Funktionen unterstützt:

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)

Weitere Informationen finden Sie unter der Funktionssyntax AEAD.DECRYPT_BYTES, AEAD.ENCRYPT, AEAD.DECRYPT_STRING und KEYS.KEYSET_CHAIN.

Deterministische Funktionssyntax

Folgende Syntax wird für die Verwendung deterministischer Funktionen unterstützt:

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)

Weitere Informationen finden Sie unter der Funktionssyntax DETERMINISTIC_DECRYPT_BYTES, DETERMINISTIC_ENCRYPT, DETERMINISTIC_DECRYPT_STRING und KEYS.KEYSET_CHAIN.

Rollen und Berechtigungen

Eine Liste der Rollen für Cloud KMS finden Sie unter Berechtigungen und Rollen für Cloud KMS.

Beschränkungen

Für die Verschlüsselung mit Cloud KMS gelten die folgenden Limits und Einschränkungen:

  • Die Cloud KMS-Schlüssel sind auf dieselbe Region oder Multiregion wie die Abfrage beschränkt. Die Verwendung globaler Cloud KMS-Schlüssel ist aus Gründen der Zuverlässigkeit nicht zulässig.

  • Ein verpackter Schlüsselsatz kann nicht mit der Funktion KEYS.ROTATE_KEYSET rotiert werden.

  • Die konstanten Parameter in einer BigQuery-Abfrage für Nutzer im Diagnoseabfrageplan sind sichtbar. Dies kann sich auf die Parameter kms_resource_name und first_level_keyset der Funktion KEYSET_CHAIN auswirken. Schlüssel werden niemals als Klartext bereitgestellt und es ist eine Berechtigung für den Cloud KMS-Schlüssel erforderlich, um den verpackten Schlüsselsatz zu entschlüsseln. Mit diesem Ansatz wird sichergestellt, dass Schlüssel nicht über den Diagnoseabfrageplan verfügbar gemacht werden, es sei denn, der Nutzer ist berechtigt, den Schlüsselsatz zu entschlüsseln.

  • Für die Verschlüsselung auf Spaltenebene gelten die folgenden Einschränkungen bei der Verwendung typbasierter Sicherheitsklassifizierungen:

    • Sicherheit auf Spaltenebene: Nutzer können Daten nur in Spalten entschlüsseln oder verschlüsseln, auf die sie Zugriff haben.

    • Sicherheit auf Zeilenebene: Nutzer können Daten nur in Zeilen entschlüsseln, auf die sie Zugriff haben.

  • SQL-Funktionen auf Spaltenebene haben keine wesentlichen Auswirkungen auf die Leistung im Vergleich zur Leistung von Rohverschlüsselungsfunktionen, bei denen die Schlüsseldaten als reiner Text gesendet werden.

Hinweis

Um mit Cloud KMS-Schlüsseln, -Schlüsselsätzen, verschlüsselten Tabellen, deterministischen und nicht deterministischen Funktionen zu arbeiten, müssen Sie Folgendes tun, falls Sie dies noch nicht getan haben:

  1. Google Cloud-Projekt erstellen

  2. Erstellen Sie ein BigQuery-Dataset.

  3. Erstellen Sie einen Cloud KMS-Schlüsselbund.

  4. Erstellen Sie einen Cloud KMS-Schlüssel für eine verschlüsselte Spalte mit der Software oder der Schutzstufe Hardwaresicherheitsmodul (HSM).

  5. Nutzerberechtigungen für die Arbeit mit Cloud KMS-Schlüsseln, -Verschlüsselung und -Entschlüsselung erteilen.

Beachten Sie die folgenden Konzepte, auf die in den nächsten Abschnitten verwiesen wird:

  • PROJECT_ID: Der Name des Google Cloud-Projekts.

  • DATASET_NAME: Der Name des BigQuery-Datasets.

  • LOCATION_ID: Der Speicherort des BigQuery-Datasets.

  • TABLE_NAME: Der Name der BigQuery-Tabelle.

  • KEY_RING_ID: Der Name des Cloud KMS-Schlüsselbunds.

  • KEY_ID: Der Name des Cloud KMS-Schlüssels.

  • KMS_KEY: Der Cloud KMS-Schlüssel (KEK) in diesem Format:

    'gcp-kms://projects/PROJECT_ID/locations/LOCATION_ID/keyRings/KEY_RING_ID/cryptoKeys/KEY_ID'
    

    Hier ein Beispiel für einen Cloud KMS-Schlüssel:

    'gcp-kms://projects/myProject/locations/us/keyRings/myKeyRing/cryptoKeys/myKeyName'
    
  • KMS_KEY_SHORT: ähnelt KMS_KEY, aber in diesem Format:

    projects/PROJECT_ID/locations/LOCATION_ID/keyRings/KEY_RING_ID/cryptoKeys/KEY_ID
    
  • KEYSET_DECODED: Ein decodierter Schlüsselsatz als BYTES-Sequenz. Die Ausgabe sieht etwa so aus wie bei einem decodierten verpackten Schlüsselsatz.

    Obwohl Schlüsselsatz-Funktionen Schlüsselsätze als Byte zurückgeben, wird die Nutzerausgabe als codierter String angezeigt. Informationen zum Konvertieren eines codierten Schlüsselsatzes in einen decodierten Schlüsselsatz finden Sie unter Cloud KMS-Schlüsselsatz decodieren.

  • KEYSET_ENCODED: Ein codierter Schlüsselsatz als STRING. Die Ausgabe sieht etwa so aus wie bei einem codierten verpackten Schlüsselsatz.

    Informationen zum Konvertieren eines codierten Schlüsselsatzes in einen decodierten Schlüsselsatz finden Sie unter Cloud KMS-Schlüsselsatz decodieren.

  • WRAPPED_KEYSET_DECODED: Ein decodierter Schlüsselsatz als BYTES-Sequenz. Hier ein Beispiel für die Ausgabe:

    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\...'
    

    Obwohl verpackte Schlüsselsatz-Funktionen verpackte Schlüsselsätze als Byte zurückgeben, wird die Nutzerausgabe als codierter String angezeigt. Informationen zum Konvertieren eines codierten verpackten Schlüsselsatzes in einen decodierten verpackten Schlüsselsatz finden Sie unter Cloud KMS-Schlüsselsatz decodieren.

  • WRAPPED_KEYSET_ENCODED: Ein codierter verpackter Schlüsselsatz als STRING. Hier ein Beispiel für die Ausgabe:

    'CiQApu4SWTozQ7lNwITxpEvGlo5sT2rv1tyuSv3UAMtoTq/lhDwStwEA8KgwvX7CpVVzhWWMkRw
    WZNr3pf8uBIlzHeunCy8ZsQ6CofQYFpiBRBB6k/QqATbiFV+3opnDk/6dBL/S8OO1WoDC+DdD9
    uzEFwqt5D20lTXCkGWFv1...'
    

    Informationen zum Konvertieren eines codierten verpackten Schlüsselsatzes in einen decodierten verpackten Schlüsselsatz finden Sie unter Cloud KMS-Schlüsselsatz decodieren.

Schlüsselverwaltung

Die folgenden Abschnitte enthalten gängige Aufgaben, die Sie mit Cloud KMS-Schlüsseln ausführen können.

Schlüsselsatz erstellen

Sie können verpackte Schlüsselsätze oder Rohschlüsselsätze erstellen. Führen Sie dazu die Schritte in den folgenden Abschnitten aus.

Rohschlüsselsatz erstellen

Führen Sie die folgende Abfrage aus, um einen Schlüsselsatz mit einem Schlüssel vom Typ DETERMINISTIC_AEAD_AES_SIV_CMAC_256 zu erstellen.

SELECT KEYS.NEW_KEYSET('DETERMINISTIC_AEAD_AES_SIV_CMAC_256') AS raw_keyset

Verpackten Schlüsselsatz erstellen

Führen Sie die folgende Abfrage aus, um einen mit Cloud KMS verpackten Schlüsselsatz mit dem Schlüssel des Typs DETERMINISTIC_AEAD_AES_SIV_CMAC_256 zu erstellen.

SELECT KEYS.NEW_WRAPPED_KEYSET(
  KMS_KEY,
  'DETERMINISTIC_AEAD_AES_SIV_CMAC_256')

Schlüsselsatz decodieren

Obwohl SQL-Funktionen, die Schlüsselsätze zurückgeben, die Schlüsselsätze im Format BYTES erzeugen, wird das vom Nutzer angezeigte Ergebnis codiert und im Format STRING angezeigt. Verwenden Sie die folgende Abfrage, wenn Sie diesen codierten String in eine decodierte Byte-Sequenz umwandeln möchten, die Sie als Funktionen für die literale Schlüsselverschlüsselung verwenden können.

Verpackten Schlüsselsatz decodieren

Führen Sie die folgende Abfrage aus, um einen mit Cloud KMS verpackten Schlüsselsatz zu decodieren.

SELECT FORMAT('%T', FROM_BASE64(WRAPPED_KEYSET_ENCODED'))

Rohschlüsselsatz decodieren

Führen Sie die folgende Abfrage aus, um einen Standard-Schlüsselsatz zu decodieren.

SELECT FORMAT('%T', FROM_BASE64(KEYSET_ENCODED'))

Verpackten Schlüsselsatz noch einmal verpacken

Führen Sie die folgende Abfrage aus, um einen mit Cloud KMS verpackten Schlüsselsatz mit einem neuen Cloud KMS-Schlüssel neu zu verpacken. KMS_KEY_CURRENT steht für die neue KMS_KEY, die zum Verschlüsseln des Schlüsselsatzes verwendet wird. KMS_KEY_NEW steht für die neue KMS_KEY, die zum Verschlüsseln des Schlüsselsatzes verwendet wird.

SELECT KEYS.REWRAP_KEYSET(
  KMS_KEY_CURRENT,
  KMS_KEY_NEW,
  WRAPPED_KEYSET_DECODED)

Verpackten Schlüsselsatz rotieren

Führen Sie die folgende Abfrage aus, um einen mit Cloud KMS verpackten Schlüsselsatz mit einem Schlüssel vom Typ DETERMINISTIC_AEAD_AES_SIV_CMAC_256 zu rotieren.

SELECT KEYS.ROTATE_WRAPPED_KEYSET(
  KMS_KEY,
  WRAPPED_KEYSET_DECODED,
  'DETERMINISTIC_AEAD_AES_SIV_CMAC_256')

Rohschlüsselsatz aus einem verpackten Schlüsselsatz generieren

Einige Verschlüsselungsfunktionen erfordern einen Rohschlüsselsatz. Führen Sie die folgenden Schritte aus, um einen mit Cloud KMS verpackten Schlüsselsatz zu entschlüsseln, um ein Rohschlüsselset zu erstellen.

  1. Verpackten Schlüsselsatz erstellen.

  2. Geben Sie im bq-Befehlszeilentool die folgenden Befehle ein, um einen verpackten Schlüsselsatz in einer Datei namens keyset_to_unwrap zu speichern, den verpackten Schlüsselsatz zu entschlüsseln und die Ausgabe im KEYSET_DECODED-Format zu erzeugen:

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

Verpackten Schlüsselsatz aus einem Rohschlüsselsatz generieren

Für einige Verschlüsselungsfunktionen wird ein mit Cloud KMS verpackter Schlüsselsatz benötigt. Führen Sie die folgenden Schritte aus, um einen Rohschlüsselsatz zu verschlüsseln, mit dem ein verpackter Schlüsselsatz erstellt wird.

  1. Erstellen Sie einen Rohschlüsselsatz.

  2. Geben Sie im bq-Befehlszeilentool die folgenden Befehle ein, um einen Schlüsselsatz im Rohformat in einer Datei namens keyset_to_wrap zu speichern, das Rohschlüsselset zu verschlüsseln und die Ausgabe im Format WRAPPED_KEYSET_DECODED zu erzeugen:

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

Anzahl der Schlüssel in einem Schlüsselsatz abrufen

Führen Sie die folgende Abfrage aus, um die Anzahl der Schlüssel in einem Standard-Schlüsselsatz abzurufen.

  1. Wenn Sie mit einem verpackten Schlüsselsatz arbeiten, erstellen Sie zuerst ein Rohschlüsselset.

  2. Führen Sie diese Abfrage mit dem Rohschlüsselsatz aus:

    SELECT KEYS.KEYSET_LENGTH(KEYSET_DECODED) as key_count;
    

JSON-Darstellung eines Schlüsselsatzes abrufen

Führen Sie die folgende Abfrage aus, um eine JSON-Darstellung eines Standard-Schlüsselsatzs aufzurufen.

  1. Wenn Sie mit einem verpackten Schlüsselsatz arbeiten, erstellen Sie zuerst ein Rohschlüsselset.

  2. Führen Sie diese Abfrage mit dem Rohschlüsselsatz aus:

    SELECT KEYS.KEYSET_TO_JSON(KEYSET_DECODED);
    

Verschlüsselung und Entschlüsselung

Sie können RAW-Schlüsselsätze oder verpackte Schlüsselsätze verwenden, um eine Spalte in einer Tabelle zu verschlüsseln. Sie können auch eine deterministische oder nicht deterministische Verschlüsselung für Ihre Spalten verwenden. In den Beispielen in diesem Abschnitt werden verpackte Schlüsselsätze verwendet. Sie können jedoch die verpackten Schlüsselsätze durch Rohschlüsselsätze ersetzen.

Spalte mit einem verpackten Schlüsselsatz deterministisch verschlüsseln

Führen Sie die folgende Abfrage aus, um eine Tabelle zu erstellen und einen mit Cloud KMS verpackten Schlüsselsatz mit deterministischer Verschlüsselung in einer Spalte namens encrypted_content zu speichern.

  1. Verpackten Schlüsselsatz erstellen.

  2. Spalte mit dem verpackten Schlüsselsatz verschlüsseln

    CREATE OR REPLACE TABLE DATASET_NAME.TABLE_NAME AS
      SELECT DETERMINISTIC_ENCRYPT(
        KEYS.KEYSET_CHAIN(KMS_KEY, WRAPPED_KEYSET_DECODED),
        'plaintext',
        '') AS encrypted_content
    

Spalte mit einem verpackten Schlüsselsatz deterministisch entschlüsseln

Führen Sie die folgende Abfrage aus, um eine Spalte mit verschlüsselten Inhalten deterministisch zu entschlüsseln. Verwenden Sie dazu einen mit Cloud KMS verpackten Schlüsselsatz. Bei dieser Abfrage wird davon ausgegangen, dass Sie auf eine Tabelle mit einer Spalte namens encrypted_content verweisen.

SELECT DETERMINISTIC_DECRYPT_STRING(
  KEYS.KEYSET_CHAIN(KMS_KEY, WRAPPED_KEYSET_DECODED),
  encrypted_content,
  '')
FROM DATASET_NAME.TABLE_NAME

Spalte mit einem verpackten Schlüsselsatz nicht deterministisch verschlüsseln

Siehe Spalte mit einem verpackten Schlüsselsatz deterministisch verschlüsseln, aber DETERMINISTIC_ENCRYPT durch AEAD.ENCRYPT ersetzen. Achten Sie darauf, dass Ihr Schlüsselsatz vom Typ AEAD_AES_GCM_256 ist.

Spalte mit einem verpackten Schlüsselsatz nicht deterministisch entschlüsseln

Siehe Spalte mit einem verpackten Schlüsselsatz deterministisch entschlüsseln, aber DETERMINISTIC_DECRYPT_STRING durch AEAD.DECRYPT_STRING ersetzen. Achten Sie darauf, dass Ihr Schlüsselsatz vom Typ AEAD_AES_GCM_256 ist.

Nächste Schritte