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

1. ภาพรวม

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

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

สิ่งที่คุณต้องดำเนินการ

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

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

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

2. การเริ่มตั้งค่า

ตลอดทั้งโค้ดแล็บนี้ เราจะจัดสรรและจัดการทรัพยากรและบริการต่างๆ ในระบบคลาวด์โดยใช้บรรทัดคำสั่งผ่าน 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 เพื่อเรียกใช้งานในโปรเจ็กต์ Cloud ในนามของแอปที่ทำงานใน App Engine บัญชีบริการนี้มีอยู่ในโปรเจ็กต์ของคุณโดยค่าเริ่มต้นพร้อมบทบาทผู้แก้ไขที่กำหนด

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

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

สุดท้าย ให้มอบบทบาทตัวแทนบริการ DLP API ซึ่งจะอนุญาตสิทธิ์ของบัญชีบริการสำหรับ BigQuery, พื้นที่เก็บข้อมูล, Datastore, Pub/Sub และ Key Management Service

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

ตอนนี้เราจะต้องสร้าง Bucket ของ Cloud Storage 3 รายการเพื่อจัดเก็บข้อมูล

  • ที่เก็บข้อมูลกักกัน: ระบบจะอัปโหลดข้อมูลของเราที่นี่ในตอนแรก
  • ที่เก็บข้อมูลที่ละเอียดอ่อน: ระบบจะย้ายข้อมูลที่ DLP API ระบุว่าละเอียดอ่อนมาไว้ที่นี่
  • ที่เก็บข้อมูลที่ไม่ได้มีความละเอียดอ่อน: ระบบจะย้ายข้อมูลที่ DLP API ระบุว่าไม่ได้มีความละเอียดอ่อนมาไว้ที่นี่

เราใช้คำสั่ง gsutil เพื่อสร้างทั้ง 3 Bucket ได้ในคราวเดียว ดังนี้

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

จดชื่อ Bucket ที่คุณเพิ่งสร้างไว้ เนื่องจากเราจะต้องใช้ในภายหลัง

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

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

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

gcloud pubsub topics create classify-topic

การสมัครสมาชิกจะได้รับการแจ้งเตือนเมื่อหัวข้อเผยแพร่ข้อความ มาสร้างการสมัครใช้บริการ Pub/Sub ที่ชื่อ "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] ด้วยชื่อ Bucket ที่ถูกต้อง ระบบจะทริกเกอร์ฟังก์ชันนี้เมื่อมีการอัปโหลดไฟล์ใหม่ไปยัง 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

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

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

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

หากกลับไปที่หน้า 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 ให้ไปที่หน้า Cloud Resource Manager

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

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

gcloud projects delete [PROJECT_ID]

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

Cloud Functions

ลบ Cloud Functions ทั้ง 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 Function
  • เราได้สร้าง Cloud Functions ที่ออกแบบมาเพื่อเริ่มงาน DLP ซึ่งจัดหมวดหมู่ไฟล์ตามข้อมูลที่ละเอียดอ่อนที่มีอยู่ในไฟล์
  • เราอัปโหลดข้อมูลทดสอบและตรวจสอบบันทึก Stackdriver ของ Cloud Functions เพื่อดูขั้นตอนการทำงาน