Ce tutoriel vous explique comment anonymiser des données lors de l'interrogation de tables BigQuery à l'aide de fonctions distantes et de la protection des données sensibles. Cette approche est utile pour assainir les résultats des requêtes en temps réel afin de minimiser l'accès aux données qui ne sont pas nécessaires à l'analyse.
Ce tutoriel explique comment chiffrer et déchiffrer les données en transit. Pour savoir comment utiliser la protection des données sensibles afin de chiffrer les données au repos, consultez Anonymisation des données sensibles dans le stockage.
Ce tutoriel s'adresse aux utilisateurs dont les responsabilités couvrent la sécurité, le traitement ou l'analyse des données. Dans ce guide, nous partons du principe que vous connaissez bien les principes de base du traitement et de la confidentialité des données, sans être nécessairement un expert. Ce guide suppose également que vous pouvez exécuter des scripts Cloud Shell et SQL de base.
Ce tutoriel utilise des fonctions basées sur SQL, BigQuery, des fonctions distantes, Cloud Run et Sensitive Data Protection.
Les techniques d'anonymisation, comme le chiffrement, obscurcissent les identifiants sensibles bruts dans vos données. Ces techniques vous permettent de préserver l'utilité de vos données à des fins de jointure ou d'analyse, tout en réduisant les risques liés à leur gestion.
Les entreprises peuvent être soumises à des règles ou à des exigences réglementaires qui les obligent à stocker uniquement des données anonymisées dans leur entrepôt de données cloud. Ils peuvent également avoir besoin de réidentifier efficacement les données anonymisées pour générer des rapports.
Pour réduire les risques liés au traitement de grands volumes de données sensibles, vous pouvez utiliser un pipeline de transformation de données automatisé afin de créer des ensembles de données anonymisés. Vous pouvez utiliser ce tutoriel pour remplacer ce pipeline par une requête SQL pour la réidentification uniquement, ou pour la désidentification et la réidentification. Ce tutoriel vous aide à supprimer et à restaurer l'identification des informations personnelles à l'aide d'un service central hébergé sur Cloud Run. Vous pouvez utiliser ce service centralisé dans toute l'organisation sans avoir à configurer ni à gérer de cluster Dataflow.
La protection des données sensibles peut classer les ensembles de données en inspectant les données pour y détecter des informations sensibles. La protection des données sensibles comporte plus de 200 classificateurs intégrés, appelés infoTypes. L'utilisation de l'API Cloud Data Loss Prevention pour anonymiser les données nécessite des applications et des pipelines de données. Ce tutoriel vise à aider vos analystes, ingénieurs ou data scientists à obtenir le même résultat à l'aide de fonctions SQL.
À la fin de ce tutoriel, vous serez en mesure d'écrire une requête semblable à la suivante. Les données sensibles seront anonymisées et réidentifiées dans le résultat de la requête.
SELECT
pii_column,
fns.dlp_freetext_encrypt(pii_column) AS dlp_encrypted,
fns.dlp_freetext_decrypt(fns.dlp_freetext_encrypt(pii_column)) AS dlp_decrypted
FROM
UNNEST(
[
'My name is John Doe. My email is john.doe@example.com']) AS pii_column
Le résultat ressemble à ce qui suit :
Ligne | pii_column |
dlp_encrypted |
dlp_decrypted |
---|---|---|---|
1 |
My name is John Doe. My email is john.doe@example.com |
My name is John Doe. My email is
BQ_TRF_EMAIL(40):AQy6lGvwKR+AiiRqJpEr+nBzZUzOcjXkXamUugU= |
My name is John Doe. My email is john.doe@example.com |
Architecture
Le schéma suivant montre comment ce tutoriel utilise BigQuery comme entrepôt de données, la protection des données sensibles pour anonymiser et réidentifier les données, et Cloud Run pour héberger les fonctions distantes.
Objectifs
- Déployez un service Cloud Run qui fournit des fonctionnalités de désidentification à partir de Sensitive Data Protection.
- Créez des fonctions distantes BigQuery qui utilisent des modèles d'anonymisation Sensitive Data Protection.
- Vérifiez le chiffrement des données dans BigQuery à l'aide d'une requête SQL.
Coûts
Dans ce document, vous utilisez les composants facturables suivants de Google Cloud :
Pour obtenir une estimation des coûts en fonction de votre utilisation prévue, utilisez le simulateur de coût.
Une fois que vous avez terminé les tâches décrites dans ce document, vous pouvez éviter de continuer à payer des frais en supprimant les ressources que vous avez créées. Pour en savoir plus, consultez la section Effectuer un nettoyage.
Avant de commencer
- Sign in to your Google Cloud account. If you're new to Google Cloud, create an account to evaluate how our products perform in real-world scenarios. New customers also get $300 in free credits to run, test, and deploy workloads.
-
Install the Google Cloud CLI.
-
If you're using an external identity provider (IdP), you must first sign in to the gcloud CLI with your federated identity.
-
To initialize the gcloud CLI, run the following command:
gcloud init
-
Create or select a Google Cloud project.
-
Create a Google Cloud project:
gcloud projects create PROJECT_ID
Replace
PROJECT_ID
with a name for the Google Cloud project you are creating. -
Select the Google Cloud project that you created:
gcloud config set project PROJECT_ID
Replace
PROJECT_ID
with your Google Cloud project name.
-
-
Make sure that billing is enabled for your Google Cloud project.
-
Enable the Artifact Registry, BigQuery, BigQuery Connection API, Cloud Build, Cloud Data Loss Prevention API, Cloud Key Management Service, Cloud Run, Container Registry, Identity and Access Management, Resource Manager, Secret Manager, and Service Usage APIs:
gcloud services enable artifactregistry.googleapis.com
bigquery.googleapis.com bigqueryconnection.googleapis.com cloudbuild.googleapis.com cloudkms.googleapis.com cloudresourcemanager.googleapis.com containerregistry.googleapis.com dlp.googleapis.com iam.googleapis.com run.googleapis.com secretmanager.googleapis.com serviceusage.googleapis.com -
Install the Google Cloud CLI.
-
If you're using an external identity provider (IdP), you must first sign in to the gcloud CLI with your federated identity.
-
To initialize the gcloud CLI, run the following command:
gcloud init
-
Create or select a Google Cloud project.
-
Create a Google Cloud project:
gcloud projects create PROJECT_ID
Replace
PROJECT_ID
with a name for the Google Cloud project you are creating. -
Select the Google Cloud project that you created:
gcloud config set project PROJECT_ID
Replace
PROJECT_ID
with your Google Cloud project name.
-
-
Make sure that billing is enabled for your Google Cloud project.
-
Enable the Artifact Registry, BigQuery, BigQuery Connection API, Cloud Build, Cloud Data Loss Prevention API, Cloud Key Management Service, Cloud Run, Container Registry, Identity and Access Management, Resource Manager, Secret Manager, and Service Usage APIs:
gcloud services enable artifactregistry.googleapis.com
bigquery.googleapis.com bigqueryconnection.googleapis.com cloudbuild.googleapis.com cloudkms.googleapis.com cloudresourcemanager.googleapis.com containerregistry.googleapis.com dlp.googleapis.com iam.googleapis.com run.googleapis.com secretmanager.googleapis.com serviceusage.googleapis.com
Préparer l'environnement
Dans Cloud Shell, clonez le dépôt source :
git clone https://github.com/GoogleCloudPlatform/bigquery-dlp-remote-function.git
Accédez au répertoire de ce tutoriel :
cd bigquery-dlp-remote-function/
Déployer les ressources à l'aide d'un script
Si vous souhaitez utiliser le script de déploiement sans le personnaliser, suivez ces étapes. Si vous souhaitez personnaliser le déploiement, ignorez cette section et consultez plutôt Déployer manuellement une solution personnalisée.
Définissez les valeurs des champs PROJECT_ID et REGION :
# Project ID of the Google Cloud project PROJECT_ID="PROJECT_ID" # Google Cloud region to use for deployment of resources # Refer to https://cloud.google.com/about/locations REGION="REGION"
Remplacez les éléments suivants :
- PROJECT_ID : ID du projet pour ce tutoriel.
- REGION : région dans laquelle vous souhaitez stocker et traiter les données (par exemple,
us-west1
). Indiquez une région, et non une zone.
Facultatif : Si vous avez un modèle d'inspection que vous souhaitez utiliser, définissez le champ DLP_INSPECT_TEMPLATE sur le nom de ressource complet de ce modèle d'inspection. Le modèle d'inspection doit se trouver dans la même région que celle que vous avez définie dans le champ REGION.
Assurez-vous que le modèle d'inspection inclut tous les infoTypes utilisés dans le modèle de suppression de l'identification.
Si vous ignorez cette étape, la protection des données sensibles inspecte les données avec un ensemble de détecteurs d'infoTypes par défaut.
DLP_INSPECT_TEMPLATE="DLP_INSPECT_TEMPLATE"
Remplacez DLP_INSPECT_TEMPLATE par le nom de ressource complet de votre modèle d'inspection (par exemple,
projects/PROJECT_ID/locations/REGION/inspectTemplates/TEMPLATE_ID
).Authentifiez-vous à l'aide des identifiants par défaut de l'application :
gcloud auth application-default login && \ gcloud auth application-default set-quota-project "${PROJECT_ID}"
Initialisez et exécutez le script Terraform pour créer toutes les ressources :
terraform init && \ terraform apply \ -var "project_id=${PROJECT_ID}" \ -var "region=${REGION}" \ -var "dlp_inspect_template_full_path=${DLP_INSPECT_TEMPLATE}"
Le système affiche toutes les actions que Terraform va effectuer. Examinez les actions. Pour continuer, saisissez
yes
.Vérifiez que les données peuvent être chiffrées et déchiffrées.
Déployer manuellement une solution personnalisée
Si vous souhaitez personnaliser le déploiement, procédez comme suit. Si vous souhaitez utiliser le script de déploiement fourni sans personnalisation ni étapes manuelles, consultez plutôt Déployer les ressources à l'aide d'un script.
Définir les variables d'environnement
Dans Cloud Shell, définissez les variables d'environnement suivantes :
PROJECT_ID="PROJECT_ID"
REGION="REGION"
CLOUD_RUN_SERVICE_NAME="CLOUD-RUN-SERVICE-NAME"
ARTIFACT_REGISTRY_NAME="ARTIFACT-DOCKER-REGISTRY-NAME"
Remplacez les éléments suivants :
- PROJECT_ID : ID du projet pour ce tutoriel.
- REGION : région dans laquelle vous souhaitez stocker et traiter les données (par exemple,
us-west1
). Indiquez une région, pas une zone. - CLOUD_RUN_SERVICE_NAME : nom du nouveau service Cloud Run. Saisissez jusqu'à 15 caractères.
- ARTIFACT_REGISTRY_NAME : nom du nouveau dépôt Artifact Registry pour stocker les images de conteneurs.
Créer un compte de service pour le service Cloud Run
Créez un compte de service :
RUNNER_SA_NAME="${CLOUD_RUN_SERVICE_NAME}-runner" RUNNER_SA_EMAIL="${RUNNER_SA_NAME}@${PROJECT_ID}.iam.gserviceaccount.com" gcloud iam service-accounts create "${RUNNER_SA_NAME}" \ --project="${PROJECT_ID}" \ --description "Runner for BigQuery remote function execution" \ --display-name "${RUNNER_SA_NAME}"
Attribuez les rôles requis pour la protection des données sensibles.
Attribuez le rôle Lecteur DLP :
gcloud projects add-iam-policy-binding "${PROJECT_ID}" \ --member="serviceAccount:${RUNNER_SA_EMAIL}" \ --role='roles/dlp.reader'
Attribuez le rôle Utilisateur DLP :
gcloud projects add-iam-policy-binding "${PROJECT_ID}" \ --member="serviceAccount:${RUNNER_SA_EMAIL}" \ --role='roles/dlp.user'
Déployer le service Cloud Run
Pour déployer l'application, procédez comme suit :
Facultatif : Vous pouvez modifier les valeurs par défaut en modifiant les variables d'environnement ou en mettant à jour le fichier
src/main/resources/aes.properties
.Créez un dépôt Artifact Registry pour stocker l'image de conteneur de la fonction :
gcloud artifacts repositories create "${ARTIFACT_REGISTRY_NAME}" \ --repository-format=docker \ --location="${REGION}" \ --description="Container images repository for BigQuery Functions" \ --project="${PROJECT_ID}"
Compilez l'application et déployez-la sur Cloud Run à l'aide de Cloud Build :
gcloud builds submit \ --project ${PROJECT_ID} \ --substitutions=_CONTAINER_IMAGE_NAME="${REGION}-docker.pkg.dev/${PROJECT_ID}/${ARTIFACT_REGISTRY_NAME}/${CLOUD_RUN_SERVICE_NAME}:latest" \ --machine-type=e2-highcpu-8 && \ gcloud beta run deploy ${CLOUD_RUN_SERVICE_NAME} \ --image="${REGION}-docker.pkg.dev/${PROJECT_ID}/${ARTIFACT_REGISTRY_NAME}/${CLOUD_RUN_SERVICE_NAME}:latest" \ --execution-environment=gen2 \ --platform=managed \ --region="${REGION}" \ --service-account="${RUNNER_SA_EMAIL}" \ --cpu=4 \ --memory=8Gi \ --no-allow-unauthenticated \ --project ${PROJECT_ID} \ --update-env-vars=PROJECT_ID=${PROJECT_ID}
La fin du résultat ressemble à ce qui suit :
ID: 403a276e-b0c6-41f3-aaed-f0ec9f9cedba CREATE_TIME: 2023-02-04T01:52:15+00:00 DURATION: 1M59S SOURCE: gs://PROJECT_ID_cloudbuild/source/1675475534.124241-9c43787f64e04cfd9e4a1979d3324fe0.tgz IMAGES: gcr.io/PROJECT_ID/CLOUD_RUN_SERVICE_NAME (+1 more) STATUS: SUCCESS Deploying container to Cloud Run service [CLOUD_RUN_SERVICE_NAME] in project [PROJECT_ID] region [REGION] OK Deploying new service... Done. OK Creating Revision... Revision deployment finished. Checking container heal th. OK Routing traffic... Done. Service [CLOUD_RUN_SERVICE_NAME] revision [CLOUD_RUN_SERVICE_NAME-00001-tat] has been deployed and is serving 100 percent of traffic. Service URL: https://CLOUD_RUN_SERVICE_NAME-j2bpjx2xoq-uw.a.run.app
Récupérez l'URL Cloud Run et enregistrez-la dans vos variables d'environnement :
RUN_URL="$(gcloud run services describe ${CLOUD_RUN_SERVICE_NAME} --region \ ${REGION} --project ${PROJECT_ID} --format="get(status.address.url)")"
Créer un modèle d'anonymisation Sensitive Data Protection
Les modèles d'anonymisation pour la protection des données sensibles vous permettent d'enregistrer vos paramètres d'anonymisation afin de pouvoir les réutiliser pour plusieurs opérations et sources de données.
Cette étape utilise le fichier sample_dlp_deid_config.json
, qui contient un exemple de modèle d'anonymisation.
Dans Cloud Shell, créez le modèle :
DEID_TEMPLATE=$(curl -X POST \
-H "Authorization: Bearer `gcloud auth print-access-token`" \
-H "Accept: application/json" \
-H "Content-Type: application/json" \
-H "X-Goog-User-Project: ${PROJECT_ID}" \
--data-binary "@sample_dlp_deid_config.json" \
"https://dlp.googleapis.com/v2/projects/${PROJECT_ID}/locations/${REGION}/deidentifyTemplates")
DEID_TEMPLATE_NAME="$(echo ${DEID_TEMPLATE} | jq -r '.name')"
Google vous recommande d'utiliser une clé encapsulée lorsque vous chiffrez des charges de travail sensibles réelles avec Sensitive Data Protection. À des fins de démonstration, ce tutoriel utilise une clé non encapsulée. Pour savoir comment créer une clé encapsulée et l'utiliser dans les requêtes d'anonymisation et de restauration de l'identification, consultez Anonymiser et désanonymiser des données sensibles.
Créer la connexion BigQuery à Cloud Run
Dans Cloud Shell, créez une connexion BigQuery pour accéder à Cloud Run :
bq mk --connection \ --display_name='External transform function connection' \ --connection_type=CLOUD_RESOURCE \ --project_id="${PROJECT_ID}" \ --location="${REGION}" \ ext-${CLOUD_RUN_SERVICE_NAME}
Recherchez et définissez le compte de service BigQuery utilisé pour la connexion :
CONNECTION_SA="$(bq --project_id ${PROJECT_ID} --format json show \ --connection ${PROJECT_ID}.${REGION}.ext-${CLOUD_RUN_SERVICE_NAME} \ | jq -r '.cloudResource.serviceAccountId')"
Attribuez le rôle Demandeur Cloud Run au compte de service :
gcloud projects add-iam-policy-binding ${PROJECT_ID} \ --member="serviceAccount:${CONNECTION_SA}" \ --role='roles/run.invoker'
Créer l'ensemble de données BigQuery pour les fonctions distantes
Définissez l'ensemble de données BigQuery pour les fonctions distantes :
BQ_FUNCTION_DATASET="fns"
Créez l'ensemble de données s'il n'existe pas encore :
bq mk --dataset \ --project_id ${PROJECT_ID} \ --location ${REGION} \ ${BQ_FUNCTION_DATASET}
Créer les fonctions distantes de protection des données sensibles
Facultatif : Si vous avez un modèle d'inspection que vous souhaitez utiliser, définissez la variable DLP_INSPECT_TEMPLATE sur le nom complet de la ressource de ce modèle d'inspection. Le modèle d'inspection doit se trouver dans la même région que celle que vous avez définie dans la variable d'environnement REGION.
Assurez-vous que le modèle d'inspection inclut tous les infoTypes utilisés dans le modèle de suppression de l'identification.
Si vous ignorez cette étape, la protection des données sensibles inspecte les données avec un ensemble de détecteurs d'infoTypes par défaut.
DLP_INSPECT_TEMPLATE="DLP_INSPECT_TEMPLATE"
Remplacez DLP_INSPECT_TEMPLATE par le nom de ressource complet de votre modèle d'inspection (par exemple,
projects/PROJECT_ID/locations/REGION/inspectTemplates/TEMPLATE_ID
).Créez la fonction d'anonymisation Sensitive Data Protection :
bq query --project_id ${PROJECT_ID} \ --use_legacy_sql=false \ "CREATE OR REPLACE FUNCTION ${BQ_FUNCTION_DATASET}.dlp_freetext_encrypt(v STRING) RETURNS STRING REMOTE WITH CONNECTION \`${PROJECT_ID}.${REGION}.ext-${CLOUD_RUN_SERVICE_NAME}\` OPTIONS (endpoint = '${RUN_URL}', user_defined_context = [('mode', 'deidentify'),('algo','dlp'),('dlp-deid-template','${DEID_TEMPLATE_NAME}'),('dlp-inspect-template', '${DLP_INSPECT_TEMPLATE}')]);"
Créez la fonction de réidentification Sensitive Data Protection :
bq query --project_id ${PROJECT_ID} \ --use_legacy_sql=false \ "CREATE OR REPLACE FUNCTION ${BQ_FUNCTION_DATASET}.dlp_freetext_decrypt(v STRING) RETURNS STRING REMOTE WITH CONNECTION \`${PROJECT_ID}.${REGION}.ext-${CLOUD_RUN_SERVICE_NAME}\` OPTIONS (endpoint = '${RUN_URL}', user_defined_context = [('mode', 'reidentify'),('algo','dlp'),('dlp-deid-template','${DEID_TEMPLATE_NAME}'),('dlp-inspect-template', '${DLP_INSPECT_TEMPLATE}')]);"
Vérifier la suppression de l'identification et la réidentification
Pour vérifier si la solution anonymise et réidentifie les données, procédez comme suit :
Console
Dans la console Google Cloud , accédez à BigQuery.
BigQuery s'ouvre dans le dernier projet auquel vous avez accédé.
Pour ouvrir un éditeur de requête, cliquez sur
Saisir une nouvelle requête.Saisissez la requête suivante :
SELECT pii_column, fns.dlp_freetext_encrypt(pii_column) AS dlp_encrypted, fns.dlp_freetext_decrypt(fns.dlp_freetext_encrypt(pii_column)) AS dlp_decrypted FROM UNNEST( [ 'My name is John Doe. My email is john.doe@example.com', 'Some non PII data', '650-253-0000', 'some script with simple number 1234']) AS pii_column
Cliquez sur Exécuter.
bq
Définissez la variable d'environnement pour l'ensemble de données :
BQ_FUNCTION_DATASET="fns"
Exécutez la requête :
bq query --project_id ${PROJECT_ID} \ --use_legacy_sql=false \ " SELECT pii_column, ${BQ_FUNCTION_DATASET}.dlp_freetext_encrypt(pii_column) AS dlp_encrypted, ${BQ_FUNCTION_DATASET}.dlp_freetext_decrypt(${BQ_FUNCTION_DATASET}.dlp_freetext_encrypt(pii_column)) AS dlp_decrypted FROM UNNEST( [ 'My name is John Doe. My email is john.doe@example.com', 'Some non PII data', '650-253-0000', 'some script with simple number 1234']) AS pii_column"
Le résultat ressemble à ce qui suit :
Ligne | pii_column |
dlp_encrypted |
dlp_decrypted |
---|---|---|---|
1 |
My name is John Doe. My email is john.doe@example.com |
My name is John Doe. My email is
BQ_TRF_EMAIL(40):AQy6lGvwKR+AiiRqJpEr+nBzZUzOcjXkXamUugU= |
My name is John Doe. My email is john.doe@example.com |
2 |
Some non PII data |
Some non PII data |
Some non PII data |
3 |
650-253-0000 |
BQ_TRF_PH(40):AeKpGU5KBXaTyecCun7dv1hHht5w5Q2PTpvkRC4= |
650-253-0000 |
4 |
some script with simple number 1234 |
some script with simple number 1234 |
some script with simple number 1234 |
Remarques
Lorsque vous adaptez ce tutoriel à vos besoins, tenez compte des points suivants :
- La suppression et la restauration de l'identification sont traitées par un service Cloud Run. Provisionnez le processeur et la mémoire Cloud Run en fonction de vos besoins de calcul. Pour en savoir plus, consultez les limites de processeur et les limites de mémoire pour Cloud Run.
- Lorsque vous utilisez la protection des données sensibles, tenez compte des limites d'utilisation et des recommandations pour contrôler les coûts.
Pour contrôler les coûts et la consommation totale de votre quota Sensitive Data Protection, limitez à 10 000 ou moins le nombre d'éléments que vous transmettez à la fonction à distance Sensitive Data Protection. La solution peut regrouper automatiquement les requêtes pour gérer correctement les limites de requêtes de protection des données sensibles suivantes :
- Nombre maximal de valeurs de tableau : 50 000
- Taille maximale des requêtes par défaut : 0,5 Mo
Les résultats finaux et filtrés de la requête doivent être transmis à la fonction de protection des données sensibles au lieu de la source.
Pour cette solution, chaque valeur de la colonne
pii_column
est un élément (par exemple,My name is John Doe. My email is john.doe@example.com
est un élément).Assurez-vous que votre ensemble de données BigQuery, votre service Cloud Run et vos modèles de protection des données sensibles se trouvent dans la même région cloud.
Effectuer un nettoyage
Pour éviter que les ressources utilisées lors de ce tutoriel soient facturées sur votre compte Google Cloud, supprimez le projet contenant les ressources, ou conservez le projet et supprimez les ressources individuelles.
Delete a Google Cloud project:
gcloud projects delete PROJECT_ID
Étapes suivantes
- En savoir plus sur les fonctions distantes BigQuery
- Découvrez comment anonymiser les données sensibles.
- Suivez un exemple qui montre comment créer une clé encapsulée, tokeniser du contenu et restaurer l'identification du contenu tokenisé.
- Découvrez comment gérer l'anonymisation et la désanonymisation des informations permettant d'identifier personnellement l'utilisateur dans les ensembles de données à grande échelle à l'aide de la protection des données sensibles.
- Découvrez Cloud KMS.