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 Cloud 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 Platform.

Antes de comenzar

  1. Verifica que tienes el SDK de Apache Beam para Java >= 2.13.0 o el SDK de Apache Beam para Python >= 2.13.0.

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

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

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

    Para obtener información sobre los ID de los proyectos de GCP y los números de los proyectos, consulta cómo identificar proyectos.

  3. En el proyecto de GCP 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 Cloud Dataflow son servicios regionalizados. Crea un llavero de claves en una ubicación que coincida con la ubicación de tus instancias de trabajador de Cloud Dataflow:

      • Para un trabajo de Cloud Dataflow especificado con region, selecciona claves para usar en la misma región.
      • Para un trabajo de Cloud Dataflow especificado con zone, selecciona claves para usar en la misma región.

Cómo otorgar permisos de encriptador/desencriptador

  1. Asigna la función Cloud KMS CryptoKey Encrypter/Decrypter a la cuenta de servicio de Cloud Dataflow. Esto le otorga a tu cuenta de servicio de Cloud Dataflow el permiso para encriptar y desencriptar contenido con la CMEK que especifiques. Si usas Google Cloud Platform Console y la página Crear un trabajo a partir de una plantilla, se otorga este permiso automáticamente 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 con el ID de tu proyecto de GCP que ejecuta Cloud KMS y reemplaza PROJECT_NUMBER con el número (no el ID) de tu proyecto de GCP que ejecuta los recursos de Cloud 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 con el ID de tu proyecto de GCP que ejecuta Cloud KMS y reemplaza PROJECT_NUMBER con el número (no el ID) de tu proyecto de GCP 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 Cloud 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

Cloud Dataflow no admite la creación de rutas predeterminadas de Cloud Storage para archivos temporales cuando se utiliza 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

Cloud Dataflow no admite la creación de rutas predeterminadas de Cloud Storage para archivos temporales cuando se utiliza 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 Cloud Dataflow.
    Ir a la IU web de Cloud 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 Cloud 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 Cloud Dataflow con una CMEK particular.

Encriptación de artefactos de estado de canalización

Los datos que una canalización de Cloud Dataflow lee de fuentes de datos especificadas por el usuario están encriptados, 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 generar un hash o transformar las claves antes de que ingresen a la canalización de Cloud 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 grafo 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:

  • Disco persistente adjunto a los trabajadores de Cloud Dataflow y usado para el almacenamiento de estado de transmisión y el shuffle basado en disco persistente.
  • Depósitos de Cloud Storage que almacenan datos temporales de importación o exportación. Cloud Dataflow solo admite las claves predeterminadas establecidas por el usuario en el nivel de depósito.
  • Depósitos de Cloud Storage que se usan para almacenar archivos binarios que contienen código de canalización. Cloud Dataflow solo admite las claves predeterminadas establecidas por el usuario en el nivel de depósito.

Actualmente, el estado de Cloud Dataflow Shuffle y Streaming Engine no puede estar protegido por una CMEK y están encriptados por una clave administrada por Google. Si deseas que todo el estado de tu canalización esté protegido por las CMEK, no uses estas funciones opcionales.

Cómo verificar el uso de clave de Cloud KMS

Puedes verificar si tu canalización utiliza una clave de Cloud KMS mediante GCP Console o la herramienta de línea de comandos de gcloud.

Console

  1. Abre la IU de supervisión de Cloud Dataflow.
    Ir a la IU web de Cloud Dataflow
  2. Selecciona tu trabajo de Cloud Dataflow para ver los detalles del trabajo.
  3. En la sección Resumen del trabajo, el tipo de clave aparece en el campo Encryption type(Tipo de encriptación).
    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 gcloud:

gcloud dataflow jobs describe JOB_ID

Busca la línea que contiene serviceKmsKeyName. Esta información muestra que una clave de Cloud KMS fue usada por la encriptación del estado de canalización de Cloud Dataflow.

Puedes verificar el uso de la clave de Cloud KMS para encriptar fuentes y receptores con las páginas y herramientas de Cloud Storage y BigQuery GCP Console o si consultas tus registros de auditoría de Cloud KMS.

Cómo quitar el acceso de Cloud Dataflow a la clave de Cloud KMS

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

  1. Revoca la función Cloud KMS CryptoKey Encrypter/Decrypter a lacuenta de servicio de Cloud Dataflow con GCP Consoleo de manera programática.
  2. Revoca la función Cloud KMS CryptoKey Encrypter/Decrypter a lacuenta de servicio de Compute Engine con GCP Console o de manera programática.
  3. Como alternativa, también puedes destruir el material de la versión de clave para evitar a un mayor grado el acceso al estado de canalización por parte de Cloud Dataflow y otros servicios.

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 Cloud Dataflow validan periódicamente si la cuenta de servicio de Cloud Dataflow puede usar de manera correcta la clave de Cloud KMS especificada. Si falla una solicitud de encriptación o desencriptación, el servicio de Cloud Dataflow detiene todo el procesamiento y la transferencia de datos lo antes posible y comienza inmediatamente a limpiar los recursos de GCP adjuntos a tu trabajo.

Cómo usar fuentes y receptores de GCP protegidos con claves de Cloud KMS

Cloud Dataflow puede acceder a fuentes y receptores que están protegidos con claves de Cloud KMS sin que tengas que especificar la clave de Cloud KMS de esas fuentes y receptores, siempre que no estés creando objetos nuevos. Si tu canalización de Cloud Dataflow podría crear objetos nuevos en un receptor, debes definir parámetros de canalización que especifiquen las claves de Cloud KMS para ese receptor y pasar esta clave de Cloud KMS a los métodos de conector de E/S apropiados.

Para los receptores y las fuentes de canalización de Cloud Dataflow que no admiten CMEK administrada por Cloud KMS, como Confluent Kafka alojado en GCP o Amazon Simple Storage Service (S3), la configuración de CMEK de Cloud 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
  • Cloud 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.

Cloud Pub/Sub

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

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

Precios

Puedes usar claves de encriptación de Cloud KMS con Cloud Dataflow en todos los extremos regionales de Cloud Dataflow donde está disponible Cloud KMS.

Esta integración no incurre en costos adicionales más allá de las operaciones de clave, que se facturan en tu proyecto de GCP. Cada vez que la cuenta de servicio de Cloud 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.

¿Te sirvió esta página? Envíanos tu opinión:

Enviar comentarios sobre…

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