Clasificación automatizada de los datos subidos a Cloud Storage con la API de DLP y Cloud Functions

1. Descripción general

En la organización moderna, cada vez hay más datos que provienen de diversas fuentes. A menudo, esto requiere ponerlos en cuarentena y clasificarlos para almacenarlos y protegerlos estratégicamente, una tarea que rápidamente será imposible y costosa si sigue siendo manual.

En este codelab, veremos cómo clasificar automáticamente los datos subidos a Cloud Storage y moverlos al bucket de almacenamiento correspondiente. Para lograrlo, usaremos Cloud Pub/Sub, Cloud Functions, Cloud Data Loss Prevention y Cloud Storage.

Actividades

  • Crear buckets de Cloud Storage para usarlos como parte de la canalización de cuarentena y clasificación
  • Crear una Cloud Function simple que invoque la API de DLP cuando se suban los archivos
  • Crea un tema y una suscripción a Pub/Sub para que te notifiquen cuando se complete el procesamiento de archivos.
  • Sube archivos de muestra al bucket de cuarentena para invocar una Cloud Function
  • Usar la API de DLP para inspeccionar y clasificar los archivos y moverlos al bucket adecuado

Requisitos

  • Un proyecto de Google Cloud con la facturación configurada Si no tienes una, debes crearla.

2. Cómo prepararte

Durante este codelab, aprovisionaremos y administraremos diferentes servicios y recursos de la nube con la línea de comandos de Cloud Shell. El siguiente comando abrirá Cloud Shell junto con el Editor de Cloud Shell y clonará el repositorio del proyecto complementario:

Para asegurarte de usar el proyecto correcto, configúralo con gcloud config set project [PROJECT_ID].

Habilitar APIs

Habilita las APIs necesarias en tu proyecto de Google Cloud:

  • API de Cloud Functions: Administra las funciones básicas que proporcionan los usuarios y que se ejecutan en respuesta a eventos.
  • API de Cloud Data Loss Prevention (DLP): Proporciona métodos para la detección, el análisis de riesgos y la desidentificación de fragmentos sensibles a la privacidad en texto, imágenes y repositorios de almacenamiento de Google Cloud Platform.
  • Cloud Storage: Google Cloud Storage es un servicio RESTful para almacenar datos y acceder a ellos en la infraestructura de Google.

Permisos de cuentas de servicio

Una cuenta de servicio es un tipo especial de cuenta que usan las aplicaciones y máquinas virtuales para realizar llamadas autorizadas a la API.

Cuenta de servicio predeterminada de App Engine

La cuenta de servicio predeterminada de App Engine se usa para ejecutar tareas en tu proyecto de Cloud en nombre de las apps que se ejecutan en App Engine. Esta cuenta de servicio existe en tu proyecto de forma predeterminada con el rol de editor asignado.

Primero, otorgaremos a nuestra cuenta de servicio el rol de administrador de DLP necesario para administrar los trabajos de Prevención de pérdida de datos:

gcloud projects add-iam-policy-binding $GOOGLE_CLOUD_PROJECT \
--member serviceAccount:$GOOGLE_CLOUD_PROJECT@appspot.gserviceaccount.com \
--role roles/dlp.admin

Por último, otorgue el rol Agente de servicio de la API de DLP, que le dará permisos a la cuenta de servicio para BigQuery, Storage, Datastore, Pub/Sub y el servicio de administración de claves:

gcloud projects add-iam-policy-binding $GOOGLE_CLOUD_PROJECT \
--member serviceAccount:$GOOGLE_CLOUD_PROJECT@appspot.gserviceaccount.com \
--role roles/dlp.serviceAgent

Cuenta de servicio de DLP

Además de la cuenta de servicio de App Engine, también usaremos una cuenta de servicio de DLP. Esta cuenta de servicio se creó automáticamente cuando se habilitó la API de DLP y, al principio, no se le otorgaron roles. Otórgale el rol de visualizador:

gcloud projects add-iam-policy-binding $GOOGLE_CLOUD_PROJECT \
--member serviceAccount:service-`gcloud projects list --filter="PROJECT_ID:$GOOGLE_CLOUD_PROJECT" --format="value(PROJECT_NUMBER)"`@dlp-api.iam.gserviceaccount.com \
--role roles/viewer

3. Depósitos de Cloud Storage

Ahora necesitaremos crear 3 buckets de Cloud Storage para almacenar nuestros datos:

  • Bucket de cuarentena: Inicialmente, nuestros datos se subirán aquí.
  • Bucket de datos sensibles: Los datos que la API de DLP determine que serán sensibles se moverán aquí.
  • Bucket de datos no sensibles: Los datos que la API de DLP determina que no son sensibles se moverán aquí

Podemos usar el comando gsutil para crear los tres buckets de una sola vez:

gsutil mb gs://[YOUR_QUARANTINE_BUCKET] \
gs://[YOUR_SENSITIVE_DATA_BUCKET] \
gs://[YOUR_NON_SENSITIVE_DATA_BUCKET] 

Toma nota de los nombres de los buckets que acabas de crear, ya que los necesitaremos más adelante.

4. Tema y suscripción de Pub/Sub

Cloud Pub/Sub proporciona varios o varios mensajes asíncronos entre aplicaciones. Un publicador creará un mensaje y lo publicará en un feed de mensajes llamado tema. Un suscriptor recibirá estos mensajes mediante una suscripción. Según esa suscripción, en nuestro caso, una Cloud Function moverá archivos a sus respectivos buckets después de que se ejecute un trabajo de DLP.

Primero, creemos un tema. Aquí se publicará un mensaje cada vez que se agregue un archivo a nuestro bucket de almacenamiento en cuarentena. Lo llamaremos "classify-topic".

gcloud pubsub topics create classify-topic

Se notificará a una suscripción cuando el tema publique un mensaje. Creemos una suscripción pubsub con el nombre “classify-sub”:

gcloud pubsub subscriptions create classify-sub --topic classify-topic

Esa suscripción activará una segunda Cloud Function que iniciará un trabajo de DLP que inspeccionará el archivo y lo moverá a su lugar correcto.

5. Cloud Functions

Con Cloud Functions, podemos implementar funciones ligeras, basadas en eventos y asíncronas de un solo propósito sin tener que administrar servidores ni entornos de ejecución. Implementaremos 2 Cloud Functions con el archivo main.py proporcionado, ubicado en dlp-cloud-functions-tutorials/gcs-dlp-classification-python/

Reemplazar variables

Antes de poder crear nuestras funciones, deberemos reemplazar algunas variables en nuestro archivo main.py.

En el editor de Cloud Shell, ajusta main.py mediante el reemplazo de los valores del ID del proyecto y las variables de bucket de las líneas 28 a 34 por los buckets correspondientes que creaste anteriormente:

main.py

PROJECT_ID = '[PROJECT_ID_HOSTING_STAGING_BUCKET]'
"""The bucket the to-be-scanned files are uploaded to."""
STAGING_BUCKET = '[YOUR_QUARANTINE_BUCKET]'
"""The bucket to move "sensitive" files to."""
SENSITIVE_BUCKET = '[YOUR_SENSITIVE_DATA_BUCKET]'
"""The bucket to move "non sensitive" files to."""
NONSENSITIVE_BUCKET = '[YOUR_NON_SENSITIVE_DATA_BUCKET]'

Además, reemplaza el valor de la variable del tema de Pub/Sub por el tema de Pub/Sub que creaste en el paso anterior:

""" Pub/Sub topic to notify once the  DLP job completes."""
PUB_SUB_TOPIC = 'classify-topic'

Implementa funciones

En Cloud Shell, cambia los directorios a gcs-dlp-classification-python donde existe el archivo main.py:

cd ~/cloudshell_open/dlp-cloud-functions-tutorials/gcs-dlp-classification-python

Es hora de implementar algunas funciones.

Primero, implementa la función create_DLP_job y reemplaza [YOUR_QUARANTINE_BUCKET] por el nombre del bucket correcto. Esta función se activa cuando se suben archivos nuevos al bucket de cuarentena designado de Cloud Storage y se crea un trabajo de DLP para cada archivo subido:

gcloud functions deploy create_DLP_job --runtime python37 \
--trigger-event google.storage.object.finalize \
--trigger-resource [YOUR_QUARANTINE_BUCKET]

A continuación, implementa la función resolve_DLP, que indica nuestro tema como su activador. Esta función escucha la notificación de Pub/Sub iniciada en el trabajo de DLP posterior de la función anterior. En cuanto recibe la notificación de Pub/Sub, reconoce los resultados del trabajo de DLP y mueve el archivo al bucket sensible o no sensible según corresponda:

gcloud functions deploy resolve_DLP --runtime python37 \
--trigger-topic classify-topic

Verificar

Verifica que ambas Cloud Functions se hayan implementado correctamente con el comando gcloud functions describe:

gcloud functions describe create_DLP_job
gcloud functions describe resolve_DLP

El resultado leerá ACTIVE para el estado cuando se haya implementado correctamente.

6. Realiza pruebas con datos de muestra

Con todas las piezas implementadas, podemos realizar pruebas con algunos archivos de muestra. En Cloud Shell, cambia el directorio de trabajo actual a sample_data:

cd ~/cloudshell_open/dlp-cloud-functions-tutorials/sample_data

Nuestros archivos de muestra consisten en archivos txt y csv que contienen diversos tipos de datos. Los archivos con el prefijo “sample_s” contienen datos sensibles, mientras que aquellos con el prefijo “sample_n” no lo hará. Por ejemplo, sample_s20.csv contiene el formato que parece ser el de los números de seguridad social de EE.UU.:

sample_s20.csv

Name,SSN,metric 1,metric 2
Maria Johnson,284-73-5110,5,43
Tyler Parker,284-73-5110,8,17
Maria Johnson,284-73-5110,54,63
Maria Johnson,245-25-8698,53,19
Tyler Parker,475-15-8499,6,67
Maria Johnson,719-12-6560,75,83
Maria Johnson,616-69-3226,91,13
Tzvika Roberts,245-25-8698,94,61

Por otro lado, los datos incluidos en sample_n15.csv no se considerarían sensibles:

sample_n15.csv

record id,metric 1,metric 2,metric 3
1,59,93,100
2,53,13,17
3,59,67,53
4,52,93,34
5,14,22,88
6,18,88,3
7,32,49,5
8,93,46,14

Para ver de qué manera la configuración tratará nuestros archivos, suba todos los archivos de prueba a la cuarentena

bucket:

gsutil -m cp * gs://[YOUR_QUARANTINE_BUCKET]

Inicialmente, nuestros archivos reposarán en el bucket de cuarentena al que los subimos. Para verificar esto, inmediatamente después de subir los archivos, enumera el contenido del bucket de cuarentena:

gsutil ls gs://[YOUR_QUARANTINE_BUCKET]

Para revisar la serie de eventos que iniciamos, comienza por navegar a la página de Cloud Functions:

Haz clic en el menú Acciones para la función create_DLP_job y selecciona Ver registros:

89211a959bf30392.png

En el registro de esta función, vemos al menos 4 entradas para cada uno de nuestros archivos que indican lo siguiente:

  • Comenzó la ejecución de la función
  • La función se activó para un archivo en particular
  • Se creó un trabajo
  • La función había terminado de ejecutarse

c864dff5a03c75a9.png

Una vez que se completa la función create_DLP_job para cada archivo, se inicia un trabajo de DLP correspondiente. Navega a la página Trabajos de DLP para ver una lista de los trabajos de DLP en la cola:

Verás una lista de trabajos Pendientes, En ejecución o Listos. Cada una corresponde a uno de los archivos que hemos subido:

6af34e72ecb83faf.png

Puedes hacer clic en el ID de cualquiera de estos trabajos para ver más detalles.

Si regresas a la página de Cloud Functions y revisas los registros de salida de la función resolve_DLP, verás al menos 8 entradas para cada archivo, que indican lo siguiente:

  • Comenzó la ejecución de la función
  • Se recibió una notificación de Pub/Sub
  • El nombre del trabajo de DLP correspondiente
  • Un código de estado
  • La cantidad de instancias de datos sensibles (si corresponde)
  • El bucket al que se moverá el archivo
  • El trabajo de DLP terminó de analizar el archivo
  • La función había terminado de ejecutarse

5025bd672cba90a0.png

Cuando todas las llamadas a la función resolve_DLP terminen de ejecutarse, vuelve a revisar el contenido del bucket de cuarentena:

gsutil ls gs://[YOUR_QUARANTINE_BUCKET]

Esta vez, debería estar completamente vacía. Sin embargo, si ejecutas el mismo comando para los otros buckets, encontrarás nuestros archivos perfectamente separados en sus buckets correspondientes.

7. Limpieza

Ahora que vimos cómo usar la API de DLP en conjunto con Cloud Functions para clasificar datos, limpiemos nuestro proyecto de todos los recursos que creamos.

Borra el proyecto

Si lo prefieres, puedes borrar todo el proyecto. En GCP Console, ve a la página Cloud Resource Manager.

En la lista de proyectos, selecciona el proyecto en el que hemos estado trabajando y haz clic en Borrar. Se te pedirá que ingreses el ID del proyecto. Ingrésalo y haz clic en Cerrar.

Como alternativa, puedes borrar todo el proyecto directamente desde Cloud Shell con gcloud:

gcloud projects delete [PROJECT_ID]

Si prefieres borrar los diferentes componentes uno por uno, continúa con la siguiente sección.

Cloud Functions

Borra ambas Cloud Functions con gcloud:

gcloud functions delete -q create_DLP_job && gcloud functions delete -q resolve_DLP

Buckets de almacenamiento

Quita todos los archivos subidos y borra los buckets con gsutil:

gsutil rm -r gs://[YOUR_QUARANTINE_BUCKET] \
gs://[YOUR_SENSITIVE_DATA_BUCKET] \
gs://[YOUR_NON_SENSITIVE_DATA_BUCKET] 

Pub/Sub

Primero, borra la suscripción a Pub/Sub con gcloud:

gcloud pubsub subscriptions delete classify-sub

Por último, borra el tema de Pub/Sub con gcloud:

gcloud pubsub topics delete classify-topic

8. ¡Felicitaciones!

¡Hurra! Lo lograste. Aprendiste a usar la API de DLP junto con Cloud Functions para automatizar la clasificación de archivos.

Temas abordados

  • Creamos buckets de Cloud Storage para almacenar nuestros datos sensibles y no sensibles.
  • Creamos un tema y una suscripción a Pub/Sub para activar una Cloud Function
  • Creamos Cloud Functions para iniciar un trabajo de DLP que categoriza archivos según los datos sensibles que contienen
  • Subimos datos de prueba y revisamos las funciones de Cloud Functions Los registros de Stackdriver para ver el proceso en acción