使用 k-匿名性直观呈现重标识风险

本主题说明如何使用 Cloud Data Loss Prevention (DLP) 衡量数据集的 k-匿名性,并在 Google Data Studio 中将其直观呈现。这样,您也可以更好地了解风险,同时有助于评估您在工具中对数据进行遮盖和去标识化时可能采用的折中。API 中也提供了 l-多样性之类的其他指标,但本主题的重点是介绍 k-匿名性。

简介

在您处理或使用数据时,去标识化技术非常有助于保护您主体的隐私。但是,如何知道数据集是否已充分进行去标识化?如何知道去标识化对于您的用例来说是否损失了太多数据?也就是说,如何将重标识风险与数据的效用进行比较,从而帮助您做出数据驱动型决策?

计算数据集的 k-匿名性值可帮助您解答这些问题,因为此操作会评估数据集记录的可重标识性。Cloud DLP 包含内置功能,可根据您指定的准标识符计算数据集上的 k-匿名性值。借此功能,您可以快速评估对某个列或列组合进行去标识化是否或多或少有可能导致对数据集进行重标识。

示例数据集

以下是某个大型数据集示例的前几行。

user_id zip_code age score
121317473 94043 25 52
121317474 92104 43 87
... ... ... ...

在本教程中,我们的侧重点在于准标识符,因此不处理 user_id。在实际场景中,您需要确保对它进行适当的遮盖或标记化处理。由于 score 列并非此数据集专有,并且攻击者不太可能通过其他方式了解,因此您不用将其包含在分析中。您将重点关注剩下的 zip_codeage 列,利用这些列,攻击者可以通过其他数据源了解个人信息。您需要回答以下有关数据集的问题:

  • 对于进行了去标识化的数据来说,这两个准标识符(zip_codeage)对其整体的重标识风险有什么影响?
  • 应用去标识化转换将如何影响这种风险?

您希望确保 zip_codeage 的组合不会映射到少数用户。例如,假设数据集中只有一个用户居住在邮编为 94043 的地区且年龄为 25 岁。攻击者可能会将这些信息与该地区的人口统计信息或其他可用信息进行交叉引用,查出该用户的身份并了解真实情报的价值。要详细了解此现象,请参阅风险分析概念主题中的实体 ID 和计算 k-匿名性部分。

步骤 1:计算数据集的 k-匿名性

首先,使用 Cloud DLP 计算数据集上的 k-匿名性。将以下 JSON 发送到资源。在此 JSON 中,将 DlpJob 实体 ID 设置为 user_id 列,并将两个准标识符标识为 zip_codeage 列。同时指示 Cloud DLP 将结果保存到 BigQuery 表格。

JSON 输入:

POST https://dlp.googleapis.com/v2/projects/[PROJECT_ID]/dlpJobs?key={YOUR_API_KEY}

{
  "riskJob":{
    "privacyMetric":{
      "kAnonymityConfig":{
        "entityId":{
          "field":{
            "name":"user_id"
          }
        },
        "quasiIds":[
          {
            "name":"zip_code"
          },
          {
            "name":"age"
          }
        ]
      }
    },
    "actions":[
      {
        "saveFindings":{
          "outputConfig":{
            "table":{
              "projectId":"dlp-demo-2",
              "datasetId":"risk",
              "tableId":"risk1"
            }
          }
        }
      }
    ],
    "sourceTable":{
      "projectId":"dlp-demo-2",
      "datasetId":"deid",
      "tableId":"source1"
    }
  }
}

k-匿名性作业完成后,Cloud DLP 会将作业结果发送到名为 dlp-demo-2.risk.risk1 的 BigQuery 表格。

步骤 2:将结果连接到 Google Data Studio

接下来,将步骤 1 中生成的 BigQuery 表连接到 Google Data Studio 中的新报告。

  1. 打开 Google Data Studio,然后点击开始新报告 (Start a new report) 下的空白选项。
  2. 在右侧的添加数据源 (Add a data source) 窗格中,点击底部的新建数据源 (CREATE NEW DATA SOURCE)。
  3. Google 连接器 (Google Connectors) 部分中,将光标指向 BigQuery,然后点击选择
  4. 在 BigQuery 数据源页面上,从列选择器中选择项目、数据集和表格。在本例中,对于项目,选择 dlp-demo-2;对于数据集,选择 risk;对于表格,选择 risk1
  5. 点击连接按钮,当三列都选择完成后,此按钮将变为蓝色。连接后,您会看到一个以不同颜色标示的字段列表,如下所示:Data Studio 中的字段列表。
  6. 字段列中,找到 upper_endpoint 字段。在汇总 (Aggregation) 下方的行中,从下拉菜单中选择求和
  7. 点击添加到报告 (Add to report)。

k-匿名性扫描结果现已添加到新的 Data Studio 报告中。在下一步中,您将创建图表。

步骤 3:创建图表

最后,根据导入的字段创建图表。执行以下操作以插入图表:

  1. 在 Data Studio 的插入菜单上,点击组合图表
  2. 在编辑器页面上想要显示图表的位置点击并绘制一个矩形。

接下来配置图表数据,以便图表显示更改存储分区大小和值范围的效果:

  1. 在右侧的数据标签下,将光标指向时间戳,然后点击带圆圈的 X 以移除日期范围维度 (Date Range Dimension)(如下图所示):
    启用了删除按钮的时间戳字段的详细信息。
  2. upper_endpoint 字段拖动到右列中的维度排序字段,然后从排序字段下的下拉菜单中选择升序
  3. bucket_sizebucket_value_count 字段拖动到指标字段中,然后移除右列中的任何其他指标选项。完成后,列应显示如下:
    字段列表的屏幕截图。
  4. 将光标指向 bucket_size 指标左侧的图标,此时将显示修改(铅笔)图标。点击修改图标,然后从相应的下拉菜单中选择以下两项:

    • 显示方式 (Display as) > 占总数的百分比 (Percent of total)
    • 应用运行计算 (Apply running calculation) > 运行求和 (Running sum)
  5. 重复上一步,不过是针对 bucket_value_count 指标。

最后,将图表配置为显示两个指标的折线图:

  1. 点击窗口右侧窗格中的样式标签。
  2. 对于这两个系列(#1 和 #2,表示 bucket_sizebucket_value_count),选择直线
  3. 要单独查看最终图表,请点击窗口右上角的查看按钮。

突出显示 k-匿名性 = 10 的最终图表。

解读图表

在生成的图表中,x 轴表示 k-匿名性值,y 轴表示数据泄露百分比。例如,在上面的屏幕截图中,突出显示的数据点的 k-匿名性值为 10。我们可以这样理解:如果删除 k-匿名性值最大为 10 的所有行,则会泄露数据集中 82% 的行。此外。还会泄露 92% 的年龄和邮编的唯一组合。上图说明,若要不泄露大量行和值,在此数据集中的 k-匿名性值很难超过 2 或 3

所幸的是,删除数据并不是唯一的选择。使用其他去标识化技术可以更好地平衡泄露和效用。例如,为了解决这种与较高的 k-匿名性值和此类数据集相关的数据泄露问题,您可以尝试对年龄或邮编进行分桶,以降低年龄/邮编组合的唯一性。例如,您可以尝试使用 20-25、25-30、30-35 等范围对年龄进行分桶。如需详细了解如何执行此操作,请参阅泛化和分桶以及对文本内容中的敏感数据进行去标识化