쿼리 시 BigQuery 데이터 익명화


이 튜토리얼에서는 원격 함수와 민감한 정보 보호를 사용하여 BigQuery에서 테이블을 쿼리하는 동안 데이터를 익명화하는 방법을 보여줍니다. 이 방법은 실시간 쿼리 결과를 정리하여 분석에 필요하지 않은 데이터에 대한 액세스 권한을 최소화하는 데 유용합니다.

이 튜토리얼에서는 전송 중인 데이터의 암호화 및 복호화를 보여줍니다. 민감한 정보 보호를 사용하여 저장 데이터 암호화에 대한 자세한 내용은 스토리지의 민감한 정보 익명화를 참조하세요.

이 튜토리얼은 데이터 보안, 데이터 처리, 데이터 분석 등을 담당하는 책임자를 대상으로 합니다. 이 가이드에서는 사용자가 전문가가 아니어도 데이터 처리 및 데이터 개인 정보 보호에 익숙하다고 가정합니다. 또한 이 가이드에서는 기본 Cloud Shell 및 SQL 스크립트를 실행할 수 있다고 가정합니다.

이 튜토리얼에서는 SQL 기반 함수, BigQuery, 원격 함수, Cloud Run, 민감한 정보 보호를 사용합니다.

암호화와 같은 익명화 기법은 데이터의 민감한 원시 식별자를 난독화합니다. 이러한 기법을 사용하면 조인 또는 분석 시 데이터의 유용성을 유지하면서 데이터 처리 위험을 줄일 수 있습니다.

기업에는 클라우드 데이터 웨어하우스에 익명화된 데이터만 저장하기 위한 정책 또는 규제 요구사항이 있을 수 있습니다. 또한 보고서 생성을 위해 익명화된 데이터를 효율적으로 재식별해야 할 수도 있습니다.

자동 데이터 변환 파이프라인을 사용하여 익명화된 데이터 세트를 만들면 대량의 민감한 정보 처리 시의 위험을 최소화할 수 있습니다. 이 튜토리얼을 사용하여 파이프라인을 재식별 전용 SQL 쿼리로 바꾸거나 재식별 및 익명화용 SQL 쿼리로 바꿀 수 있습니다. 이 튜토리얼은 Cloud Run에서 호스팅되는 중앙 서비스를 사용하여 익명화 및 재식별을 모두 수행하는 데 도움이 됩니다. Dataflow 클러스터를 설정하거나 유지보수할 필요 없이 조직 전체에서 이 중앙 서비스를 사용할 수 있습니다.

민감한 정보 보호는 데이터에 민감한 정보가 있는지 검사하여 데이터 세트를 분류할 수 있습니다. 민감한 정보 보호에는 infoType이라고 하는 기본 제공 분류기가 150개 넘게 있습니다. Cloud Data Loss Prevention API를 사용하여 데이터를 익명화하려면 데이터 파이프라인과 애플리케이션이 필요합니다. 이 튜토리얼은 데이터 분석가, 엔지니어 또는 과학자가 SQL 함수를 통해 동일한 결과를 얻을 수 있도록 도와줍니다.

이 튜토리얼을 마치면 다음과 비슷한 쿼리를 작성할 수 있습니다. 민감한 정보는 익명화되고 쿼리 결과에서 재식별화됩니다.

SELECT
    pii_column,
    fns.dlp_freetext_encrypt(pii_column) AS dlp_encrypted,
    fns.dlp_freetext_decrypt(fns.dlp_freetext_encrypt(pii_column)) AS dlp_decrypted
FROM
    UNNEST(
    [
        'My name is John Doe. My email is john.doe@example.com']) AS pii_column

출력은 다음과 비슷합니다.

Row pii_column dlp_encrypted dlp_decrypted
1 My name is John Doe. My email is john.doe@example.com My name is John Doe. My email is BQ_TRF_EMAIL(40):AQy6lGvwKR+AiiRqJpEr+nBzZUzOcjXkXamUugU= My name is John Doe. My email is john.doe@example.com

아키텍처

다음 다이어그램에서는 이 튜토리얼에서 BigQuery를 데이터 웨어하우스, 민감한 정보 보호로 사용하여 데이터를 익명화 및 재식별하고 Cloud Run을 사용하여 원격 함수를 호스팅하는 방법을 보여줍니다.

이 튜토리얼의 대략적인 아키텍처 다이어그램

목표

  • 민감한 정보 보호의 익명화 기능을 제공하는 Cloud Run 서비스를 배포합니다.
  • 민감한 정보 보호 익명화 템플릿을 사용하는 BigQuery 원격 함수를 만듭니다.
  • SQL 쿼리를 사용하여 BigQuery에서 데이터 암호화를 확인합니다.

비용

이 문서에서는 비용이 청구될 수 있는 다음과 같은 Google Cloud 구성요소를 사용합니다.

프로젝트 사용량을 기준으로 예상 비용을 산출하려면 가격 계산기를 사용하세요. Google Cloud를 처음 사용하는 사용자는 무료 체험판을 사용할 수 있습니다.

이 문서에 설명된 태스크를 완료했으면 만든 리소스를 삭제하여 청구가 계속되는 것을 방지할 수 있습니다. 자세한 내용은 삭제를 참조하세요.

시작하기 전에

  1. Install the Google Cloud CLI.
  2. Configure the gcloud CLI to use your federated identity.

    For more information, see Browser-based sign-in with the gcloud CLI.

  3. To initialize the gcloud CLI, run the following command:

    gcloud init
  4. Create or select a Google Cloud project.

    • Create a Google Cloud project:

      gcloud projects create PROJECT_ID

      Replace PROJECT_ID with a name for the Google Cloud project you are creating.

    • Select the Google Cloud project that you created:

      gcloud config set project PROJECT_ID

      Replace PROJECT_ID with your Google Cloud project name.

  5. Google Cloud 프로젝트에 결제가 사용 설정되어 있는지 확인합니다.

  6. Enable the Artifact Registry, BigQuery, BigQuery Connection API, Cloud Build, Cloud Data Loss Prevention API, Cloud Key Management Service, Cloud Run, Container Registry, Identity and Access Management, Resource Manager, Secret Manager 및 서비스 사용 APIs:

    gcloud services enable artifactregistry.googleapis.com bigquery.googleapis.com bigqueryconnection.googleapis.com cloudbuild.googleapis.com cloudkms.googleapis.com cloudresourcemanager.googleapis.com containerregistry.googleapis.com dlp.googleapis.com iam.googleapis.com run.googleapis.com secretmanager.googleapis.com serviceusage.googleapis.com

환경 준비

  1. Cloud Shell에서 소스 저장소를 클론합니다.

    git clone https://github.com/GoogleCloudPlatform/bigquery-dlp-remote-function.git
    
  2. 이 튜토리얼의 디렉터리로 이동합니다.

    cd bigquery-dlp-remote-function/
    

스크립트를 사용하여 리소스 배포

맞춤설정 없이 배포 스크립트를 사용하려면 다음 단계를 수행합니다. 배포를 맞춤설정하려면 이 섹션을 건너뛰고 대신맞춤설정된 솔루션을 수동으로 배포를 참조하세요.

  1. PROJECT_IDREGION 필드의 값을 설정합니다.

    # Project ID of the Google Cloud project
    PROJECT_ID="PROJECT_ID"
    
    # Google Cloud region to use for deployment of resources
    # Refer to https://cloud.google.com/about/locations
    REGION="REGION"
    

    다음을 바꿉니다.

    • PROJECT_ID: 이 튜토리얼의 프로젝트 ID
    • REGION: 데이터를 저장하고 처리할 리전(예: us-west1) 영역이 아닌 리전을 제공합니다.
  2. 선택사항: 사용할 검사 템플릿이 있는 경우 DLP_INSPECT_TEMPLATE 필드를 해당 검사 템플릿의 전체 리소스 이름으로 설정합니다. 검사 템플릿은 REGION 필드에 설정한 것과 동일한 리전에 있어야 합니다.

    검사 템플릿에 익명화 템플릿에 사용된 모든 infoType이 포함되는지 확인합니다.

    이 단계를 건너뛰면 민감한 정보 보호는 시스템 기본 infoType 감지기 집합으로 데이터를 검사합니다.

    DLP_INSPECT_TEMPLATE="DLP_INSPECT_TEMPLATE"
    

    DLP_INSPECT_TEMPLATE를 검사 템플릿의 전체 리소스 이름(예: projects/PROJECT_ID/locations/REGION/inspectTemplates/TEMPLATE_ID)으로 바꿉니다.

  3. 애플리케이션 기본 사용자 인증 정보를 사용하여 인증합니다.

    gcloud auth application-default login && \
    gcloud auth application-default set-quota-project "${PROJECT_ID}"
    
  4. Terraform 스크립트를 초기화하고 실행하여 모든 리소스를 만듭니다.

    terraform init && \
    terraform apply \
    -var "project_id=${PROJECT_ID}" \
    -var "region=${REGION}" \
    -var "dlp_inspect_template_full_path=${DLP_INSPECT_TEMPLATE}"
    

    시스템은 Terraform에서 수행할 모든 작업을 표시합니다. 작업을 검토합니다. 계속하려면 yes를 입력합니다.

  5. 데이터를 암호화 및 복호화할 수 있는지 확인합니다.

수동으로 맞춤설정된 솔루션 배포

배포를 맞춤설정하려면 다음 단계를 따르세요. 맞춤설정 또는 수동 단계 없이 제공된 배포 스크립트를 사용하려면 대신 스크립트를 사용하여 리소스 배포를 참조하세요.

환경 변수를 설정하고,

Cloud Shell에서 다음 환경 변수를 설정합니다.

PROJECT_ID="PROJECT_ID"
REGION="REGION"
CLOUD_RUN_SERVICE_NAME="CLOUD_RUN_SERVICE_NAME"
ARTIFACT_REGISTRY_NAME="ARTIFACT_DOCKER_REGISTRY_NAME"

다음을 바꿉니다.

  • PROJECT_ID: 이 튜토리얼의 프로젝트 ID
  • REGION: 데이터를 저장하고 처리할 리전(예: us-west1) 영역이 아닌 리전을 제공합니다.
  • CLOUD_RUN_SERVICE_NAME: 새 Cloud Run의 이름. 15자(영문 기준) 이하로 입력하세요.
  • ARTIFACT_REGISTRY_NAME: 컨테이너 이미지를 저장할 새 Artifact Registry의 이름입니다.

Cloud Run 서비스의 서비스 계정 만들기

  1. 서비스 계정을 만듭니다.

    RUNNER_SA_NAME="${CLOUD_RUN_SERVICE_NAME}-runner"
    RUNNER_SA_EMAIL="${RUNNER_SA_NAME}@${PROJECT_ID}.iam.gserviceaccount.com"
    gcloud iam service-accounts create "${RUNNER_SA_NAME}" \
        --project="${PROJECT_ID}" \
        --description "Runner for BigQuery remote function execution" \
        --display-name "${RUNNER_SA_NAME}"
    
  2. 민감한 정보 보호를 위해 필요한 역할을 부여합니다.

    DLP 리더 역할을 부여합니다.

    gcloud projects add-iam-policy-binding "${PROJECT_ID}" \
        --member="serviceAccount:${RUNNER_SA_EMAIL}" \
        --role='roles/dlp.reader'
    

    DLP 사용자 역할을 부여합니다.

    gcloud projects add-iam-policy-binding "${PROJECT_ID}" \
        --member="serviceAccount:${RUNNER_SA_EMAIL}" \
        --role='roles/dlp.user'
    

Cloud Run 서비스 배포

애플리케이션을 배포하려면 다음 단계를 따르세요.

  1. 선택사항: 환경 변수를 변경하거나 src/main/resources/aes.properties 파일을 업데이트하여 기본값을 변경할 수 있습니다.

  2. Artifact Registry 저장소를 만들어 함수의 컨테이너 이미지를 저장합니다.

    gcloud artifacts repositories create "${ARTIFACT_REGISTRY_NAME}" \
    --repository-format=docker \
    --location="${REGION}" \
    --description="Container images repository for BigQuery Functions" \
    --project="${PROJECT_ID}"
    
  3. 애플리케이션을 컴파일하고 Cloud Build를 사용하여 Cloud Run에 배포합니다.

    gcloud builds submit \
    --project ${PROJECT_ID} \
    --substitutions=_CONTAINER_IMAGE_NAME="${REGION}-docker.pkg.dev/${PROJECT_ID}/${ARTIFACT_REGISTRY_NAME}/${CLOUD_RUN_SERVICE_NAME}:latest" \
    --machine-type=e2-highcpu-8 && \
    gcloud beta run deploy ${CLOUD_RUN_SERVICE_NAME} \
    --image="${REGION}-docker.pkg.dev/${PROJECT_ID}/${ARTIFACT_REGISTRY_NAME}/${CLOUD_RUN_SERVICE_NAME}:latest" \
    --execution-environment=gen2 \
    --platform=managed \
    --region="${REGION}" \
    --service-account="${RUNNER_SA_EMAIL}" \
    --cpu=4 \
    --memory=8Gi \
    --no-allow-unauthenticated \
    --project ${PROJECT_ID} \
    --update-env-vars=PROJECT_ID=${PROJECT_ID}
    

    출력의 끝부분은 다음과 비슷합니다.

    ID: 403a276e-b0c6-41f3-aaed-f0ec9f9cedba
    CREATE_TIME: 2023-02-04T01:52:15+00:00
    DURATION: 1M59S
    SOURCE: gs://PROJECT_ID_cloudbuild/source/1675475534.124241-9c43787f64e04cfd9e4a1979d3324fe0.tgz
    IMAGES: gcr.io/PROJECT_ID/CLOUD_RUN_SERVICE_NAME (+1 more)
    STATUS: SUCCESS
    Deploying container to Cloud Run service [CLOUD_RUN_SERVICE_NAME] in project [PROJECT_ID] region [REGION]
    OK Deploying new service... Done.
     OK Creating Revision... Revision deployment finished. Checking container heal
     th.
     OK Routing traffic...
    Done.
    Service [CLOUD_RUN_SERVICE_NAME] revision [CLOUD_RUN_SERVICE_NAME-00001-tat] has been deployed and is serving 100 percent of traffic.
    Service URL: https://CLOUD_RUN_SERVICE_NAME-j2bpjx2xoq-uw.a.run.app
    
  4. Cloud Run URL을 검색하고 환경 변수에 저장합니다.

    RUN_URL="$(gcloud run services describe ${CLOUD_RUN_SERVICE_NAME} --region \
        ${REGION} --project ${PROJECT_ID} --format="get(status.address.url)")"
    

민감한 정보 보호 익명화 템플릿 만들기

민감한 정보 보호 익명화 템플릿을 사용하면 여러 작업 및 데이터 소스에서 익명화 설정을 재사용할 수 있도록 저장할 수 있습니다.

이 단계에서는 익명화 템플릿 예시가 포함된 sample_dlp_deid_config.json 파일을 사용합니다.

Cloud Shell에서 템플릿을 만듭니다.

DEID_TEMPLATE=$(curl -X POST \
-H "Authorization: Bearer `gcloud auth print-access-token`" \
-H "Accept: application/json" \
-H "Content-Type: application/json" \
-H "X-Goog-User-Project: ${PROJECT_ID}" \
--data-binary "@sample_dlp_deid_config.json" \
"https://dlp.googleapis.com/v2/projects/${PROJECT_ID}/locations/${REGION}/deidentifyTemplates")

DEID_TEMPLATE_NAME="$(echo ${DEID_TEMPLATE} | jq -r '.name')"

실제 민감한 워크로드에서 민감한 정보 보호 암호화를 수행할 때는 래핑된 키를 사용하는 것이 좋습니다. 이 튜토리얼에서는 시연 목적으로 래핑되지 않은 키를 사용합니다. 래핑된 키를 만들어 익명화 및 재식별 요청에 사용하는 방법에 대한 자세한 내용은 민감한 정보 익명화 및 재식별을 참조하세요.

Cloud Run에 대한 BigQuery 연결 만들기

  1. Cloud Shell에서 Cloud Run에 액세스하기 위한 BigQuery 연결을 만듭니다.

    bq mk --connection \
    --display_name='External transform function connection' \
    --connection_type=CLOUD_RESOURCE \
    --project_id="${PROJECT_ID}" \
    --location="${REGION}" \
    ext-${CLOUD_RUN_SERVICE_NAME}
    
  2. 연결에 사용되는 BigQuery 서비스 계정을 찾아 설정합니다.

    CONNECTION_SA="$(bq --project_id ${PROJECT_ID} --format json show \
        --connection ${PROJECT_ID}.${REGION}.ext-${CLOUD_RUN_SERVICE_NAME} \
        | jq -r '.cloudResource.serviceAccountId')"
    
  3. 서비스 계정에 Cloud Run 호출자 역할을 부여합니다.

    gcloud projects add-iam-policy-binding ${PROJECT_ID} \
        --member="serviceAccount:${CONNECTION_SA}" \
        --role='roles/run.invoker'
    

원격 함수를 위한 BigQuery 데이터 세트 만들기

  1. 원격 함수의 BigQuery 데이터 세트를 정의합니다.

    BQ_FUNCTION_DATASET="fns"
    
  2. 데이터 세트가 아직 없으면 만듭니다.

       bq mk --dataset \
           --project_id ${PROJECT_ID} \
           --location ${REGION} \
           ${BQ_FUNCTION_DATASET}
    

민감한 정보 보호 원격 함수 만들기

  1. 선택사항: 사용할 검사 템플릿이 있으면 DLP_INSPECT_TEMPLATE 변수를 해당 검사 템플릿의 전체 리소스 이름으로 설정합니다. 검사 템플릿은 REGION 환경 변수에 설정한 것과 동일한 리전에 있어야 합니다.

    검사 템플릿에 익명화 템플릿에 사용된 모든 infoType이 포함되는지 확인합니다.

    이 단계를 건너뛰면 민감한 정보 보호는 시스템 기본 infoType 감지기 집합으로 데이터를 검사합니다.

    DLP_INSPECT_TEMPLATE="DLP_INSPECT_TEMPLATE"
    

    DLP_INSPECT_TEMPLATE를 검사 템플릿의 전체 리소스 이름(예: projects/PROJECT_ID/locations/REGION/inspectTemplates/TEMPLATE_ID)으로 바꿉니다.

  2. 민감한 정보 보호 익명화 함수를 만듭니다.

    bq query --project_id ${PROJECT_ID} \
    --use_legacy_sql=false \
    "CREATE OR REPLACE FUNCTION ${BQ_FUNCTION_DATASET}.dlp_freetext_encrypt(v STRING)
    RETURNS STRING
    REMOTE WITH CONNECTION \`${PROJECT_ID}.${REGION}.ext-${CLOUD_RUN_SERVICE_NAME}\`
    OPTIONS (endpoint = '${RUN_URL}', user_defined_context = [('mode', 'deidentify'),('algo','dlp'),('dlp-deid-template','${DEID_TEMPLATE_NAME}'),('dlp-inspect-template', '${DLP_INSPECT_TEMPLATE}')]);"
    
  3. 민감한 정보 보호 재식별 함수를 만듭니다.

    bq query --project_id ${PROJECT_ID} \
    --use_legacy_sql=false \
    "CREATE OR REPLACE FUNCTION ${BQ_FUNCTION_DATASET}.dlp_freetext_decrypt(v STRING)
    RETURNS STRING
    REMOTE WITH CONNECTION \`${PROJECT_ID}.${REGION}.ext-${CLOUD_RUN_SERVICE_NAME}\`
    OPTIONS (endpoint = '${RUN_URL}', user_defined_context = [('mode', 'reidentify'),('algo','dlp'),('dlp-deid-template','${DEID_TEMPLATE_NAME}'),('dlp-inspect-template', '${DLP_INSPECT_TEMPLATE}')]);"
    

익명화 및 재식별 확인

솔루션이 데이터를 익명화하고 재식별하는지 여부를 확인하려면 다음을 수행하세요.

콘솔

  1. Google Cloud 콘솔에서 BigQuery로 이동합니다.

    BigQuery로 이동

    가장 최근에 액세스한 프로젝트에서 BigQuery가 열립니다.

  2. 쿼리 편집기를 열려면 새 쿼리 작성을 클릭합니다.

  3. 다음 쿼리를 입력합니다.

    SELECT
        pii_column,
        fns.dlp_freetext_encrypt(pii_column) AS dlp_encrypted,
        fns.dlp_freetext_decrypt(fns.dlp_freetext_encrypt(pii_column)) AS dlp_decrypted
    FROM
        UNNEST(
        [
            'My name is John Doe. My email is john.doe@example.com',
            'Some non PII data',
            '650-253-0000',
            'some script with simple number 1234']) AS pii_column
    
  4. 실행을 클릭합니다.

bq

  1. 데이터 세트의 환경 변수를 설정합니다.

    BQ_FUNCTION_DATASET="fns"
    
  2. 쿼리를 실행합니다.

    bq query --project_id ${PROJECT_ID} \
    --use_legacy_sql=false \
    "
    SELECT
      pii_column,
      ${BQ_FUNCTION_DATASET}.dlp_freetext_encrypt(pii_column) AS dlp_encrypted,
    ${BQ_FUNCTION_DATASET}.dlp_freetext_decrypt(${BQ_FUNCTION_DATASET}.dlp_freetext_encrypt(pii_column)) AS dlp_decrypted
    FROM
      UNNEST(
        [
          'My name is John Doe. My email is john.doe@example.com',
          'Some non PII data',
          '650-253-0000',
          'some script with simple number 1234']) AS pii_column"
    

출력은 다음과 비슷합니다.

Row pii_column dlp_encrypted dlp_decrypted
1 My name is John Doe. My email is john.doe@example.com My name is John Doe. My email is BQ_TRF_EMAIL(40):AQy6lGvwKR+AiiRqJpEr+nBzZUzOcjXkXamUugU= My name is John Doe. My email is john.doe@example.com
2 Some non PII data Some non PII data Some non PII data
3 650-253-0000 BQ_TRF_PH(40):AeKpGU5KBXaTyecCun7dv1hHht5w5Q2PTpvkRC4= 650-253-0000
4 some script with simple number 1234 some script with simple number 1234 some script with simple number 1234

고려사항

이 튜토리얼을 필요에 맞게 조정할 때는 다음 사항을 고려하세요.

  • 익명화 및 재식별은 Cloud Run 서비스를 통해 처리됩니다. 컴퓨팅 요구사항에 따라 Cloud Run CPU와 메모리를 프로비저닝합니다. 자세한 내용은 Cloud Run의 CPU 한도메모리 한도를 참조하세요.
  • 민감한 정보 보호 기능을 사용할 때는 사용량 한도비용 관리 권장사항을 고려하세요.
  • 비용과 민감한 정보 보호 할당량 합계 소비를 제어하려면 민감한 정보 보호 원격 함수를 통해 전달하는 항목을 10,000개 이하로 제한합니다. 이 솔루션은 요청을 자동으로 일괄 처리하여 다음과 같은 민감한 정보 보호 요청 한도를 정상적으로 처리할 수 있습니다.

    • 테이블 값의 최대 개수: 50,000
    • 기본 요청 크기 한도: 0.5MB

    쿼리의 최종 결과와 필터링된 결과를 소스 대신 민감한 정보 보호 함수에 전달해야 합니다.

    이 솔루션에서 pii_column 열의 각 값은 항목입니다. 예를 들어 My name is John Doe. My email is john.doe@example.com는 한 항목입니다.

  • BigQuery 데이터 세트, Cloud Run 서비스, 민감한 정보 보호 템플릿이 같은 클라우드 리전에 있는지 확인합니다.

삭제

이 튜토리얼에서 사용된 리소스 비용이 Google Cloud 계정에 청구되지 않도록 하려면 리소스가 포함된 프로젝트를 삭제하거나 프로젝트를 유지하고 개별 리소스를 삭제하세요.

    Delete a Google Cloud project:

    gcloud projects delete PROJECT_ID

다음 단계