Classification automatique des données importées dans Cloud Storage avec l'API DLP et Cloud Functions

1. Présentation

Dans l'organisation moderne, la quantité de données provenant de sources diverses ne cesse de croître. Cela nécessite souvent de placer ces données en quarantaine et de les classer afin de les stocker et de les protéger de manière stratégique. Cette tâche deviendra rapidement coûteuse et impossible si elle reste manuelle.

Dans cet atelier de programmation, nous verrons comment classer automatiquement les données importées dans Cloud Storage et les déplacer vers un bucket de stockage correspondant. Pour ce faire, nous allons utiliser Cloud Pub/Sub, Cloud Functions, Cloud Data Loss Prevention et Cloud Storage.

Objectifs de l'atelier

  • Créer des buckets Cloud Storage pour le pipeline de zone de quarantaine et de classification
  • Créer une fonction Cloud simple qui appelle l'API DLP lors de l'importation de fichiers
  • Créer un sujet et un abonnement Pub/Sub pour vous avertir lorsque le traitement du fichier est terminé.
  • Importer des exemples de fichiers dans le bucket de la zone de quarantaine pour appeler une fonction Cloud
  • Inspectez et classez les fichiers, puis déplacez-les dans le bucket approprié à l'aide de l'API DLP.

Prérequis

  • Un projet Google Cloud avec la facturation configurée Si vous n'en avez pas, vous devrez en créer un.

2. Configuration

Tout au long de cet atelier de programmation, nous allons provisionner et gérer différents services et ressources cloud à l'aide de la ligne de commande via Cloud Shell. La commande suivante ouvre Cloud Shell avec l'éditeur Cloud Shell et clone le dépôt du projet associé:

Assurez-vous d'utiliser le bon projet en le définissant avec gcloud config set project [PROJECT_ID]

Activer les API

Activez les API requises sur votre projet Google Cloud:

  • API Cloud Functions : gère des fonctions légères fournies par l'utilisateur et exécutées en réponse à des événements.
  • API Cloud Data Loss Prevention (DLP) : fournit des méthodes de détection, d'analyse des risques et d'anonymisation de fragments sensibles à la confidentialité dans du texte, des images et des dépôts de stockage Google Cloud Platform.
  • Cloud Storage : Google Cloud Storage est un service RESTful permettant de stocker vos données sur l'infrastructure de Google et d'y accéder.

Autorisations liées aux comptes de service

Un compte de service est un type particulier de compte utilisé par les applications et les machines virtuelles pour effectuer des appels d'API autorisés.

Compte de service App Engine par défaut

Le compte de service App Engine par défaut permet d'exécuter des tâches dans votre projet Cloud pour le compte de vos applications exécutées dans App Engine. Ce compte de service existe par défaut dans votre projet avec le rôle Éditeur.

Tout d'abord, nous attribuerons à notre compte de service le rôle Administrateur de protection contre la perte de données, qui est nécessaire pour administrer les tâches de protection contre la perte de données:

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

Enfin, attribuez le rôle "Agent de service de l'API DLP" qui autorisera le compte de service à accéder à BigQuery, Storage, Datastore, Pub/Sub et le service de gestion des clés:

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

Compte de service DLP

En plus du compte de service App Engine, nous allons également utiliser le compte de service DLP. Ce compte de service a été créé automatiquement lors de l'activation de l'API DLP et ne se voit initialement attribuer aucun rôle. Attribuez-lui le rôle "Lecteur" :

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

Nous devons maintenant créer trois buckets Cloud Storage pour stocker nos données:

  • Bucket de quarantaine: nos données seront initialement importées ici.
  • Bucket de données sensibles: les données considérées comme sensibles par l'API DLP sont déplacées ici.
  • Bucket de données non sensibles: les données jugées non sensibles par l'API DLP seront déplacées ici

Nous pouvons utiliser la commande gsutil pour créer nos trois buckets en une seule fois:

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

Notez les noms des buckets que vous venez de créer. Nous en aurons besoin plus tard.

4. Sujet et abonnement Pub/Sub

Cloud Pub/Sub fournit une messagerie asynchrone multi- ou multi-applications entre applications. Un éditeur créera un message et le publiera dans un flux de messages appelé sujet. Un abonné recevra ces messages par le biais d'un abonnement. Sur la base de cet abonnement, dans notre cas, une fonction Cloud déplacera les fichiers vers leurs buckets respectifs après l'exécution d'un job DLP.

Commençons par créer un sujet. Un message sera publié ici chaque fois qu'un fichier sera ajouté à notre bucket de stockage des zones de quarantaine. Nous l'appellerons "classify-topic".

gcloud pubsub topics create classify-topic

Un abonnement recevra une notification lorsque le sujet publiera un message. Créons un abonnement Pub/Sub nommé "classify-sub" :

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

Cet abonnement déclenchera une deuxième fonction Cloud qui lancera un job DLP qui inspectera le fichier et le déplacera à l'emplacement approprié.

5. Cloud Functions

Cloud Functions nous permet de déployer des fonctions à application unique, asynchrones et légères, basées sur des événements, sans avoir à gérer de serveur ni d'environnement d'exécution. Nous allons déployer deux fonctions Cloud à l'aide du fichier main.py fourni, situé dans dlp-cloud-functions-tutorials/gcs-dlp-classification-python/.

Remplacer les variables

Avant de pouvoir créer nos fonctions, nous devons remplacer certaines variables dans le fichier main.py.

Dans l'éditeur Cloud Shell, ajustez main.py en remplaçant les valeurs de l'ID de projet et des variables de bucket aux lignes 28 à 34 par les buckets correspondants créés précédemment:

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

De plus, remplacez la valeur de la variable de sujet Pub/Sub par le sujet Pub/Sub créé à l'étape précédente:

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

Déployer des fonctions

Dans Cloud Shell, remplacez les répertoires où se trouve le fichier main.py par gcs-dlp-classification-python:

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

Il est temps de déployer quelques fonctions.

Commencez par déployer la fonction create_DLP_job en remplaçant [YOUR_QUARANTINE_BUCKET] par le nom de bucket approprié. Cette fonction se déclenche lorsque de nouveaux fichiers sont importés dans le bucket de zone de quarantaine Cloud Storage désigné et crée un job DLP pour chaque fichier importé:

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

Déployez ensuite la fonction resolve_DLP, en indiquant notre sujet comme déclencheur. Cette fonction écoute la notification Pub/Sub initiée par la tâche DLP suivante à partir de la fonction ci-dessus. Dès qu'il reçoit une notification Pub/Sub, il récupère les résultats du job DLP et déplace le fichier vers un bucket sensible ou non sensible en conséquence:

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

Valider

Vérifiez que nos deux fonctions Cloud ont bien été déployées à l'aide de la commande gcloud functions describe:

gcloud functions describe create_DLP_job
gcloud functions describe resolve_DLP

Une fois le déploiement réussi, la sortie indique ACTIVE pour l'état.

6. Tester avec des exemples de données

Maintenant que tous les éléments sont en place, nous pouvons effectuer des tests avec quelques exemples de fichiers. Dans Cloud Shell, remplacez votre répertoire de travail actuel par sample_data:

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

Nos exemples de fichiers sont constitués de fichiers txt et csv contenant différentes données. Fichiers précédés de "sample_s" contiendront des données sensibles, alors que celles commençant par "sample_n" ne fonctionne pas. Par exemple, sample_s20.csv contient ce qui est mis en forme pour ressembler à des numéros de sécurité sociale américains:

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

En revanche, les données du fichier sample_n15.csv ne seront pas considérées comme 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

Pour voir comment notre configuration traitera nos fichiers, importons tous nos fichiers de test dans notre zone de quarantaine.

bucket:

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

Au départ, nos fichiers sont placés dans le bucket de zone de quarantaine dans lequel nous les avons importés. Pour vous en assurer, affichez le contenu du bucket de la zone de quarantaine juste après l'importation des fichiers:

gsutil ls gs://[YOUR_QUARANTINE_BUCKET]

Pour consulter la série d'événements que nous avons lancés, commencez par accéder à la page Cloud Functions:

Cliquez sur le menu "Actions" pour la fonction create_DLP_job, puis sélectionnez "Afficher les journaux" :

89211a959bf30392.png

Dans notre journal pour cette fonction, nous voyons au moins 4 entrées pour chacun de nos fichiers, indiquant:

  • L'exécution de la fonction a démarré
  • La fonction avait été déclenchée pour un fichier particulier
  • Une offre d'emploi a été créée.
  • L'exécution de la fonction était terminée

c864dff5a03c75a9.png

Une fois que la fonction create_DLP_job est exécutée pour chaque fichier, un job DLP correspondant est lancé. Accédez à la page "Jobs DLP" (Tâches DLP) pour afficher la liste des tâches DLP dans la file d'attente:

La liste des jobs en attente, en cours ou terminés s'affiche. Chacun d'eux correspond à l'un des fichiers que nous avons importés:

6af34e72ecb83faf.png

Vous pouvez cliquer sur l'ID de n'importe quelle tâche pour afficher plus de détails.

Si vous revenez à la page Cloud Functions et consultez les journaux pour la fonction resolve_DLP, vous verrez au moins huit entrées pour chaque fichier, indiquant:

  • L'exécution de la fonction a démarré
  • Une notification Pub/Sub a été reçue
  • Le nom du job DLP correspondant
  • Un code d'état
  • Nombre d'instances de données sensibles (le cas échéant)
  • Bucket vers lequel le fichier sera déplacé
  • Le job DLP a terminé d'analyser le fichier
  • L'exécution de la fonction était terminée

5025bd672cba90a0.png

Dès que tous les appels à la fonction resolve_DLP sont terminés, vérifiez à nouveau le contenu du bucket de la zone de quarantaine:

gsutil ls gs://[YOUR_QUARANTINE_BUCKET]

Cette fois, il doit être complètement vide. Toutefois, si vous exécutez la même commande ci-dessus pour les autres buckets, vous constaterez que nos fichiers sont parfaitement séparés dans les buckets correspondants.

7. Nettoyage

Maintenant que nous avons vu comment classer des données à l'aide de l'API DLP et de Cloud Functions, nettoyons toutes les ressources que nous avons créées dans notre projet.

Supprimer le projet

Si vous le souhaitez, vous pouvez supprimer l'intégralité du projet. Dans la console GCP, accédez à la page Cloud Resource Manager :

Dans la liste des projets, sélectionnez celui dans lequel vous avez travaillé, puis cliquez sur Supprimer. Vous serez alors invité à saisir l'ID du projet. Saisissez-le, puis cliquez sur Arrêter.

Vous pouvez également supprimer le projet entier directement dans Cloud Shell à l'aide de gcloud:

gcloud projects delete [PROJECT_ID]

Si vous préférez supprimer les différents composants un par un, passez à la section suivante.

Cloud Functions

Supprimez nos deux fonctions Cloud avec gcloud:

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

Buckets de stockage

Supprimez tous les fichiers importés et les buckets à l'aide de gsutil:

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

Pub/Sub

Commencez par supprimer l'abonnement Pub/Sub avec gcloud:

gcloud pubsub subscriptions delete classify-sub

Enfin, supprimez le sujet Pub/Sub avec gcloud:

gcloud pubsub topics delete classify-topic

8. Félicitations !

Bravo ! Bravo ! Vous avez appris à utiliser l'API DLP avec Cloud Functions pour automatiser la classification des fichiers.

Points abordés

  • Nous avons créé des buckets Cloud Storage pour stocker nos données sensibles et non sensibles
  • Nous avons créé un sujet et un abonnement Pub/Sub pour déclencher une fonction Cloud.
  • Nous avons créé Cloud Functions pour lancer un job DLP qui classe les fichiers en fonction des données sensibles qu'ils contiennent.
  • Nous avons importé des données de test et consulté nos Journaux Stackdriver pour voir le processus en action