Usar claves de encriptación administradas por el cliente

En esta página, se describe cómo usar una clave de encriptación de Cloud Key Management Service (Cloud KMS) con Dataflow. Una clave de encriptación administrada por el cliente (CMEK) habilita la encriptación de datos en reposo con una clave que puedes controlar a través de Cloud KMS. Puedes crear una canalización por lotes o transmisión que esté protegida con una CMEK o acceder a los datos protegidos por una CMEK en las fuentes y los receptores.

También puedes usar las claves de Cloud EKM o Cloud HSM. Cuando usas CMEK en Dataflow, tus proyectos pueden consumir cuotas de solicitudes criptográficas de Cloud KMS. Por ejemplo, las canalizaciones de Dataflow pueden consumir estas cuotas cuando tu canalización accede a datos protegidos por CMEK en fuentes y receptores, o cuando se recupera el estado de una canalización encriptada con CMEK. Para obtener más información, consulta la sección Encriptación de ubicaciones del estado de las canalizaciones en esta página. Las operaciones de encriptación y desencriptación con claves CMEK afectan las cuotas de Cloud KMS solo si usas claves de hardware (Cloud HSM) o externas (Cloud EKM). Para obtener más información, consulta Cuotas de Cloud KMS.

Con Cloud External Key Manager (Cloud EKM), puedes usar las claves que administras dentro de un socio de administración de claves externo compatible para proteger los datos en Google Cloud. Puedes proteger los datos en reposo en los servicios de integración de CMEK compatibles o llamando directamente a la API de Dataflow.

Para obtener más información, consulta las opciones de encriptación en Google Cloud.

Asistencia y limitaciones

  • Cloud KMS es compatible con las siguientes versiones del SDK de Apache Beam:

    • Versiones 2.13.0 y posteriores del SDK de Java
    • Versiones 2.13.0 y posteriores del SDK de Python
    • Versiones 2.40.0 y posteriores del SDK de Go
  • Cloud KMS con Dataflow admite claves regionales. Advertencia: Si anulas la región o la zona de trabajador de la canalización para usar una región distinta de la asociada con tu las claves, las claves regionales no funcionarán.

  • La región de tu CMEK y la región de tu trabajo de Dataflow deben ser iguales.

  • No se admiten ubicaciones multirregionales ni globales. No se pueden usar claves globales y multirregionales con canalizaciones de Dataflow.

Encriptación de artefactos de estado de canalización

Los datos que una canalización de Dataflow lee de las fuentes de datos especificadas por el usuario se encriptan, excepto las claves de datos que especificas para las transformaciones basadas en claves en trabajos de transmisión.

En los trabajos por lotes, todos los datos, incluidas las claves de datos que especificas para las transformaciones basadas en claves, siempre están protegidos por la encriptación de CMEK.

En los trabajos de transmisión creados después del 7 de marzo de 2024, todos los datos del usuario se encriptan con CMEK.

En los trabajos de transmisión creados antes del 7 de marzo de 2024, las claves de datos que se usan en las operaciones basadas en claves, como las de sistema de ventanas, agrupación y unión, no están protegidas por la encriptación de CMEK. A fin de habilitar esta encriptación para tus trabajos, desvía o cancela el trabajo y, luego, reinícialo.

Los metadatos del trabajo no están encriptados con las claves de Cloud KMS. Los metadatos del trabajo incluyen lo siguiente:

  • Datos proporcionados por el usuario, como nombres de trabajo, valores de parámetros de trabajo y gráfico de canalización
  • Datos generados por el sistema, como los ID de trabajo y las direcciones IP de los trabajadores

Encriptación de ubicaciones de estado de canalización

Las siguientes ubicaciones de almacenamiento están protegidas con claves de Cloud KMS:

  • Discos persistentes que se conectaron a trabajadores de Dataflow y se usaron para el almacenamiento de estado de transmisión y el shuffle basado en disco persistente
  • Estado Shuffle de Dataflow para canalizaciones por lotes
  • Depósitos de Cloud Storage que almacenan datos temporales de importación o exportación Dataflow solo admite las claves predeterminadas que establece el usuario en el nivel del bucket.
  • Depósitos de Cloud Storage que se usan para almacenar archivos binarios que contienen código de canalización. Dataflow solo admite las claves predeterminadas que establece el usuario en el nivel del bucket.
  • Buckets de Cloud Storage que se usan para almacenar datos de canalización de muestra, cuando el muestreo de datos está habilitado.
  • Estado de Dataflow Streaming Engine para canalizaciones de transmisión.

Claves externas

Puedes usar Cloud External Key Manager (Cloud EKM) para encriptar datos en Google Cloud mediante claves externas que administras.

Cuando usas una clave de Cloud EKM, Google no tiene control sobre la disponibilidad de tu clave administrada de forma externa. Si la clave no está disponible durante el trabajo o el período de creación de la canalización, tu trabajo o canalización se cancela.

Para obtener más consideraciones sobre el uso de claves externas, consulta Cloud External Key Manager.

Antes de comenzar

  1. Verifica que tienes el SDK de Apache Beam para Java 2.13.0 o una versión posterior, el SDK de Apache Beam para Python 2.13.0 o una versión posterior, o el SDK de Apache Beam para Go 2.40.0 o una versión posterior.

    Para obtener más información, consulta Instala el SDK de Apache Beam.

  2. Decide si ejecutarás Dataflow y Cloud KMS en el mismo proyecto de Google Cloud o en proyectos diferentes. En esta página, se usa la siguiente convención:

    • PROJECT_ID es el ID del proyecto que ejecuta Dataflow.
    • PROJECT_NUMBER es el número del proyecto que ejecuta Dataflow.
    • KMS_PROJECT_ID es el ID del proyecto que ejecuta Cloud KMS.

    Para obtener información sobre los números y los ID de los proyectos de Google Cloud, consulta la sección Identifica proyectos.

  3. En el proyecto de Google Cloud en el que deseas ejecutar Cloud KMS, haz lo siguiente:

    1. Habilita la API de Cloud KMS.
    2. Crea un llavero de claves y una clave como se describe en Crea claves simétricas. Cloud KMS y Dataflow son servicios regionalizados. La región de tu CMEK y la región de tu trabajo de Dataflow deben ser iguales. No uses claves globales ni multirregionales con tus canalizaciones de Dataflow. En su lugar, usa las claves regionales.

Otorga permisos de encriptador/desencriptador

  1. Asigna el rol Cloud KMS CryptoKey Encrypter/Decrypter a la cuenta de servicio de Dataflow. Este permiso le otorga a tu cuenta de servicio de Dataflow el permiso para encriptar y desencriptar contenido con la CMEK que especifiques. Si usas la consola de Google Cloud y la página Crea un trabajo a partir de una plantilla, este permiso se otorga de manera automática y puedes omitir este paso.

    Usa la Google Cloud CLI para asignar el rol:

    gcloud projects add-iam-policy-binding KMS_PROJECT_ID \
    --member serviceAccount:service-PROJECT_NUMBER@dataflow-service-producer-prod.iam.gserviceaccount.com \
    --role roles/cloudkms.cryptoKeyEncrypterDecrypter
    

    Reemplaza KMS_PROJECT_ID por el ID de tu proyecto de Google Cloud que ejecuta Cloud KMS y reemplaza PROJECT_NUMBER por el número del proyecto (no el ID del proyecto) de Google Cloud que ejecuta los recursos de Dataflow.

  2. Asigna la función Cloud KMS CryptoKey Encrypter/Decrypter a la cuenta de servicio de Compute Engine. Esto le otorga a tu cuenta de servicio de Compute Engine el permiso para encriptar y desencriptar contenido con la CMEK que especifiques.

    Usa la Google Cloud CLI para asignar el rol:

    gcloud projects add-iam-policy-binding KMS_PROJECT_ID \
    --member serviceAccount:service-PROJECT_NUMBER@compute-system.iam.gserviceaccount.com \
    --role roles/cloudkms.cryptoKeyEncrypterDecrypter
    

    Reemplaza KMS_PROJECT_ID por el ID del proyecto de Google Cloud que ejecuta Cloud KMS y reemplaza PROJECT_NUMBER por el número del proyecto (no el ID) de Google Cloud que ejecuta los recursos de Compute Engine.

Crea una canalización protegida por Cloud KMS

Cuando creas una canalización por lotes o de transmisión, puedes seleccionar una clave de Cloud KMS para encriptar el estado de la canalización. El estado de la canalización son los datos que Dataflow almacena en el almacenamiento temporal.

Interfaz de línea de comandos

Para crear una canalización nueva con el estado de la canalización que esté protegida por una clave de Cloud KMS, agrega la marca correspondiente a los parámetros de la canalización. En el siguiente ejemplo, se demuestra cómo ejecutar una canalización de recuento de palabras con Cloud KMS.

Java

Dataflow no admite la creación de rutas de acceso predeterminadas de Cloud Storage para archivos temporales cuando se usa una clave de Cloud KMS. Debes especificar gcpTempLocation.

mvn compile exec:java -Dexec.mainClass=org.apache.beam.examples.WordCount \
  -Dexec.args="--inputFile=gs://dataflow-samples/shakespeare/kinglear.txt \
               --output=gs://STORAGE_BUCKET/counts \
               --runner=DataflowRunner --project=PROJECT_ID \
               --gcpTempLocation=gs://STORAGE_BUCKET/tmp \
               --dataflowKmsKey=KMS_KEY"
  -Pdataflow-runner

Python

Dataflow no admite la creación de rutas de acceso predeterminadas de Cloud Storage para archivos temporales cuando se usa una clave de Cloud KMS. Debes especificar gcpTempLocation.

python -m apache_beam.examples.wordcount \
  --input gs://dataflow-samples/shakespeare/kinglear.txt \
  --output gs://STORAGE_BUCKET/counts \
  --runner DataflowRunner \
  --region HOST_GCP_REGION \
  --project PROJECT_ID \
  --temp_location gs://STORAGE_BUCKET/tmp/ \
  --dataflow_kms_key=KMS_KEY

Go

Dataflow no admite la creación de rutas de acceso predeterminadas de Cloud Storage para archivos temporales cuando se usa una clave de Cloud KMS. Debes especificar gcpTempLocation.

wordcount
  --project HOST_PROJECT_ID \
  --region HOST_GCP_REGION \
  --runner dataflow \
  --staging_location gs://STORAGE_BUCKET/staging \
  --temp_location gs://STORAGE_BUCKET/temp \
  --input gs://dataflow-samples/shakespeare/kinglear.txt \
  --output gs://STORAGE_BUCKET/output \
  --dataflow_kms_key=KMS_KEY

Consola de Google Cloud

  1. Abre la interfaz de supervisión de Dataflow.
    Ir a la interfaz web de Dataflow
  2. Selecciona Crear un trabajo a partir de una plantilla.
  3. En la sección Encryption (Encriptación), selecciona Customer-managed key (Clave administrada por el cliente).
En las opciones de encriptación de la página Crear un trabajo a partir de una plantilla, se incluyen una clave administrada por Google o claves administradas por el cliente.

La primera vez que intentes ejecutar un trabajo con una clave particular de Cloud KMS, tu cuenta de servicio de Compute Engine o tu cuenta de servicio de Dataflow podrían no tener los permisos para encriptar y desencriptar contenido con esa clave. En este caso, aparece un mensaje de advertencia que te solicita que otorgues el permiso a tu cuenta de servicio.

Solicita otorgar permisos para encriptar y desencriptar en tus cuentas de servicio de Compute Engine y Dataflow con una CMEK particular.

Verifica el uso de clave de Cloud KMS

Puedes verificar si la canalización usa una clave de Cloud KMS con la consola de Google Cloud o Google Cloud CLI.

Consola

  1. Abre la interfaz de supervisión de Dataflow.
    Ir a la interfaz web de Dataflow
  2. Para ver los detalles del trabajo, selecciona tu trabajo de Dataflow.
  3. En el panel lateral Información del trabajo, marca el campo Tipo de encriptación para ver el tipo de clave.

    • Para el tipo de encriptación: “Clave administrada por Google”
      Panel lateral de información del trabajo en el que se enumeran los detalles de un trabajo de Dataflow.
      El tipo de clave que usa tu trabajo aparece en el campo Tipo de encriptación.
    • Para el tipo de encriptación: “Clave administrada por el cliente”
      Panel lateral de información del trabajo en el que se enumeran los detalles de un trabajo de Dataflow.
      El tipo de clave que usa tu trabajo aparece en el campo Tipo de encriptación.

CLI

Ejecuta el comando describe con la CLI de gcloud:

gcloud dataflow jobs describe JOB_ID

Busca la línea que contiene serviceKmsKeyName. En esta información, se muestra que se usó una clave de Cloud KMS para la encriptación del estado de la canalización de Dataflow.

Puedes verificar el uso de claves de Cloud KMS a fin de encriptar fuentes y receptores mediante las páginas y las herramientas de la consola de Google Cloud de esas fuentes y receptores, incluidos Pub/Sub, Cloud Storage y BigQuery. También puedes verificar el uso de las claves de Cloud KMS a través de los registros de auditoría de Cloud KMS.

Inhabilita o destruye la clave

Si, por algún motivo, necesitas inhabilitar o destruir la clave, puedes usar la consola de Google Cloud. Las operaciones de inhabilitación y destrucción cancelan los trabajos que usan esa clave. Esta operación es permanente.

Si usas Cloud EKM, inhabilita o destruye la clave en tu administrador de claves externo.

Si usas la opción Streaming Engine, se recomienda tomar una instantánea del trabajo antes de inhabilitar la clave.

Quita el acceso a Dataflow a la clave de Cloud KMS

Puedes quitar el acceso de Dataflow a la clave de Cloud KMS mediante los siguientes pasos:

  1. Revoca el rol Cloud KMS CryptoKey Encrypter/Decrypter de la cuenta de servicio de Dataflow mediante la consola de Google Cloud o la CLI de gcloud.
  2. Revoca el rol Cloud KMS CryptoKey Encrypter/Decrypter de la cuenta de servicio de Compute Engine mediante la consola de Google Cloud o la CLI de gcloud.
  3. Si lo deseas, también puedes destruir el material de la versión de clave para evitar que Dataflow y otros servicios accedan al estado de la canalización.

Aunque puedes destruir el material de la versión de clave, no puedes borrar las claves ni los llaveros de claves. Las claves y los llaveros de claves no tienen costos facturables ni limitaciones de cuota, por lo que su existencia continua no afecta los límites de costo ni de producción.

Los trabajos de Dataflow validan de forma periódica si la cuenta de servicio de Dataflow puede usar la clave de Cloud KMS determinada de forma correcta. Si una solicitud de encriptación o desencriptación falla, el servicio de Dataflow detiene toda la transferencia y el procesamiento de datos lo antes posible. Dataflow comienza a limpiar de inmediato los recursos de Google Cloud conectados a tu trabajo.

Usa fuentes y receptores protegidos con claves de Cloud KMS

Dataflow puede acceder a las fuentes y los receptores de Google Cloud protegidos por las claves de Cloud KMS. Si no creas objetos nuevos, no necesitas especificar la clave de Cloud KMS de esas fuentes y receptores. Si tu canalización de Dataflow puede crear objetos nuevos en un receptor, debes definir parámetros de canalización. Estos parámetros especifican las claves de Cloud KMS de ese receptor y pasan esta clave de Cloud KMS a los métodos de conector de E/S adecuados.

Para las fuentes y los receptores de las canalizaciones de Dataflow que no admiten la CMEK administrada por Cloud KMS, la configuración de CMEK de Dataflow es irrelevante.

Permisos de clave de Cloud KMS

Cuando accedes a servicios que están protegidos con claves de Cloud KMS, verifica que hayas asignado la función Cloud KMS CryptoKey Encrypter/Decrypter a ese servicio. Las cuentas son las siguientes:

  • Cloud Storage: service-{project_number}@gs-project-accounts.iam.gserviceaccount.com
  • BigQuery: bq-{project_number}@bigquery-encryption.iam.gserviceaccount.com
  • Pub/Sub: service-{project_number}@gcp-sa-pubsub.iam.gserviceaccount.com

Cloud Storage

Si quieres proteger los depósitos temporales y de etapa de pruebas que especificaste con los parámetros de canalización TempLocation/temp_location y stagingLocation/staging_location, consulta cómo configurar depósitos de Cloud Storage protegidos por CMEK.

BigQuery

Java

Usa el método with_kms_key() en los valores de retorno de BigQueryIO.readTableRows(), BigQueryIO.read(), BigQueryIO.writeTableRows() y BigQueryIO.write().

Puedes encontrar un ejemplo en el repositorio de GitHub de Apache Beam.

Python

Usa el argumento kms_key en BigQuerySource y BigQuerySink.

Puedes encontrar un ejemplo en el repositorio de GitHub de Apache Beam.

Go

Los IO de BigQuery no son compatibles con el uso de la clave KMS en Go.

Pub/Sub

Dataflow controla el acceso a los temas protegidos por CMEK mediante la configuración de CMEK de tu tema.

Para leer y escribir en temas de Pub/Sub protegidos por CMEK, consulta las instrucciones de Pub/Sub para usar CMEK.

Registros de auditoría para el uso de claves de Cloud KMS

Dataflow te permite a Cloud KMS usar los registros de auditoría de Cloud para registrar operaciones clave, como encriptar y desencriptar. Dataflow proporciona el ID de trabajo como contexto a un emisor de Cloud KMS. Este ID te permite hacer un seguimiento de cada instancia en la que se usa una clave de Cloud KMS específica para un trabajo de Dataflow.

Los registros de auditoría de Cloud mantienen registros de auditoría para cada proyecto, carpeta y organización de Google Cloud. Tienes varias opciones para ver los registros de auditoría de Cloud KMS.

Cloud KMS escribe los registros de auditoría de la actividad del administrador para tus trabajos de Dataflow con encriptación de CMEK. En estos registros, se asientan las operaciones que modifican la configuración o los metadatos de un recurso. No puedes inhabilitar los registros de auditoría de la actividad de administrador.

Si se habilita de forma explícita, Cloud KMS escribirá registros de auditoría de acceso a los datos para tus trabajos de Dataflow con encriptación de CMEK. Estos registros contienen llamadas a la API que leen la configuración o los metadatos de los recursos. Estos registros también contienen llamadas a la API que controla el usuario y que crean, modifican o leen los datos de los recursos que proporciona el usuario. Para obtener instrucciones acerca de cómo habilitar algunos, o todos, los registros de auditoría de acceso a los datos, consulta Configura registros de acceso a los datos.

Precios

Puedes usar las claves de encriptación de Cloud KMS con Dataflow en todas las regiones de Dataflow en las que está disponible Cloud KMS.

Esta integración no genera costos adicionales más allá de las operaciones de clave que se facturan en tu proyecto de Google Cloud. Cada vez que la cuenta de servicio de Dataflow usa tu clave de Cloud KMS, la operación se factura con la tarifa de las operaciones de clave de Cloud KMS.

Para obtener más información, consulta Detalles de precios de Cloud KMS.

Soluciona problemas

Usa las sugerencias de esta sección para solucionar errores.

No se puede validar Cloud KMS

Tu flujo de trabajo puede fallar con el siguiente error:

Workflow failed. Causes: Cloud KMS key <key-name> cannot be validated.

Para solucionarlo, verifica que hayas pasado la ruta completa de la clave. Se verá de esta forma projects/<project-id>/locations/<gcp-region>/keyRings/<key-ring-name>/cryptoKeys/<key-name>. Busca posibles errores tipográficos en la ruta de la clave.

Se denegó el permiso para usar la clave de Cloud KMS

Tu flujo de trabajo puede fallar con el siguiente error:

Workflow failed. Causes: Cloud KMS key Permission 'cloudkms.cryptoKeyVersions.useToEncrypt' denied on resource
'projects/<project-id>/locations/<gcp-region>/keyRings/<key-ring-name>/cryptoKeys/<key-name>' (or it may not exist). cannot be validated.

Para solucionarlo, verifica que el ID del proyecto mencionado en la ruta de la clave sea correcto. Además, verifica que tengas el permiso para usar la clave.

La ubicación de la clave de Cloud KMS no coincide con la ubicación del trabajo de Dataflow

Tu flujo de trabajo puede fallar con el siguiente error:

Workflow failed. Causes: Cloud KMS key projects/<project-id>/locations/<gcp-region>/keyRings/<key-ring-name>/cryptoKeys/<key-name>
can't protect resources for this job. Make sure the region of the KMS key matches the Dataflow region.

Para solucionar este problema, si usas una clave regional, verifica que la clave de Cloud KMS esté en la misma región que el trabajo de Dataflow.