Anule a identificação dos dados do BigQuery no momento da consulta


Este tutorial mostra como desidentificar dados enquanto consulta tabelas do BigQuery através de funções remotas e da proteção de dados confidenciais. Esta abordagem é útil para limpar os resultados das consultas em tempo real de modo a minimizar o acesso a dados que não são necessários para a análise.

Este tutorial demonstra a encriptação e a desencriptação de dados em trânsito. Para obter informações sobre a utilização da proteção de dados confidenciais para encriptar dados em repouso, consulte o artigo Desidentificação de dados confidenciais no armazenamento.

Este tutorial destina-se a públicos-alvo cujas responsabilidades incluem a segurança de dados, o tratamento de dados ou a análise de dados. Este guia pressupõe que tem conhecimentos sobre o tratamento de dados e a privacidade dos dados. Não tem de ser um especialista. Este guia também pressupõe que consegue executar scripts básicos do Cloud Shell e SQL.

Este tutorial usa funções baseadas em SQL, BigQuery, funções remotas, Cloud Run e proteção de dados confidenciais.

As técnicas de desidentificação, como a encriptação, ocultam os identificadores confidenciais brutos nos seus dados. Estas técnicas permitem-lhe preservar a utilidade dos seus dados para a união ou as estatísticas, ao mesmo tempo que reduzem o risco de processamento dos dados.

As empresas podem ter políticas ou requisitos regulamentares para armazenar apenas dados anonimizados no respetivo armazém de dados na nuvem. Além disso, podem ter de reidentificar de forma eficiente os dados desidentificados para a geração de relatórios.

Para minimizar o risco de processamento de grandes volumes de dados confidenciais, pode usar um pipeline de transformação de dados automatizado para criar conjuntos de dados anonimizados. Pode usar este tutorial para substituir essa conduta por uma consulta SQL apenas para reidentificação ou para desidentificação e reidentificação. Este tutorial ajuda a realizar a desidentificação e a reidentificação através de um serviço central alojado no Cloud Run. Pode usar este serviço central em toda a organização sem ter de configurar nem manter um cluster do Dataflow.

A proteção de dados confidenciais pode classificar conjuntos de dados inspecionando os dados para encontrar informações confidenciais. A Proteção de dados confidenciais tem mais de 200 classificadores incorporados, denominados infoTypes. A utilização da API Cloud Data Loss Prevention para desidentificar dados requer pipelines de dados e aplicações. Este tutorial destina-se a ajudar os seus analistas, engenheiros ou cientistas de dados a alcançar o mesmo resultado através de funções SQL.

No final deste tutorial, vai poder escrever uma consulta semelhante à seguinte. Os dados confidenciais vão ser desidentificados e reidentificados no resultado da 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

O resultado é semelhante ao seguinte:

Linha 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

Arquitetura

O diagrama seguinte mostra como este tutorial usa o BigQuery como o armazém de dados, o Sensitive Data Protection para desidentificar e voltar a identificar dados, e o Cloud Run para alojar as funções remotas.

Diagrama de arquitetura de alto nível deste tutorial

Objetivos

  • Implemente um serviço do Cloud Run que forneça funcionalidade de desidentificação a partir da proteção de dados confidenciais.
  • Crie funções remotas do BigQuery que usem modelos de desidentificação do serviço de proteção de dados confidenciais.
  • Valide a encriptação de dados no BigQuery através de uma consulta SQL.

Custos

Neste documento, usa os seguintes componentes faturáveis do Google Cloud:

Para gerar uma estimativa de custos com base na sua utilização projetada, use a calculadora de preços.

Os novos Google Cloud utilizadores podem ser elegíveis para uma avaliação gratuita.

Quando terminar as tarefas descritas neste documento, pode evitar a faturação contínua eliminando os recursos que criou. Para mais informações, consulte o artigo Limpe.

Antes de começar

  1. 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.
  2. Install the Google Cloud CLI.

  3. Se estiver a usar um fornecedor de identidade (IdP) externo, tem primeiro de iniciar sessão na CLI gcloud com a sua identidade federada.

  4. Para inicializar a CLI gcloud, execute o seguinte comando:

    gcloud init
  5. 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 the resourcemanager.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.

  6. Verify that billing is enabled for your Google Cloud project.

  7. 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 the serviceusage.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
  8. Install the Google Cloud CLI.

  9. Se estiver a usar um fornecedor de identidade (IdP) externo, tem primeiro de iniciar sessão na CLI gcloud com a sua identidade federada.

  10. Para inicializar a CLI gcloud, execute o seguinte comando:

    gcloud init
  11. 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 the resourcemanager.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.

  12. Verify that billing is enabled for your Google Cloud project.

  13. 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 the serviceusage.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
  14. Prepare o ambiente

    1. No Cloud Shell, clone o repositório de origem:

      git clone https://github.com/GoogleCloudPlatform/bigquery-dlp-remote-function.git
      
    2. Aceda ao diretório deste tutorial:

      cd bigquery-dlp-remote-function/
      

    Implemente os recursos através de um script

    Se quiser usar o script de implementação sem fazer personalizações, siga estes passos. Se quiser personalizar a implementação, ignore esta secção e consulte Implemente uma solução personalizada manualmente.

    1. Defina os valores dos campos PROJECT_ID e 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"
      

      Substitua o seguinte:

      • PROJECT_ID: o ID do projeto para este tutorial.
      • REGION: a região onde quer armazenar e processar os dados, por exemplo, us-west1. Indique uma região e não uma zona.
    2. Opcional: se tiver um modelo de inspeção que queira usar, defina o campo DLP_INSPECT_TEMPLATE para o nome completo do recurso desse modelo de inspeção. O modelo de inspeção tem de estar na mesma região que definiu no campo REGION.

      Certifique-se de que o modelo de inspeção inclui todos os infoTypes usados no modelo de desidentificação.

      Se ignorar este passo, a Proteção de dados confidenciais inspeciona os dados com um conjunto de detetores infoType predefinidos do sistema.

      DLP_INSPECT_TEMPLATE="DLP_INSPECT_TEMPLATE"
      

      Substitua DLP_INSPECT_TEMPLATE pelo nome completo do recurso do seu modelo de inspeção, por exemplo, projects/PROJECT_ID/locations/REGION/inspectTemplates/TEMPLATE_ID.

    3. Faça a autenticação através das Credenciais padrão da aplicação:

      gcloud auth application-default login && \
      gcloud auth application-default set-quota-project "${PROJECT_ID}"
      
    4. Inicialize e execute o script do Terraform para criar todos os recursos:

      terraform init && \
      terraform apply \
      -var "project_id=${PROJECT_ID}" \
      -var "region=${REGION}" \
      -var "dlp_inspect_template_full_path=${DLP_INSPECT_TEMPLATE}"
      

      O sistema apresenta todas as ações que o Terraform vai realizar. Reveja as ações. Para continuar, introduza yes.

    5. Verifique se os dados podem ser encriptados e desencriptados.

    Implemente uma solução personalizada manualmente

    Se quiser personalizar a implementação, siga estes passos. Se quiser usar o script de implementação fornecido sem personalizações nem passos manuais, consulte o artigo Implemente os recursos através de um script.

    Defina as variáveis de ambiente

    No Cloud Shell, defina as seguintes variáveis de ambiente:

    PROJECT_ID="PROJECT_ID"
    REGION="REGION"
    CLOUD_RUN_SERVICE_NAME="CLOUD-RUN-SERVICE-NAME"
    ARTIFACT_REGISTRY_NAME="ARTIFACT-DOCKER-REGISTRY-NAME"
    

    Substitua o seguinte:

    • PROJECT_ID: o ID do projeto para este tutorial.
    • REGION: a região onde quer armazenar e processar os dados, por exemplo, us-west1. Indique uma região e não uma zona.
    • CLOUD_RUN_SERVICE_NAME: um nome para o novo serviço do Cloud Run. Introduza até 15 carateres.
    • ARTIFACT_REGISTRY_NAME: um nome para o novo Artifact Registry para armazenar imagens de contentores.

    Crie uma conta de serviço para o serviço do Cloud Run

    1. Crie uma conta de serviço:

      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. Conceda as funções necessárias para a proteção de dados confidenciais.

      Conceda a função Leitor de DLP:

      gcloud projects add-iam-policy-binding "${PROJECT_ID}" \
          --member="serviceAccount:${RUNNER_SA_EMAIL}" \
          --role='roles/dlp.reader'
      

      Conceda a função Utilizador de DLP:

      gcloud projects add-iam-policy-binding "${PROJECT_ID}" \
          --member="serviceAccount:${RUNNER_SA_EMAIL}" \
          --role='roles/dlp.user'
      

    Implemente o serviço do Cloud Run

    Para implementar a aplicação, siga estes passos:

    1. Opcional: pode alterar os valores predefinidos alterando as variáveis de ambiente ou atualizando o ficheiro src/main/resources/aes.properties.

    2. Crie um repositório do Artifact Registry para armazenar a imagem de contentor da função:

      gcloud artifacts repositories create "${ARTIFACT_REGISTRY_NAME}" \
      --repository-format=docker \
      --location="${REGION}" \
      --description="Container images repository for BigQuery Functions" \
      --project="${PROJECT_ID}"
      
    3. Compile a aplicação e implemente-a no Cloud Run através do 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}
      

      O final da saída é semelhante ao seguinte:

      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. Obtenha o URL do Cloud Run e guarde-o nas variáveis de ambiente:

      RUN_URL="$(gcloud run services describe ${CLOUD_RUN_SERVICE_NAME} --region \
          ${REGION} --project ${PROJECT_ID} --format="get(status.address.url)")"
      

    Crie um modelo de desidentificação da Proteção de dados confidenciais

    Os modelos de desidentificação da proteção de dados confidenciais ajudam a guardar as suas definições de desidentificação para que possa reutilizá-las em várias operações e origens de dados.

    Este passo usa o ficheiro sample_dlp_deid_config.json, que contém um exemplo de modelo de anonimização.

    No Cloud Shell, crie o modelo:

    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')"
    

    A Google recomenda que use uma chave protegida quando realizar a encriptação da proteção de dados confidenciais em cargas de trabalho confidenciais reais. Para fins de demonstração, este tutorial usa uma chave não envolvida. Para mais informações sobre como criar uma chave envolvida e usá-la em pedidos de desidentificação e reidentificação, consulte o artigo Desidentifique e reidentifique dados confidenciais.

    Crie a ligação do BigQuery ao Cloud Run

    1. No Cloud Shell, crie uma ligação do BigQuery para aceder ao 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. Encontre e defina a conta de serviço do BigQuery usada para a ligação:

      CONNECTION_SA="$(bq --project_id ${PROJECT_ID} --format json show \
          --connection ${PROJECT_ID}.${REGION}.ext-${CLOUD_RUN_SERVICE_NAME} \
          | jq -r '.cloudResource.serviceAccountId')"
      
    3. Conceda a função Invocador do Cloud Run à conta de serviço:

      gcloud projects add-iam-policy-binding ${PROJECT_ID} \
          --member="serviceAccount:${CONNECTION_SA}" \
          --role='roles/run.invoker'
      

    Crie o conjunto de dados do BigQuery para funções remotas

    1. Defina o conjunto de dados do BigQuery para as funções remotas:

      BQ_FUNCTION_DATASET="fns"
      
    2. Crie o conjunto de dados se ainda não existir:

         bq mk --dataset \
             --project_id ${PROJECT_ID} \
             --location ${REGION} \
             ${BQ_FUNCTION_DATASET}
      

    Crie as funções remotas da proteção de dados confidenciais

    1. Opcional: se tiver um modelo de inspeção que queira usar, defina a variável DLP_INSPECT_TEMPLATE com o nome completo do recurso desse modelo de inspeção. O modelo de inspeção tem de estar na mesma região que definiu na variável de ambiente REGION.

      Certifique-se de que o modelo de inspeção inclui todos os infoTypes usados no modelo de desidentificação.

      Se ignorar este passo, a Proteção de dados confidenciais inspeciona os dados com um conjunto de detetores infoType predefinidos do sistema.

      DLP_INSPECT_TEMPLATE="DLP_INSPECT_TEMPLATE"
      

      Substitua DLP_INSPECT_TEMPLATE pelo nome completo do recurso do seu modelo de inspeção, por exemplo, projects/PROJECT_ID/locations/REGION/inspectTemplates/TEMPLATE_ID.

    2. Crie a função de desidentificação da Proteção de dados confidenciais:

      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. Crie a função de reidentificação da Proteção de dados confidenciais:

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

    Valide a anulação da identificação e a reidentificação

    Para verificar se a solução desidentifica e reidentifica os dados, faça o seguinte:

    Consola

    1. Na Google Cloud consola, aceda ao BigQuery.

      Aceda ao BigQuery

      O BigQuery é aberto no projeto ao qual acedeu mais recentemente.

    2. Para abrir um editor de consultas, clique em Compor uma nova consulta.

    3. Introduza a seguinte 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
      
    4. Clique em Executar.

    bq

    1. Defina a variável de ambiente para o conjunto de dados:

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

    O resultado é semelhante ao seguinte:

    Linha 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

    Considerações

    Quando adaptar este tutorial às suas necessidades, considere o seguinte:

    • A anulação da identificação e a reidentificação são processadas através de um serviço do Cloud Run. Aprovisione a CPU e a memória do Cloud Run de acordo com os seus requisitos de computação. Para ver detalhes, consulte os limites de CPU e os limites de memória do Cloud Run.
    • Quando usar a proteção de dados confidenciais, tenha em atenção os limites de utilização e as recomendações para controlar os custos.
    • Para ajudar a controlar os custos e o consumo total da quota de proteção de dados confidenciais, limite os itens que transmite através da função remota de proteção de dados confidenciais a 10 000 ou menos. A solução pode agrupar automaticamente os pedidos para processar corretamente os seguintes limites de pedidos de proteção de dados confidenciais:

      • Número máximo de valores da tabela: 50 000
      • Limite de tamanho do pedido predefinido: 0,5 MB

      Os resultados finais e filtrados da consulta devem ser transmitidos à função de proteção de dados confidenciais em vez da origem.

      Para esta solução, cada valor na coluna pii_column é um item. Por exemplo, My name is John Doe. My email is john.doe@example.com é um item.

    • Certifique-se de que o conjunto de dados do BigQuery, o serviço do Cloud Run e os modelos do Sensitive Data Protection estão na mesma região da nuvem.

    Limpar

    Para evitar incorrer em custos na sua conta do Google Cloud pelos recursos usados neste tutorial, elimine o projeto que contém os recursos ou mantenha o projeto e elimine os recursos individuais.

      Delete a Google Cloud project:

      gcloud projects delete PROJECT_ID

    O que se segue?