1. Descripción general
En las organizaciones modernas, cada vez hay más datos que provienen de diversas fuentes. Esto suele requerir que se pongan en cuarentena y se clasifiquen esos datos para almacenarlos y protegerlos de forma estratégica, una tarea que se volverá costosa e imposible rápidamente si sigue siendo manual.
En este codelab, veremos cómo clasificar automáticamente los datos subidos a Cloud Storage y moverlos a un bucket de almacenamiento correspondiente. Para ello, usaremos Cloud Pub/Sub, Cloud Functions, Cloud Data Loss Prevention y Cloud Storage.
Actividades
- Crear buckets de Cloud Storage para usar como parte de la canalización de cuarentena y clasificación
- Crear una función simple de Cloud Functions que invoque la API de DLP cuando se suban los archivos
- Crear un tema y una suscripción de Pub/Sub para notificarte cuando se complete el procesamiento de archivos
- Sube archivos de muestra al bucket de cuarentena para invocar una función de Cloud Functions
- 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, deberás crearla.
2. Cómo prepararte
A lo largo de este codelab, aprovisionaremos y administraremos diferentes recursos y servicios de la nube con la línea de comandos a través de Cloud Shell. Con lo siguiente, se abrirá Cloud Shell junto con el Editor de Cloud Shell y se clonará el repositorio del proyecto complementario:
Asegúrate de usar el proyecto correcto configurándolo con gcloud config set project [PROJECT_ID].
Habilita las 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 los eventos.
- API de Cloud Data Loss Prevention (DLP): Proporciona métodos para detectar y desidentificar fragmentos sensibles en cuanto a la privacidad, así como analizar el riesgo que conllevan, en texto, imágenes y repositorios de almacenamiento de Google Cloud.
- Cloud Storage: Google Cloud Storage es un servicio RESTful que permite almacenar datos en la infraestructura de Google y acceder a ellos.
Permisos de las cuentas de servicio
Una cuenta de servicio es un tipo especial de cuenta que usan las aplicaciones y las 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 tus 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 que se requiere 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, otorga el rol de agente de servicio de la API de DLP que permitirá los permisos de 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, en principio, no se le otorgó ningún rol. Otorga 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, deberemos crear 3 buckets de Cloud Storage para almacenar nuestros datos:
- Bucket de cuarentena: Inicialmente, nuestros datos se subirán aquí.
- Bucket de datos sensibles: Aquí se moverán los datos que la API de DLP determine que son sensibles.
- Bucket de datos no sensibles: Aquí se moverán los datos que la API de DLP determine que no son sensibles.
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 mensajería asíncrona de varios a varios entre aplicaciones. Un publicador creará un mensaje y lo publicará en un feed de mensajes llamado tema. Un suscriptor recibirá estos mensajes a través de una suscripción. Según esa suscripción, en nuestro caso, tendremos una Cloud Function que moverá los 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. Le pondremos el nombre "classify-topic".
gcloud pubsub topics create classify-topic
Se notificará a una suscripción cuando el tema publique un mensaje. Creemos una suscripción a Pub/Sub llamada “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
Cloud Functions nos permite implementar funciones ligeras, basadas en eventos y asíncronas de un solo propósito sin necesidad de administrar un servidor o un entorno 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 crear nuestras funciones, deberemos reemplazar algunas variables en nuestro archivo main.py.
En el editor de Cloud Shell, ajusta main.py reemplazando los valores del ID del proyecto y las variables del bucket en las líneas 28 a 34 con 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 creará 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 y, luego, indica nuestro tema como el activador de la función. Esta función escucha la notificación de Pub/Sub que se inicia desde el trabajo de DLP posterior de la función anterior. En cuanto recibe la notificación de Pub/Sub, toma los resultados del trabajo de DLP y mueve el archivo al bucket de datos sensibles o al de datos no sensibles, según corresponda:
gcloud functions deploy resolve_DLP --runtime python37 \ --trigger-topic classify-topic
Verificar
Verifica que ambas funciones de Cloud Functions se hayan implementado correctamente con el comando gcloud functions describe:
gcloud functions describe create_DLP_job
gcloud functions describe resolve_DLP
La salida mostrará ACTIVE para el estado cuando se haya implementado correctamente.
6. Prueba con datos de muestra
Con todas las partes en su lugar, ahora podemos probar las cosas con algunos archivos de muestra. En Cloud Shell, cambia tu directorio de trabajo actual a sample_data:
cd ~/cloudshell_open/dlp-cloud-functions-tutorials/sample_data
Nuestros archivos de muestra constan de archivos CSV y TXT que contienen varios fragmentos de datos. Los archivos con el prefijo "sample_s" contendrán datos sensibles, mientras que los que tengan el prefijo "sample_n" no lo harán. Por ejemplo, sample_s20.csv contiene lo que se formateó para que parezca 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 de 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 cómo nuestra configuración tratará nuestros archivos, subamos todos nuestros archivos de prueba a la cuarentena.
bucket:
gsutil -m cp * gs://[YOUR_QUARANTINE_BUCKET]
Inicialmente, nuestros archivos se encontrará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 consultar la serie de eventos que iniciamos, primero navega a la página de Cloud Functions:
Haz clic en el menú Actions de la función create_DLP_job y selecciona View Logs:

En el registro de esta función, vemos al menos 4 entradas para cada uno de nuestros archivos, que indican lo siguiente:
- Se inició 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

Una vez que se completa la función create_DLP_job para cada archivo, se inicia el 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 completados. Cada uno de ellos corresponde a uno de los archivos que subimos:

Puedes hacer clic en el ID de cualquiera de estos trabajos para ver más detalles.
Si vuelves a la página de Cloud Functions y consultas los registros de la función resolve_DLP, verás al menos 8 entradas para cada archivo, que indican lo siguiente:
- Se inició la ejecución de la función
- Se recibió una notificación de Pub/Sub
- Nombre del trabajo de DLP correspondiente
- Un código de estado
- La cantidad de instancias de datos sensibles (si las hay)
- 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

Una vez que finalicen todas las llamadas a la función resolve_DLP, vuelve a consultar el contenido de la bucket de cuarentena:
gsutil ls gs://[YOUR_QUARANTINE_BUCKET]
Esta vez, debería estar completamente vacío. Sin embargo, si ejecutas el mismo comando anterior para los otros buckets, verás que nuestros archivos están perfectamente separados en sus buckets correspondientes.
7. Limpieza
Ahora que vimos cómo usar la API de DLP junto 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 funciones de Cloud 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 utilizar 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 de Pub/Sub para activar una Cloud Function.
- Creamos Cloud Functions diseñadas para iniciar un trabajo de DLP que categoriza los archivos según los datos sensibles que contienen.
- Subimos datos de prueba y consultamos los registros de Stackdriver de nuestras Cloud Functions para ver el proceso en acción.