Protege datos con claves de Cloud KMS

De forma predeterminada, BigQuery encripta contenido almacenado en reposo del cliente. BigQuery controla y administra esta encriptación predeterminada en tu lugar sin acciones adicionales de tu parte. 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 claves de encriptación de claves, conocido como 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. Para 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 las claves de encriptación que protegen tus datos, tú controlas y administras las claves de encriptación en Cloud KMS. En este tema, se proporcionan detalles sobre esta técnica.

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

Antes de comenzar

  1. Obtén información sobre conjuntos de datos, tablas y consultas.

  2. Decide si ejecutarás BigQuery y Cloud KMS en el mismo proyecto de GCP o en proyectos diferentes. 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 de proyecto que ejecuta BigQuery.
    • [KMS_PROJECT_ID] es el ID del proyecto del proyecto que ejecuta Cloud KMS (incluso si es el mismo proyecto que ejecuta BigQuery).
    Para obtener información sobre los ID de los proyectos de GCP y los números de los proyectos, consulta Identifica proyectos.

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

  4. Para el proyecto de GCP que ejecuta Cloud KMS:

    1. Habilita la API de Cloud KMS.
    2. Crea un llavero de claves y una clave como se describe en Crea llavero de claves y claves. Crea el llavero de claves en una ubicación que coincida con la ubicación de tu conjunto de datos de BigQuery:
      • Cualquier conjunto de datos multirregional debe usar un llavero de claves multirregional desde una ubicación coincidente. Por ejemplo, un conjunto de datos en la región US debe protegerse con un llavero de claves de la región us, mientras que un conjunto de datos en la región EU debe protegerse con un conjunto de claves de la región europe.
      • Los conjuntos de datos regionales deben usar una clave regional coincidente. 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 con BigQuery.
      Si quieres obtener más información sobre las ubicaciones compatibles para BigQuery y Cloud KMS, consulta Ubicaciones de Cloud.

Especificaciones de encriptación

Las claves de Cloud KMS que se usan para proteger tus datos en BigQuery son claves AES-256. Estas claves 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 Platform Console para determinar el ID de cuenta de servicio de BigQuery y proporciona la cuenta de servicio con la función adecuada a fin de encriptar y desencriptar con Cloud KMS.

Determina el ID de cuenta de servicio

IU web

  1. Dirígete 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 Customer Managed Encryption (Encriptación administrada por el cliente).

  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 Copy (copiar) para copiar el ID de cuenta de servicio a tu portapapeles y, luego, haz clic en OK (Aceptar) con el fin de cerrar el cuadro de diálogo del usuario.

Línea de comandos

Puedes usar el comando bq show con la marca --encryption_service_account a modo de determinar el ID de 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 tu portapapeles. Esta cuenta tiene este formato

bq-[PROJECT_NUMBER]@bigquery-encryption.iam.gserviceaccount.com

IU web

  1. Abre la página Security (Seguridad) en GCP Console.

    Ir a la página Security Cryptographic Keys (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 no aparece todavía en la lista de miembros, no tiene funciones asignadas. Haz clic en Add member (Agregar miembro) y, luego, ingresa bq-[PROJECT_NUMBER]@bigquery-encryption.iam.gserviceaccount.com, la dirección de correo electrónico de la cuenta de servicio.
    • Si la cuenta de servicio ya se encuentra en la lista de miembros, es porque tiene funciones existentes. En la lista desplegable, haz clic en la función actual de la cuenta de servicio bq-[PROJECT_NUMBER]@bigquery-encryption.iam.gserviceaccount.com.
  4. Haz clic en la lista desplegable y busca Role (Función), haz clic en Cloud KMS y, luego, en la función Cloud KMS CryptoKey Encrypter/Decrypter(Encriptador/Desencriptador de clave de encriptación de Cloud KMS).

  5. Haz clic en Add o Save para aplicar la función a la cuenta de servicio bq-[PROJECT_NUMBER]@bigquery-encryption.iam.gserviceaccount.com.

Línea de comandos

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] con el ID de tu proyecto de GCP que ejecuta Cloud KMS, reemplaza [PROJECT_NUMBER] con el número de proyecto (no el ID del proyecto) de tu proyecto de GCP que ejecuta BigQuery y reemplaza [KMS_KEY_LOCATION], [KMS_KEY_RING], [KMS_KEY_RING], [KMS_KEY] con ubicación, llavero de claves y nombre de clave de tu clave de Cloud KMS.

Crea una tabla protegida por Cloud KMS

Crea una tabla vacía protegida por Cloud KMS

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

IU web

  1. Haz clic en el ícono de flecha hacia abajo ícono de flecha hacia abajo al lado del nombre de tu conjunto de datos en la interfaz de usuario web de BigQuery y, luego, haz clic en Create new table (Crear tabla nueva).

  2. En la página Create table (Crear tabla), completa la información requerida para crear una tabla vacía sin esquema o crear una tabla vacía con una definición de esquema. Antes de hacer clic en Create Table, configura el tipo de encriptación y especifica la clave de Cloud KMS que se usará con la tabla:

    1. Haz clic en la lista desplegable y busca Encryption Type (Tipo de encriptación) y selecciona Customer-Managed Encryption (Encriptación administrada por el cliente).
    2. En Customer-Managed Encryption Key (Clave de encriptación administrada por el cliente), ingresa el ID del recurso para la clave. Esta clave tiene el formato siguiente:
      projects/[PROJECT_ID]/locations/[LOCATION]/keyRings/[KEYRING]/cryptoKeys/[KEY]
      
      Para obtener información sobre cómo recuperar el ID del recurso clave, consulta ID del recurso de clave.
  3. Haz clic en Create Table.

Línea de comandos

Puedes usar la herramienta de línea de comandos bq con la marca --destination_kms_key para crear la tabla. La marca --destination_kms_key especifica el ID del recurso de la clave que se usará con la tabla. Esta clave tiene el formato siguiente:

projects/[PROJECT_ID]/locations/[LOCATION]/keyRings/[KEYRING]/cryptoKeys/[KEY]
Para obtener información sobre cómo recuperar el ID del recurso clave, consulta [ID del recurso clave] (/kms/docs/object-hierarchy#key_resource_id). Crear una tabla vacía con un esquema:
bq mk --schema name:string,value:integer -t \
--destination_kms_key projects/[PROJECT_ID]/locations/[LOCATION]/keyRings/[KEYRING]/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/[KEYRING]/cryptoKeys/[KEY]'
  )
"

Para crear una tabla desde una consulta:

bq query --destination_table=mydataset.newtable \
--destination_kms_key projects/[PROJECT_ID]/locations/[LOCATION]/keyRings/[KEYRING]/cryptoKeys/[KEY] \
"SELECT name,count FROM mydataset.babynames WHERE gender = 'M' ORDER BY count DESC LIMIT 6"

Si quieres obtener más información sobre la herramienta de línea de comandos de bq, consulta 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

Protege una tabla nueva con una clave de encriptación administrada por el cliente mediante la configuración de la propiedad Table.encryption_configuration en 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 Cloud KMS

No se necesitan arreglos especiales a fin de consultar una tabla protegida por Cloud KMS. BigQuery almacena el nombre de la clave usada para encriptar el contenido de la tabla y la usará cuando se consulte una tabla que protege Cloud KMS.

Todas las herramientas existentes, la consola de BigQuery y la interfaz de línea de comandos bq se ejecutan de la misma forma como con las tablas encriptadas de forma predeterminada, mientras que BigQuery tiene acceso a la clave de Cloud KMS que se usa para encriptar el contenido de la tabla.

Protege resultados de consultas con la clave de Cloud KMS

IU web

  1. Haz clic en el botón Compose query (Redactar consulta) en la interfaz de usuario web de BigQuery.

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

  3. Haz clic en Encryption Type y selecciona Customer-Managed Encryption.

  4. En Customer-Managed Encryption Key, ingresa el ID del recurso para la clave. Esta clave tiene el formato siguiente:

    projects/[PROJECT_ID]/locations/[LOCATION]/keyRings/[KEYRING]/cryptoKeys/[KEY]
    
    Para obtener información sobre cómo recuperar el ID del recurso clave, consulta ID del recurso de clave.

  5. Haz clic en RunQuery (Ejecutar consulta).

Línea de comandos

Especifica la marca --destination_kms_key para proteger la tabla de destino o los resultados de consultas (si usas una tabla temporal) con tu clave de Cloud KMS. La marca --destination_kms_key especifica el ID del recurso de la clave que se usará con la tabla de destino o la resultante. Esta clave tiene el formato siguiente:

projects/[PROJECT_ID]/locations/[LOCATION]/keyRings/[KEYRING]/cryptoKeys/[KEY]
Para obtener información sobre cómo recuperar el ID del recurso clave, consulta [ID del recurso clave] (/kms/docs/object-hierarchy#key_resource_id). Otra opción es usar la marca `--destination_table` para especificar el destino de los resultados de consultas. Si no se usa `--destination_table`, los resultados de las consultas 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/[KEYRING]/cryptoKeys/[KEY] \
"SELECT name,count FROM mydataset.babynames WHERE gender = 'M' ORDER BY count DESC LIMIT 6"

Si quieres obtener más información sobre la herramienta de línea de comandos de bq, consulta 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

Protege una tabla de destino de consultas con una clave de encriptación administrada por el cliente mediante la configuración de la propiedad QueryJobConfig.destination_encryption_configuration en 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 Cloud KMS

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

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

Protege una tabla de destino de trabajo de cargas con una clave de encriptación administrada por el cliente mediante la configuración de la propiedad QueryJobConfig.destination_encryption_configuration en 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 en una tabla protegida por Cloud 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 encriptaron con tu clave de Cloud KMS en el búfer, así como 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 Cloud KMS

Línea de comandos

Puedes usar el comando bq cp con la marca --destination_kms_key para copiar una tabla protegida por la encriptación predeterminada en una tabla nueva o en la original protegida por Cloud KMS. La marca --destination_kms_key especifica el ID del recurso de la clave que se usa con la tabla de destino. Esta clave tiene el formato siguiente:

projects/[PROJECT_ID]/locations/[LOCATION]/keyRings/[KEYRING]/cryptoKeys/[KEY]

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

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

bq cp \
--destination_kms_key projects/[PROJECT_ID]/locations/[LOCATION]/keyRings/[KEYRING]/cryptoKeys/[KEY] \
sourceDataset.sourceTableId destinationDataset.destinationTableId

Si quieres copiar una tabla con encriptación predeterminada en la misma tabla con la protección de Cloud KMS:

bq cp -f \
--destination_kms_key projects/[PROJECT_ID]/locations/[LOCATION]/keyRings/[KEYRING]/cryptoKeys/[KEY] \
sourceDataset.sourceTableId sourceDataset.sourceTableId

Si quieres cambiar una tabla de la protección de Cloud KMS a la encriptación predeterminada, copia el archivo en sí mismo mediante la ejecución de bq cp sin usar la marca --destination_kms_key.

Si quieres obtener más información sobre la herramienta de línea de comandos de bq, consulta 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

Protege el destino de una copia de tabla con una clave de encriptación administrada por el cliente mediante la configuración de la propiedad QueryJobConfig.destination_encryption_configuration en 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 Cloud KMS

  1. En la interfaz de usuario 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. Esto muestra las tablas y vistas en el conjunto de datos.

  2. Haz clic en el nombre de la tabla.

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

  4. Si la tabla está protegida por Cloud KMS, el campo Customer-Managed Encryption Key mostrará el ID del recurso de la clave.

    Tabla protegida

Cambia la clave de Cloud KMS por una tabla de BigQuery

Para cambiar la clave de Cloud KMS de una tabla protegida por CMEK existente, puedes usar la API o la herramienta de línea de comandos bq. Hay dos formas de modificar la clave de Cloud KMS: update o cp. Si usas update, puedes cambiar la clave de Cloud KMS que usa una tabla protegida por KMS. Si usas cp, puedes cambiar la clave de Cloud KMS usada por una tabla protegida por CMEK, cambiar una tabla desde la encriptación predeterminada a una protección de CMEK y también cambiar una tabla desde una protección de CMEK a una encriptación predeterminada. Una ventaja de update es que es más rápida que cp y permite el uso de decoradores de tabla.

Línea de comandos

Puedes usar el comando bq cp con la marca --destination_kms_key para cambiar la clave por una tabla protegida por Cloud KMS. La marca --destination_kms_key especifica el ID del recurso de la clave que se usa con la tabla. Esta clave tiene el formato siguiente:

projects/[PROJECT_ID]/locations/[LOCATION]/keyRings/[KEYRING]/cryptoKeys/[KEY]

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

bq update \
--destination_kms_key projects/[PROJECT_ID]/locations/[LOCATION]/keyRings/[KEYRING]/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

Cambia la clave de encriptación administrada por el cliente por una tabla mediante el cambio de la propiedad Table.encryption_configuration en 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

Quita a la clave de Cloud KMS el acceso a BigQuery

Puedes quitar a BigQuery el acceso a la clave de Cloud KMS en cualquier momento, si revocas los permisos de IAM para esa clave.

Si BigQuery pierde acceso a la clave de Cloud KMS, la experiencia del usuario pude sufrir de manera significante y pueden ocurrir pérdidas de datos:

  • No se puede acceder más a los datos en estas tablas protegidas por CMEK: query, cp, extract y tabledata.list (todas fallarán).

  • No se pueden 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 la clave de Cloud KMS

BigQuery no rota una clave de encriptación de tabla de forma automática cuando se rota una clave de Cloud KMS asociada a la tabla. 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 Cloud KMS

Se considera que una clave de Cloud KMS está disponible y es accesible para BigQuery en las situaciones siguientes:

  • Cuando la clave está habilitada.
  • Cuando 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 a 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 Cloud KMS debe estar disponible y accesible por lo menos durante 24 horas consecutivas en el período de 48 horas después de la solicitud de inserción de transmisión. Si la clave no está disponible y accesible, los datos transmitidos tal vez no sean persistentes y se pueden perder. Para 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 Cloud KMS de una tabla de BigQuery dada no está disponible y no está accesible durante 60 días consecutivos, BigQuery puede elegir borrar la tabla y sus datos asociados. Antes de borrar los datos, BigQuery te 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 se reemplazan datos en una tabla protegida por Cloud KMS a través de una disposición de escritura de WRITE_TRUNCATE por operaciones load, cp o query, la tabla se vuelve inaccesible para consultas a través de decoradores de tabla según el tiempo del decorador de instantáneas.

Supongamos que una tabla se reemplazó en T tiempo y el decorador de instantánea snapshot_time es para un tiempo menor que T. En la tabla a continuación, se 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 por Cloud KMS Encriptado por Cloud KMS No se puede consultar.
Encriptado predeterminado Encriptado por Cloud KMS Se puede consultar.
Encriptado por Cloud KMS Encriptado predeterminado No se puede consultar.

Ten en cuenta que se usa la misma lógica para <time2> cuando se usa un decorador de rango.

Preguntas frecuentes

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

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

¿Qué cuenta de servicio se usa?

La cuenta de servicio de BigQuery asociada al proyecto de GCP 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 Cloud 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}, sigue estos pasos:

  • 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 Cloud KMS?

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

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

¿Cómo obtener más ayuda?

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

Solución de problemas

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 a tu proyecto no tiene los permisos de Cloud IAM suficientes para operar en la clave de Cloud 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 la tabla de encriptación existente no coinciden con las opciones de configuración de la encriptación especificada en la solicitud. Esto puede suceder en situaciones en 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, use 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 Cloud 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 en un conjunto de datos que coincida con la región clave.

Problemas comunes

  • Las bibliotecas cliente de BigQuery aún no son compatibles con comandos para configurar claves de encriptación administradas por el cliente.
¿Te sirvió esta página? Envíanos tu opinión:

Enviar comentarios sobre…

¿Necesitas ayuda? Visita nuestra página de asistencia.