DLP API 및 Cloud Functions를 사용하여 Cloud Storage에 업로드된 데이터 자동 분류

1. 개요

오늘날의 조직에서는 다양한 소스에서 유입되는 데이터 양이 계속 증가하고 있습니다. 이를 위해서는 전략적으로 데이터를 저장하고 보호하기 위해 데이터를 격리하고 분류해야 하는 경우가 많습니다. 이 작업은 수동으로 유지될 경우 비용이 빠르게 증가하고 불가능해집니다.

이 Codelab에서는 Cloud Storage에 업로드된 데이터를 자동으로 분류하고 해당 스토리지 버킷으로 이동하는 방법을 알아봅니다. Cloud Pub/Sub, Cloud Functions, Cloud Data Loss Prevention, Cloud Storage를 사용하여 이를 달성합니다.

실습할 내용

  • 격리 및 분류 파이프라인의 일부로 사용되는 Cloud Storage 버킷을 만듭니다.
  • 파일이 업로드되면 DLP API를 호출하는 간단한 Cloud 함수를 만듭니다.
  • 파일 처리 완료 시점을 알려주는 Pub/Sub 주제 및 구독을 만듭니다.
  • 격리 버킷에 샘플 파일을 업로드하여 Cloud 함수 호출
  • DLP API를 사용하여 파일을 검사하고 분류한 후 적절한 버킷으로 이동합니다.

필요한 항목

2. 설정

이 Codelab에서는 Cloud Shell을 통해 명령줄을 사용하여 다양한 클라우드 리소스와 서비스를 프로비저닝하고 관리합니다. 다음과 같이 하면 Cloud Shell과 Cloud Shell 편집기가 열리고 동반 프로젝트 저장소가 클론됩니다.

gcloud config set project [PROJECT_ID]을 사용하여 올바른 프로젝트를 설정합니다.

API 사용 설정

Google Cloud 프로젝트에서 필요한 API를 사용 설정합니다.

  • Cloud Functions API - 이벤트에 대한 응답으로 실행되는 간단한 사용자 제공 함수를 관리합니다.
  • Cloud Data Loss Prevention (DLP) API - 텍스트, 이미지, Google Cloud Platform 스토리지 저장소에서 민감한 개인 정보 보호 프래그먼트를 감지, 위험 분석, 익명화하는 방법을 제공합니다.
  • Cloud Storage: Google Cloud Storage는 Google 인프라에 데이터를 저장하고 액세스하기 위한 RESTful 서비스입니다.

서비스 계정 권한

서비스 계정은 애플리케이션과 가상 머신이 승인된 API 호출을 수행하는 데 사용하는 특별한 유형의 계정입니다.

App Engine 기본 서비스 계정

App Engine 기본 서비스 계정은 App Engine에서 실행되는 앱을 대신하여 Cloud 프로젝트에서 작업을 실행하는 데 사용됩니다. 이 서비스 계정은 편집자 역할이 할당된 상태로 기본적으로 프로젝트에 존재합니다.

먼저 데이터 손실 방지 작업을 관리하는 데 필요한 DLP 관리자 역할을 서비스 계정에 부여합니다.

gcloud projects add-iam-policy-binding $GOOGLE_CLOUD_PROJECT \
--member serviceAccount:$GOOGLE_CLOUD_PROJECT@appspot.gserviceaccount.com \
--role roles/dlp.admin

마지막으로 서비스 계정에 BigQuery, Storage, Datastore, Pub/Sub, 키 관리 서비스에 대한 권한을 부여하는 DLP API 서비스 에이전트 역할을 부여합니다.

gcloud projects add-iam-policy-binding $GOOGLE_CLOUD_PROJECT \
--member serviceAccount:$GOOGLE_CLOUD_PROJECT@appspot.gserviceaccount.com \
--role roles/dlp.serviceAgent

DLP 서비스 계정

App Engine 서비스 계정 외에도 DLP 서비스 계정도 사용합니다. 이 서비스 계정은 DLP API가 사용 설정될 때 자동으로 생성되며 처음에는 역할이 부여되지 않습니다. 뷰어 역할을 부여해 보겠습니다.

gcloud projects add-iam-policy-binding $GOOGLE_CLOUD_PROJECT \
--member serviceAccount:service-`gcloud projects list --filter="PROJECT_ID:$GOOGLE_CLOUD_PROJECT" --format="value(PROJECT_NUMBER)"`@dlp-api.iam.gserviceaccount.com \
--role roles/viewer

3. Cloud Storage 버킷

이제 데이터를 저장할 Cloud Storage 버킷 3개를 만들어야 합니다.

  • 격리 버킷: 데이터가 처음 업로드되는 위치입니다.
  • 민감한 정보 버킷: DLP API에서 민감한 것으로 판단한 데이터가 여기로 이동됩니다.
  • 민감하지 않은 정보 버킷: DLP API에서 민감하지 않다고 판단한 데이터가 여기로 이동됩니다.

gsutil 명령어를 사용하여 세 버킷을 모두 한 번에 만들 수 있습니다.

gsutil mb gs://[YOUR_QUARANTINE_BUCKET] \
gs://[YOUR_SENSITIVE_DATA_BUCKET] \
gs://[YOUR_NON_SENSITIVE_DATA_BUCKET] 

방금 만든 버킷의 이름을 적어 둡니다. 나중에 필요합니다.

4. Pub/Sub 주제 및 구독

Cloud Pub/Sub는 애플리케이션 간의 다대다 비동기 메시지 기능을 제공합니다. 게시자는 메시지를 만들어 주제라는 메시지 피드에 게시합니다. 구독자구독을 통해 이러한 메시지를 수신합니다. 이 구독을 기반으로 DLP 작업이 실행된 후 Cloud 함수가 파일을 각 버킷으로 이동합니다.

먼저 주제를 만들어 보겠습니다. 파일이 격리 저장소 버킷에 추가될 때마다 여기에 메시지가 게시됩니다. 이름을'classify-topic'으로 지정합니다.

gcloud pubsub topics create classify-topic

주제에서 메시지를 게시하면 구독에 알림이 전송됩니다. 'classify-sub'이라는 Pub/Sub 구독을 만들어 보겠습니다.

gcloud pubsub subscriptions create classify-sub --topic classify-topic

이 구독은 파일을 검사하고 적절한 위치로 이동하는 DLP 작업을 시작하는 두 번째 Cloud 함수를 트리거합니다.

5. Cloud Functions

Cloud Functions를 사용하면 서버나 런타임 환경을 관리할 필요 없이 경량의 이벤트 기반 비동기 단일 목적 함수를 배포할 수 있습니다. dlp-cloud-functions-tutorials/gcs-dlp-classification-python/에 있는 제공된 main.py 파일을 사용하여 2개의 Cloud 함수를 배포합니다.

변수 바꾸기

함수를 만들기 전에 main.py 파일에서 몇 가지 변수를 바꿔야 합니다.

Cloud Shell 편집기에서 28~34행의 프로젝트 ID 및 버킷 변수 값을 이전에 만든 해당 버킷으로 바꿔 main.py를 수정합니다.

main.py

PROJECT_ID = '[PROJECT_ID_HOSTING_STAGING_BUCKET]'
"""The bucket the to-be-scanned files are uploaded to."""
STAGING_BUCKET = '[YOUR_QUARANTINE_BUCKET]'
"""The bucket to move "sensitive" files to."""
SENSITIVE_BUCKET = '[YOUR_SENSITIVE_DATA_BUCKET]'
"""The bucket to move "non sensitive" files to."""
NONSENSITIVE_BUCKET = '[YOUR_NON_SENSITIVE_DATA_BUCKET]'

또한 pub/sub 주제 변수의 값을 이전 단계에서 만든 pub/sub 주제로 바꿉니다.

""" Pub/Sub topic to notify once the  DLP job completes."""
PUB_SUB_TOPIC = 'classify-topic'

함수 배포

Cloud Shell에서 main.py 파일이 있는 gcs-dlp-classification-python 디렉터리로 변경합니다.

cd ~/cloudshell_open/dlp-cloud-functions-tutorials/gcs-dlp-classification-python

이제 함수를 배포할 차례입니다.

먼저 create_DLP_job 함수를 배포합니다. 이때 [YOUR_QUARANTINE_BUCKET] 을 올바른 버킷 이름으로 바꿉니다. 이 함수는 새 파일이 지정된 Cloud Storage 격리 버킷에 업로드될 때 트리거되며 업로드된 각 파일에 대해 DLP 작업을 만듭니다.

gcloud functions deploy create_DLP_job --runtime python37 \
--trigger-event google.storage.object.finalize \
--trigger-resource [YOUR_QUARANTINE_BUCKET]

다음으로 resolve_DLP 함수를 배포하여 주제를 트리거로 표시합니다. 이 함수는 위의 함수에서 후속 DLP 작업에서 시작된 pub/sub 알림을 수신합니다. Pub/Sub 알림을 받는 즉시 DLP 작업의 결과를 가져와 파일을 민감한 버킷 또는 민감하지 않은 버킷으로 이동합니다.

gcloud functions deploy resolve_DLP --runtime python37 \
--trigger-topic classify-topic

확인

gcloud functions describe 명령어를 사용하여 두 Cloud 함수가 모두 성공적으로 배포되었는지 확인합니다.

gcloud functions describe create_DLP_job
gcloud functions describe resolve_DLP

성공적으로 배포되면 상태가 ACTIVE로 표시됩니다.

6. 샘플 데이터로 테스트

모든 부분이 준비되었으므로 이제 샘플 파일로 테스트해 볼 수 있습니다. Cloud Shell에서 현재 작업 디렉터리를 sample_data로 변경합니다.

cd ~/cloudshell_open/dlp-cloud-functions-tutorials/sample_data

샘플 파일은 다양한 데이터가 포함된 txt 및 csv 파일로 구성됩니다. 'sample_s'로 시작하는 파일에는 민감한 정보가 포함되고 'sample_n'으로 시작하는 파일에는 민감한 정보가 포함되지 않습니다. 예를 들어 sample_s20.csv에는 미국 사회보장번호처럼 보이도록 형식이 지정된 내용이 포함되어 있습니다.

sample_s20.csv

Name,SSN,metric 1,metric 2
Maria Johnson,284-73-5110,5,43
Tyler Parker,284-73-5110,8,17
Maria Johnson,284-73-5110,54,63
Maria Johnson,245-25-8698,53,19
Tyler Parker,475-15-8499,6,67
Maria Johnson,719-12-6560,75,83
Maria Johnson,616-69-3226,91,13
Tzvika Roberts,245-25-8698,94,61

반면 sample_n15.csv의 데이터는 민감한 정보로 간주되지 않습니다.

sample_n15.csv

record id,metric 1,metric 2,metric 3
1,59,93,100
2,53,13,17
3,59,67,53
4,52,93,34
5,14,22,88
6,18,88,3
7,32,49,5
8,93,46,14

설정에서 파일을 어떻게 처리하는지 확인하려면 모든 테스트 파일을 격리 폴더에 업로드하세요.

bucket:

gsutil -m cp * gs://[YOUR_QUARANTINE_BUCKET]

처음에는 파일을 업로드한 격리 버킷에 파일이 저장됩니다. 이를 확인하려면 파일을 업로드한 직후 격리 버킷의 콘텐츠를 나열하세요.

gsutil ls gs://[YOUR_QUARANTINE_BUCKET]

시작된 이벤트 시리즈를 확인하려면 먼저 Cloud Functions 페이지로 이동하세요.

create_DLP_job 함수의 작업 메뉴를 클릭하고 로그 보기를 선택합니다.

89211a959bf30392.png

이 함수의 로그에는 각 파일에 대해 다음을 나타내는 항목이 4개 이상 표시됩니다.

  • 함수 실행이 시작됨
  • 특정 파일에 대해 함수가 트리거되었습니다.
  • 작업이 생성됨
  • 함수 실행이 완료되었습니다.

c864dff5a03c75a9.png

각 파일에 대해 create_DLP_job 함수가 완료되면 해당 DLP 작업이 시작됩니다. DLP 작업 페이지로 이동하여 대기열에 있는 DLP 작업 목록을 확인합니다.

대기 중, 실행 중 또는 완료된 작업 목록이 표시됩니다. 각각은 업로드된 파일 중 하나에 해당합니다.

6af34e72ecb83faf.png

이러한 작업의 ID를 클릭하면 자세한 내용을 확인할 수 있습니다.

Cloud Functions 페이지로 돌아가 resolve_DLP 함수의 로그를 확인하면 각 파일에 대해 항목이 8개 이상 표시됩니다. 이는 다음을 나타냅니다.

  • 함수 실행이 시작됨
  • Pub/Sub 알림이 수신됨
  • 해당 DLP 작업의 이름
  • 상태 코드
  • 민감한 데이터의 인스턴스 수 (있는 경우)
  • 파일이 이동될 버킷
  • DLP 작업에서 파일 파싱을 완료했습니다.
  • 함수 실행이 완료되었습니다.

5025bd672cba90a0.png

resolve_DLP 함수에 대한 모든 호출이 실행을 완료하면 격리 버킷의 콘텐츠를 다시 확인합니다.

gsutil ls gs://[YOUR_QUARANTINE_BUCKET]

이번에는 완전히 비어 있어야 합니다. 다른 버킷에 대해 위와 동일한 명령어를 실행하면 파일이 해당 버킷으로 완벽하게 분리됩니다.

7. 삭제

Cloud Functions와 함께 DLP API를 사용하여 데이터를 분류하는 방법을 살펴보았으므로 이제 생성한 모든 리소스를 프로젝트에서 정리해 보겠습니다.

프로젝트 삭제하기

원하는 경우 전체 프로젝트를 삭제할 수 있습니다. GCP Console에서 Cloud Resource Manager 페이지로 이동합니다.

프로젝트 목록에서 작업 중인 프로젝트를 선택하고 삭제를 클릭합니다. 프로젝트 ID를 입력하라는 메시지가 표시됩니다. 프로젝트 ID를 입력하고 종료를 클릭합니다.

또는 gcloud를 사용하여 Cloud Shell에서 전체 프로젝트를 직접 삭제할 수 있습니다.

gcloud projects delete [PROJECT_ID]

여러 구성요소를 하나씩 삭제하려면 다음 섹션으로 진행하세요.

Cloud Functions

gcloud를 사용하여 두 클라우드 함수를 모두 삭제합니다.

gcloud functions delete -q create_DLP_job && gcloud functions delete -q resolve_DLP

스토리지 버킷

업로드된 파일을 모두 삭제하고 gsutil로 버킷을 삭제합니다.

gsutil rm -r gs://[YOUR_QUARANTINE_BUCKET] \
gs://[YOUR_SENSITIVE_DATA_BUCKET] \
gs://[YOUR_NON_SENSITIVE_DATA_BUCKET] 

Pub/Sub

먼저 gcloud를 사용하여 Pub/Sub 구독을 삭제합니다.

gcloud pubsub subscriptions delete classify-sub

마지막으로 gcloud를 사용하여 Pub/Sub 주제를 삭제합니다.

gcloud pubsub topics delete classify-topic

8. 축하합니다.

오호! 수고하셨습니다. DLP API와 Cloud Functions를 함께 사용하여 파일 분류를 자동화하는 방법을 배웠습니다.

학습한 내용

  • 민감한 정보와 민감하지 않은 정보를 저장하기 위해 Cloud Storage 버킷을 만들었습니다.
  • Cloud 함수를 트리거하기 위해 Pub/Sub 주제와 구독을 만들었습니다.
  • 파일에 포함된 민감한 정보를 기반으로 파일을 분류하는 DLP 작업을 시작하도록 설계된 Cloud 함수를 만들었습니다.
  • 테스트 데이터를 업로드하고 Cloud Functions의 Stackdriver 로그를 확인하여 프로세스가 작동하는지 확인했습니다.