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

本页面提供的查询示例可用于分析导出到 BigQuery 的敏感数据保护发现结果。

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

如需详细了解敏感数据保护在检查后可以执行的所有操作,请参阅操作概念主题。

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

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 infoTypes
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]