BigQuery에서 Sensitive Data Protection 발견 항목 쿼리

이 페이지에서는 BigQuery로 내보낸 Sensitive Data Protection 발견 항목을 분석하는 데 사용할 수 있는 쿼리 예시를 제공합니다.

발견 항목을 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 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]