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:
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
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:
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
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