En este instructivo, se muestra cómo desidentificar datos mientras consultas tablas de BigQuery mediante funciones remotas y la protección de datos sensibles. Este enfoque es útil para limpiar los resultados de las consultas en tiempo real con el fin de 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. Si quieres obtener información sobre el uso de la protección de datos sensibles 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 datos; no necesitas ser 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 la protección de datos sensibles.
Las técnicas de desidentificación, como la encriptación, ofuscan los identificadores sensibles sin procesar en tus datos. Estas técnicas te permiten conservar la utilidad de tus datos para la unión o las estadísticas, a la vez que reducen el riesgo de manejar los datos.
Las empresas pueden tener políticas o requisitos reglamentarios para almacenar solo datos desidentificados en su almacén de datos en la nube. Además, es posible que necesiten volver a identificar de manera eficiente los datos desidentificados para generar informes.
Para minimizar el riesgo de manejar 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 tanto para la desidentificación como la reidentificación. En este instructivo, encontrarás ayuda para realizar tanto la desidentificación como la reidentificación mediante un servicio central alojado en Cloud Run. Puedes usar este servicio central en toda la organización sin necesidad de configurar o mantener un clúster de Dataflow.
La protección de datos sensibles 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 canalizaciones y aplicaciones de datos. El objetivo de este instructivo es ayudar a los analistas de datos, ingenieros o científicos a lograr el mismo resultado a través de las funciones de SQL.
Al final de este instructivo, podrás escribir una consulta similar a la siguiente; los datos sensibles se desidentificará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 es similar al siguiente:
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 en este instructivo se usa BigQuery como el almacén de datos, la protección de datos sensibles a fin de desidentificar y reidentificar datos, y Cloud Run para alojar las funciones remotas.
Objetivos
- Implementa un servicio de Cloud Run que proporcione la función de desidentificación de la protección de datos sensibles.
- Crear funciones remotas de BigQuery que usen plantillas de desidentificación de protección de datos sensibles
- Verificar la encriptación de datos en BigQuery mediante 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
- Install the Google Cloud CLI.
-
Configure the gcloud CLI to use your federated identity.
For more information, see Browser-based sign-in with the gcloud 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.
-
-
Asegúrate de que la facturación esté habilitada para tu proyecto de Google Cloud.
-
Enable the Artifact Registry, BigQuery, API de BigQuery Connection, Cloud Build, API de Cloud Data Loss Prevention, Cloud Key Management Service, Cloud Run, Container Registry, Identity and Access Management, Resource Manager, Secret Manager y 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
Prepara 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 mediante una secuencia de comandos
Si deseas usar la secuencia de comandos de implementación sin personalizarla, sigue estos pasos. Si quieres personalizar la implementación, omite esta sección y consulta Implementa 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 para 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, configura el campo DLP_INSPECT_TEMPLATE con el nombre completo del recurso de esa plantilla de inspección. La plantilla de inspección debe estar en la misma región que estableciste en el campo REGION.
Asegúrate de que la plantilla de inspección incluya todos los infotipos usados en la plantilla de desidentificación.
Si omites este paso, la protección de datos sensibles inspecciona 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 tu 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 Terraform realizará. Revisa las acciones. Para continuar, ingresa
yes
.Verifica que los datos se puedan encriptar y desencriptar.
Implementar manualmente una solución personalizada
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 Implementa los recursos mediante una secuencia de comandos.
Configura las variables de entorno
En Cloud Shell, configura 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 para 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 servicio nuevo de Cloud Run. Ingresa hasta 15 caracteres.
- ARTIFACT_REGISTRY_NAME: Es un nombre para el nuevo Artifact Registry para almacenar imágenes de contenedor.
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 la protección de datos sensibles.
Otorga la función Lector de DLP:
gcloud projects add-iam-policy-binding "${PROJECT_ID}" \ --member="serviceAccount:${RUNNER_SA_EMAIL}" \ --role='roles/dlp.reader'
Otorga la función 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 si cambias las variables de entorno o actualizas 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, 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 protección de datos sensibles
Las plantillas de desidentificación de protección de datos sensibles te ayudan a guardar la configuración de desidentificación para que puedas volver a usarla 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 usar una clave unida cuando realices la encriptación de protección de datos sensibles en cargas de trabajo sensibles reales. Para fines de demostración, en este instructivo se usa una clave separada. 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 vuelve a identificar 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 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 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 protección de datos sensibles
Opcional: Si tienes una plantilla de inspección que deseas usar, configura la variable DLP_INSPECT_TEMPLATE con el nombre completo del recurso de esa plantilla de inspección. La plantilla de inspección debe estar en la misma región que estableciste en la variable de entorno REGION.
Asegúrate de que la plantilla de inspección incluya todos los infotipos usados en la plantilla de desidentificación.
Si omites este paso, la protección de datos sensibles inspecciona 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 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 la 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}')]);"
Verificar la desidentificación y la reidentificación
Para verificar si la solución desidentifica y vuelve a identificar los datos, haz lo siguiente:
Consola
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
Establece la variable de entorno para el 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"
El resultado es similar al siguiente:
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 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 la protección de datos sensibles, ten en cuenta los límites de uso y las recomendaciones para controlar los costos.
Para controlar los costos y el consumo total de la cuota de protección de datos sensibles, limita los artículos que pasas por la función remota de protección de datos sensibles a 10,000 o menos. La solución puede agrupar automáticamente las solicitudes en lotes para administrar de forma correcta los siguientes límites de solicitudes de protección de datos sensibles:
- Cantidad máxima de valores de la tabla: 50,000
- Límite de tamaño predeterminado de la solicitud: 0.5 MB
Los resultados finales y filtrados de la consulta deben pasarse a la función de protección de datos sensibles en lugar de a la fuente.
Para 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 el conjunto de datos de BigQuery, el servicio de Cloud Run y las plantillas de protección de datos sensibles 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.
Borra un proyecto de Google Cloud:
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 sobre cómo desidentificar datos sensibles.
- Revisa un ejemplo en el que se muestra cómo crear una clave unida, asignar tokens al contenido y volver a identificar el contenido con tokens.
- Obtén información sobre cómo manejar la desidentificación y la reidentificación de PII en conjuntos de datos a gran escala con la protección de datos sensibles.
- Obtén más información sobre Cloud KMS.