סיווג אוטומטי של נתונים שהועלו ל-Cloud Storage באמצעות DLP API ו-Cloud Functions

1. סקירה כללית

בארגון המודרני כיום יש כמות הולכת וגדלה של נתונים שמגיעים ממגוון מקורות. לרוב, לשם כך צריך להכניס את הנתונים להסגר ולסווג אותם כדי לאחסן אותם באופן אסטרטגי ולהגן עליהם. משימה שעלות העבודה שלה תהיה יקרה במהירות ויישארו בלתי אפשרית.

ב-Codelab הזה נראה איך אנחנו יכולים לסווג באופן אוטומטי נתונים שהועלו ל-Cloud Storage ולהעביר אותם לקטגוריית אחסון תואמת. ניתן להשיג זאת באמצעות Cloud Pub/Sub, Cloud Functions, מניעת אובדן נתונים בענן ו-Cloud Storage.

הפעולות שתבצעו:

  • יצירת קטגוריות של Cloud Storage לשימוש כחלק מצינור עיבוד הנתונים להסגר ולסיווג.
  • יוצרים פונקציה פשוטה של Cloud Functions שמפעילה את DLP API כשמעלים קבצים.
  • יצירת נושא Pub/Sub ומינוי לקבלת התראה כשעיבוד הקובץ מסתיים.
  • העלאת קבצים לדוגמה לקטגוריית ההסגר כדי להפעיל פונקציה של Cloud Functions
  • אתם יכולים להשתמש ב-DLP API כדי לבדוק ולסווג את הקבצים ולהעביר אותם לקטגוריה המתאימה.

מה צריך להכין

  • יצירת פרויקט ב-Google Cloud שמוגדר בו חיוב. אם אין לכם חשבון, תצטרכו ליצור חשבון.

2. בתהליך ההגדרה

במסגרת ה-Codelab הזה, נקצה וננהל משאבים ושירותים שונים של ענן באמצעות שורת הפקודה (CLI) של 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, storage, מאגר נתונים, 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

עכשיו צריך ליצור 3 קטגוריות של Cloud Storage כדי לאחסן את הנתונים שלנו:

  • קטגוריית הסגר: הנתונים יועלו לכאן בשלב הראשון.
  • קטגוריה של מידע אישי רגיש: הנתונים שנקבעים על ידי 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 מספק מגוון רחב של הודעות אסינכרוניות בין אפליקציות. בעל תוכן דיגיטלי ייצור הודעה ויפרסם אותה בפיד של הודעות שנקרא נושא. מנוי יקבל את ההודעות האלה באמצעות מינוי. בהתאם למינוי הזה, במקרה שלנו פונקציה של Cloud Functions תעביר קבצים לקטגוריות המתאימות אחרי הרצה של משימת DLP.

קודם כול, יוצרים נושא. בכל פעם שיתווסף קובץ לקטגוריית האחסון להסגר, תופיע כאן הודעה. נשנה את השם 'classify-topic'

gcloud pubsub topics create classify-topic

המינוי יקבל התראה כשיתפרסם הודעה בנושא. בואו ניצור מינוי pubsub בשם 'classify-sub':

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

המינוי הזה יפעיל פונקציה שנייה של Cloud Functions שתפעיל משימת DLP שתבדוק את הקובץ ותעביר אותו למקום הנכון.

5. Cloud Functions

בעזרת Cloud Functions, אנחנו יכולים לפרוס פונקציות אסינכרוניות ומבוססות-אירועים למטרה יחידה, בלי צורך לנהל שרת או סביבת זמן ריצה. אנחנו פורסים 2 פונקציות של Cloud באמצעות קובץ main.py שסופק, שנמצא בכתובת dlp-cloud-functions-tutorials/gcs-dlp-classification-python/

החלפת משתנים

לפני שנוכל ליצור את הפונקציות שלנו, נצטרך להחליף כמה משתנים בקובץ main.py.

ב-Cloud Shell Editor, משנים את הערך הראשי.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

אימות

מוודאים ששתי הפונקציות של Cloud Functions פרוסות בהצלחה באמצעות הפקודה 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 ותבדקו את יומני הרישום של הפונקציה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 באמצעות 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
  • יצרנו את Cloud Functions כדי להתחיל משימת DLP שמסווגת קבצים לפי מידע אישי רגיש
  • העלנו נתוני בדיקה ובדקנו את הפונקציות ב-Cloud Functions יומני Stackdriver כדי לראות את התהליך בפעולה