Valider les données anonymisées dans BigQuery et restaurer l'identification des informations personnelles

Ce tutoriel vous montre comment valider l'exemple d'ensemble de données dont vous avez supprimé l'identification dans le tutoriel Exécuter un pipeline Dataflow automatisé pour anonymiser un ensemble de données personnelles. Une fois la validation effectuée, vous restaurez l'identification des données à l'aide des modèles Cloud DLP précédemment utilisés pour anonymiser des informations personnelles.

Ce document fait partie d'une série :

Dans ce tutoriel, nous partons du principe que vous maîtrisez le script shell, SQL, BigQuery et Dataflow.

Architecture de référence

Ce tutoriel se veut la mise en pratique du pipeline de validation et de restauration de l'identification des données représenté dans le schéma suivant.

Architecture du pipeline de restauration de l'identification

Le pipeline de validation et de restauration de l'identification des données valide les copies des données anonymisées et utilise un pipeline Dataflow pour restaurer l'identification des données à grande échelle.

Objectifs

  • Valider un ensemble de données anonymisé dans BigQuery à l'aide du langage SQL standard
  • Restaurer l'identification des données à l'aide d'un pipeline Dataflow

Coûts

Ce tutoriel utilise les composants facturables suivants de Google Cloud :

Obtenez une estimation des coûts en fonction de votre utilisation prévue à l'aide du simulateur de coût. Les nouveaux utilisateurs de Google Cloud peuvent bénéficier d'un essai gratuit.

Une fois que vous avez terminé ce tutoriel, vous pouvez éviter de continuer à payer des frais en supprimant les ressources que vous avez créées. Consultez la page Effectuer un nettoyage pour en savoir plus.

Avant de commencer

  1. Prenez connaissance de la partie 2 de la série.
  2. Prenez connaissance de la partie 3 de la série.

Valider l'ensemble de données anonymisé dans BigQuery

Vous allez vous assurer que les données de BigQuery comprennent bien des données anonymisées et qu'elles peuvent de ce fait être partagées en toute sécurité sans risque de divulgation d'informations personnelles. Étant donné que le pipeline automatisé a créé une table BigQuery basée sur les exemples de fichiers CSV du tutoriel précédent, vous pouvez valider les données en comparant les tables et les schémas dans BigQuery.

  1. Dans Cloud Shell, affichez la ligne d'en-tête du fichier CSV que vous avez utilisé pour créer le schéma :

    head -1 solution-test/CCRecords_1564602825.csv
    

    Le résultat est le suivant :

    ID,Card Type Code,Card Type Full Name,Issuing Bank,Card Number,Card Holder's Name,Issue Date,Expiry Date,Billing Date,Card PIN,Credit Limit,Age,SSN,JobTitle,Additional Details
    
  2. Dans Cloud Console, accédez à la page Éditeur de requête de BigQuery.

    Accéder à l'éditeur de requête

  3. Dans l'éditeur de requête, exécutez la requête suivante pour comparer le schéma à la ligne d'en-tête du fichier CSV :

    select table_name, column_name
    from `deid_dataset.INFORMATION_SCHEMA.COLUMNS`
    WHERE table_name="CCRecords_1564602825"
    

    Le résultat est le suivant :

    Résultat de la requête présenté dans une table avec des noms de colonne

    Les noms de colonne ne contiennent aucune espace, car le pipeline vérifie que les noms de colonne et de table ne contiennent que des caractères valides, conformément à la convention de dénomination de BigQuery.

  4. Vérifiez que la table comporte bien 100 000 lignes :

    select count(*) as number_of_rows
    from `deid_dataset.CCRecords_*` LIMIT 1
    

    Dans le résultat, la colonne number_of_rows contient la valeur 100 000 au lieu de 100 001. Le fichier CSV contient un enregistrement d'en-tête qui n'est pas inclus dans le nombre de lignes de la table.

    Résultat indiquant le nombre de lignes

  5. Vérifiez que la transformation de binning a bien été appliquée à la colonne JobTitle :

    select JobTitle, count(*) as number_of_records_found
    from `deid_dataset.CCRecords_1564602825`
    group by JobTitle
    

    Dans le résultat, les valeurs JobTitle sont regroupées en trois buckets généralisés : Executive, Engineer et Manager.

    Résultat indiquant les regroupements par fonctions

  6. Vérifiez que les valeurs de la colonne Age sont regroupées dans six buckets représentant les âges de 60 à 20 ans :

    select Age, count(*) as number_of_records_found
    from `deid_dataset.CCRecords_1564602825`
    group by Age
    order by Age desc
    

    Le résultat est le suivant :

    Résultat indiquant les regroupements par tranches d'âge

    Ces catégories permettent de procéder à des regroupements par tranches d'âge et par fonctions visant à faciliter le processus d'anonymisation des informations personnelles. Supposons par exemple que le jeune PDG bien connu d'une start-up puisse facilement être reconnu. Quelqu'un pourrait le repérer dans l'ensemble de données d'origine en utilisant les quasi-identifiants que sont la fonction et l'âge. Une fois la transformation de binning effectuée, il est plus difficile d'identifier cette personne dans les copies anonymisées de l'ensemble de données.

  7. Validez la transformation de masquage pour le numéro de sécurité sociale :

    select SSN
    from `deid_dataset.CCRecords_*`
    where regexp_contains(SSN, "@*")
    

    Dans le résultat, les cinq premiers chiffres de toutes les entrées de numéro de sécurité sociale sont masqués :

    Résultat avec masquage du numéro de sécurité sociale

  8. Vérifiez que la transformation cryptographique a utilisé le chiffrement déterministe pour les entrées card_holders_name, card_number et card_pin :

    select card_holders_name, card_number, card_pin
    from `deid_dataset.CCRecords_*`
    limit 1
    

    Dans le résultat, les trois entrées sont remplacées par une chaîne chiffrée encodée en base64 :

    Résultat avec chiffrement des informations de la carte

  9. Vérifiez que la transformation infoType a été appliquée à la colonne Additional Details :

    select additional_details
    from `deid_dataset.CCRecords_*`
    where regexp_contains(additional_details, r'(IBAN_CODE+)') or regexp_contains(additional_details, r'(EMAIL_ADDRESS+)')or regexp_contains(additional_details, r'(PHONE_NUMBER+)')or regexp_contains(additional_details, r'(ONLINE_USER_ID+)')
    

    Dans le résultat, les valeurs sensibles sont remplacées par des espaces réservés tels que [IBAN_CODE], [EMAIL_ADDRESS], [PHONE_NUMBER,] et [ONLINE_USER_ID] :

    Résultat avec des espaces réservés

  10. Interrogez les copies anonymisées de l'ensemble de données pour l'ID 76901 :

    select * from `deid_dataset.CCRecords_1564602825` where id='76901'
    

    Le résultat affiche les valeurs suivantes :

    "ID": "76901"
    "Card_Type_Code": "AX"
    "Card_Type_Full_Name": "American Express"
    "Issuing_Bank": "American Express"
    "Card_Number": "encrypted value"
    "Card_Holders_Name": "encrypted value"
    "Issue_Date": "03/2013"
    "Expiry_Date": "03/2015"
    "Billing_Date": "14"
    "Card_PIN": "encrypted value"
    "Credit_Limit": "57000"
    "Age": "40"
    "SSN": "***-**-9395"
    "JobTitle": "Manager"
    "Additional_Details": "[IBAN_CODE][PHONE_NUMBER] [EMAIL_ADDRESS] 102-326-2388 hugedomains.com Maggio[ONLINE_USER_ID]"
    
  11. Dans Cloud Shell, comparez le résultat de l'étape précédente avec l'ensemble de données d'origine du fichier CSV pour l'ID 76901 :

    awk -F "," '$1 == 76901' solution-test/CCRecords_1564602825.csv
    

    Le résultat est :

    76901,AX,American Express,American Express,376467075604410,Francis U Riggs,03/2013,03/2015,14,7425,57000,43,623-12-9395,Product Manager,ES20 6871 8240 0493 0298 3587 dsumpton1nc4@reddit.com 102-326-2388 hugedomains.com Maggio:5282194096147081
    

Restaurer l'identification de l'ensemble de données à partir de BigQuery

Enfin, vous pouvez restaurer l'identification des données en rétablissant les valeurs d'origine à l'aide des modèles Cloud DLP utilisés pour l'anonymisation. Pour ce faire, vous devez utiliser un pipeline Dataflow de restauration automatique de l'identification effectuant un traitement à grande échelle adapté à cet ensemble de données. Ce processus de restauration de l'identification est utile lorsque la clé de chiffrement de jeton doit faire l'objet d'une rotation. Vous pouvez restaurer l'identification de l'ensemble de données avant la rotation de la clé, puis procéder à nouveau à une tokenisation à l'aide de la nouvelle clé de chiffrement de jeton.

  1. Dans Cloud Shell, créez un sujet Pub/Sub dans lequel les valeurs restaurées seront publiées :

    export TOPIC_ID="reid-topic"
    gcloud pubsub topics create ${TOPIC_ID}
    
  2. Créez un abonnement Pub/Sub pour le sujet :

    export SUBSCRIPTION_ID="reid-subscription"
    gcloud pubsub subscriptions create ${SUBSCRIPTION_ID} --topic=${TOPIC_ID}
    
  3. Exportez la requête SQL BigQuery :

    export QUERY='select id,card_number,card_holders_name
    from `deid_dataset.CCRecords_1564602825`
    where safe_cast(credit_limit as int64)>100000 and safe_cast(age as int64)>50
    group by id,card_number,card_holders_name limit 10'
    

    Dans ce tutoriel, vous allez restaurer l'identification du numéro de la carte et du nom de son détenteur, pour toute personne âgée au moins de 50 ans dont la limite de crédit est supérieure à 100 000 US$.

  4. Importez la requête dans le bucket de stockage de données :

      cat << EOF | gsutil cp - gs://${DATA_STORAGE_BUCKET}/reid_query.sql
      ${QUERY}
      EOF
    
  5. Déclenchez le pipeline :

    gcloud beta dataflow flex-template run "dlp-reid-demo" --project=${PROJECT_ID} \
        --region=${REGION} \
        --template-file-gcs-location=gs://dataflow-dlp-solution-sample-data/dynamic_template_dlp_v2.json --  parameters=^~^streaming=true~enableStreamingEngine=true~tempLocation=gs://${DATAFLOW_TEMP_BUCKET}/temp~numWorkers=1~maxNumWorkers=2 ~runner=DataflowRunner~tableRef=${PROJECT_ID}:deid_dataset.CCRecords_1564602825~dataset=deid_dataset~autoscalingAlgorithm=THROUGHPUT_BASED~workerMachineType=n1-highmem-8 ~topic=projects/${PROJECT_ID}/topics/${TOPIC_ID}~deidentifyTemplateName=${REID_TEMPLATE_NAME} ~DLPMethod=REID~keyRange=1024~queryPath=gs://${DATA_STORAGE_BUCKET}/reid_query.sql
    
  6. Pour surveiller le pipeline, accédez à la page Dataflow dans Cloud Console.

    Accéder à Dataflow

    Au bout de quelques minutes, le pipeline se termine correctement lorsque vous voyez s'afficher ce qui suit :

    Fin de l&#39;exécution du pipeline avec indication de l&#39;état signalant la réussite de la tâche

  7. Afin de vérifier les données dont l'identification a été restaurée, utilisez Cloud Shell pour procéder à l'extraction de n'importe quel enregistrement de l'abonné Pub/Sub :

    gcloud pubsub subscriptions pull ${SUBSCRIPTION_ID} \
        --auto-ack --limit 1000 --project ${PROJECT_ID} >> re-id-data.txt
    

    Le résultat indique que l'identification des données a bien été restaurée avec rétablissement du format d'origine :

    cat re-id-data.txt
    

    Le résultat est semblable à :

    {"id":"17880","Card Number":"6558977436350773","Card Holder's Name":"Elden E Courtright"}
    {"id":"57055","Card Number":"3529749048585358","Card Holder's Name":"Francisco Duffy"}
    {"id":"31487","Card Number":"6227182611813833","Card Holder's Name":"Leslie C Wade"}
    {"id":"38521","Card Number":"36533383873740","Card Holder's Name":"Laura Z Thomas"}
    {"id":"81585","Card Number":"3569920557158538","Card Holder's Name":"Kelly Reed"}
    {"id":"96408","Card Number":"340687318048371","Card Holder's Name":"Ignacio V Pisano"}
    

Nettoyer

Le moyen le plus simple d'éviter la facturation consiste à supprimer le projet Cloud que vous avez créé pour le tutoriel. Vous pouvez également supprimer les différentes ressources.

Supprimer le projet

  1. Dans Cloud Console, accédez à la page Gérer les ressources.

    Accéder à la page Gérer les ressources

  2. Dans la liste des projets, sélectionnez le projet que vous souhaitez supprimer, puis cliquez sur Supprimer.
  3. Dans la boîte de dialogue, saisissez l'ID du projet, puis cliquez sur Arrêter pour supprimer le projet.

Étape suivante