En este tutorial se explica cómo desidentificar datos al consultar tablas de BigQuery con funciones remotas y Protección de Datos Sensibles. Este enfoque es útil para anonimizar los resultados de las consultas en tiempo real y minimizar el acceso a los datos que no se necesitan para el análisis.
En este tutorial se muestra cómo cifrar y descifrar datos en tránsito. Para obtener información sobre cómo usar Protección de Datos Sensibles para cifrar datos en reposo, consulta Desidentificación de datos sensibles en el almacenamiento.
Este tutorial está dirigido a audiencias cuyas responsabilidades incluyen la seguridad, el tratamiento o el análisis de datos. En esta guía se da por hecho que conoces el tratamiento y la privacidad de los datos, pero no es necesario que seas un experto. En esta guía también se da por hecho que puedes ejecutar scripts básicos de Cloud Shell y SQL.
En este tutorial se usan funciones basadas en SQL, BigQuery, funciones remotas, Cloud Run y Protección de Datos Sensibles.
Las técnicas de desidentificación, como el cifrado, ofuscan los identificadores sensibles sin procesar de tus datos. Estas técnicas te permiten seguir usando los datos para uniones o analíticas. Además, para reducir los riesgos inherentes a la gestión de datos, se ofuscan los identificadores sensibles sin procesar.
Las empresas pueden tener políticas o requisitos normativos para almacenar solo datos anonimizados en su almacén de datos en la nube. Además, es posible que necesiten volver a identificar de forma eficiente los datos desidentificados para generar informes.
Para minimizar el riesgo de gestionar grandes volúmenes de datos sensibles, puedes usar un flujo de procesamiento de transformación de datos automatizado para crear conjuntos de datos desidentificados. Puedes usar este tutorial para sustituir esa canalización por una consulta SQL que solo realice la reidentificación o que realice tanto la desidentificación como la reidentificación. En este tutorial se explica cómo anonimizar y volver a identificar datos mediante un servicio central alojado en Cloud Run. Puedes usar este servicio central en toda la organización sin necesidad de configurar ni mantener un clúster de Dataflow.
Protección de Datos Sensibles puede clasificar conjuntos de datos inspeccionando los datos para detectar información sensible. Protección de Datos Sensibles tiene más de 200 clasificadores integrados, llamados infoTypes. Para desidentificar datos con la API Cloud Data Loss Prevention, se necesitan flujos de datos y aplicaciones. El objetivo de este tutorial es ayudar a tus analistas, ingenieros o científicos de datos a conseguir el mismo resultado mediante funciones de SQL.
Al final de este tutorial, podrás escribir una consulta similar a la siguiente. Los datos sensibles se anonimizarán y se volverán a identificar en el resultado de la consulta.
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
El resultado debería ser similar al siguiente:
Acceso | 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 |
Arquitectura
En el siguiente diagrama se muestra cómo se usa BigQuery en este tutorial como almacén de datos, Protección de Datos Sensibles para desidentificar y volver a identificar datos, y Cloud Run para alojar las funciones remotas.
Objetivos
- Despliega un servicio de Cloud Run que proporcione funciones de desidentificación de Protección de Datos Sensibles.
- Crea funciones remotas de BigQuery que usen plantillas de desidentificación de Protección de Datos Sensibles.
- Verifica el cifrado de datos en BigQuery mediante una consulta SQL.
Costes
En este documento, se utilizan los siguientes componentes facturables de Google Cloud:
Para generar una estimación de costes basada en el uso previsto,
utiliza la calculadora de precios.
Cuando termines las tareas que se describen en este documento, puedes evitar que se te siga facturando eliminando los recursos que has creado. Para obtener más información, consulta la sección Limpiar.
Antes de empezar
- 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.
-
Si utilizas un proveedor de identidades (IdP) externo, primero debes iniciar sesión en la CLI de gcloud con tu identidad federada.
-
Para inicializar gcloud CLI, ejecuta el siguiente comando:
gcloud init
-
Create or select a Google Cloud project.
Roles required to select or create a project
- Select a project: Selecting a project doesn't require a specific IAM role—you can select any project that you've been granted a role on.
-
Create a project: To create a project, you need the Project Creator
(
roles/resourcemanager.projectCreator
), which contains theresourcemanager.projects.create
permission. Learn how to grant roles.
-
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.
-
Verify 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:
Roles required to enable APIs
To enable APIs, you need the Service Usage Admin IAM role (
roles/serviceusage.serviceUsageAdmin
), which contains theserviceusage.services.enable
permission. Learn how to grant roles.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.
-
Si utilizas un proveedor de identidades (IdP) externo, primero debes iniciar sesión en la CLI de gcloud con tu identidad federada.
-
Para inicializar gcloud CLI, ejecuta el siguiente comando:
gcloud init
-
Create or select a Google Cloud project.
Roles required to select or create a project
- Select a project: Selecting a project doesn't require a specific IAM role—you can select any project that you've been granted a role on.
-
Create a project: To create a project, you need the Project Creator
(
roles/resourcemanager.projectCreator
), which contains theresourcemanager.projects.create
permission. Learn how to grant roles.
-
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.
-
Verify 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:
Roles required to enable APIs
To enable APIs, you need the Service Usage Admin IAM role (
roles/serviceusage.serviceUsageAdmin
), which contains theserviceusage.services.enable
permission. Learn how to grant roles.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 En Cloud Shell, clona el repositorio de origen:
git clone https://github.com/GoogleCloudPlatform/bigquery-dlp-remote-function.git
Ve al directorio de este tutorial:
cd bigquery-dlp-remote-function/
Define los valores de los campos PROJECT_ID y 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"
Haz los cambios siguientes:
- PROJECT_ID: el ID del proyecto de este tutorial.
- REGION: la región en la que quieras almacenar y tratar los datos (por ejemplo,
us-west1
). Proporciona una región, no una zona.
Opcional: Si tienes una plantilla de inspección que quieras usar, asigna al campo DLP_INSPECT_TEMPLATE el nombre de recurso completo de esa plantilla de inspección. La plantilla de inspección debe estar en la misma región que hayas definido en el campo REGION.
Asegúrate de que la plantilla de inspección incluya todos los infoTypes que se usen en la plantilla de desidentificación.
Si omite este paso, Protección de Datos Sensibles inspeccionará los datos con un conjunto predeterminado del sistema de detectores de infoType.
DLP_INSPECT_TEMPLATE="DLP_INSPECT_TEMPLATE"
Sustituye DLP_INSPECT_TEMPLATE por el nombre completo del recurso de tu plantilla de inspección. Por ejemplo,
projects/PROJECT_ID/locations/REGION/inspectTemplates/TEMPLATE_ID
.Autentica con las credenciales de aplicación predeterminadas:
gcloud auth application-default login && \ gcloud auth application-default set-quota-project "${PROJECT_ID}"
Inicializa y ejecuta la secuencia de comandos de Terraform para crear todos los recursos:
terraform init && \ terraform apply \ -var "project_id=${PROJECT_ID}" \ -var "region=${REGION}" \ -var "dlp_inspect_template_full_path=${DLP_INSPECT_TEMPLATE}"
El sistema muestra todas las acciones que realizará Terraform. Revisa las acciones. Para continuar, introduce
yes
.Verifica que los datos se puedan cifrar y descifrar.
- PROJECT_ID: el ID del proyecto de este tutorial.
- REGION: la región en la que quieras almacenar y tratar los datos (por ejemplo,
us-west1
). Proporciona una región, no una zona. - CLOUD_RUN_SERVICE_NAME: nombre del nuevo servicio de Cloud Run. Escribe un máximo de 15 caracteres.
- ARTIFACT_REGISTRY_NAME: nombre del nuevo Artifact Registry para almacenar imágenes de contenedor.
Crea una cuenta de servicio:
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}"
Asigna los roles necesarios para Protección de Datos Sensibles.
Concede el rol Lector de DLP:
gcloud projects add-iam-policy-binding "${PROJECT_ID}" \ --member="serviceAccount:${RUNNER_SA_EMAIL}" \ --role='roles/dlp.reader'
Asigna el rol Usuario de protección de datos:
gcloud projects add-iam-policy-binding "${PROJECT_ID}" \ --member="serviceAccount:${RUNNER_SA_EMAIL}" \ --role='roles/dlp.user'
Opcional: Puedes cambiar los valores predeterminados modificando las variables de entorno o actualizando el archivo
src/main/resources/aes.properties
.Crea un repositorio de Artifact Registry para almacenar la imagen de contenedor de la función:
gcloud artifacts repositories create "${ARTIFACT_REGISTRY_NAME}" \ --repository-format=docker \ --location="${REGION}" \ --description="Container images repository for BigQuery Functions" \ --project="${PROJECT_ID}"
Compila la aplicación y despliégala en Cloud Run con 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}
El final de la salida es similar al siguiente:
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
Obtén la URL de Cloud Run y guárdala en las variables de entorno:
RUN_URL="$(gcloud run services describe ${CLOUD_RUN_SERVICE_NAME} --region \ ${REGION} --project ${PROJECT_ID} --format="get(status.address.url)")"
En Cloud Shell, crea una conexión de BigQuery para acceder a 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}
Busca y define la cuenta de servicio de BigQuery que se usa para la conexión:
CONNECTION_SA="$(bq --project_id ${PROJECT_ID} --format json show \ --connection ${PROJECT_ID}.${REGION}.ext-${CLOUD_RUN_SERVICE_NAME} \ | jq -r '.cloudResource.serviceAccountId')"
Asigna el rol Invocador de Cloud Run a la cuenta de servicio:
gcloud projects add-iam-policy-binding ${PROJECT_ID} \ --member="serviceAccount:${CONNECTION_SA}" \ --role='roles/run.invoker'
Define el conjunto de datos de BigQuery para las funciones remotas:
BQ_FUNCTION_DATASET="fns"
Crea el conjunto de datos si aún no existe:
bq mk --dataset \ --project_id ${PROJECT_ID} \ --location ${REGION} \ ${BQ_FUNCTION_DATASET}
Opcional: Si tienes una plantilla de inspección que quieras usar, asigna a la variable DLP_INSPECT_TEMPLATE el nombre de recurso completo de esa plantilla. La plantilla de inspección debe estar en la misma región que la que hayas definido en la variable de entorno REGION.
Asegúrate de que la plantilla de inspección incluya todos los infoTypes que se usen en la plantilla de desidentificación.
Si omite este paso, Protección de Datos Sensibles inspeccionará los datos con un conjunto predeterminado del sistema de detectores de infoType.
DLP_INSPECT_TEMPLATE="DLP_INSPECT_TEMPLATE"
Sustituye DLP_INSPECT_TEMPLATE por el nombre completo del recurso de tu plantilla de inspección. Por ejemplo,
projects/PROJECT_ID/locations/REGION/inspectTemplates/TEMPLATE_ID
.Crea la función de desidentificación de Protección de Datos 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}')]);"
Crea la función de reidentificación de Protección de Datos 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}')]);"
En la Google Cloud consola, ve a BigQuery.
BigQuery se abre en el proyecto al que has accedido más recientemente.
Para abrir un editor de consultas, haz clic en
Crear una consulta.Introduce la siguiente consulta:
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
Haz clic en Ejecutar.
Define la variable de entorno del conjunto de datos:
BQ_FUNCTION_DATASET="fns"
Ejecuta la consulta:
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"
- La desidentificación y la reidentificación se procesan a través de un servicio de Cloud Run. Aprovisiona la CPU y la memoria de Cloud Run en función de tus requisitos de computación. Para obtener más información, consulta los límites de CPU y los límites de memoria de Cloud Run.
- Cuando uses Protección de Datos Sensibles, ten en cuenta los límites de uso y las recomendaciones para controlar los costes.
Para controlar los costes y el consumo total de tu cuota de Protección de Datos Sensibles, limita a 10.000 o menos los elementos que transfieras a través de la función remota de Protección de Datos Sensibles. La solución puede agrupar automáticamente las solicitudes para gestionar correctamente los siguientes límites de solicitudes de Protección de Datos Sensibles:
- Número máximo de valores de tabla: 50.000
- Límite de tamaño de las solicitudes predeterminado: 0,5 MB
Los resultados finales y filtrados de la consulta deben enviarse a la función de protección de datos sensibles en lugar de a la fuente.
En esta solución, cada valor de la columna
pii_column
es un elemento. Por ejemplo,My name is John Doe. My email is john.doe@example.com
es un elemento.Asegúrate de que tu conjunto de datos de BigQuery, tu servicio de Cloud Run y tus plantillas de protección de datos sensibles estén en la misma región de la nube.
- Más información sobre las funciones remotas de BigQuery
- Consulta cómo desidentificar datos sensibles.
- Consulta un ejemplo que muestra cómo crear una clave envuelta, tokenizar contenido y volver a identificar contenido tokenizado.
- Consulta cómo gestionar la desidentificación y la reidentificación de IPI en conjuntos de datos a gran escala con Protección de Datos Sensibles.
- Más información sobre Cloud KMS
Preparar el entorno
Implementar los recursos mediante una secuencia de comandos
Si quieres usar la secuencia de comandos de implementación sin hacer personalizaciones, sigue estos pasos. Si quieres personalizar la implementación, salta esta sección y consulta Implementar una solución personalizada manualmente.
Desplegar una solución personalizada manualmente
Si quieres personalizar la implementación, sigue estos pasos. Si quieres usar la secuencia de comandos de implementación proporcionada sin personalizaciones ni pasos manuales, consulta Implementar los recursos con una secuencia de comandos.
Definir las variables de entorno
En Cloud Shell, define las siguientes variables de entorno:
PROJECT_ID="PROJECT_ID"
REGION="REGION"
CLOUD_RUN_SERVICE_NAME="CLOUD-RUN-SERVICE-NAME"
ARTIFACT_REGISTRY_NAME="ARTIFACT-DOCKER-REGISTRY-NAME"
Haz los cambios siguientes:
Crear una cuenta de servicio para el servicio de Cloud Run
Desplegar el servicio de Cloud Run
Para implementar la aplicación, sigue estos pasos:
Crear una plantilla de desidentificación de Protección de Datos Sensibles
Las plantillas de desidentificación de Protección de Datos Sensibles te ayudan a guardar tus ajustes de desidentificación para que puedas reutilizarlos en varias operaciones y fuentes de datos.
En este paso se usa el archivo sample_dlp_deid_config.json
, que contiene una plantilla de anonimización de ejemplo.
En Cloud Shell, crea la plantilla:
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 recomienda usar una clave envuelta al cifrar cargas de trabajo sensibles reales con Protección de Datos Sensibles. Con fines de demostración, en este tutorial se usa una clave desencapsulada. Para obtener más información sobre cómo crear una clave envuelta y usarla en solicitudes de desidentificación y reidentificación, consulta Desidentificar y reidentificar datos sensibles.
Crear la conexión de BigQuery a Cloud Run
Crear el conjunto de datos de BigQuery para funciones remotas
Crear las funciones remotas de Protección de Datos Sensibles
Verificar la anonimización y la reidentificación
Para verificar si la solución anonimiza y vuelve a identificar los datos, haz lo siguiente:
Consola
bq
El resultado debería ser similar al siguiente:
Acceso | 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 |
Cuestiones importantes
Cuando adaptes este tutorial a tus necesidades, ten en cuenta lo siguiente:
Limpieza
Para evitar que los recursos utilizados en este tutorial se cobren en tu cuenta de Google Cloud, elimina el proyecto que contiene los recursos o conserva el proyecto y elimina los recursos.
Delete a Google Cloud project:
gcloud projects delete PROJECT_ID