การแยกประเภทข้อมูลที่อัปโหลดไปยัง Cloud Storage โดยอัตโนมัติด้วย DLP API และ Cloud Functions
เกี่ยวกับ Codelab นี้
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 แล้วเลือก "ดูบันทึก" ดังนี้
ในบันทึกสำหรับฟังก์ชันนี้ เราเห็นรายการอย่างน้อย 4 รายการสำหรับแต่ละไฟล์ที่ระบุ:
- เริ่มการเรียกใช้ฟังก์ชันแล้ว
- ทริกเกอร์ฟังก์ชันนี้สำหรับไฟล์ใดไฟล์หนึ่งแล้ว
- สร้างงานแล้ว
- ฟังก์ชันดำเนินการเสร็จแล้ว
เมื่อฟังก์ชัน create_DLP_job ทำงานของแต่ละไฟล์เสร็จสมบูรณ์ ระบบจะเริ่มงาน DLP ที่เกี่ยวข้อง ไปที่หน้างาน DLP เพื่อดูรายการงาน DLP ในคิว
คุณจะเห็นรายการงานที่รอดำเนินการ กำลังทำงาน หรือเสร็จสิ้น แต่ละไฟล์จะสอดคล้องกับหนึ่งในไฟล์ที่เราอัปโหลดไว้
คุณคลิกรหัสของงานใดก็ได้เพื่อดูรายละเอียดเพิ่มเติม
หากกลับไปที่หน้า Cloud Functions และตรวจสอบการเข้าสู่ระบบสำหรับฟังก์ชัน Solve_DLP คุณจะเห็นรายการอย่างน้อย 8 รายการสำหรับแต่ละไฟล์ ซึ่งระบุว่า
- เริ่มการเรียกใช้ฟังก์ชันแล้ว
- ได้รับการแจ้งเตือน Pub/Sub
- ชื่องาน DLP ที่เกี่ยวข้อง
- รหัสสถานะ
- จำนวนอินสแตนซ์ของข้อมูลที่ละเอียดอ่อน (หากมี)
- ที่เก็บข้อมูลที่จะย้ายไฟล์ไป
- งาน DLP แยกวิเคราะห์ไฟล์เสร็จแล้ว
- ฟังก์ชันดำเนินการเสร็จแล้ว
หลังจากที่การเรียกฟังก์ชัน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 เพื่อดูกระบวนการทำงานจริง