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, 스토리지, 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 파일을 사용하여 Cloud 함수 2개를 배포합니다.

변수 대체

함수를 만들기 전에 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

설정에서 파일이 어떻게 처리되는지 확인하기 위해 모든 테스트 파일을 스팸 격리 저장소에 업로드하겠습니다.

버킷:

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. 삭제

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

프로젝트 삭제하기

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

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

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

gcloud projects delete [PROJECT_ID]

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

Cloud Functions

gcloud를 사용하여 두 Cloud 함수를 모두 삭제합니다.

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 주제 및 구독을 만들었습니다.
  • Google은 파일에 포함된 민감한 정보를 기반으로 파일을 분류하는 DLP 작업을 시작하도록 설계된 Cloud Functions를 만들었습니다.
  • 테스트 데이터를 업로드하고 Cloud Functions의 실행 중인 프로세스를 확인할 수 있는 Stackdriver 로그