Protege datos con claves de Cloud KMS

Por configuración predeterminada, BigQuery encripta contenido de cliente almacenado en reposo. BigQuery controla y administra esta encriptación predeterminada por ti sin que tengas que realizar ninguna acción adicional. Primero, los datos en una tabla de BigQuery se encriptan con una clave de encriptación de datos. Luego, esas claves de encriptación de datos se encriptan con la clave de encriptación de claves. Este proceso se denomina encriptación de sobre. Las claves de encriptación de claves no encriptan tus datos de modo directo, pero se usan para encriptar las claves de encriptación de datos que Google usa a fin de encriptar tus datos. Si deseas obtener más información, consulta Administración de claves.

Si deseas controlar la encriptación por tu cuenta, puedes usar las claves de encriptación administradas por el cliente (CMEK) para BigQuery. En lugar de que Google administre la clave de encriptación de claves que protege tus datos, tú controlas y administras la clave de encriptación de claves en KMS. En este tema se proveen detalles sobre esta técnica.

Obtén más información sobre opciones de encriptación en Google Cloud.

Antes de comenzar

  1. Comprende qué son los conjuntos de datos, las tablas y las consultas.

  2. Decide si ejecutarás BigQuery y KMS en el mismo proyecto de Google Cloud, o si lo harás en proyectos distintos. Con el propósito de brindar documentación de ejemplo, se usa la convención siguiente:

    • project_id es el ID del proyecto que ejecuta BigQuery
    • project_number es el número del proyecto que ejecuta BigQuery
    • kms_project_id es el ID del proyecto que ejecuta KMS (incluso si es el mismo proyecto que ejecuta BigQuery)
    Para obtener información sobre los ID de los proyectos de Google Cloud y los números de proyectos, consulta la sección sobre cómo identificar proyectos.

  3. BigQuery se habilita de manera automática en proyectos nuevos. Si usas un proyecto existente para ejecutar BigQuery, habilita la API de BigQuery.

  4. Para los proyectos de Google Cloud que ejecutan KSM, sigue estos pasos:

    1. Habilita la API de KSM.
    2. Crea un llavero de claves y una clave como se describe en Crea claves simétricas. Crea el llavero de claves en una ubicación que coincida con la de tu conjunto de datos de BigQuery:
      • Cualquier conjunto de datos multirregional debe usar un llavero de claves multirregional desde una ubicación que coincida. Por ejemplo, un conjunto de datos en la región US debe protegerse con un llavero de claves de la región us, y un conjunto de datos en la región EU debe protegerse con un llavero de claves de la región europe.
      • Los conjuntos de datos regionales deben usar una clave regional que coincida. Por ejemplo, un conjunto de datos en la región asia-northeast1 debe protegerse con un llavero de claves de la región asia-northeast1.
      • La región global no es compatible para usar con BigQuery.
      Si quieres obtener más información sobre ubicaciones compatibles con BigQuery y KMS, consulta Ubicaciones de Cloud.

Especificaciones de encriptación

Las claves KSM que se usan para proteger tus datos en BigQuery son claves AES-256. Estas se usan como claves de encriptación de claves en BigQuery porque encriptan las claves de encriptación de datos que encriptan tus datos.

Otorga permisos de encriptación y desencriptación

Usa Google Cloud Console para determinar el ID de la cuenta de servicio de BigQuery y proporciona a la cuenta de servicio la función adecuada para encriptar y desencriptar con KMS.

Determina el ID de cuenta de servicio

IU clásica

  1. Ve a la IU web de BigQuery.

    Ir a la IU web de BigQuery

  2. Haz clic en el ícono de flecha hacia abajo ícono de flecha hacia abajo al lado del nombre de tu proyecto en el panel de navegación y, luego, haz clic en Encriptación administrada por el cliente (Customer-Managed Encryption).

  3. Se abrirá un cuadro de diálogo del usuario para mostrarte la cuenta de servicio que necesita permisos de encriptación y desencriptación:

    ID de cuenta de servicio

  4. Haz clic en Copiar (Copy) para copiar el ID de la cuenta de servicio al portapapeles y haz clic en Aceptar (OK) a fin de cerrar el cuadro de diálogo del usuario.

CLI

Puedes usar el comando bq show con la marca --encryption_service_account para determinar el ID de la cuenta de servicio:

bq show --encryption_service_account

El comando muestra el ID de cuenta de servicio:

                       ServiceAccountID
     -------------------------------------------------------------
      bq-project_number@bigquery-encryption.iam.gserviceaccount.com

Asigna la función Encriptador/Desencriptador

Asigna la función Cloud KMS CryptoKey Encrypter/Decrypter a la cuenta de servicio del sistema de BigQuery que copiaste en el portapapeles. Esta cuenta tiene el siguiente formato:

bq-project_number@bigquery-encryption.iam.gserviceaccount.com

Console

  1. Abre la página Seguridad en Cloud Console.

    Ir a la página Claves criptográficas de seguridad

  2. Selecciona el proyecto y haz clic en Continue (Continuar).

  3. Identifica la clave de encriptación a la que quieres agregar la función.

    • Si la cuenta de servicio bq-project_number@bigquery-encryption.iam.gserviceaccount.com aún no se encuentra en la lista de miembros, no tiene ninguna función asignada. Haz clic en Agregar miembro y, luego, ingresa la dirección de correo electrónico de la cuenta de servicio, bq-project_number@bigquery-encryption.iam.gserviceaccount.com.
    • Si la cuenta de servicio ya se encuentra en la lista de miembros, es porque tiene funciones existentes. Haz clic en la lista desplegable de funciones actuales de la cuenta de servicio bq-project_number@bigquery-encryption.iam.gserviceaccount.com.
  4. Haz clic en la lista desplegable y busca Función, haz clic en Cloud KMS y, luego, en la función Encriptador/Desencriptador de clave de encriptación de Cloud KMS.

  5. Haz clic en Agregar o Guardar para aplicar la función a la cuenta de servicio bq-project_number@bigquery-encryption.iam.gserviceaccount.com.

CLI

Puedes usar la herramienta de línea de comandos de gcloud para asignar la función:

gcloud kms keys add-iam-policy-binding \
--project=kms_project_id \
--member serviceAccount:bq-project_number@bigquery-encryption.iam.gserviceaccount.com \
--role roles/cloudkms.cryptoKeyEncrypterDecrypter \
--location=kms_key_location \
--keyring=kms_key_ring \
kms_key

Reemplaza kms_project_id por el ID de tu proyecto de Google Cloud que ejecuta KMS, reemplaza project_number por el número de proyecto (no el ID del proyecto) de tu proyecto de Google Cloud que ejecuta BigQuery y reemplaza kms_key_location, kms_key_ring y kms_key por la ubicación, el llavero de claves y los nombres de clave de tu clave de KMS.

ID de recurso de la clave

El ID de recurso de la clave de KMS es obligatorio para el uso de CMEK, como se muestra en los ejemplos de este tema. Esta clave tiene el formato siguiente:

projects/project_id/locations/location/keyRings/key_ring/cryptoKeys/key

Para obtener información sobre cómo recuperar el ID de recurso de clave, consulta ID de recurso de la clave.

Crea una tabla protegida por KMS

Crea una tabla vacía protegida por KMS

Para crear una tabla protegida por KMS, sigue estos pasos:

IU clásica

  1. Haz clic en el ícono de flecha hacia abajo ícono de flecha hacia abajo junto al nombre de tu conjunto de datos en la interfaz de usuario web de BigQuery y, luego, haz clic en Crear tabla nueva.

  2. En la página Crear tabla, completa la información requerida para crear una tabla vacía con una definición de esquema. Antes de hacer clic en Crear tabla, configura el tipo de encriptación y especifica la clave de KMS para usar con la tabla:

    1. Haz clic en la lista desplegable y busca Tipo de encriptación; luego, selecciona Encriptación administrada por el cliente.
    2. En Clave de encriptación administrada por el cliente, ingresa el ID de recurso de la clave.
  3. Haz clic en Crear tabla.

CLI

Puedes usar la herramienta de línea de comandos de bq con la marca --destination_kms_key para crear la tabla. La marca --destination_kms_key especifica el ID de recurso de la clave para usar con la tabla.

Para crear una tabla vacía con un esquema, usa lo siguiente:

bq mk --schema name:string,value:integer -t \
--destination_kms_key projects/project_id/locations/location/keyRings/key_ring/cryptoKeys/key \
mydataset.newtable

Como alternativa, puedes usar una declaración de DDL:

bq query --use_legacy_sql=false "
  CREATE TABLE mydataset.newtable (name STRING, value INT64)
  OPTIONS(
    kms_key_name='projects/project_id/locations/location/keyRings/key_ring/cryptoKeys/key'
  )
"

Para crear una tabla desde una consulta, usa lo siguiente:

bq query --destination_table=mydataset.newtable \
--destination_kms_key projects/project_id/locations/location/keyRings/key_ring/cryptoKeys/key \
"SELECT name,count FROM mydataset.babynames WHERE gender = 'M' ORDER BY count DESC LIMIT 6"

Si deseas obtener más información sobre la herramienta de línea de comandos de bq, consulta Usa la herramienta de línea de comandos de bq.

Go

// To run this sample, you will need to create (or reuse) a context and
// an instance of the bigquery client.  For example:
// import "cloud.google.com/go/bigquery"
// ctx := context.Background()
// client, err := bigquery.NewClient(ctx, "your-project-id")
tableRef := client.Dataset(datasetID).Table(tableID)
meta := &bigquery.TableMetadata{
	EncryptionConfig: &bigquery.EncryptionConfig{
		// TODO: Replace this key with a key you have created in Cloud KMS.
		KMSKeyName: "projects/cloud-samples-tests/locations/us-central1/keyRings/test/cryptoKeys/test",
	},
}
if err := tableRef.Create(ctx, meta); err != nil {
	return err
}

Python

Para proteger una tabla nueva con una clave de encriptación administrada por el cliente, configura la propiedad Table.encryption_configuration como un objeto EncryptionConfiguration antes de crear la tabla.

# from google.cloud import bigquery
# client = bigquery.Client()
# dataset_id = 'my_dataset'

table_ref = client.dataset(dataset_id).table('my_table')
table = bigquery.Table(table_ref)

# Set the encryption key to use for the table.
# TODO: Replace this key with a key you have created in Cloud KMS.
kms_key_name = 'projects/{}/locations/{}/keyRings/{}/cryptoKeys/{}'.format(
    'cloud-samples-tests', 'us-central1', 'test', 'test')
table.encryption_configuration = bigquery.EncryptionConfiguration(
    kms_key_name=kms_key_name)

table = client.create_table(table)  # API request

assert table.encryption_configuration.kms_key_name == kms_key_name

Consulta una tabla protegida por una clave de KMS

No se necesitan arreglos especiales para consultar una tabla protegida por KMS. En BigQuery se almacena el nombre de la clave que se usó para encriptar el contenido de la tabla y se usará esa clave cuando se consulte una tabla protegida por KMS.

Todas las herramientas existentes, la consola de BigQuery y la interfaz de línea de comandos de bq se ejecutan de la misma manera que con las tablas encriptadas de forma predeterminada, siempre que BigQuery tenga acceso a la clave de KMS que se usó para encriptar el contenido de la tabla.

Protege los resultados de las consultas con la clave de KMS

IU clásica

  1. Haz clic en el botón Redactar consulta en la IU web de BigQuery.

  2. Ingresa una consulta válida de SQL en BigQuery en el área de texto Consulta nueva.

  3. Haz clic en Tipo de encriptación y selecciona Encriptación administrada por el cliente.

  4. En Clave de encriptación administrada por el cliente, ingresa el ID de recurso de la clave.

  5. Haz clic en Ejecutar consulta.

CLI

Especifica la marca --destination_kms_key para proteger la tabla de destino o los resultados de las consultas (si usas una tabla temporal) con tu clave de KMS. La marca --destination_kms_key especifica el ID de recurso de la clave para usar con la tabla de destino o la tabla resultante.

De forma opcional, puedes usar la marca --destination_table para especificar el destino de los resultados de la consulta. Si --destination_table no se usa, los resultados de la consulta se escribirán en una tabla temporal.

Para consultar una tabla, sigue estos pasos:

bq query \
--destination_table=mydataset.newtable \
--destination_kms_key projects/project_id/locations/location/keyRings/key_ring/cryptoKeys/key \
"SELECT name,count FROM mydataset.babynames WHERE gender = 'M' ORDER BY count DESC LIMIT 6"

Si deseas obtener más información sobre la herramienta de línea de comandos de bq, consulta Usa la herramienta de línea de comandos de bq.

Go

q := client.Query("SELECT 17 as my_col")
q.Location = "US" // Location must match the dataset(s) referenced in query.
q.QueryConfig.Dst = client.Dataset(destDatasetID).Table(destTableID)
q.DestinationEncryptionConfig = &bigquery.EncryptionConfig{
	// TODO: Replace this key with a key you have created in Cloud KMS.
	KMSKeyName: "projects/cloud-samples-tests/locations/us-central1/keyRings/test/cryptoKeys/test",
}
return runAndRead(ctx, client, q)
job, err := q.Run(ctx)
if err != nil {
	return err
}
status, err := job.Wait(ctx)
if err != nil {
	return err
}
if err := status.Err(); err != nil {
	return err
}
it, err := job.Read(ctx)
for {
	var row []bigquery.Value
	err := it.Next(&row)
	if err == iterator.Done {
		break
	}
	if err != nil {
		return err
	}
	fmt.Println(row)
}

Python

Para proteger una tabla de destino de consultas con una clave de encriptación administrada por el cliente, configura la propiedad QueryJobConfig.destination_encryption_configuration como una EncryptionConfiguration y ejecuta la consulta.

# from google.cloud import bigquery
# client = bigquery.Client()

job_config = bigquery.QueryJobConfig()

# Set the destination table. Here, dataset_id is a string, such as:
# dataset_id = 'your_dataset_id'
table_ref = client.dataset(dataset_id).table('your_table_id')
job_config.destination = table_ref

# Set the encryption key to use for the destination.
# TODO: Replace this key with a key you have created in KMS.
kms_key_name = 'projects/{}/locations/{}/keyRings/{}/cryptoKeys/{}'.format(
    'cloud-samples-tests', 'us-central1', 'test', 'test')
encryption_config = bigquery.EncryptionConfiguration(
    kms_key_name=kms_key_name)
job_config.destination_encryption_configuration = encryption_config

# Start the query, passing in the extra configuration.
query_job = client.query(
    'SELECT 17 AS my_col;',
    # Location must match that of the dataset(s) referenced in the query
    # and of the destination table.
    location='US',
    job_config=job_config)  # API request - starts the query
query_job.result()

# The destination table is written using the encryption configuration.
table = client.get_table(table_ref)
assert table.encryption_configuration.kms_key_name == kms_key_name

Carga una tabla protegida por KMS

Para cargar un archivo de datos en una tabla protegida por KMS, sigue estos pasos:

Console

Especifica la clave cuando cargues una tabla de destino del trabajo de carga para protegerla con una clave de encriptación administrada por el cliente.

  1. Abre la IU web de BigQuery en Cloud Console.
    Ir a la IU web de BigQuery
  2. En el panel de navegación, en la sección Recursos, expande tu proyecto y selecciona un conjunto de datos.
  3. En el lado derecho de la ventana, en el panel de detalles, haz clic en Crear tabla.
  4. Ingresa las opciones que deseas usar para cargar la tabla, pero antes de hacer clic en Crear tabla, haz clic en Opciones avanzadas (Advanced options).
  5. En Encriptación (Encryption), selecciona Clave administrada por el cliente (Customer-managed key).
  6. Haz clic en el menú desplegable Seleccionar una clave administrada por el cliente (Select a customer-managed key) y selecciona la clave que deseas usar. Si no hay claves disponibles, ingresa un ID de recurso de la clave.

    Opciones avanzadas

  7. Haz clic en Crear tabla.

CLI

Para proteger una tabla de destino del trabajo de carga con una clave de encriptación administrada por el cliente, configura la marca --destination_kms_key.

bq --location=location load \
--autodetect \
--source_format=format \
--destination_kms_key projects/project_id/locations/location/keyRings/key_ring/cryptoKeys/key \
dataset.table \
path_to_source
Por ejemplo:
bq load \
--autodetect \
--source_format=NEWLINE_DELIMITED_JSON \
--destination_kms_key projects/project_id/locations/location/keyRings/key_ring/cryptoKeys/key \
test2.table4 \
gs://cloud-samples-data/bigquery/us-states/us-states.json

Go

// To run this sample, you will need to create (or reuse) a context and
// an instance of the bigquery client.  For example:
// import "cloud.google.com/go/bigquery"
// ctx := context.Background()
// client, err := bigquery.NewClient(ctx, "your-project-id")
gcsRef := bigquery.NewGCSReference("gs://cloud-samples-data/bigquery/us-states/us-states.json")
gcsRef.SourceFormat = bigquery.JSON
gcsRef.AutoDetect = true
loader := client.Dataset(datasetID).Table(tableID).LoaderFrom(gcsRef)
loader.WriteDisposition = bigquery.WriteEmpty
loader.DestinationEncryptionConfig = &bigquery.EncryptionConfig{
	// TODO: Replace this key with a key you have created in KMS.
	KMSKeyName: "projects/cloud-samples-tests/locations/us-central1/keyRings/test/cryptoKeys/test",
}

job, err := loader.Run(ctx)
if err != nil {
	return err
}
status, err := job.Wait(ctx)
if err != nil {
	return err
}

if status.Err() != nil {
	return fmt.Errorf("Job completed with error: %v", status.Err())
}

Python

Para proteger una tabla de destino del trabajo de carga con una clave de encriptación administrada por el cliente, configura la propiedad LoadJobConfig.destination_encryption_configuration como una EncryptionConfiguration y carga la tabla.

# from google.cloud import bigquery
# client = bigquery.Client()
# dataset_id = 'my_dataset'

dataset_ref = client.dataset(dataset_id)
job_config = bigquery.LoadJobConfig()
job_config.autodetect = True
job_config.source_format = bigquery.SourceFormat.NEWLINE_DELIMITED_JSON

# Set the encryption key to use for the destination.
# TODO: Replace this key with a key you have created in KMS.
kms_key_name = 'projects/{}/locations/{}/keyRings/{}/cryptoKeys/{}'.format(
    'cloud-samples-tests', 'us-central1', 'test', 'test')
encryption_config = bigquery.EncryptionConfiguration(
    kms_key_name=kms_key_name)
job_config.destination_encryption_configuration = encryption_config
uri = 'gs://cloud-samples-data/bigquery/us-states/us-states.json'

load_job = client.load_table_from_uri(
    uri,
    dataset_ref.table('us_states'),
    location='US',  # Location must match that of the destination dataset.
    job_config=job_config)  # API request

assert load_job.job_type == 'load'

load_job.result()  # Waits for table load to complete.

assert load_job.state == 'DONE'
table = client.get_table(dataset_ref.table('us_states'))
assert table.encryption_configuration.kms_key_name == kms_key_name

Transmite a una tabla protegida por KMS

Puedes transmitir datos a tu tabla de BigQuery protegida por CMEK sin especificar ningún parámetro adicional. Ten en cuenta que estos datos se encriptan con tu clave de KMS en el búfer y también en la ubicación final. Antes de usar la transmisión con una tabla de CMEK, revisa los requisitos sobre la disponibilidad y accesibilidad de la clave.

Para obtener más información sobre la transmisión, consulta Transmite datos a BigQuery.

Cambia una tabla de encriptación predeterminada a protección de KMS

CLI

Puedes usar el comando bq cp con la marca --destination_kms_key para copiar una tabla que está protegida por encriptación predeterminada en una tabla nueva o en la tabla original, que está protegida por KMS. La marca --destination_kms_key especifica el ID de recurso de la clave para usar con la tabla de destino.

Para copiar una tabla que tiene encriptación predeterminada en una tabla nueva que tiene protección de Cloud KMS, usa lo siguiente:

bq cp \
--destination_kms_key projects/project_id/locations/location/keyRings/key_ring/cryptoKeys/key \
sourceDataset.sourceTableId destinationDataset.destinationTableId

Si deseas copiar una tabla que tiene encriptación predeterminada en la misma tabla con protección KMS, usa esto otro:

bq cp -f \
--destination_kms_key projects/project_id/locations/location/keyRings/key_ring/cryptoKeys/key \
sourceDataset.sourceTableId sourceDataset.sourceTableId

Si deseas cambiar la protección KMS de una tabla por la encriptación predeterminada, copia el archivo a sí mismo y ejecuta bq cp sin usar la marca --destination_kms_key.

Si deseas obtener más información sobre la herramienta de línea de comandos de bq, consulta Usa la herramienta de línea de comandos de bq.

Go

// To run this sample, you will need to create (or reuse) a context and
// an instance of the bigquery client.  For example:
// import "cloud.google.com/go/bigquery"
// ctx := context.Background()
// client, err := bigquery.NewClient(ctx, "your-project-id")
srcTable := client.DatasetInProject("bigquery-public-data", "samples").Table("shakespeare")
copier := client.Dataset(datasetID).Table(tableID).CopierFrom(srcTable)
copier.DestinationEncryptionConfig = &bigquery.EncryptionConfig{
	// TODO: Replace this key with a key you have created in Cloud KMS.
	KMSKeyName: "projects/cloud-samples-tests/locations/us-central1/keyRings/test/cryptoKeys/test",
}
job, err := copier.Run(ctx)
if err != nil {
	return err
}
status, err := job.Wait(ctx)
if err != nil {
	return err
}
if err := status.Err(); err != nil {
	return err
}

Python

Para proteger el destino de una copia de tabla con una clave de encriptación administrada por el cliente, configura la propiedad QueryJobConfig.destination_encryption_configuration como una EncryptionConfiguration y copia la tabla.

# from google.cloud import bigquery
# client = bigquery.Client()

source_dataset = bigquery.DatasetReference(
    'bigquery-public-data', 'samples')
source_table_ref = source_dataset.table('shakespeare')

# dataset_id = 'my_dataset'
dest_dataset_ref = client.dataset(dataset_id)
dest_table_ref = dest_dataset_ref.table('destination_table')

# Set the encryption key to use for the destination.
# TODO: Replace this key with a key you have created in KMS.
kms_key_name = 'projects/{}/locations/{}/keyRings/{}/cryptoKeys/{}'.format(
    'cloud-samples-tests', 'us-central1', 'test', 'test')
encryption_config = bigquery.EncryptionConfiguration(
    kms_key_name=kms_key_name)
job_config = bigquery.CopyJobConfig()
job_config.destination_encryption_configuration = encryption_config

job = client.copy_table(
    source_table_ref,
    dest_table_ref,
    # Location must match that of the source and destination tables.
    location='US',
    job_config=job_config)  # API request
job.result()  # Waits for job to complete.

assert job.state == 'DONE'
dest_table = client.get_table(dest_table_ref)
assert dest_table.encryption_configuration.kms_key_name == kms_key_name

Determina si una tabla está protegida por KMS

  1. En la IU web de BigQuery, haz clic en la flecha azul a la izquierda de tu conjunto de datos para expandirlo o haz doble clic sobre el nombre del conjunto de datos. Esta acción muestra las tablas y vistas del conjunto de datos.

  2. Haz clic en el nombre de la tabla.

  3. Haz clic en Details (Detalles). En la página Detalles de la tabla, se muestra la descripción y la información de la tabla.

  4. Si la tabla está protegida por KMS, en el campo Clave de encriptación administrada por el cliente (Customer-Managed Encryption Key), se mostrará el ID del recurso de la clave.

    Tabla protegida

Cambia la clave de KMS por una tabla de BigQuery

Si deseas cambiar la clave de KMS de una tabla protegida con CMEK existente, puedes ejecutar una consulta ALTER TABLE, usar la API o usar la herramienta de línea de comandos de bq. Hay dos maneras de modificar la clave de KMS mediante la API y la herramienta de línea de comandos: update o cp. Si usas update, puedes cambiar la clave de KMS que usa una tabla protegida por KMS. Si usas cp, puedes cambiar la clave de KMS que usa una tabla protegida por CMEK, cambiar una tabla de encriptación predeterminada a la protección CMEK y, también, cambiar una tabla de protección CMEK a la encriptación predeterminada. Una ventaja de update es que es más rápido que cp y permite el uso de decoradores de tabla.

IU clásica

  1. Ve a la IU web de BigQuery.

    Ir a la IU web de BigQuery

  2. Haz clic en Redactar consulta.

  3. Escribe tu declaración DDL en el área de texto Consulta nueva. Para el valor kms_key_name, especifica el ID de recurso de la clave que quieres usar para proteger la tabla.

    #standardSQL
    ALTER TABLE mydataset.mytable
    SET OPTIONS (
    kms_key_name="projects/[PROJECT_ID]/locations/[LOCATION]/keyRings/[KEYRING]/cryptoKeys/[KEY]"
    )
    

CLI

Puedes usar el comando bq cp con la marca --destination_kms_key para cambiar la clave de una tabla protegida por KMS. La marca --destination_kms_key especifica el ID de recurso de la clave para usar con la tabla.

bq update \
--destination_kms_key projects/project_id/locations/location/keyRings/key_ring/cryptoKeys/key \
-t dataset_id.table_id

Go

// To run this sample, you will need to create (or reuse) a context and
// an instance of the bigquery client.  For example:
// import "cloud.google.com/go/bigquery"
// ctx := context.Background()
// client, err := bigquery.NewClient(ctx, "your-project-id")
tableRef := client.Dataset(datasetID).Table(tableID)
meta, err := tableRef.Metadata(ctx)
if err != nil {
	return err
}
update := bigquery.TableMetadataToUpdate{
	EncryptionConfig: &bigquery.EncryptionConfig{
		// TODO: Replace this key with a key you have created in Cloud KMS.
		KMSKeyName: "projects/cloud-samples-tests/locations/us-central1/keyRings/test/cryptoKeys/otherkey",
	},
}
if _, err := tableRef.Update(ctx, update, meta.ETag); err != nil {
	return err
}

Python

Para cambiar la clave de encriptación administrada por el cliente de una tabla, cambia la propiedad Table.encryption_configuration como un objeto EncryptionConfiguration nuevo y actualiza la tabla.

# from google.cloud import bigquery
# client = bigquery.Client()

assert table.encryption_configuration.kms_key_name == original_kms_key_name

# Set a new encryption key to use for the destination.
# TODO: Replace this key with a key you have created in KMS.
updated_kms_key_name = (
    'projects/cloud-samples-tests/locations/us-central1/'
    'keyRings/test/cryptoKeys/otherkey')
table.encryption_configuration = bigquery.EncryptionConfiguration(
    kms_key_name=updated_kms_key_name)

table = client.update_table(
    table, ['encryption_configuration'])  # API request

assert table.encryption_configuration.kms_key_name == updated_kms_key_name
assert original_kms_key_name != updated_kms_key_name

Configura una clave predeterminada para el conjunto de datos

Puedes configurar una clave de KMS predeterminada para todo el conjunto de datos que se aplicará a todas las tablas recién creadas dentro de este, a menos que se especifique una clave de KMS diferente cuando crees la tabla. La clave predeterminada no se aplica a las tablas existentes. Cambiar la clave predeterminada no modifica las tablas existentes y solo se aplica a las tablas nuevas creadas después del cambio.

Puedes aplicar, cambiar o quitar una clave predeterminada del conjunto de datos si realizas lo siguiente:

Quita el acceso de BigQuery a la clave de KMS

Puedes quitar el acceso de BigQuery a la clave de KMS en cualquier momento; para hacerlo, revoca el permiso de IAM de esa clave.

Si BigQuery pierde el acceso a la clave de KMS, la experiencia del usuario puede sufrir de manera significativa y puede producirse la pérdida de datos:

  • Ya no se puede acceder a los datos en estas tablas protegidas por CMEK: query, cp, extract y tabledata.list fallarán.

  • No se podrán agregar datos nuevos a estas tablas protegidas por CMEK.

  • Incluso una vez que se otorga el acceso de nuevo, el rendimiento de las consultas a estas tablas puede verse degradado durante varios días.

Impacto de la rotación de claves de KMS

BigQuery no rota de forma automática una clave de encriptación de tabla cuando la clave de KMS asociada con la tabla rota. Las tablas existentes continúan usando la versión de clave con la que se crearon. Las tablas nuevas usarán la versión de clave actual.

Limitaciones

Acceso de BigQuery a la clave de KMS

Se considera que una clave de KMS está disponible y es accesible para BigQuery si cumple con los siguientes requisitos:

  • La clave está habilitada.
  • La cuenta de servicio de BigQuery tiene permisos de encriptación y desencriptación sobre la clave.

En las secciones a continuación, se describe el impacto en las inserciones de transmisión y los datos inaccesibles a largo plazo cuando no se puede acceder a una clave.

Impacto en las inserciones de transmisión

La clave de KMS deberá estar disponible y deberá ser accesible por al menos 24 horas consecutivas en el período de 48 horas después de una solicitud de inserción de transmisión. Si la clave no está disponible y no es accesible, los datos transmitidos tal vez no sean persistentes y pueden perderse. Si deseas obtener más información sobre la inserción de transmisión, consulta Transmite datos a BigQuery.

Impacto en los datos inaccesibles a largo plazo

Mientras que BigQuery proporciona almacenamiento administrado, los datos inaccesibles a largo plazo no son compatibles con la arquitectura de BigQuery. Si la clave de KMS de una tabla de BigQuery no está disponible y no se puede acceder a ella por 60 días consecutivos, BigQuery puede borrar la tabla y sus datos asociados. Antes de borrar los datos, BigQuery enviará un correo electrónico a la dirección de correo electrónico asociada a la cuenta de facturación al menos 7 días antes de la eliminación.

Usa decoradores de tablas

Cuando los datos en una tabla protegida por KMS se reemplazan mediante la disposición de escritura WRITE_TRUNCATE por las operaciones load, cp o query, la tabla se vuelve inaccesible para la consulta a través de decoradores de tabla, según el tiempo del decorador de instantáneas.

Supongamos que se reemplazó una tabla en el momento T y el decorador de instantáneas snapshot_time es para un tiempo menor que , la siguiente tabla muestra si puedes consultar durante snapshot_time:

Tipo de encriptación antes de T Tipo de encriptación después de T snapshot_time
Encriptado KMS Encriptado KMS No se puede consultar
Encriptado predeterminado Encriptado KMS Se puede consultar
Encriptado KMS Encriptado predeterminado No se puede consultar

Ten en cuenta que una lógica similar se aplica a <time2> cuando se usa un decorador de rango.

Preguntas frecuentes

¿Quién necesita permiso para acceder a la clave de KMS?

Con las claves de encriptación administradas por el cliente, no se necesita especificar permisos de forma repetida. Siempre y cuando la cuenta de servicio de BigQuery tenga permitido usar la clave de KMS para encriptar y desencriptar, cualquiera con permiso de acceso a la tabla de BigQuery puede acceder a los datos, incluso si no tienen acceso directo a la clave de KMS.

¿Qué cuenta de servicio se usa?

La cuenta de servicio de BigQuery asociada con el proyecto de Google Cloud de la tabla se usa para desencriptar los datos de la tabla. Las cuentas de servicio de BigQuery son únicas para cada proyecto. Si es un trabajo que escribe datos en una tabla anónima protegida por KMS, se usa la cuenta de servicio del proyecto del trabajo.

Como ejemplo, considera tres tablas protegidas por CMEK: table1, table2 y table3. Para consultar datos desde {project1.table1, project2.table2} con la tabla de destino {project3.table3}:

  • Usa la cuenta de servicio project1 para project1.table1.
  • Usa la cuenta de servicio project2 para project2.table2.
  • Usa la cuenta de servicio project3 para project3.table3.

¿Cómo puede usar BigQuery mi clave de KMS?

BigQuery usará la clave de KMS para desencriptar datos en respuesta a una consulta del usuario, por ejemplo, tabledata.list o jobs.insert.

BigQuery también puede usar la clave para realizar mantenimiento de datos y tareas de optimización de almacenamiento, como la conversión de datos a un formato de lectura optimizado.

¿Qué bibliotecas criptográficas se usan?

BigQuery depende de KMS para la funcionalidad de CMEK. KMS usa Tink para la encriptación.

¿Cómo puedo obtener más ayuda?

Si después de leer este documento sigues teniendo dudas, comunícate con cmek-feedback@google.com, consulta Obtén ayuda con el desarrollo de BigQuery o consulta Asistencia de KMS.

Soluciona errores

A continuación, se describen errores comunes y mitigaciones recomendadas.

Error Recomendación
Otorga la función de Encriptador/Desencriptador clave de encriptación de Cloud KMS. La cuenta de servicio de BigQuery asociada con tu proyecto no tiene los permisos de Cloud IAM suficientes para operar en la clave de KMS especificada. Sigue las instrucciones en el error o en esta documentación para otorgar los permisos de Cloud IAM adecuados.
Las opciones de configuración de encriptación de la tabla existente no coinciden con las opciones de configuración de encriptación especificadas en la solicitud. Esto puede ocurrir en situaciones en los que la tabla de destino tiene una configuración de encriptación que no coincide con la configuración de encriptación en tu solicitud. Como mitigación, usa la disposición de escritura TRUNCATE para reemplazar la tabla o especifica una tabla de destino diferente.
Esta región no es compatible. La región de la clave de KMS no coincide con la región del conjunto de datos de BigQuery de la tabla de destino. Como mitigación, selecciona una clave en una región que coincida con tu conjunto de datos o carga un conjunto de datos que coincida con la región de la clave.
¿Te ha resultado útil esta página? Enviar comentarios:

Enviar comentarios sobre...

Si necesitas ayuda, visita nuestra página de asistencia.