验证 BigQuery 中去标识化的数据并重标识个人身份信息数据

本教程介绍如何验证在运行自动 Dataflow 流水线以对个人身份信息数据集进行去标识化教程中去标识化的示例数据集。验证完成后,您需要使用先前用于对个人身份信息 (PII) 进行去标识化的 Cloud DLP 模板重标识数据

本文档是以下系列文章中的一篇:

本教程假定您熟悉 Shell 脚本、SQL、BigQuery 和 Dataflow。

参考架构

本教程演示了数据验证和重标识流水线,如下图所示。

重标识流水线架构。

数据验证和重标识流水线验证去标识化的数据的副本,并使用 Dataflow 流水线对数据进行大规模重标识。

目标

  • 使用标准 SQL 验证 BigQuery 中去标识化的数据集。
  • 使用 Dataflow 流水线重标识数据。

费用

本教程使用 Google Cloud 的以下收费组件:

您可使用价格计算器根据您的预计使用量来估算费用。 Google Cloud 新用户可能有资格申请免费试用

完成本教程后,您可以删除所创建的资源以避免继续计费。如需了解详情,请参阅清理

准备工作

  1. 完成本系列教程的第 2 部分
  2. 完成本系列教程的第 3 部分

验证 BigQuery 中去标识化的数据集

您需要验证 BigQuery 中的数据是否包含去标识化的数据,确保在不泄露个人身份信息的情况下安全共享数据。由于在上一个教程中,自动流水线基于示例 CSV 文件创建了 BigQuery 表,因此您可以通过比较 BigQuery 中的表和架构来验证数据。

  1. 在 Cloud Shell 中,显示您用于创建架构的 CSV 文件的标题行:

    head -1 solution-test/CCRecords_1564602825.csv
    

    输出如下所示:

    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. 在 Cloud Console 中,转到 BigQuery 查询编辑器页面。

    转到查询编辑器

  3. 查询编辑器中,运行以下查询,将架构与 CSV 文件的标题行进行比较:

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

    输出如下所示:

    表中标有列名称的查询输出。

    列名称中没有空格,因为流水线可确保列名称和表名称仅包含符合 BigQuery 命名标准的有效字符。

  4. 验证表中的行数是否为 100000:

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

    在输出中,number_of_rows 列为 100000,而不是 100001。CSV 文件包含一行标题记录,该行不计入表行数。

    显示行数的输出。

  5. 验证是否已成功将分桶转换应用到 JobTitle 列:

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

    在输出中,JobTitle 值被分到三个通用化存储分区中:Executive、Engineer 和 Manager。

    显示职位分组的输出。

  6. 验证 Age 列中的值是否分到 6 个不同的存储分区(60 - 20):

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

    输出如下所示:

    显示年龄分组的输出。

    按这些类别进行年龄和职位分组,可以进一步协助对个人身份信息进行去标识化的过程。例如,假设一家初创公司的年轻首席执行官很有名,容易被人认出。一些人可能会通过原始数据集中的准标识符(职位和年龄)在数据集中识别出此人。分桶转换意味着较难在去标识化的数据集副本上识别出此人。

  7. 验证 SSN 的遮盖转换:

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

    在输出中,所有 SSN 条目的前五个数字都进行了遮盖:

    遮盖了 SSN 的输出。

  8. 验证加密转换已对 card_holders_namecard_number 以及 card_pin 条目使用确定性加密:

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

    在输出中,所有三个条目都替换为 base64 编码的加密字符串:

    显示银行卡详细信息加密的输出。

  9. 验证已将 infoType 转换应用于 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+)')
    

    在输出中,敏感值会替换为占位符值,如 [IBAN_CODE][EMAIL_ADDRESS][PHONE_NUMBER,][ONLINE_USER_ID]

    显示占位符值的输出。

  10. 查询对应于 ID 76901 的数据集的去标识化副本:

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

    输出会显示以下值:

    "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. 在 Cloud Shell 中,比较上一步的输出和 CSV 文件中对应于 ID 76901 的原始数据集:

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

    输出如下:

    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
    

对 BigQuery 中的数据集进行重标识

最后,您可以使用用于去标识化的 DLP 模板将数据重标识回原始值。要重标识数据,您需要使用自动重标识 Dataflow 流水线对数据集进行大规模重标识。这种重标识过程在必须轮替令牌加密密钥 (TEK) 的情况下非常有用。您可以在轮替密钥前先重标识数据集,然后使用新的 TEK 重新标记化。

  1. 在 Cloud Shell 中,创建一个要在其中发布重标识的值的 Pub/Sub 主题:

    export TOPIC_ID="reid-topic"
    gcloud pubsub topics create ${TOPIC_ID}
    
  2. 为该主题创建 Pub/Sub 订阅:

    export SUBSCRIPTION_ID="reid-subscription"
    gcloud pubsub subscriptions create ${SUBSCRIPTION_ID} --topic=${TOPIC_ID}
    
  3. 导出 BigQuery SQL 查询:

    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'
    

    在本教程中,您需要为年满 50 周岁且信用额度超过 10 万美元的所有人重标识卡号和持卡人姓名。

  4. 在数据存储分区中上传查询:

      cat << EOF | gsutil cp - gs://${DATA_STORAGE_BUCKET}/reid_query.sql
      ${QUERY}
      EOF
    
  5. 触发流水线:

    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. 要监控流水线,请在 Cloud Console 中转到 Dataflow 页面。

    转到 Dataflow

    几分钟后,如果您看到以下内容即表示流水线成功完成:

    流水线已成功完成,作业状态为成功。

  7. 要验证重标识的数据,请在 Cloud Shell 中随机提取一条 Pub/Sub 订阅者的记录:

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

    输出显示数据已成功重标识为原始格式:

    cat re-id-data.txt
    

    输出类似于以下内容:

    {"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"}
    

清理

若要避免产生费用,最简单的方法是删除您为本教程创建的 Cloud 项目。或者,您也可以删除各个资源。

删除项目

  1. 在 Cloud Console 中,转到管理资源页面。

    转到“管理资源”

  2. 在项目列表中,选择要删除的项目,然后点击删除
  3. 在对话框中输入项目 ID,然后点击关闭以删除项目。

后续步骤