BigQuery で Cloud DLP の検出結果をクエリする

検出結果が BigQuery に転送されると、データが新しいテーブルまたは既存のテーブルに書き込まれます。アクションの詳細については、アクションのコンセプトのトピックをご覧ください。

サンプルクエリ

下記のサンプルクエリを使用して、検出結果を分析できます。クエリは、Google データポータルなどの可視化ツールでも使用できます。これらのクエリは、検出データのクエリを始める際にご利用いただくために提供されています。

次の各クエリでは、[DATASET] を BigQuery データセット名、[TABLE_ID] をテーブル ID、[PROJECT_ID] をプロジェクト ID に置き換えます。

各 infoType の数を選択する

Cloud Console

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 の数を日ごとに選択する

Cloud Console

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 の数を選択する

Cloud Console

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 句を変更します。たとえば、複数のテーブルの結果が結果テーブルに含まれている場合、これらの結果を 1 つのジョブ実行または 1 つのテーブル名に制限できます。

Cloud Console

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

上記のクエリで、サンプル テーブルに対して次のような結果が生成されることがあります。infoTypes 列には、その 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]