การแยกประเภทข้อมูลที่อัปโหลดไปยัง Cloud Storage โดยอัตโนมัติด้วย DLP API และ Cloud Functions

การแยกประเภทข้อมูลที่อัปโหลดไปยัง Cloud Storage โดยอัตโนมัติด้วย DLP API และ Cloud Functions

เกี่ยวกับ Codelab นี้

subjectอัปเดตล่าสุดเมื่อ ก.พ. 15, 2022
account_circleเขียนโดย Roger Martinez

1 ภาพรวม

ในองค์กรในปัจจุบัน มีข้อมูลจากแหล่งข้อมูลที่หลากหลายมากขึ้นเรื่อยๆ ซึ่งมักต้องมีการกักเก็บและแยกประเภทข้อมูลเพื่อจัดเก็บและปกป้องข้อมูลนั้นอย่างมีกลยุทธ์ ซึ่งเป็นงานที่จะมีต้นทุนสูงอย่างรวดเร็วและแทบจะเป็นไปไม่ได้เลยหากยังคงใช้บุคลากรอยู่

ใน Codelab นี้ เราจะดูวิธีแยกประเภทข้อมูลที่อัปโหลดไปยัง Cloud Storage โดยอัตโนมัติและย้ายข้อมูลไปยังที่เก็บข้อมูลของพื้นที่เก็บข้อมูลที่เกี่ยวข้อง เราจะดำเนินการดังกล่าวโดยใช้ Cloud Pub/Sub, Cloud Functions, การป้องกันข้อมูลรั่วไหลของระบบคลาวด์ และ Cloud Storage

สิ่งที่คุณต้องทำ

  • สร้างที่เก็บข้อมูล Cloud Storage ที่จะใช้เป็นส่วนหนึ่งของไปป์ไลน์การกักเก็บและการแยกประเภท
  • สร้าง Cloud Function แบบง่ายๆ ที่จะเรียกใช้ DLP API เมื่ออัปโหลดไฟล์
  • สร้างหัวข้อ Pub/Sub และการสมัครใช้บริการเพื่อแจ้งให้คุณทราบเมื่อการประมวลผลไฟล์เสร็จสมบูรณ์
  • อัปโหลดไฟล์ตัวอย่างไปยังที่เก็บข้อมูลเขตกักบริเวณเพื่อเรียกใช้ Cloud Function
  • ใช้ DLP API เพื่อตรวจสอบและแยกประเภทไฟล์และย้ายไปยังที่เก็บข้อมูลที่เหมาะสม

สิ่งที่คุณต้องมี

  • โปรเจ็กต์ Google Cloud ที่มีการตั้งค่าการเรียกเก็บเงิน หากยังไม่มีบัญชี คุณจะต้องสร้างบัญชี

2 การตั้งค่า

ตลอด Codelab นี้ เราจะจัดสรรและจัดการทรัพยากรและบริการระบบคลาวด์ต่างๆ โดยใช้บรรทัดคำสั่งผ่าน Cloud Shell รายการต่อไปนี้จะเปิด Cloud Shell พร้อมกับ Cloud Shell Editor และโคลนที่เก็บโปรเจ็กต์ที่ใช้ร่วมกัน

ตรวจสอบให้แน่ใจว่าคุณใช้โปรเจ็กต์ที่ถูกต้องโดยตั้งค่าโปรเจ็กต์ด้วย gcloud config set project [PROJECT_ID]

เปิดใช้ API

เปิดใช้ API ที่จำเป็นในโปรเจ็กต์ Google Cloud

  • Cloud Functions API - จัดการฟังก์ชันที่ผู้ใช้มีขนาดเล็กซึ่งดำเนินการเพื่อตอบสนองต่อเหตุการณ์
  • Cloud Data Loss Prevention (DLP) API - มอบวิธีการตรวจจับ วิเคราะห์ความเสี่ยง และการลบการระบุตัวตนของส่วนย่อยที่คำนึงถึงความเป็นส่วนตัวในข้อความ รูปภาพ และที่เก็บพื้นที่เก็บข้อมูลของ Google Cloud Platform
  • Cloud Storage - Google Cloud Storage คือบริการ RESTful สำหรับจัดเก็บและเข้าถึงข้อมูลบนโครงสร้างพื้นฐานของ Google

สิทธิ์ของบัญชีบริการ

บัญชีบริการเป็นบัญชีประเภทพิเศษที่แอปพลิเคชันและเครื่องเสมือนใช้เพื่อเรียก API ที่ได้รับอนุญาต

บัญชีบริการเริ่มต้นของ App Engine

ระบบจะใช้บัญชีบริการเริ่มต้นของ App Engine เพื่อดำเนินงานในโปรเจ็กต์ที่อยู่ในระบบคลาวด์ในนามของแอปที่กำลังทำงานใน App Engine บัญชีบริการนี้อยู่ในโปรเจ็กต์ของคุณโดยค่าเริ่มต้นพร้อมบทบาทผู้แก้ไข

ก่อนอื่น เราจะมอบบทบาทผู้ดูแลระบบ DLP ที่จำเป็นต่อการจัดการงานการป้องกันข้อมูลรั่วไหลให้กับบัญชีบริการของเรา

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

และสุดท้าย ให้บทบาท Agent บริการ DLP API ที่จะอนุญาตสิทธิ์ของบัญชีบริการสำหรับ BigQuery, พื้นที่เก็บข้อมูล, พื้นที่เก็บข้อมูล, pubsub และบริการการจัดการคีย์

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 เพื่อสร้างที่เก็บข้อมูลทั้ง 3 รายการในการวนๆ เพียงครั้งเดียวดังนี้

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

จดชื่อของที่เก็บข้อมูลที่คุณเพิ่งสร้าง เนื่องจากเราจะต้องใช้ที่เก็บข้อมูลเหล่านั้นในภายหลัง

4 หัวข้อ Pub/Sub และการสมัครใช้บริการ

Cloud Pub/Sub จะรับส่งข้อความแบบไม่พร้อมกันระหว่างแอปพลิเคชันได้ตั้งแต่หลายรายการไปจนถึงหลายรายการ ผู้เผยแพร่จะสร้างข้อความและเผยแพร่ไปยังฟีดข้อความที่เรียกว่าหัวข้อ โดยสมาชิกจะได้รับข้อความเหล่านี้ผ่านทางการสมัครใช้บริการ ซึ่งจากการสมัครใช้บริการดังกล่าว ในกรณีของเรา เราจะย้ายไฟล์ไปยังที่เก็บข้อมูลที่เกี่ยวข้องหลังจากงาน DLP ทำงาน

ก่อนอื่น ให้สร้างหัวข้อ ระบบจะเผยแพร่ข้อความที่นี่ทุกครั้งที่มีการเพิ่มไฟล์ลงในที่เก็บข้อมูลของพื้นที่เก็บข้อมูลเขตกักบริเวณ เราจะตั้งชื่อว่า "classify-topic"

gcloud pubsub topics create classify-topic

ระบบจะแจ้งเตือนการติดตามเมื่อหัวข้อมีการเผยแพร่ข้อความ มาสร้างการสมัครสมาชิก pubsub ที่ชื่อ "classify-sub" กัน

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

การสมัครใช้บริการดังกล่าวจะทริกเกอร์ Cloud Function ที่ 2 ซึ่งจะเริ่มงาน DLP ซึ่งจะตรวจสอบไฟล์และย้ายไฟล์ไปยังตำแหน่งที่เหมาะสม

5 Cloud Functions

Cloud Functions ช่วยให้เราติดตั้งใช้งานฟังก์ชันวัตถุประสงค์เดียวที่น้ำหนักเบาและอิงกับเหตุการณ์แบบไม่พร้อมกันได้โดยไม่ต้องจัดการเซิร์ฟเวอร์หรือสภาพแวดล้อมรันไทม์ เราจะทำให้ฟังก์ชันระบบคลาวด์ 2 รายการใช้งานได้โดยใช้ไฟล์ main.py ที่ให้ไว้ใน dlp-cloud-functions-tutorials/gcs-dlp-classification-python/

แทนที่ตัวแปร

เราจะต้องแทนที่ตัวแปรบางอย่างในไฟล์ main.py ก่อน จึงจะสร้างฟังก์ชันได้

ใน Cloud Shell Editor ให้ปรับ main.py ด้วยการแทนที่ค่าสำหรับรหัสโปรเจ็กต์และตัวแปรที่เก็บข้อมูลในบรรทัดที่ 28 ถึง 34 โดยใช้ที่เก็บข้อมูลที่เกี่ยวข้องซึ่งสร้างไว้ก่อนหน้านี้

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 ให้เปลี่ยนไดเรกทอรีเป็น gcs-dlp-classification-python เมื่อมีไฟล์ main.py อยู่:

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 ใช้งานได้ โดยระบุหัวข้อของเราเป็นทริกเกอร์ ฟังก์ชันนี้รอฟังการแจ้งเตือน pub/sub ที่เริ่มต้นจากงาน DLP ถัดไปจากฟังก์ชันด้านบน เมื่อได้รับการแจ้งเตือน pub/sub แท็กจะรับผลลัพธ์จากงาน DLP และย้ายไฟล์ไปยังที่เก็บข้อมูลที่มีความละเอียดอ่อนหรือที่เก็บข้อมูลที่ไม่ละเอียดอ่อนตามนั้น ดังนี้

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

ยืนยัน

ตรวจสอบว่าได้ทำให้ฟังก์ชันระบบคลาวด์ทั้ง 2 รายการใช้งานได้เรียบร้อยแล้วด้วยคำสั่ง gcloud functions describe

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

คุณคลิกรหัสของงานใดก็ได้เพื่อดูรายละเอียดเพิ่มเติม

หากกลับไปที่หน้า Cloud Functions และตรวจสอบการเข้าสู่ระบบสำหรับฟังก์ชัน Solve_DLP คุณจะเห็นรายการอย่างน้อย 8 รายการสำหรับแต่ละไฟล์ ซึ่งระบุว่า

  • เริ่มการเรียกใช้ฟังก์ชันแล้ว
  • ได้รับการแจ้งเตือน Pub/Sub
  • ชื่องาน DLP ที่เกี่ยวข้อง
  • รหัสสถานะ
  • จำนวนอินสแตนซ์ของข้อมูลที่ละเอียดอ่อน (หากมี)
  • ที่เก็บข้อมูลที่จะย้ายไฟล์ไป
  • งาน DLP แยกวิเคราะห์ไฟล์เสร็จแล้ว
  • ฟังก์ชันดำเนินการเสร็จแล้ว

5025bd672cba90a0.png

หลังจากที่การเรียกฟังก์ชันrerell_DLP ทั้งหมดทำงานเสร็จสิ้นแล้ว ให้ตรวจสอบเนื้อหาของที่เก็บข้อมูลเขตกักเก็บอีกครั้ง โดยทำดังนี้

gsutil ls gs://[YOUR_QUARANTINE_BUCKET]

ครั้งนี้เทมเพลตควรจะว่างเปล่าทั้งหมด อย่างไรก็ตาม หากคุณเรียกใช้คำสั่งเดียวกันด้านบนสำหรับที่เก็บข้อมูลอื่นๆ คุณจะพบไฟล์ของเราถูกแบ่งย่อยลงในที่เก็บข้อมูลที่เกี่ยวข้องกันอย่างลงตัว

7 ล้างข้อมูล

เราก็ได้เห็นวิธีใช้ DLP API ร่วมกับ Cloud Functions เพื่อแยกประเภทข้อมูล เราจะมาจัดการโปรเจ็กต์ของเราจากทรัพยากรทั้งหมดที่สร้างขึ้นกัน

ลบโปรเจ็กต์

คุณลบทั้งโปรเจ็กต์ได้หากต้องการ ในคอนโซล GCP ให้ไปที่หน้า Cloud Resource Manager

ในรายการโปรเจ็กต์ ให้เลือกโปรเจ็กต์ที่เรากำลังดำเนินการอยู่ แล้วคลิกลบ ระบบจะแจ้งให้คุณพิมพ์รหัสโปรเจ็กต์ ป้อนรหัสและคลิกปิด

หรือคุณจะลบทั้งโปรเจ็กต์จาก Cloud Shell โดยตรงด้วย gcloud ก็ได้โดยทำดังนี้

gcloud projects delete [PROJECT_ID]

หากคุณต้องการลบคอมโพเนนต์ต่างๆ ทีละรายการ ให้ดำเนินการต่อในส่วนถัดไป

ฟังก์ชันระบบคลาวด์

ลบฟังก์ชันระบบคลาวด์ทั้ง 2 รายการที่มี 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

ก่อนอื่นให้ลบการสมัครใช้บริการ pub/sub ด้วย gcloud:

gcloud pubsub subscriptions delete classify-sub

และสุดท้าย ให้ลบหัวข้อ pub/sub ด้วย gcloud:

gcloud pubsub topics delete classify-topic

8 ยินดีด้วย

แจ่มแจ๋ว! คุณทำได้แล้ว คุณได้เรียนรู้วิธีใช้ DLP API ร่วมกับ Cloud Functions เพื่อแยกประเภทไฟล์โดยอัตโนมัติ

สรุปประเด็นที่ได้พูดถึง

  • เราได้สร้างที่เก็บข้อมูล Cloud Storage เพื่อจัดเก็บข้อมูลที่ละเอียดอ่อนและไม่มีความละเอียดอ่อนของเราแล้ว
  • เราสร้างหัวข้อ Pub/Sub และการสมัครใช้บริการเพื่อทริกเกอร์ฟังก์ชันระบบคลาวด์
  • เราได้สร้าง Cloud Functions ที่ออกแบบมาเพื่อเริ่มต้นงาน DLP ที่จัดหมวดหมู่ไฟล์ตามข้อมูลที่ละเอียดอ่อนที่มีอยู่
  • เราได้อัปโหลดข้อมูลทดสอบและดู Cloud Functions บันทึกของ Stackdriver เพื่อดูกระบวนการทำงานจริง