Ce tutoriel vous explique comment anonymiser les données lors de l'interrogation de tables à partir de BigQuery à l'aide de fonctions distantes et de la protection des données sensibles. Cette approche est utile pour nettoyer les résultats des requêtes en temps réel afin de réduire l'accès aux données qui ne sont pas nécessaires à l'analyse.
Ce tutoriel explique comment chiffrer et déchiffrer des données en transit. Pour en savoir plus sur l'utilisation de la protection des données sensibles pour chiffrer les données au repos, consultez la section Anonymisation des données sensibles dans l'espace de stockage.
Ce tutoriel s'adresse aux audiences dont les responsabilités couvrent la sécurité des données, leur traitement et leur analyse. 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 la protection des données sensibles.
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 à ne stocker que des données anonymisées dans leur entrepôt de données cloud. En outre, ils peuvent être amenés à 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 uniquement pour la réidentification ou pour la déidentification et la réidentification. Ce tutoriel vous aide à effectuer à la fois la suppression et la restauration de l'identification à l'aide d'un service central hébergé sur Cloud Run. Vous pouvez utiliser ce service central dans l'ensemble de l'organisation sans avoir à configurer ni à gérer un cluster Dataflow.
La protection des données sensibles peut classer les ensembles de données en inspectant les données à la recherche d'informations sensibles. La protection des données sensibles inclut plus de 150 classificateurs intégrés, appelés infoTypes. L'utilisation de l'API Cloud Data Loss Prevention pour anonymiser des données nécessite des pipelines et des applications 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 pourrez é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 diagramme 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 la fonctionnalité de désidentification de la protection des données sensibles.
- 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 :
Obtenez une estimation des coûts en fonction de votre utilisation prévue à l'aide du 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.
-
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.
-
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 effectuer de personnalisations, procédez comme suit. 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 pour les 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 souhaitez utiliser un modèle d'inspection, définissez le champ 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 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 du système.
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 effectuera. 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 personnalisations ni étapes manuelles, consultez plutôt Déploiement des 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, et non une zone. - CLOUD_RUN_SERVICE_NAME: nom du nouveau service Cloud Run. Vous pouvez saisir jusqu'à 15 caractères.
- ARTIFACT_REGISTRY_NAME: nom du nouveau dépôt Artifact Registry pour stocker les images de conteneur.
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 Sensitive Data Protection.
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}"
Complétez 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 de la sortie 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 de la protection des données sensibles vous aident à enregistrer vos paramètres d'anonymisation afin de pouvoir les réutiliser sur 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 effectuez le chiffrement de la protection des données sensibles sur des charges de travail sensibles réelles. À des fins de démonstration, ce tutoriel utilise une clé non encapsulée. Pour en savoir plus sur la création d'une clé encapsulée et son utilisation dans les requêtes d'anonymisation et de restauration de l'identification, consultez la page Supprimer l'identification des données sensibles et la restaurer.
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 déjà:
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 du système.
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 de la protection des données sensibles:
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 désanonymisation de la protection des données sensibles:
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 désanonymise 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 désidentification et la réidentification sont traitées via 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 de Cloud Run.
- Lorsque vous utilisez Sensitive Data Protection, tenez compte des limites d'utilisation et des recommandations pour contrôler les coûts.
Pour mieux contrôler les coûts et la consommation totale de votre quota de protection des données sensibles, limitez le nombre d'éléments que vous transmettez via la fonction à distance de la protection des données sensibles à 10 000 éléments maximum. 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 table: 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 plutôt qu'à la source.
Pour cette solution, chaque valeur de la colonne
pii_column
correspond à un élément. Par exemple,My name is John Doe. My email is john.doe@example.com
correspond à 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
Étape suivante
- En savoir plus sur les fonctions BigQuery distantes
- Découvrez comment anonymiser des 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.