Classificazione automatica dei dati caricati su Cloud Storage con l'API DLP e Cloud Functions

1. Panoramica

Nell'organizzazione moderna, c'è una quantità sempre crescente di dati che provengono da diverse origini. Questo richiede spesso la messa in quarantena e la classificazione dei dati per archiviarli e proteggerli in modo strategico, un'attività che diventerà rapidamente costosa e impossibile se rimane manuale.

In questo codelab, vedremo come classificare automaticamente i dati caricati su Cloud Storage e spostarli in un bucket di archiviazione corrispondente. Lo faremo utilizzando Cloud Pub/Sub, Cloud Functions, Cloud Data Loss Prevention e Cloud Storage.

In questo lab proverai a:

  • Creare bucket Cloud Storage da utilizzare nella pipeline di quarantena e classificazione.
  • Creare una funzione Cloud Functions semplice che richiami l'API DLP quando vengono caricati i file.
  • Crea un argomento e una sottoscrizione Pub/Sub per ricevere una notifica al termine dell'elaborazione dei file.
  • Carica file di esempio nel bucket di quarantena per richiamare una funzione Cloud Functions
  • Utilizza l'API DLP per ispezionare e classificare i file e spostarli nel bucket appropriato.

Che cosa ti serve

  • Un progetto Google Cloud in cui è configurata la fatturazione. Se non ne hai uno, dovrai crearlo.

2. Preparazione

Nel corso di questo codelab, eseguiremo il provisioning e la gestione di diversi servizi e risorse cloud utilizzando la riga di comando tramite Cloud Shell. Quanto segue aprirà Cloud Shell insieme all'editor di Cloud Shell e clonerà il repository del progetto companion:

Assicurati di utilizzare il progetto corretto impostandolo con gcloud config set project [PROJECT_ID]

Abilita le API

Abilita le API richieste sul tuo progetto Google Cloud:

  • API Cloud Functions: gestisce le funzioni leggere fornite dall'utente e eseguite in risposta agli eventi.
  • API Cloud Data Loss Prevention (DLP): fornisce metodi per il rilevamento, l'analisi dei rischi e l'anonimizzazione di frammenti sensibili alla privacy in testi, immagini e repository di archiviazione di Google Cloud Platform.
  • Cloud Storage: Google Cloud Storage è un servizio RESTful per l'archiviazione e l'accesso ai dati sull'infrastruttura di Google.

Autorizzazioni account di servizio

Un account di servizio è un tipo speciale di account utilizzato da applicazioni e macchine virtuali per effettuare chiamate API autorizzate.

Account di servizio predefinito App Engine

L'account di servizio predefinito di App Engine viene utilizzato per eseguire attività nel progetto Cloud per conto delle app in esecuzione in App Engine. Questo account di servizio esiste nel progetto per impostazione predefinita con il ruolo Editor assegnato.

Innanzitutto, concederemo al nostro account di servizio il ruolo Amministratore DLP necessario per amministrare i job di prevenzione della perdita di dati:

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

Infine, concedi il ruolo Agente di servizio API DLP che consentirà le autorizzazioni dell'account di servizio per BigQuery, Storage, Datastore, Pub/Sub e Key Management Service:

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

Account di servizio DLP

Oltre all'account di servizio App Engine, utilizzeremo anche un account di servizio DLP. Questo account di servizio è stato creato automaticamente quando è stata abilitata l'API DLP e inizialmente non sono concessi ruoli. Assegna il ruolo Visualizzatore:

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. Bucket Cloud Storage

Ora dovremo creare tre bucket Cloud Storage per archiviare i nostri dati:

  • Bucket quarantena: i nostri dati verranno inizialmente caricati qui.
  • Bucket di dati sensibili: i dati identificati come sensibili dall'API DLP verranno spostati qui.
  • Bucket di dati non sensibili: i dati identificati come non sensibili dall'API DLP verranno spostati qui

Possiamo usare il comando gsutil per creare tutti e tre i nostri bucket in un unico swoop:

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

Prendi nota dei nomi dei bucket che hai appena creato: ne avremo bisogno in seguito.

4. Argomento e sottoscrizione Pub/Sub

Cloud Pub/Sub fornisce moltissimi messaggi asincroni tra le applicazioni. Un editore creerà un messaggio e lo pubblicherà in un feed di messaggi denominato argomento. Un sottoscrittore riceverà questi messaggi attraverso una sottoscrizione. In base a questa sottoscrizione, nel nostro caso, una funzione Cloud Functions sposterà i file nei rispettivi bucket dopo l'esecuzione di un job DLP.

Innanzitutto, creiamo un argomento. Ogni volta che un file viene aggiunto al bucket di archiviazione in quarantena verrà pubblicato un messaggio qui. Lo chiameremo "classify-topic".

gcloud pubsub topics create classify-topic

Una sottoscrizione riceverà una notifica quando l'argomento pubblica un messaggio. Creiamo una sottoscrizione Pub/Sub denominata "classify-sub":

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

Questa sottoscrizione attiverà una seconda funzione Cloud Functions che avvierà un job DLP che ispeziona il file e lo sposterà nella posizione corretta.

5. Cloud Functions

Cloud Functions ci consente di eseguire il deployment di funzioni leggere, basate su eventi e asincrone a uso specifico senza la necessità di gestire un ambiente server o di runtime. Eseguiremo il deployment di due funzioni Cloud Functions utilizzando il file main.py fornito, che si trova in dlp-cloud-functions-tutorials/gcs-dlp-classification-python/

Sostituisci variabili

Prima di poter creare le funzioni, dobbiamo sostituire alcune variabili nel file main.py.

Nell'editor di Cloud Shell, modifica il file main.py sostituendo i valori dell'ID progetto e le variabili del bucket nelle righe da 28 a 34 utilizzando i bucket corrispondenti creati in precedenza:

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]'

Inoltre, sostituisci il valore della variabile dell'argomento pub/sub con l'argomento pub/sub creato nel passaggio precedente:

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

Esegui il deployment delle funzioni

In Cloud Shell, cambia le directory in gcs-dlp-classification-python, dove è presente il file main.py:

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

È il momento di eseguire il deployment di alcune funzioni.

Innanzitutto, esegui il deployment della funzione create_DLP_job, sostituendo [YOUR_QUARANTINE_BUCKET] con il nome del bucket corretto. Questa funzione viene attivata quando vengono caricati nuovi file nel bucket di quarantena designato di Cloud Storage e crea un job DLP per ogni file caricato:

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

Successivamente, esegui il deployment della funzione resolve_DLP, indicando l'argomento come trigger. Questa funzione rimane in ascolto della notifica Pub/Sub avviata dal job DLP successivo dalla funzione riportata sopra. Non appena riceve la notifica Pub/Sub, recupera i risultati dal job DLP e sposta di conseguenza il file nel bucket sensibile o non sensibile:

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

Verifica

Verifica che il deployment di entrambe le nostre funzioni Cloud Functions sia stato eseguito correttamente con il comando gcloud functions describe:

gcloud functions describe create_DLP_job
gcloud functions describe resolve_DLP

Una volta eseguito correttamente il deployment, l'output leggerà ACTIVE per lo stato.

6. Esegui test con dati di esempio

Ora che tutte le parti sono a posto, possiamo eseguire dei test con alcuni file di esempio. In Cloud Shell cambia la directory di lavoro attuale in sample_data:

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

I nostri file di esempio sono costituiti da file txt e csv contenenti vari tipi di dati. I file hanno il prefisso "sample_s" conterrà i dati sensibili mentre quelli preceduti dal prefisso "sample_n" al contrario. Ad esempio, sample_s20.csv contiene i dati formattati in modo che siano i codici fiscali statunitensi:

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

D'altra parte, i dati in sample_n15.csv non vengono considerati sensibili:

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

Per vedere come verranno trattati i nostri file durante la configurazione, carichiamo tutti i nostri file di prova nella quarantena

del bucket:

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

Inizialmente, i nostri file rimarranno nel bucket di quarantena in cui li abbiamo caricati. Per verificarlo, elenca i contenuti del bucket in quarantena subito dopo aver caricato i file:

gsutil ls gs://[YOUR_QUARANTINE_BUCKET]

Per dare un'occhiata alla serie di eventi che abbiamo lanciato, vai innanzitutto alla pagina Cloud Functions:

Fai clic sul menu Azioni per la funzione create_DLP_job e seleziona Visualizza log:

89211a959bf30392.png

Nel log per questa funzione vediamo almeno quattro voci per ciascuno dei nostri file che indicano:

  • Esecuzione della funzione avviata
  • La funzione è stata attivata per un determinato file
  • È stato creato un job
  • L'esecuzione della funzione è terminata

c864dff5a03c75a9.png

Una volta completata la funzione create_DLP_job per ciascun file, viene avviato un job DLP corrispondente. Vai alla pagina dei job DLP per visualizzare un elenco dei job DLP in coda:

Viene visualizzato un elenco di job in attesa, in esecuzione o completati. Ognuno di questi corrisponde a uno dei file che abbiamo caricato:

6af34e72ecb83faf.png

Puoi fare clic sull'ID di uno di questi job per visualizzare ulteriori dettagli.

Se torni alla pagina di Cloud Functions e controlli i log fuori dalla pagina per individuare la funzione resolve_DLP, vedrai almeno 8 voci per ogni file, che indicano:

  • Esecuzione della funzione avviata
  • È stata ricevuta una notifica Pub/Sub
  • Il nome del job DLP corrispondente
  • Un codice di stato
  • Il numero di istanze di dati sensibili (se presenti)
  • Il bucket in cui verrà spostato il file
  • Il job DLP ha terminato l'analisi del file
  • L'esecuzione della funzione è terminata

5025bd672cba90a0.png

Non appena tutte le chiamate alla funzione resolve_DLP saranno terminate, controlla di nuovo il contenuto del bucket in quarantena:

gsutil ls gs://[YOUR_QUARANTINE_BUCKET]

Questa volta dovrebbe essere completamente vuoto. Se esegui lo stesso comando riportato sopra per gli altri bucket, troverai i nostri file perfettamente separati nei relativi bucket corrispondenti.

7. Esegui la pulizia

Ora che abbiamo visto come utilizzare l'API DLP insieme a Cloud Functions per classificare i dati, è arrivato il momento di ripulire il nostro progetto di tutte le risorse che abbiamo creato.

Eliminare il progetto

Se preferisci, puoi eliminare l'intero progetto. Nella console Google Cloud, vai alla pagina Cloud Resource Manager:

Nell'elenco dei progetti, seleziona quello a cui abbiamo lavorato e fai clic su Elimina. Ti verrà chiesto di digitare l'ID progetto. Inseriscilo e fai clic su Arresta.

In alternativa, puoi eliminare l'intero progetto direttamente da Cloud Shell con gcloud:

gcloud projects delete [PROJECT_ID]

Se preferisci eliminare i vari componenti uno alla volta, vai alla sezione successiva.

Cloud Functions

Elimina entrambe le funzioni Cloud Functions con gcloud:

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

Bucket di archiviazione

Rimuovi tutti i file caricati ed elimina i bucket con gsutil:

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

Pub/Sub

Innanzitutto, elimina la sottoscrizione Pub/Sub con gcloud:

gcloud pubsub subscriptions delete classify-sub

Infine, elimina l'argomento Pub/Sub con gcloud:

gcloud pubsub topics delete classify-topic

8. Complimenti!

Evvai! Ce l'hai fatta! Hai imparato a utilizzare l'API DLP insieme a Cloud Functions per automatizzare la classificazione dei file.

Argomenti trattati

  • Abbiamo creato dei bucket Cloud Storage per archiviare i nostri dati sensibili e non sensibili
  • Abbiamo creato un argomento e una sottoscrizione Pub/Sub per attivare una funzione Cloud Functions
  • Abbiamo creato Cloud Functions progettato per avviare un job DLP che classifica i file in base ai dati sensibili al loro interno
  • Abbiamo caricato i dati di test e controllato le nostre funzioni Cloud Functions Log di Stackdriver per vedere il processo in azione