Clasificación automatizada de datos cargados en Cloud Storage con la API de DLP y Cloud Functions

En la organización moderna, existe una cantidad cada vez mayor de datos que provienen de una variedad de fuentes. Esto a menudo requiere poner en cuarentena y clasificar esos datos para almacenarlos y protegerlos estratégicamente, una tarea que rápidamente se volverá costosa e imposible si sigue siendo manual.

En este laboratorio de código, veremos cómo podemos clasificar automáticamente los datos cargados en Cloud Storage y moverlos a un depósito de almacenamiento correspondiente. Lo lograremos con Cloud Pub / Sub, Cloud Functions, Cloud Data Loss Prevention y Cloud Storage.

Lo que harás

  • Crea depósitos de Cloud Storage para usarlos como parte de la canalización de cuarentena y clasificación.
  • Cree una función de nube simple que invoca la API de DLP cuando se cargan archivos.
  • Cree un tema de Pub / Sub y una suscripción para notificarle cuando se complete el procesamiento del archivo.
  • Sube archivos de muestra al depósito de cuarentena para invocar una función en la nube
  • Utilice la API de DLP para inspeccionar y clasificar los archivos y moverlos al depósito correspondiente.

Lo que necesitarás

  • Un proyecto de Google Cloud con configuración de facturación. Si no tiene uno, tendrá quecrear uno .

A lo largo de este laboratorio de código, aprovisionaremos y administraremos diferentes recursos y servicios en la nube mediante la línea de comandos a través de Cloud Shell . A continuación, se abrirá Cloud Shell junto con Cloud Shell Editor y se clonará el repositorio del proyecto complementario:

Abrir en Cloud Shell

Asegúrate de estar usando el proyecto correcto configurándolo con gcloud config set project [PROJECT_ID]

Habilitar API

Habilite las API requeridas en su proyecto de Google Cloud:

  • API de Cloud Functions: administra funciones ligeras proporcionadas por el usuario 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 y acceder a sus datos en la infraestructura de Google.

Habilitar API

Permisos de cuentas de servicio

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

Cuenta de servicio predeterminada de App Engine

La cuenta de servicio predeterminada de App Engine se usa para ejecutar tareas en su proyecto en la nube en nombre de sus aplicaciones que se ejecutan en App Engine. Esta cuenta de servicio existe en su proyecto de forma predeterminada con la función de editor asignada.

Primero, concederemos 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

Y finalmente, otorgue el rol de Agente de servicio de la API de DLP que permitirá los permisos de la cuenta de servicio para bigquery, almacenamiento, almacén de datos, pubsub y 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 DLP

Además de la cuenta de servicio de App Engine, también usaremos una cuenta de servicio DLP. Esta cuenta de servicio se creó automáticamente cuando se habilitó la API de DLP e inicialmente no se le otorgan roles. Concedamos el rol de espectador:

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

Ahora necesitaremos crear 3 depósitos de almacenamiento en la nube para almacenar nuestros datos:

  • Depósito de cuarentena: nuestros datos se cargarán inicialmente aquí.
  • Depósito de datos confidenciales: los datos que la API de DLP determina que son confidenciales se moverán aquí.
  • Depósito de datos no confidenciales: los datos que la API de DLP determina que no son confidenciales se moverán aquí

Podemos usar el comando gsutil para crear los tres depósitos de una sola vez:

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

Tome nota de los nombres de los depósitos que acaba de crear; los necesitaremos más adelante.

Cloud Pub / Sub proporciona de muchos a muchos mensajes asincrónicos entre aplicaciones. Un editor creará un mensaje y lo publicará en una fuente de mensajes llamada tema . Un suscriptor recibirá estos mensajes mediante una suscripción . Según esa suscripción, en nuestro caso, tendremos una función de nube que mueva archivos a sus respectivos depósitos después de que se ejecute un trabajo de DLP.

Primero, creemos un tema. Se publicará un mensaje aquí cada vez que se agregue un archivo a nuestro depósito de almacenamiento en cuarentena. Lo llamaremos 'classify-topic'

gcloud pubsub topics create classify-topic

Se notificará una suscripción cuando el tema publique un mensaje. Creemos una suscripción a pubsub llamada 'classify-sub':

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

Esa suscripción activará una segunda función en la nube que iniciará un trabajo de DLP que inspeccionará el archivo y lo moverá a su lugar adecuado.

Cloud Functions nos permite implementar funciones ligeras, asíncronas y de un solo propósito basadas en eventos sin la necesidad de administrar un servidor o un entorno de ejecución. Vamos a implementar 2 funciones en la nube usando el archivo main.py provisto, ubicado en dlp-cloud-functions-tutorials/gcs-dlp-classification-python/

Reemplazar variables

Antes de que podamos crear nuestras funciones, necesitaremos reemplazar algunas variables en nuestro archivo main.py

En el Editor de Cloud Shell, ajuste main.py reemplazando los valores del ID del proyecto y las variables del depósito en las líneas 28 a 34 con los depósitos correspondientes creados 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, reemplace el valor de la variable pub / subtema con el pub / subtema creado en el paso anterior:

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

Implementar funciones

En su Cloud Shell, cambie los directorios a gcs-dlp-class-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, implemente la función create_DLP_job , reemplazando [YOUR_QUARANTINE_BUCKET] con el nombre de depósito correcto. Esta función se activa cuando se suben nuevos archivos al depósito 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, implemente la función resolve_DLP , indicando nuestro tema como desencadenante. Esta función escucha la notificación de publicación / suscripción iniciada desde el trabajo de DLP posterior de la función anterior. Tan pronto como recibe una notificación de publicación / sub, recoge los resultados del trabajo de DLP y mueve el archivo al depósito sensible o al depósito no sensible según corresponda:

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

Verificar

Verifique que nuestras dos funciones en la nube se hayan implementado correctamente con el gcloud functions describe :

gcloud functions describe create_DLP_job
gcloud functions describe resolve_DLP

La salida leerá ACTIVE para el estado cuando se implementó correctamente.

Con todas las piezas en su lugar, ahora podemos probar cosas con algunos archivos de muestra. En su Cloud Shell, cambie su 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 varios datos. Los archivos con el prefijo 'sample_s' contendrán datos confidenciales, mientras que los que tengan el prefijo 'sample_n' no. Por ejemplo, sample_s20.csv contiene lo que está formateado para parecerse a los números de la 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 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 cómo nuestra configuración tratará nuestros archivos, carguemos todos nuestros archivos de prueba en nuestra cuarentena.

Cubeta:

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

Inicialmente, nuestros archivos se ubicarán en el depósito de cuarentena en el que los cargamos. Para verificar esto, inmediatamente después de cargar los archivos, enumere el contenido del depósito de cuarentena:

gsutil ls gs://[YOUR_QUARANTINE_BUCKET]

Para ver la serie de eventos que iniciamos, comience navegando a la página de Cloud Functions:

Funciones en la nube

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

89211a959bf30392.png

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

  • La ejecución de la función comenzó
  • La función se ha activado para un archivo en particular.
  • Se ha creado 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 DLP correspondiente. Navegue a la página de trabajos de DLP para ver una lista de los trabajos de DLP en la cola:

Trabajos de DLP

Verá una lista de trabajos pendientes, en ejecución o terminados. Cada uno de ellos corresponde a uno de los archivos que hemos subido:

6af34e72ecb83faf.png

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

Si regresa a la página de Cloud Functions y verifica los registros de la función resolve_DLP, verá al menos 8 entradas para cada archivo, lo que indica:

  • La ejecución de la función comenzó
  • Se recibió una notificación de publicación / suscripción
  • El nombre del trabajo de DLP correspondiente
  • Un código de estado
  • La cantidad de instancias de datos confidenciales (si corresponde)
  • El depósito al que se moverá el archivo
  • El trabajo de DLP ha terminado de analizar el archivo.
  • La función había terminado de ejecutarse

5025bd672cba90a0.png

Tan pronto como todas las llamadas a la función resolve_DLP hayan terminado de ejecutarse, revise el contenido del depósito de cuarentena una vez más:

gsutil ls gs://[YOUR_QUARANTINE_BUCKET]

Esta vez, debería estar completamente vacío. Sin embargo, si ejecuta el mismo comando anterior para los otros depósitos, encontrará nuestros archivos perfectamente separados en sus depósitos correspondientes.

Ahora que hemos visto cómo usar la API de DLP junto con Cloud Functions para clasificar datos, limpiemos nuestro proyecto de todos los recursos que hemos creado.

Eliminar el proyecto

Si lo prefiere, puede eliminar todo el proyecto. En GCP Console, vaya a la página de Cloud Resource Manager :

Administrador de recursos en la nube

En la lista de proyectos, seleccione el proyecto en el que hemos estado trabajando y haga clic en Eliminar . Se le pedirá que escriba el ID del proyecto. Ingrese y haga clic en Apagar.

Alternativamente, puede borrar todo el proyecto directamente desde Cloud Shell con gcloud:

gcloud projects delete [PROJECT_ID]

Si prefiere eliminar los diferentes componentes uno por uno, continúe con la siguiente sección.

Funciones en la nube

Elimina nuestras dos funciones en la nube con gcloud:

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

Cubos de almacenamiento

Quita todos los archivos subidos y borra los depósitos con gsutil:

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

Pub / Sub

Primero, borre la suscripción de pub / sub con gcloud:

gcloud pubsub subscriptions delete classify-sub

Y finalmente, elimine el tema pub / sub con gcloud:

gcloud pubsub topics delete classify-topic

¡Woo hoo! Lo hiciste. ¡Aprendió a utilizar la API de DLP junto con Cloud Functions para automatizar la clasificación de archivos!

Lo que hemos cubierto

  • Creamos depósitos de almacenamiento en la nube para almacenar nuestros datos confidenciales y no confidenciales
  • Creamos un tema Pub / Sub y una suscripción para activar una función en la nube
  • Creamos Cloud Functions diseñadas para iniciar un trabajo de DLP que clasifica los archivos en función de los datos confidenciales que contienen.
  • Subimos datos de prueba y revisamos los registros de Stackdriver de Cloud Functions para ver el proceso en acción.