BigQuery의 익명화된 데이터 유효성 검사 및 PII 데이터 재식별

이 가이드에서는 자동화된 Dataflow 파이프라인을 실행하여 PII 데이터 세트 익명화하기 가이드에서 익명화한 샘플 데이터 세트의 유효성을 검사하는 방법을 보여줍니다. 유효성을 검사한 후 이전에 개인 식별 정보(PII)익명화할 때 사용했던 Cloud DLP 템플릿을 사용하여 데이터를 재식별합니다.

이 문서는 시리즈의 일부입니다.

이 가이드에서는 사용자가 셸 스크립트, SQL, BigQuery, Dataflow에 익숙하다고 가정합니다.

참조 아키텍처

이 가이드에서는 아래 다이어그램에 묘사된 바와 같이 데이터 유효성 검사와 재식별 파이프라인을 보여줍니다.

재식별 파이프라인 아키텍처

데이터 유효성 검사 및 재식별 파이프라인은 익명화된 데이터 사본의 유효성을 검사하고 Dataflow 파이프라인을 사용하여 대규모 데이터를 재식별합니다.

목표

  • 표준 SQL을 사용하여 BigQuery의 익명화된 데이터 세트의 유효성을 검사합니다.
  • Dataflow 파이프라인을 사용하여 데이터를 재식별합니다.

비용

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

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

이 가이드를 마치면 만든 리소스를 삭제하여 비용이 계속 청구되지 않게 할 수 있습니다. 자세한 내용은 삭제를 참조하세요.

시작하기 전에

  1. 시리즈의 2부를 완료합니다.
  2. 시리즈의 3부를 완료합니다.

BigQuery의 익명화된 데이터 세트 유효성 검사

BigQuery의 데이터에 익명화된 데이터가 포함되어 있는지 확인하여 PII가 노출되지 않고 공유하기에 안전한지 확인합니다. 이전 가이드에서 자동화된 파이프라인이 샘플 CSV 파일을 토대로 BigQuery 테이블을 생성했기 때문에 BigQuery의 스키마와 테이블을 비교하여 데이터의 유효성을 검사할 수 있습니다.

  1. Cloud Shell에서 스키마를 생성하는 데 사용한 CSV 파일의 헤더 행을 표시합니다.

    head -1 solution-test/CCRecords_1564602825.csv
    

    출력은 다음과 같습니다.

    ID,Card Type Code,Card Type Full Name,Issuing Bank,Card Number,Card Holder's Name,Issue Date,Expiry Date,Billing Date,Card PIN,Credit Limit,Age,SSN,JobTitle,Additional Details
    
  2. Cloud Console에서 BigQuery 쿼리 편집기 페이지로 이동합니다.

    쿼리 편집기로 이동

  3. 쿼리 편집기에서 다음 쿼리를 실행하여 스키마를 CSV 파일의 헤더 행과 비교합니다.

    select table_name, column_name
    from `deid_dataset.INFORMATION_SCHEMA.COLUMNS`
    WHERE table_name="CCRecords_1564602825"
    

    출력은 다음과 같습니다.

    레이블이 지정된 열 이름이 있는 테이블의 쿼리 출력

    파이프라인은 BigQuery 명명 표준에 따라 열 및 테이블 이름에 유효한 문자만 포함되도록 하므로 열 이름에는 공백이 없습니다.

  4. 테이블의 행 수가 100,000개인지 확인합니다.

    select count(*) as number_of_rows
    from `deid_dataset.CCRecords_*` LIMIT 1
    

    출력에서 number_of_rows 열은 100001이 아닌 100000입니다. CSV 파일에는 테이블 행 개수에 포함되지 않은 헤더 레코드가 있습니다.

    행 수를 보여주는 출력

  5. JobTitle 열에 버케팅 변환이 성공적으로 적용되었는지 확인합니다.

    select JobTitle, count(*) as number_of_records_found
    from `deid_dataset.CCRecords_1564602825`
    group by JobTitle
    

    출력에서 JobTitle 값은 3개의 일반화된 버킷 Executive, Engineer, Manager로 그룹화됩니다.

    직무 그룹화를 보여주는 출력

  6. Age 열의 값이 60에서 20까지 6개의 다른 버킷으로 그룹화되었는지 확인합니다.

    select Age, count(*) as number_of_records_found
    from `deid_dataset.CCRecords_1564602825`
    group by Age
    order by Age desc
    

    출력은 다음과 같습니다.

    연령 그룹화를 보여주는 출력

    연령과 직무가 이러한 범주로 그룹화된 이유는 PII 익명화 프로세스를 돕기 위함입니다. 예를 들어 쉽게 알아볼 수 있는 스타트업 회사의 유명한 젊은 CEO가 있는 경우를 생각해 보십시오. 누군가는 원본 데이터 세트의 이러한 유사 식별자(직무와 연령)를 사용하여 데이터 세트에서 이 사람을 식별할 수도 있습니다. 버케팅 변환은 데이터 세트의 익명화된 사본에서 이 사람을 보다 식별하기 어렵게 만드는 것입니다.

  7. 사회보장번호(SSN) 마스킹 변환의 유효성을 검사합니다.

    select SSN
    from `deid_dataset.CCRecords_*`
    where regexp_contains(SSN, "@*")
    

    출력에서 모든 SSN 항목의 처음 5자리가 마스킹됩니다.

    SSN이 마스킹된 출력

  8. card_holders_name, card_number, card_pin 항목의 암호화 변환에 확정적 암호화가 사용되었는지 확인합니다.

    select card_holders_name, card_number, card_pin
    from `deid_dataset.CCRecords_*`
    limit 1
    

    출력에서는 세 항목 모두 base64 인코딩 암호화된 문자열로 대체되었습니다.

    카드 세부정보의 암호화를 보여주는 출력

  9. Additional Details 열에 infoType 변환이 적용되었는지 확인합니다.

    select additional_details
    from `deid_dataset.CCRecords_*`
    where regexp_contains(additional_details, r'(IBAN_CODE+)') or regexp_contains(additional_details, r'(EMAIL_ADDRESS+)')or regexp_contains(additional_details, r'(PHONE_NUMBER+)')or regexp_contains(additional_details, r'(ONLINE_USER_ID+)')
    

    출력에서 민감한 값은 [IBAN_CODE], [EMAIL_ADDRESS], [PHONE_NUMBER,], [ONLINE_USER_ID]와 같은 자리표시자 값으로 대체되었습니다.

    자리표시자 값을 보여주는 출력

  10. ID 76901에서 데이터 세트의 익명화된 사본을 쿼리합니다.

    select * from `deid_dataset.CCRecords_1564602825` where id='76901'
    

    출력에 다음 값이 표시됩니다.

    "ID": "76901"
    "Card_Type_Code": "AX"
    "Card_Type_Full_Name": "American Express"
    "Issuing_Bank": "American Express"
    "Card_Number": "encrypted value"
    "Card_Holders_Name": "encrypted value"
    "Issue_Date": "03/2013"
    "Expiry_Date": "03/2015"
    "Billing_Date": "14"
    "Card_PIN": "encrypted value"
    "Credit_Limit": "57000"
    "Age": "40"
    "SSN": "***-**-9395"
    "JobTitle": "Manager"
    "Additional_Details": "[IBAN_CODE][PHONE_NUMBER] [EMAIL_ADDRESS] 102-326-2388 hugedomains.com Maggio[ONLINE_USER_ID]"
    
  11. Cloud Shell에서 이전 단계로 얻은 출력과 ID 76901에 대한 CSV 파일의 원본 데이터 세트를 비교합니다.

    awk -F "," '$1 == 76901' solution-test/CCRecords_1564602825.csv
    

    출력은 다음과 같습니다.

    76901,AX,American Express,American Express,376467075604410,Francis U Riggs,03/2013,03/2015,14,7425,57000,43,623-12-9395,Product Manager,ES20 6871 8240 0493 0298 3587 dsumpton1nc4@reddit.com 102-326-2388 hugedomains.com Maggio:5282194096147081
    

BigQuery의 데이터세트 재식별

마지막으로, 익명화에 사용했던 DLP 템플릿을 사용하여 데이터를 원본 값으로 재식별할 수 있습니다. 데이터를 재식별하기 위해 대량의 데이터 세트를 재식별하는 자동화된 재식별 Dataflow 파이프라인을 사용합니다. 이 재식별 프로세스는 토큰 암호화 키(TEK)를 반드시 순환시켜야 할 때 유용합니다. 키 순환 전에 데이터 세트를 재식별하고 새로운 TEK로 토큰화할 수 있습니다.

  1. Cloud Shell에서 재식별된 값이 게시될 Pub/Sub 주제를 만듭니다.

    export TOPIC_ID="reid-topic"
    gcloud pubsub topics create ${TOPIC_ID}
    
  2. 주제의 Pub/Sub 구독을 만듭니다.

    export SUBSCRIPTION_ID="reid-subscription"
    gcloud pubsub subscriptions create ${SUBSCRIPTION_ID} --topic=${TOPIC_ID}
    
  3. BigQuery SQL 쿼리를 내보냅니다.

    export QUERY='select id,card_number,card_holders_name
    from `deid_dataset.CCRecords_1564602825`
    where safe_cast(credit_limit as int64)>100000 and safe_cast(age as int64)>50
    group by id,card_number,card_holders_name limit 10'
    

    이 가이드에서는 50세 이상이고 신용 한도가 10만 달러를 초과하는 사람의 카드 번호와 카드 소지자 이름을 재식별합니다.

  4. 데이터 스토리지 버킷에 쿼리를 업로드합니다.

      cat << EOF | gsutil cp - gs://${DATA_STORAGE_BUCKET}/reid_query.sql
      ${QUERY}
      EOF
    
  5. 파이프라인을 트리거합니다.

    gcloud beta dataflow flex-template run "dlp-reid-demo" --project=${PROJECT_ID} \
        --region=${REGION} \
        --template-file-gcs-location=gs://dataflow-dlp-solution-sample-data/dynamic_template_dlp_v2.json --  parameters=^~^streaming=true~enableStreamingEngine=true~tempLocation=gs://${DATAFLOW_TEMP_BUCKET}/temp~numWorkers=1~maxNumWorkers=2 ~runner=DataflowRunner~tableRef=${PROJECT_ID}:deid_dataset.CCRecords_1564602825~dataset=deid_dataset~autoscalingAlgorithm=THROUGHPUT_BASED~workerMachineType=n1-highmem-8 ~topic=projects/${PROJECT_ID}/topics/${TOPIC_ID}~deidentifyTemplateName=${REID_TEMPLATE_NAME} ~DLPMethod=REID~keyRange=1024~queryPath=gs://${DATA_STORAGE_BUCKET}/reid_query.sql
    
  6. 파이프라인을 모니터링하기 위해 Cloud Console에서 Dataflow 페이지로 이동합니다.

    Dataflow로 이동

    몇 분 후 다음과 같이 표시되면 파이프라인이 성공적으로 완료된 것입니다.

    성공적으로 완료되었으며 작업 상태가 성공인 파이프라인

  7. 재식별된 데이터의 유효성을 검사하려면 Cloud Shell에서 Pub/Sub 구독자로부터 무작위로 레코드를 가져옵니다.

    gcloud pubsub subscriptions pull ${SUBSCRIPTION_ID} \
        --auto-ack --limit 1000 --project ${PROJECT_ID} >> re-id-data.txt
    

    출력은 데이터가 원본 형식으로 성공적으로 재식별되었음을 보여줍니다.

    cat re-id-data.txt
    

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

    {"id":"17880","Card Number":"6558977436350773","Card Holder's Name":"Elden E Courtright"}
    {"id":"57055","Card Number":"3529749048585358","Card Holder's Name":"Francisco Duffy"}
    {"id":"31487","Card Number":"6227182611813833","Card Holder's Name":"Leslie C Wade"}
    {"id":"38521","Card Number":"36533383873740","Card Holder's Name":"Laura Z Thomas"}
    {"id":"81585","Card Number":"3569920557158538","Card Holder's Name":"Kelly Reed"}
    {"id":"96408","Card Number":"340687318048371","Card Holder's Name":"Ignacio V Pisano"}
    

삭제

비용이 청구되지 않도록 하는 가장 쉬운 방법은 가이드에서 만든 Cloud 프로젝트를 삭제하는 것입니다. 또는 개별 리소스를 삭제할 수 있습니다.

프로젝트 삭제

  1. Cloud Console에서 리소스 관리 페이지로 이동합니다.

    리소스 관리로 이동

  2. 프로젝트 목록에서 삭제할 프로젝트를 선택하고 삭제를 클릭합니다.
  3. 대화상자에서 프로젝트 ID를 입력한 후 종료를 클릭하여 프로젝트를 삭제합니다.

다음 단계