在 BigQuery 中查询敏感数据保护结果

本页提供了一些查询示例,您可以使用这些示例查询导出到 BigQuery 的敏感数据保护发现结果。

您可以配置检查作业或作业触发器,将发现结果保存到 BigQuery。这样一来,您就可以查询发现结果以进行进一步分析。将发现结果导出到 BigQuery 后,数据 会写入新表或现有表。

详细了解 Sensitive Data Protection 可以执行的所有操作 请参阅操作概念主题。

如需详细了解如何运行查询,请参阅以下内容:

BigQuery 表的列

导出发现结果表中的列基于 Finding 对象。

如果您要配置 BigQuery 表的检查,可以设置作业或作业触发器,以便导出的发现结果包含行标识符。这样,您就可以将检查结果重新关联到包含这些结果的行。

在检查作业或作业触发器中,将以下字段设置为用于唯一标识表中每一行的列的名称,即用作主键的列:

  • 如果您使用的是 Google Cloud 控制台,请设置标识字段(英文逗号 分隔)字段。
  • 如果您使用的是 DLP API,请设置 identifyingFields 属性。

完成检查并将发现结果导出到 BigQuery 后,每个发现结果都将包含您指定的列的相应值。这些值将位于 location.content_locations.record_location.record_key.id_values 字段中。然后,您可以使用这些值将发现结果重新关联到被检查的 BigQuery 表中的特定行。

查询示例

您可以使用以下示例查询来分析您的结果。您可以 也可以使用可视化工具中的查询 Looker Studio。这些查询可帮助您开始查询您的结果数据。

在以下每个查询中,替换以下内容:

  • PROJECT_ID:项目标识符
  • DATASET:BigQuery 数据集名称
  • TABLE_ID:表 ID

选择每个 infoType 的数量

Google Cloud 控制台

SELECT info_type.name,
COUNT(info_type.name) AS count
FROM `PROJECT_ID.DATASET.TABLE_ID`
GROUP BY info_type.name
ORDER BY count DESC;

命令行

bq query --use_legacy_sql=false ' SELECT info_type.name,
COUNT(info_type.name) AS count
FROM `PROJECT_ID.DATASET.TABLE_ID`
GROUP BY info_type.name ORDER BY count DESC;'

按天选择每个 infoType 的数量

Google Cloud 控制台

SELECT info_type.name, cast(TIMESTAMP_SECONDS(create_time.seconds) as date) as day,
COUNT(locations.container_name) AS count
FROM `PROJECT_ID.DATASET.TABLE_ID`,
UNNEST(location.content_locations) AS locations
GROUP BY info_type.name, day
ORDER BY count DESC;

命令行

bq query --use_legacy_sql=false ' SELECT info_type.name,
cast(TIMESTAMP_SECONDS(create_time.seconds) as date) as day,
COUNT(locations.container_name) AS count FROM `PROJECT_ID.DATASET.TABLE_ID`,
UNNEST(location.content_locations) AS locations
GROUP BY info_type.name, day ORDER BY count DESC;'

选择每个容器中各个 infoType 的数量

Google Cloud 控制台

SELECT info_type.name, locations.container_name,
COUNT(locations.container_name) AS count
FROM `PROJECT_ID.DATASET.TABLE_ID`,
UNNEST(location.content_locations) AS locations
GROUP BY locations.container_name, info_type.name
ORDER BY count DESC;

命令行

bq query --use_legacy_sql=false ' SELECT info_type.name, locations.container_name,
COUNT(locations.container_name) AS count FROM `PROJECT_ID.DATASET.TABLE_ID`,
UNNEST(location.content_locations) AS locations
GROUP BY locations.container_name,info_type.name ORDER BY count DESC;'

选择为表的每一列查找的结果类型

此查询将按列名称对所有发现结果进行分组,其目的在于 从 BigQuery 检查作业中发现的发现结果。如果您尝试识别给定列的可能性类型,此查询会很有用。您可以通过修改 WHERE 和 HAVING 子句来调整设置。例如,如果有多个 表结果会包含在发现结果表中,则可以将这些结果限制为仅包含 一个作业运行或一个表名称。

Google Cloud 控制台

SELECT
  table_counts.field_name,
  STRING_AGG( CONCAT(" ",table_counts.name," [count: ",CAST(table_counts.count_total AS String),"]")
  ORDER BY
    table_counts.count_total DESC) AS infoTypes
FROM (
  SELECT
    locations.record_location.field_id.name AS field_name,
    info_type.name,
    COUNT(*) AS count_total
  FROM
    `PROJECT_ID.DATASET.TABLE_ID`,
    UNNEST(location.content_locations) AS locations
  WHERE
    (likelihood = 'LIKELY'
      OR likelihood = 'VERY_LIKELY'
      OR likelihood = 'POSSIBLE')
  GROUP BY
    locations.record_location.field_id.name,
    info_type.name
  HAVING
    count_total>200 ) AS table_counts
GROUP BY
  table_counts.field_name
ORDER BY
  table_counts.field_name

上面的查询可能为示例表生成类似这样的结果,其中 infoType 列显示为该指定列找到的每个 infoType 的实例数量。

field_name infoType
field1 CUSTOM_USER_US [count: 7004], CUSTOM_USER_EU [count: 2996]
field2 US_VEHICLE_IDENTIFICATION_NUMBER [count: 9597]
field3 EMAIL_ADDRESS [count: 10000]
field4 IP_ADDRESS [count: 10000]
field5 PHONE_NUMBER [count: 7815]
field6 US_SOCIAL_SECURITY_NUMBER [count: 10000]
field7 CREDIT_CARD_NUMBER [count: 10000]