Desidentificar datos de BigQuery en el momento de la consulta


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 [email protected]']) 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 [email protected] My name is John Doe. My email is BQ_TRF_EMAIL(40):AQy6lGvwKR+AiiRqJpEr+nBzZUzOcjXkXamUugU= My name is John Doe. My email is [email protected]

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.

Diagrama de arquitectura de alto nivel de este instructivo

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. Es posible que los usuarios nuevos de Google Cloud califiquen para obtener una prueba gratuita.

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

  1. Accede a tu cuenta de Google Cloud. Si eres nuevo en Google Cloud, crea una cuenta para evaluar el rendimiento de nuestros productos en situaciones reales. Los clientes nuevos también obtienen $300 en créditos gratuitos para ejecutar, probar y, además, implementar cargas de trabajo.
  2. Instala Google Cloud CLI.
  3. Para inicializar la CLI de gcloud, ejecuta el siguiente comando:

    gcloud init
  4. Crea o selecciona un proyecto de Google Cloud.

    • Crea un proyecto de Google Cloud:

      gcloud projects create PROJECT_ID

      Reemplaza PROJECT_ID por un nombre para el proyecto de Google Cloud que estás creando.

    • Selecciona el proyecto de Google Cloud que creaste:

      gcloud config set project PROJECT_ID

      Reemplaza PROJECT_ID por el nombre del proyecto de Google Cloud.

  5. Asegúrate de que la facturación esté habilitada para tu proyecto de Google Cloud.

  6. Habilita las APIs de 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:

    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
  7. Instala Google Cloud CLI.
  8. Para inicializar la CLI de gcloud, ejecuta el siguiente comando:

    gcloud init
  9. Crea o selecciona un proyecto de Google Cloud.

    • Crea un proyecto de Google Cloud:

      gcloud projects create PROJECT_ID

      Reemplaza PROJECT_ID por un nombre para el proyecto de Google Cloud que estás creando.

    • Selecciona el proyecto de Google Cloud que creaste:

      gcloud config set project PROJECT_ID

      Reemplaza PROJECT_ID por el nombre del proyecto de Google Cloud.

  10. Asegúrate de que la facturación esté habilitada para tu proyecto de Google Cloud.

  11. Habilita las APIs de 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:

    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

  1. En Cloud Shell, clona el repositorio de código fuente:

    git clone https://github.com/GoogleCloudPlatform/bigquery-dlp-remote-function.git
    
  2. 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.

  1. 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.
  2. 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.

  3. Autentica con las credenciales predeterminadas de la aplicación:

    gcloud auth application-default login && \
    gcloud auth application-default set-quota-project "${PROJECT_ID}"
    
  4. 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.

  5. 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

  1. 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}"
    
  2. 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:

  1. Opcional: Puedes cambiar los valores predeterminados si cambias las variables de entorno o actualizas el archivo src/main/resources/aes.properties.

  2. 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}"
    
  3. 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
    
  4. 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

  1. 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}
    
  2. 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')"
    
  3. 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

  1. Define el conjunto de datos de BigQuery para las funciones remotas:

    BQ_FUNCTION_DATASET="fns"
    
  2. 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

  1. 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.

  2. 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}')]);"
    
  3. 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

  1. En la consola de Google Cloud, ve a BigQuery.

    Ir a BigQuery

    Se abrirá BigQuery en el último proyecto al que accediste.

  2. Para abrir un editor de consultas, haz clic en Redactar una consulta nueva.

  3. 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 [email protected]',
            'Some non PII data',
            '650-253-0000',
            'some script with simple number 1234']) AS pii_column
    
  4. Haz clic en Ejecutar.

bq

  1. Establece la variable de entorno para el conjunto de datos:

    BQ_FUNCTION_DATASET="fns"
    
  2. 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 [email protected]',
          '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 [email protected] My name is John Doe. My email is BQ_TRF_EMAIL(40):AQy6lGvwKR+AiiRqJpEr+nBzZUzOcjXkXamUugU= My name is John Doe. My email is [email protected]
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 [email protected] 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?