Usa 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 Cloud HSM, un servicio de Módulo de seguridad de hardware (HSM) alojado en la nube que te permite alojar claves de encriptación y realizar operaciones criptográficas en un clúster de HSM certificados con el nivel 3 del estándar FIPS 140-2. Para obtener más información sobre las cuotas adicionales de Cloud HSM, consulta las Cuotas de Cloud KMS.

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

Antes de comenzar

  1. Verifica que tienes el SDK de Apache Beam para Java 2.13.0 o una versión posterior o el SDK de Apache Beam para Python 2.13.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 el extremo regional de tu trabajo de Dataflow deben ser iguales.

Otorga permisos de encriptador/desencriptador

  1. Asigna la función Cloud KMS CryptoKey Encrypter/Decrypter a la cuenta de servicio de Dataflow. Esto le otorga a tu cuenta de servicio de Dataflow el permiso para encriptar y desencriptar contenido con la CMEK que especifiques. Si usas Google Cloud Console 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 herramienta de línea de comandos gcloud para asignar la función:

    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 herramienta de línea de comandos gcloud para asignar la función:

    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 que esté 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 temp_location.

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

Cloud Console

  1. Abre la IU de supervisión de Dataflow.
    Ir a la IU 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 de Cloud KMS específica, es posible que la cuenta de servicio de Compute Engine o la cuenta de servicio de Dataflow no tengan los permisos para encriptar y desencriptar mediante 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 Cloud Dataflow con una CMEK particular.

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 el usuario especificó para las transformaciones basadas en claves.

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. Si estas claves contienen información de identificación personal (PII), debes aplicar un hash o transformar las claves antes de que ingresen a la canalización de Dataflow. Los valores de los pares clave-valor están dentro del alcance de la encriptación de CMEK.

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 depósito.
  • 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 depósito.

En este momento, el estado de Dataflow Streaming Engine no puede estar protegido por una CMEK y está encriptado por una clave administrada por Google. Si deseas que las CMEK protejan todo el estado de la canalización, no uses esta característica opcional.

Verifica el uso de clave de Cloud KMS

Puedes verificar si la canalización usa una clave de Cloud KMS con Cloud Console o la herramienta de línea de comandos de gcloud.

Console

  1. Abre la IU de supervisión de Dataflow.
    Ir a la IU web de Dataflow
  2. Selecciona tu trabajo de Dataflow para ver los detalles del trabajo.
  3. En la sección Resumen del trabajo, el tipo de clave aparece en el campo Tipo de encriptación (Encryption type).
    Sección Resumen de trabajo, en la cual se enumeran los detalles de un trabajo de Cloud Dataflow.
          El tipo de clave que usa tu trabajo aparece en el campo Tipo de encriptación.

CLI

Ejecuta el comando describe con la herramienta 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 Cloud Console 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.

Registro de auditoría del uso de la clave de Cloud KMS

Dataflow le 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. Esto 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, así como llamadas a la API controladas por el usuario que crean, modifican o leen 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.

Quita el acceso de 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 la función Cloud KMS CryptoKey Encrypter/Decrypter en la cuenta de servicio de Dataflow mediante Cloud Console o la herramienta de gcloud.
  2. Revoca la función Cloud KMS CryptoKey Encrypter/Decrypter a la cuenta de servicio de Compute Engine mediante Cloud Console o la herramienta 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 y comienza a limpiar de inmediato los recursos de Google Cloud conectados a tu trabajo.

Usa fuentes y receptores de GCP protegidos con claves de Cloud KMS

Dataflow puede acceder a fuentes y receptores que están protegidos por claves de Cloud KMS sin que tengas que especificar la clave de Cloud KMS de esas fuentes y receptores, siempre que no crees objetos nuevos. Si tu canalización de Dataflow puede crear objetos nuevos en un receptor, debes definir parámetros de canalización que especifiquen las claves de Cloud KMS de ese receptor y pasar 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, como Confluent Kafka alojado en Google Cloud o Amazon Simple Storage Service (S3), 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 tienen los siguientes formatos:

  • 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.

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.

Precios

Puedes usar las claves de encriptación de Cloud KMS con Dataflow en todos los extremos regionales de Dataflow en los 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.