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

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

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