Como validar dados desidentificados no BigQuery e reidentificar dados de PII

Neste tutorial, mostramos como validar o conjunto de dados de amostra que você desidentificou no tutorial sobre Como executar um pipeline do Dataflow automatizado para desidentificar um conjunto de dados de PII. Após a validação, reidentifique os dados usando os modelos de DLP do Cloud que foram usados anteriormente para desidentificar as informações de identificação pessoal (PII).

Este documento faz parte de uma série:

Neste tutorial, pressupomos que você esteja familiarizado com shell scripts, SQL, BigQuery e Dataflow.

Arquitetura de referência

Neste tutorial, demonstramos o pipeline de validação e reidentificação de dados ilustrado no diagrama a seguir.

Arquitetura do pipeline de reidentificação.

O pipeline de validação e reidentificação de dados valida cópias dos dados desidentificados e usa um pipeline do Dataflow para reidentificar dados em escala.

Objetivos

  • Validar um conjunto de dados desidentificado no BigQuery usando o SQL padrão.
  • Reidentificar dados usando um pipeline do Dataflow.

Custos

Neste tutorial, usamos os seguintes componentes faturáveis do Google Cloud:

Para gerar uma estimativa de custo baseada na projeção de uso deste tutorial, use a calculadora de preços. Novos usuários do Google Cloud podem ser qualificados para uma avaliação gratuita.

Ao concluir este tutorial, exclua os recursos criados para evitar o faturamento contínuo. Para mais informações, consulte Como fazer a limpeza.

Antes de começar

  1. Conclua a segunda parte da série.
  2. Conclua a terceira parte da série.

Como validar o conjunto de dados desidentificado no BigQuery

Você valida que os dados no BigQuery contêm dados desidentificados para garantir que seja seguro compartilhá-los sem expor informações PII. Como o pipeline automatizado criou uma tabela do BigQuery com base nos arquivos CSV de amostra no tutorial anterior, é possível validar os dados comparando as tabelas e os esquemas no BigQuery.

  1. No Cloud Shell, exiba a linha do cabeçalho do arquivo CSV que você usou para criar o esquema:

    head -1 solution-test/CCRecords_1564602825.csv
    

    A saída é esta:

    ID,Card Type Code,Card Type Full Name,Issuing Bank,Card Number,Card Holder's Name,Issue Date,Expiry Date,Billing Date,Card PIN,Credit Limit,Age,SSN,JobTitle,Additional Details
    
  2. No Console do Cloud, acesse a página do Editor de consultas do BigQuery.

    Acessar o Editor de consultas

  3. No Editor de consultas, execute a seguinte consulta para comparar o esquema com a linha de cabeçalho do arquivo CSV:

    select table_name, column_name
    from `deid_dataset.INFORMATION_SCHEMA.COLUMNS`
    WHERE table_name="CCRecords_1564602825"
    

    A saída é esta:

    Saída da consulta em uma tabela com nomes de coluna rotulados.

    Não há espaços nos nomes das colunas porque o pipeline garante que os nomes de colunas e tabelas contenham apenas caracteres válidos de acordo com o Padrão de nomenclatura do BigQuery.

  4. Valide se o número de linhas na tabela é 100.000:

    select count(*) as number_of_rows
    from `deid_dataset.CCRecords_*` LIMIT 1
    

    Na saída, a coluna number_of_rows é 100000 em vez de 100001. O arquivo CSV tem um registro de cabeçalho, que não está incluído na contagem de linhas da tabela.

    Saída mostrando o número de linhas.

  5. Confirme se a transformação de agrupamento por classes foi aplicada com sucesso à coluna JobTitle:

    select JobTitle, count(*) as number_of_records_found
    from `deid_dataset.CCRecords_1564602825`
    group by JobTitle
    

    Na saída, os valores JobTitle são agrupados em três buckets generalizados: Executivo, Engenheiro e Gerente.

    Saída mostrando agrupamentos de cargos.

  6. Confirme se os valores na coluna Age estão agrupados em seis buckets diferentes de 60 a 20:

    select Age, count(*) as number_of_records_found
    from `deid_dataset.CCRecords_1564602825`
    group by Age
    order by Age desc
    

    A saída é esta:

    Saída com agrupamentos por faixa etária.

    As idades e os cargos são agrupados nessas categorias para ajudar ainda mais no processo de desidentificação de PII. Por exemplo, considere um caso em que há um jovem CEO bem conhecido em uma empresa iniciante que pode ser facilmente reconhecido. Alguém pode identificar essa pessoa no conjunto de dados usando esses quase identificadores (cargo e idade) do conjunto de dados original. Uma transformação de bucket significa que é mais difícil identificar essa pessoa nas cópias desidentificadas do conjunto de dados.

  7. Valide a transformação de mascaramento para o SSN:

    select SSN
    from `deid_dataset.CCRecords_*`
    where regexp_contains(SSN, "@*")
    

    Na saída, os primeiros cinco dígitos de todas as entradas de SSN são mascarados:

    SSN da máscara de saída.

  8. Valide se a transformação criptográfica usou a criptografia determinística para as entradas card_holders_name e card_number e card_pin:

    select card_holders_name, card_number, card_pin
    from `deid_dataset.CCRecords_*`
    limit 1
    

    Na saída, todas as três entradas são substituídas por uma string criptografada codificada em base64:

    Saída que mostra a criptografia dos detalhes do cartão.

  9. Valide se a transformação infoType foi aplicada à coluna Additional Details:

    select additional_details
    from `deid_dataset.CCRecords_*`
    where regexp_contains(additional_details, r'(IBAN_CODE+)') or regexp_contains(additional_details, r'(EMAIL_ADDRESS+)')or regexp_contains(additional_details, r'(PHONE_NUMBER+)')or regexp_contains(additional_details, r'(ONLINE_USER_ID+)')
    

    Na saída, os valores confidenciais são substituídos por valores de marcador, como [IBAN_CODE], [EMAIL_ADDRESS], [PHONE_NUMBER,] e [ONLINE_USER_ID]:

    Saída que mostra valores de marcador.

  10. Consulte as cópias desidentificadas do conjunto de dados para o ID 76901:

    select * from `deid_dataset.CCRecords_1564602825` where id='76901'
    

    A saída mostra os seguintes valores:

    "ID": "76901"
    "Card_Type_Code": "AX"
    "Card_Type_Full_Name": "American Express"
    "Issuing_Bank": "American Express"
    "Card_Number": "encrypted value"
    "Card_Holders_Name": "encrypted value"
    "Issue_Date": "03/2013"
    "Expiry_Date": "03/2015"
    "Billing_Date": "14"
    "Card_PIN": "encrypted value"
    "Credit_Limit": "57000"
    "Age": "40"
    "SSN": "***-**-9395"
    "JobTitle": "Manager"
    "Additional_Details": "[IBAN_CODE][PHONE_NUMBER] [EMAIL_ADDRESS] 102-326-2388 hugedomains.com Maggio[ONLINE_USER_ID]"
    
  11. No Cloud Shell, compare a saída da etapa anterior com o conjunto de dados original no arquivo CSV para o código 76901:

    awk -F "," '$1 == 76901' solution-test/CCRecords_1564602825.csv
    

    A saída é:

    76901,AX,American Express,American Express,376467075604410,Francis U Riggs,03/2013,03/2015,14,7425,57000,43,623-12-9395,Product Manager,ES20 6871 8240 0493 0298 3587 dsumpton1nc4@reddit.com 102-326-2388 hugedomains.com Maggio:5282194096147081
    

Como reidentificar o conjunto de dados do BigQuery

Por fim, é possível reidentificar os dados de volta aos valores originais usando os modelos de DLP que foram usados para desidentificação. Para reidentificar os dados, use uma reidentificação automática pipeline do Dataflow para reidentificar o conjunto de dados em escala. Esse processo de reidentificação é útil quando a chave de criptografia de token (TEK, na sigla em inglês) precisa ser girada. É possível reidentificar o conjunto de dados antes da rotação de chaves e, em seguida, tokenizar novamente usando a nova TEK.

  1. No Cloud Shell, crie um tópico do Pub/Sub em que os valores reidentificados serão publicados:

    export TOPIC_ID="reid-topic"
    gcloud pubsub topics create ${TOPIC_ID}
    
  2. Crie uma assinatura do Pub/Sub para o tópico:

    export SUBSCRIPTION_ID="reid-subscription"
    gcloud pubsub subscriptions create ${SUBSCRIPTION_ID} --topic=${TOPIC_ID}
    
  3. Exporte a consulta SQL do BigQuery:

    export QUERY='select id,card_number,card_holders_name
    from `deid_dataset.CCRecords_1564602825`
    where safe_cast(credit_limit as int64)>100000 and safe_cast(age as int64)>50
    group by id,card_number,card_holders_name limit 10'
    

    Neste tutorial, você reidentifica o número do cartão e o nome do titular do cartão para qualquer pessoa com 50 anos ou mais e com limite de crédito acima de US$ 100.000.

  4. Faça upload da consulta no bucket de armazenamento de dados:

      cat << EOF | gsutil cp - gs://${DATA_STORAGE_BUCKET}/reid_query.sql
      ${QUERY}
      EOF
    
  5. Acione o pipeline:

    gcloud beta dataflow flex-template run "dlp-reid-demo" --project=${PROJECT_ID} \
        --region=${REGION} \
        --template-file-gcs-location=gs://dataflow-dlp-solution-sample-data/dynamic_template_dlp_v2.json --  parameters=^~^streaming=true~enableStreamingEngine=true~tempLocation=gs://${DATAFLOW_TEMP_BUCKET}/temp~numWorkers=1~maxNumWorkers=2 ~runner=DataflowRunner~tableRef=${PROJECT_ID}:deid_dataset.CCRecords_1564602825~dataset=deid_dataset~autoscalingAlgorithm=THROUGHPUT_BASED~workerMachineType=n1-highmem-8 ~topic=projects/${PROJECT_ID}/topics/${TOPIC_ID}~deidentifyTemplateName=${REID_TEMPLATE_NAME} ~DLPMethod=REID~keyRange=1024~queryPath=gs://${DATA_STORAGE_BUCKET}/reid_query.sql
    
  6. Para monitorar o pipeline, no Console do Cloud, acesse a página Dataflow.

    Acessar o Dataflow

    Depois de alguns minutos, o pipeline é concluído com êxito quando você vê:

    Conclusão bem-sucedida do pipeline com status de job bem-sucedido.

  7. Para validar os dados reidentificados, no Cloud Shell busque um registro aleatório do assinante do Pub/Sub:

    gcloud pubsub subscriptions pull ${SUBSCRIPTION_ID} \
        --auto-ack --limit 1000 --project ${PROJECT_ID} >> re-id-data.txt
    

    A saída mostra que os dados foram reidentificados com êxito para o formato original:

    cat re-id-data.txt
    

    Esta saída é semelhante a:

    {"id":"17880","Card Number":"6558977436350773","Card Holder's Name":"Elden E Courtright"}
    {"id":"57055","Card Number":"3529749048585358","Card Holder's Name":"Francisco Duffy"}
    {"id":"31487","Card Number":"6227182611813833","Card Holder's Name":"Leslie C Wade"}
    {"id":"38521","Card Number":"36533383873740","Card Holder's Name":"Laura Z Thomas"}
    {"id":"81585","Card Number":"3569920557158538","Card Holder's Name":"Kelly Reed"}
    {"id":"96408","Card Number":"340687318048371","Card Holder's Name":"Ignacio V Pisano"}
    

Como fazer a limpeza

A maneira mais fácil de eliminar o faturamento é excluir o projeto do Cloud que você criou para o tutorial. A outra opção é excluir os recursos individuais.

Exclua o projeto

  1. No Console do Cloud, acesse a página Gerenciar recursos:

    Acessar a página "Gerenciar recursos"

  2. Na lista de projetos, selecione o projeto que você quer excluir e clique em Excluir .
  3. Na caixa de diálogo, digite o ID do projeto e clique em Encerrar para excluí-lo.

A seguir