En este instructivo, se muestra cómo desidentificar datos mientras consultas tablas de BigQuery con funciones remotas y la Protección de datos sensibles. Este enfoque es útil para limpiar 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 instructivo, se muestra la encriptación y desencriptación de datos en tránsito. Para obtener información sobre el uso de Sensitive Data Protection para encriptar datos en reposo, consulta Desidentificación de datos sensibles en el almacenamiento.
Este instructivo está dirigido a públicos cuyas responsabilidades incluyen la seguridad, el procesamiento o el análisis de datos. En esta guía, se supone que estás familiarizado con el procesamiento y la privacidad de los datos, pero no es necesario que seas un experto. En esta guía, también se supone que puedes ejecutar secuencias de comandos básicas de Cloud Shell y SQL.
En este instructivo, se usan funciones basadas en SQL, BigQuery, funciones remotas, Cloud Run y Protección de datos sensibles.
Las técnicas de desidentificación, como la encriptación, ofuscan los identificadores de confidencialidad sin procesar en tus datos. Estas técnicas te permiten conservar la utilidad de tus datos para la unión o las estadísticas y, al mismo tiempo, disminuir el riesgo de la manipulación de datos.
Es posible que las empresas tengan políticas o requisitos regulatorios para almacenar solo datos desidentificados en su almacén de datos en la nube. Además, es posible que deban reidentificar de manera eficiente los datos desidentificados para generar informes.
Para minimizar el riesgo de manipular grandes volúmenes de datos sensibles, puedes usar una canalización de transformación de datos automatizada para crear conjuntos de datos desidentificados. Puedes usar este instructivo para reemplazar esa canalización con una consulta en SQL solo para la reidentificación o para la desidentificación y la reidentificación. En este instructivo, se te ayuda a realizar la desidentificación y la reidentificación con 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.
Sensitive Data Protection puede clasificar conjuntos de datos mediante la inspección de los datos en busca de información sensible. La Protección de datos sensibles tiene más de 150 clasificadores integrados, llamados infoTypes. El uso de la API de Cloud Data Loss Prevention para desidentificar datos requiere aplicaciones y canalizaciones de datos. El objetivo de este instructivo es ayudar a tus analistas, ingenieros o científicos de datos a lograr el mismo resultado a través de funciones de SQL.
Al final de este instructivo, podrás escribir una consulta similar a la siguiente. Los datos sensibles se desidentificarán y volverán a identificarse 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 es similar a este:
Fila | 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 este instructivo usa BigQuery como almacén de datos, Sensitive Data Protection para desidentificar y volver a identificar datos, y Cloud Run para alojar las funciones remotas.
Objetivos
- Implementa un servicio de Cloud Run que proporcione la funcionalidad de desidentificación de la Protección de datos sensibles.
- Crea funciones remotas de BigQuery que usen plantillas de desidentificación de Sensitive Data Protection.
- Verifica la encriptación de datos en BigQuery con una consulta en SQL.
Costos
En este documento, usarás los siguientes componentes facturables de Google Cloud:
Para generar una estimación de costos en función del uso previsto, usa la calculadora de precios.
Cuando finalices las tareas que se describen en este documento, puedes borrar los recursos que creaste para evitar que continúe la facturación. Para obtener más información, consulta Cómo realizar una limpieza.
Antes de comenzar
- 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
Prepare el entorno
En Cloud Shell, clona el repositorio de código fuente:
git clone https://github.com/GoogleCloudPlatform/bigquery-dlp-remote-function.git
Ve al directorio de este instructivo:
cd bigquery-dlp-remote-function/
Implementa los recursos con una secuencia de comandos
Si deseas usar la secuencia de comandos de implementación sin realizar personalizaciones, sigue estos pasos. Si deseas personalizar la implementación, omite esta sección y consulta Cómo implementar una solución personalizada de forma manual.
Establece 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"
Reemplaza lo siguiente:
- PROJECT_ID: Es el ID del proyecto de este instructivo.
- REGION: Es la región en la que deseas almacenar y procesar los datos, por ejemplo,
us-west1
. Proporciona una región, no una zona.
Opcional: Si tienes una plantilla de inspección que deseas usar, establece el campo DLP_INSPECT_TEMPLATE en el nombre completo del recurso de esa plantilla de inspección. La plantilla de inspección debe estar en la misma región que configuraste en el campo REGION.
Asegúrate de que la plantilla de inspección incluya todos los infoTypes que se usan en la plantilla de desidentificación.
Si omites este paso, Sensitive Data Protection inspeccionará los datos con un conjunto predeterminado del sistema de detectores de infotipos.
DLP_INSPECT_TEMPLATE="DLP_INSPECT_TEMPLATE"
Reemplaza DLP_INSPECT_TEMPLATE por el nombre completo del recurso de la plantilla de inspección, por ejemplo,
projects/PROJECT_ID/locations/REGION/inspectTemplates/TEMPLATE_ID
.Autentica con las credenciales predeterminadas de la aplicación:
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, ingresa
yes
.Verifica que los datos se puedan encriptar y desencriptar.
Implementa una solución personalizada de forma manual
Si quieres personalizar la implementación, sigue estos pasos. Si deseas usar la secuencia de comandos de implementación proporcionada sin personalizaciones ni pasos manuales, consulta Cómo implementar los recursos con una secuencia de comandos.
Configura las variables de entorno
En Cloud Shell, establece 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"
Reemplaza lo siguiente:
- PROJECT_ID: Es el ID del proyecto de este instructivo.
- REGION: Es la región en la que deseas almacenar y procesar los datos, por ejemplo,
us-west1
. Proporciona una región, no una zona. - CLOUD_RUN_SERVICE_NAME: Es un nombre para el nuevo servicio de Cloud Run. Ingresa hasta 15 caracteres.
- ARTIFACT_REGISTRY_NAME: Es un nombre para el nuevo Artifact Registry para almacenar imágenes de contenedores.
Crea una cuenta de servicio para el servicio de Cloud Run
Crear 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}"
Otorga los roles necesarios para Sensitive Data Protection.
Otorga el rol de Lector de DLP:
gcloud projects add-iam-policy-binding "${PROJECT_ID}" \ --member="serviceAccount:${RUNNER_SA_EMAIL}" \ --role='roles/dlp.reader'
Otorga el rol de Usuario de DLP:
gcloud projects add-iam-policy-binding "${PROJECT_ID}" \ --member="serviceAccount:${RUNNER_SA_EMAIL}" \ --role='roles/dlp.user'
Implementa el servicio de Cloud Run
Para implementar la aplicación, sigue estos pasos:
Opcional: Puedes cambiar los valores predeterminados cambiando las variables de entorno o actualizando el archivo
src/main/resources/aes.properties
.Crea un repositorio de Artifact Registry para almacenar la imagen del 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, luego, impleméntala 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 del resultado 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
Recupera la URL de Cloud Run y guárdala en tus variables de entorno:
RUN_URL="$(gcloud run services describe ${CLOUD_RUN_SERVICE_NAME} --region \ ${REGION} --project ${PROJECT_ID} --format="get(status.address.url)")"
Crea una plantilla de desidentificación de Sensitive Data Protection
Las plantillas de desidentificación de Sensitive Data Protection te ayudan a guardar la configuración de desidentificación para que puedas reutilizarla en varias operaciones y fuentes de datos.
En este paso, se usa el archivo sample_dlp_deid_config.json
, que contiene una plantilla de desidentificació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 que uses una clave unida cuando realices la encriptación de Sensitive Data Protection en cargas de trabajo sensibles reales. A modo de demostración, en este instructivo, se usa una clave desenvuelta. Para obtener más información sobre cómo crear una clave unida y usarla en solicitudes de desidentificación y reidentificación, consulta Desidentifica y reidentifica datos sensibles.
Crea la conexión de BigQuery a Cloud Run
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 configura 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')"
Otorga el rol de 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'
Crea el conjunto de datos de BigQuery para las funciones remotas
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}
Crea las funciones remotas de Sensitive Data Protection
Opcional: Si tienes una plantilla de inspección que deseas usar, establece la variable DLP_INSPECT_TEMPLATE en el nombre completo del recurso de esa plantilla de inspección. La plantilla de inspección debe estar en la misma región que configuraste en la variable de entorno REGION.
Asegúrate de que la plantilla de inspección incluya todos los infoTypes que se usan en la plantilla de desidentificación.
Si omites este paso, Sensitive Data Protection inspeccionará los datos con un conjunto predeterminado del sistema de detectores de infotipos.
DLP_INSPECT_TEMPLATE="DLP_INSPECT_TEMPLATE"
Reemplaza DLP_INSPECT_TEMPLATE por el nombre completo del recurso de la plantilla de inspección, por ejemplo,
projects/PROJECT_ID/locations/REGION/inspectTemplates/TEMPLATE_ID
.Crea la función de desidentificación de 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}')]);"
Crea la función de reidentificación de 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}')]);"
Verifica la desidentificación y la reidentificación
Para verificar si la solución desidentifica y vuelve a identificar los datos, haz lo siguiente:
Console
En la consola de Google Cloud, ve a BigQuery.
Se abrirá BigQuery en el último proyecto al que accediste.
Para abrir un editor de consultas, haz clic en
Redactar una consulta nueva.Ingresa 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.
bq
Configura la variable de entorno para el conjunto de datos:
BQ_FUNCTION_DATASET="fns"
Ejecuta la siguiente 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"
El resultado es similar a este:
Fila | 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 |
Consideraciones
Cuando adaptes este instructivo a tus necesidades, ten en cuenta lo siguiente:
- 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 según tus requisitos de procesamiento. Para obtener más información, consulta los límites de CPU y los límites de memoria de Cloud Run.
- Cuando uses Sensitive Data Protection, ten en cuenta los límites de uso y las recomendaciones para controlar los costos.
Para controlar los costos y el consumo total de tu cuota de Protección de datos sensibles, limita los elementos que pasas a través de la función remota de Protección de datos sensibles a 10,000 o menos. La solución puede agrupar automáticamente las solicitudes para controlar de forma fluida los siguientes límites de solicitudes de Sensitive Data Protection:
- Cantidad máxima de valores de tabla: 50,000
- Límite de tamaño de solicitud predeterminado: 0.5 MB
Los resultados finales y filtrados de la consulta se deben pasar 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, el servicio de Cloud Run y las plantillas de Sensitive Data Protection estén en la misma región de la nube.
Limpia
Para evitar que se apliquen cargos a tu cuenta de Google Cloud por los recursos usados en este instructivo, borra el proyecto que contiene los recursos o conserva el proyecto y borra los recursos individuales.
Delete a Google Cloud project:
gcloud projects delete PROJECT_ID
¿Qué sigue?
- Obtén más información sobre las funciones remotas de BigQuery.
- Obtén más información para desidentificar datos sensibles.
- Trabaja con un ejemplo en el que se muestre cómo crear una clave unida, asignar un token al contenido y reidentificar el contenido con asignación de token.
- Obtén información para controlar la desidentificación y la reidentificación de PII en conjuntos de datos a gran escala con Sensitive Data Protection.
- Obtén más información sobre Cloud KMS.