1. סקירה כללית
'מניעת אובדן נתונים בענן (DLP)' היא שירות מנוהל שנועד לעזור לגלות מידע רגיש, לסווג אותו ולהגן עליו. בשיעור הזה נציג כמה מהיכולות הבסיסיות של Cloud DLP API ונדגים את הדרכים השונות שבהן אפשר להשתמש בו כדי להגן על נתונים.
מה תעשו
- איך משתמשים ב-DLP כדי לבדוק מחרוזות וקבצים כדי לאתר סוגי מידע תואמים
- מידע על השיטות להסרת פרטי הזיהוי ושימוש ב-DLP כדי להסיר פרטי זיהוי מהנתונים
- איך לזהות מחדש נתונים שהוסרו מהם פרטי הזיהוי באמצעות הצפנה שומרת על פורמט (FPE)
- שימוש ב-DLP כדי לצנזר סוגי מידע ממחרוזות ומתמונות
מה צריך להכין
- יצירת פרויקט ב-Google Cloud שמוגדר בו חיוב. אם אין לכם חשבון, תצטרכו ליצור חשבון.
2. בתהליך ההגדרה
ה-Codelab הזה יכול לפעול באופן מלא ב-Google Cloud Platform ללא התקנה או הגדרות מקומיות.
Cloud Shell
במסגרת ה-Codelab הזה, נקצה וננהל משאבים ושירותים שונים של ענן באמצעות שורת הפקודה (CLI) של Cloud Shell.
מורידים את מאגר הפרויקט הנלווה:
git clone https://github.com/googleapis/nodejs-dlp
אחרי שמורידים את קוד הפרויקט, עוברים לספריית הדוגמאות ומתקינים את חבילות Node.js הנדרשות:
cd samples && npm install
חשוב לוודא שאתם משתמשים בפרויקט הנכון. לשם כך, צריך להגדיר אותו באמצעות הפקודה הבאה ב-gcloud:
gcloud config set project [PROJECT_ID]
הפעלת ממשקי API
אלו ממשקי ה-API שנצטרך להפעיל בפרויקט שלנו:
- Cloud Data Loss Prevention API – הפתרון הזה מספק שיטות לזיהוי, לניתוח סיכונים ולהסרת פרטי הזיהוי של מקטעים שרגישים לפרטיות בטקסט, בתמונות ובמאגרי אחסון של Google Cloud Platform
- API של Cloud Key Management Service (KMS) – Google Cloud KMS מאפשר ללקוחות לנהל מפתחות הצפנה ולבצע פעולות קריפטוגרפיות באמצעות המפתחות האלה.
מפעילים את ממשקי ה-API הנדרשים באמצעות הפקודה הבאה של gcloud:
gcloud services enable dlp.googleapis.com cloudkms.googleapis.com \ --project ${GOOGLE_CLOUD_PROJECT}
3. בדיקה של מחרוזות וקבצים
ספריית הדוגמאות של הפרויקט שהורדתם בשלב הקודם מכילה כמה קובצי JavaScript שמשתמשים בפונקציות השונות של Cloud DLP. inspect.js
יחפש סוג מידע רגיש במחרוזת או בקובץ שסופקו.
כדי לבדוק את זה, אפשר לספק את האפשרות string
ומחרוזת לדוגמה עם מידע שעשוי להיות רגיש:
node inspect.js -c $GOOGLE_CLOUD_PROJECT \ string 'My email address is jenny@somedomain.com and you can call me at 555-867-5309'
הפלט אמור להראות לנו את הממצאים של כל סוג מידע תואם, כולל:
ציטוט: התבנית מציינת
InfoType: סוג המידע שזוהה לגבי החלק הזה במחרוזת. רשימה מלאה של סוגי המידע האפשריים זמינה כאן. כברירת מחדל, inspect.js
בודק רק את סוגי המידע CREDIT_CARD_NUMBER
, PHONE_NUMBER
וגם EMAIL_ADDRESS
סבירות: התוצאות מחולקות לקטגוריות לפי הסבירות שכל אחת מהן מייצגת התאמה. הסבירות נעה בין VERY_UNLIKELY
ל-VERY_LIKELY
.
הממצאים של בקשת הפקודה שלמעלה:
Findings: Quote: jenny@somedomain.com Info type: EMAIL_ADDRESS Likelihood: LIKELY Quote: 555-867-5309 Info type: PHONE_NUMBER Likelihood: VERY_LIKELY
באופן דומה, אנחנו יכולים לבדוק קבצים כדי לאתר סוגי מידע שונים. כדאי לעיין בקובץ accounts.txt
לדוגמה:
resources/accounts.txt
My credit card number is 1234 5678 9012 3456, and my CVV is 789.
מריצים שוב את הפקודה inspect.js
, הפעם עם אפשרות הקובץ:
node inspect.js -c $GOOGLE_CLOUD_PROJECT file resources/accounts.txt
התוצאות:
Findings: Quote: 5678 9012 3456 Info type: CREDIT_CARD_NUMBER Likelihood: VERY_LIKELY
בכל סוג של שאילתה, אנחנו עשויים להגביל את התוצאות לפי סבירות או סוג המידע. לדוגמה:
node inspect.js -c $GOOGLE_CLOUD_PROJECT \ string 'Call 900-649-2568 or email me at anthony@somedomain.com' \ -m VERY_LIKELY
אם מציינים את הסבירות VERY_LIKELY
כסבירות המינימלית, כל התאמה שנמוכה מ-VERY_LIKELY
לא תיכלל:
Findings: Quote: 900-649-2568 Info type: PHONE_NUMBER Likelihood: VERY_LIKELY
התוצאות המלאות, ללא הגבלה, יהיו:
Findings: Quote: 900-649-2568 Info type: PHONE_NUMBER Likelihood: VERY_LIKELY Quote: anthony@somedomain.com Info type: EMAIL_ADDRESS Likelihood: LIKELY
באופן דומה, נוכל לציין את סוג המידע שאנחנו בודקים:
node inspect.js -c $GOOGLE_CLOUD_PROJECT \ string 'Call 900-649-2568 or email me at anthony@somedomain.com' \ -t EMAIL_ADDRESS
אם נמצא מידע מהסוג שצוין, מוחזר רק סוג המידע שצוין:
Findings: Quote: anthony@somedomain.com Info type: EMAIL_ADDRESS Likelihood: LIKELY
בהמשך מוצגת הפונקציה האסינכרונית שמשתמשת ב-API כדי לבדוק את הקלט:
inspect.js
async function inspectString(
callingProjectId,
string,
minLikelihood,
maxFindings,
infoTypes,
customInfoTypes,
includeQuote
) {
...
}
הארגומנטים שצוינו לפרמטרים שלמעלה משמשים לבניית אובייקט בקשה. הבקשה הזו נשלחת לפונקציה inspectContent
כדי לקבל תשובה שמובילה לפלט שלנו:
inspect.js
// Construct item to inspect
const item = {value: string};
// Construct request
const request = {
parent: dlp.projectPath(callingProjectId),
inspectConfig: {
infoTypes: infoTypes,
customInfoTypes: customInfoTypes,
minLikelihood: minLikelihood,
includeQuote: includeQuote,
limits: {
maxFindingsPerRequest: maxFindings,
},
},
item: item,
};
...
...
const [response] = await dlp.inspectContent(request);
4. הסרת פרטי הזיהוי
מעבר לבדיקה ולזיהוי של מידע אישי רגיש, אפשר להשתמש ב-Cloud DLP כדי להסיר את פרטי הזיהוי. הסרת פרטי הזיהוי היא התהליך של הסרת פרטים מזהים מנתונים. ה-API מזהה מידע אישי רגיש לפי סוגי מידע, ואז משתמש בטרנספורמציה של הסרת פרטי הזיהוי כדי לבצע אנונימיזציה של הנתונים, למחוק אותם או לטשטש אותם.
deid.js
ידגים את הסרת פרטי הזיהוי בכמה דרכים. השיטה הפשוטה ביותר להסרת פרטי הזיהוי היא שימוש במסכה:
node deid.js deidMask -c $GOOGLE_CLOUD_PROJECT \ "My order number is F12312399. Email me at anthony@somedomain.com"
אם משתמשים במסכה, ה-API יחליף את התווים של סוג המידע התואם בתו אחר, * כברירת מחדל. הפלט ייראה כך:
My order number is F12312399. Email me at *****************************
שימו לב שכתובת האימייל במחרוזת מעורפלת (obfuscated), אבל מספר ההזמנה השרירותי ללא שינוי. (אפשר להשתמש בסוגים של מידע מותאם אישית, אבל הם לא נכללים ב-Codelab הזה).
זוהי הפונקציה שמשתמשת ב-DLP API כדי להסיר את פרטי הזיהוי באמצעות מסכה:
deid.js
async function deidentifyWithMask(
callingProjectId,
string,
maskingCharacter,
numberToMask
) {
...
}
שוב, הארגומנטים האלה משמשים לבניית אובייקט בקשה. הפעם הוא מסופק בפונקציה deidentifyContent
:
deid.js
// Construct deidentification request
const item = {value: string};
const request = {
parent: dlp.projectPath(callingProjectId),
deidentifyConfig: {
infoTypeTransformations: {
transformations: [
{
primitiveTransformation: {
characterMaskConfig: {
maskingCharacter: maskingCharacter,
numberToMask: numberToMask,
},
},
},
],
},
},
item: item,
};
...
...
const [response] = await dlp.deidentifyContent(request);
הסרת פרטי הזיהוי באמצעות הצפנה לשמירה על פורמט
ה-DLP API גם מאפשר להצפין ערכים של מידע אישי רגיש באמצעות מפתח קריפטוגרפי.
בתור התחלה, משתמשים ב-Cloud KMS כדי ליצור אוסף מפתחות:
gcloud kms keyrings create dlp-keyring --location global
עכשיו נוכל ליצור מפתח שבו נשתמש כדי להצפין את הנתונים:
gcloud kms keys create dlp-key \ --purpose='encryption' \ --location=global \ --keyring=dlp-keyring
ה-DLP API יקבל מפתח ארוז שהוצפן באמצעות מפתח ה-KMS שיצרנו. נוכל ליצור מחרוזת אקראית שתהיה ארוזה. נצטרך את זה מאוחר יותר כדי לשחזר פרטי זיהוי:
export AES_KEY=`head -c16 < /dev/random | base64 -w 0`
עכשיו אנחנו יכולים להצפין את המחרוזת באמצעות מפתח KMS שלנו. הפעולה הזו תיצור קובץ בינארי שמכיל את המחרוזת המוצפנת כמידע מוצפן (ciphertext):
echo -n $AES_KEY | gcloud kms encrypt \ --location global \ --keyring dlp-keyring \ --key dlp-key \ --plaintext-file - \ --ciphertext-file ./ciphertext.bin
באמצעות deid.js
אנחנו יכולים עכשיו להסיר את פרטי הזיהוי של מספר הטלפון במחרוזת לדוגמה הבאה באמצעות הצפנה:
node deid.js deidFpe -c $GOOGLE_CLOUD_PROJECT \ "My client's cell is 9006492568" `base64 -w 0 ciphertext.bin` \ projects/${GOOGLE_CLOUD_PROJECT}/locations/global/keyRings/dlp-keyring/cryptoKeys/dlp-key \ -s PHONE_NUMBER
הפלט יחזיר את המחרוזת עם סוגי המידע התואמים שיוחלפו במחרוזת מוצפנת, ולפניה יופיע סוג המידע שמצוין בדגל -s:
My client's cell is PHONE_NUMBER(10):vSt55z79nR
נבחן את הפונקציה שבה אנחנו משתמשים כדי להסיר את פרטי הזיהוי של המחרוזת:
deid.js
async function deidentifyWithFpe(
callingProjectId,
string,
alphabet,
surrogateType,
keyName,
wrappedKey
) {
...
}
הארגומנטים משמשים ליצירת אובייקט cryptoReplaceFfxFpeConfig
:
deid.js
const cryptoReplaceFfxFpeConfig = {
cryptoKey: {
kmsWrapped: {
wrappedKey: wrappedKey,
cryptoKeyName: keyName,
},
},
commonAlphabet: alphabet,
};
if (surrogateType) {
cryptoReplaceFfxFpeConfig.surrogateInfoType = {
name: surrogateType,
};
}
לאחר מכן נעשה שימוש באובייקט cryptoReplaceFfxFpeConfig
בבקשה ל-API דרך הפונקציה deidentifyContent
:
deid.js
// Construct deidentification request
const item = {value: string};
const request = {
parent: dlp.projectPath(callingProjectId),
deidentifyConfig: {
infoTypeTransformations: {
transformations: [
{
primitiveTransformation: {
cryptoReplaceFfxFpeConfig: cryptoReplaceFfxFpeConfig,
},
},
],
},
},
item: item,
};
try {
// Run deidentification request
const [response] = await dlp.deidentifyContent(request);
זיהוי מחדש של נתונים
כדי לזהות מחדש את הנתונים, ה-DLP API ישתמש במידע מוצפן (ciphertext) שיצרנו בשלב הקודם:
node deid.js reidFpe -c $GOOGLE_CLOUD_PROJECT \ "<YOUR_DEID_OUTPUT>" \ PHONE_NUMBER `base64 -w 0 ciphertext.bin` \ projects/${GOOGLE_CLOUD_PROJECT}/locations/global/keyRings/dlp-keyring/cryptoKeys/dlp-key
הפלט יהיה המחרוזת המקורית ללא צנזורים או סוג הפונקציה (surrogate) שצוין:
My client's cell is 9006492568
הפונקציה שמשמשת לזיהוי מחדש של נתונים דומה לפונקציה שמשמשת להסרת פרטי הזיהוי שלהם:
deid.js
async function reidentifyWithFpe(
callingProjectId,
string,
alphabet,
surrogateType,
keyName,
wrappedKey
) {
...
}
שוב נעשה שימוש בארגומנטים בבקשה ל-API, הפעם לפונקציה reidentifyContent
:
deid.js
// Construct deidentification request
const item = {value: string};
const request = {
parent: dlp.projectPath(callingProjectId),
reidentifyConfig: {
infoTypeTransformations: {
transformations: [
{
primitiveTransformation: {
cryptoReplaceFfxFpeConfig: {
cryptoKey: {
kmsWrapped: {
wrappedKey: wrappedKey,
cryptoKeyName: keyName,
},
},
commonAlphabet: alphabet,
surrogateInfoType: {
name: surrogateType,
},
},
},
},
],
},
},
inspectConfig: {
customInfoTypes: [
{
infoType: {
name: surrogateType,
},
surrogateType: {},
},
],
},
item: item,
};
try {
// Run reidentification request
const [response] = await dlp.reidentifyContent(request);
הסרת פרטי זיהוי של תאריכים באמצעות שינוי התאריך
בהקשרים מסוימים, תאריכים עשויים להיחשב כמידע אישי רגיש שאולי נרצה לערפל את הקוד (obfuscation). שינוי תאריך מאפשר לנו לשנות את התאריכים במרווחים אקראיים, תוך שמירה על הרצף ועל משך הזמן של פרק זמן מסוים. כל תאריך בקבוצה משתנה לפי פרק הזמן הייחודי לאותה רשומה. כדי להמחיש את הסרת פרטי הזיהוי באמצעות שינוי תאריך, אפשר לעיין קודם בקובץ ה-CSV לדוגמה שמכיל נתוני תאריך:
resources/dates.csv
name,birth_date,register_date,credit_card
Ann,01/01/1980,07/21/1996,4532908762519852
James,03/06/1988,04/09/2001,4301261899725540
Dan,08/14/1945,11/15/2011,4620761856015295
Laura,11/03/1992,01/04/2017,4564981067258901
הנתונים מכילים שני שדות שבהם אנחנו יכולים להחיל שינוי תאריך: birth_date
ו-register_date
. deid.js יקבל ערך גבול תחתון וערך גבול עליון כדי להגדיר טווח לבחירת מספר אקראי של ימים שבהם יועברו התאריכים:
node deid.js deidDateShift -c $GOOGLE_CLOUD_PROJECT resources/dates.csv datesShifted.csv 30 90 birth_date
המערכת תיצור קובץ בשם datesShifted.csv
והתאריכים ישתנו באופן אקראי במספר ימים בין 30 ל-90. דוגמה לפלט שנוצר:
name,birth_date,register_date,credit_card
Ann,2/6/1980,7/21/1996,4532908762519852
James,5/18/1988,4/9/2001,4301261899725540
Dan,9/16/1945,11/15/2011,4620761856015295
Laura,12/16/1992,1/4/2017,4564981067258901
שימו לב שאפשרו לנו גם לציין איזו עמודת תאריך בקובץ ה-CSV אנחנו רוצים לשנות. השדה birth_date
השדה register_date
נותר ללא שינוי.
נבחן את הפונקציה שמטפלת בהסרת פרטי הזיהוי באמצעות הזזת תאריך:
deid.js
async function deidentifyWithDateShift(
callingProjectId,
inputCsvFile,
outputCsvFile,
dateFields,
lowerBoundDays,
upperBoundDays,
contextFieldId,
wrappedKey,
keyName
) {
...
}
שימו לב שהפונקציה הזו יכולה לקבל מפתח עטוף ושם של מפתח, בדומה להסרת פרטי הזיהוי באמצעות FPE, כך שתהיה לנו אפשרות לספק מפתח הצפנה כדי לזהות מחדש שינוי בתאריך. הארגומנטים שאנחנו מספקים build של אובייקט dateShiftConfig:
deid.js
// Construct DateShiftConfig
const dateShiftConfig = {
lowerBoundDays: lowerBoundDays,
upperBoundDays: upperBoundDays,
};
if (contextFieldId && keyName && wrappedKey) {
dateShiftConfig.context = {name: contextFieldId};
dateShiftConfig.cryptoKey = {
kmsWrapped: {
wrappedKey: wrappedKey,
cryptoKeyName: keyName,
},
};
} else if (contextFieldId || keyName || wrappedKey) {
throw new Error(
'You must set either ALL or NONE of {contextFieldId, keyName, wrappedKey}!'
);
}
// Construct deidentification request
const request = {
parent: dlp.projectPath(callingProjectId),
deidentifyConfig: {
recordTransformations: {
fieldTransformations: [
{
fields: dateFields,
primitiveTransformation: {
dateShiftConfig: dateShiftConfig,
},
},
],
},
},
item: tableItem,
};
5. השמטת מחרוזות ותמונות
שיטה נוספת לערפול קוד (obfuscation) של מידע רגיש היא השמטת נתונים. השמטת הנתונים תחליף התאמה בסוג המידע שזוהה להתאמה. ב-redact.js
מתבצעת השמטת נתונים:
node redact.js -c $GOOGLE_CLOUD_PROJECT \ string "Please refund the purchase to my credit card 4012888888881881" \ -t 'CREDIT_CARD_NUMBER'
הפלט מחליף את מספר כרטיס האשראי לדוגמה בסוג המידע CREDIT_CARD_NUMBER
:
Please refund the purchase on my credit card [CREDIT_CARD_NUMBER]
האפשרות הזו שימושית אם אתם רוצים להסתיר מידע רגיש ועדיין לזהות את סוג המידע שיוסר. באופן דומה, ה-DLP API יכול לצנזר מידע מתמונות שמכילות טקסט. כדי להדגים, נבחן תמונה לדוגמה:
resources/test.png
כדי לצנזר את מספר הטלפון וכתובת האימייל מהתמונה שלמעלה:
node redact.js -c $GOOGLE_CLOUD_PROJECT \ image resources/test.png ./redacted.png \ -t PHONE_NUMBER -t EMAIL_ADDRESS
כפי שצוין, המערכת תיצור תמונה חדשה בשם unacted.png עם המידע המבוקש מוסתר:
זו הפונקציה שמשמשת לצנזור ממחרוזת:
redact.js
async function redactText(
callingProjectId,
string,
minLikelihood,
infoTypes
) {
...}
זאת הבקשה שתסופק לפונקציה deidentifyContent
:
redact.js
const request = {
parent: dlp.projectPath(callingProjectId),
item: {
value: string,
},
deidentifyConfig: {
infoTypeTransformations: {
transformations: [replaceWithInfoTypeTransformation],
},
},
inspectConfig: {
minLikelihood: minLikelihood,
infoTypes: infoTypes,
},
};
בדומה לכך, זוהי הפונקציה של צנזור תמונה:
redact.js
async function redactImage(
callingProjectId,
filepath,
minLikelihood,
infoTypes,
outputPath
) {
...}
זאת הבקשה שתסופק לפונקציה redactImage
:
redact.js
// Construct image redaction request
const request = {
parent: dlp.projectPath(callingProjectId),
byteItem: {
type: fileTypeConstant,
data: fileBytes,
},
inspectConfig: {
minLikelihood: minLikelihood,
infoTypes: infoTypes,
},
imageRedactionConfigs: imageRedactionConfigs,
};
6. הסרת המשאבים
למדנו איך אנחנו יכולים להשתמש ב-DLP API כדי לבצע אנונימיזציה של מידע רגיש, הסרת פרטי הזיהוי והצנזור שלו בנתונים שלנו. זה הזמן לנקות את הפרויקט שלנו מכל המשאבים שיצרנו.
מחיקת הפרויקט
במסוף GCP, נכנסים לדף Cloud Resource Manager:
ברשימת הפרויקטים, בוחרים את הפרויקט שעבדנו בו ולוחצים על מחיקה. תתבקשו להקליד את מזהה הפרויקט. מזינים אותו ולוחצים על כיבוי.
לחלופין, אפשר למחוק את הפרויקט כולו ישירות מ-Cloud Shell באמצעות gcloud:
gcloud projects delete $GOOGLE_CLOUD_PROJECT
7. מעולה!
יש! הצלחת! Cloud DLP הוא כלי אפקטיבי שמעניק גישה לפלטפורמה עוצמתית לבדיקה ולסיווג של מידע אישי רגיש ולהסרת פרטי הזיהוי.
הנושאים שטיפלנו בהם
- ראינו איך אפשר להשתמש ב-Cloud DLP API כדי לבדוק מחרוזות וקבצים בכמה סוגי מידע
- למדנו איך DLP API יכול להסיר את פרטי הזיהוי ממחרוזות באמצעות מסכה כדי להסתיר סוגי מידע שתואמים לנתונים
- השתמשנו ב-DLP API כדי להשתמש במפתח הצפנה להסרת פרטי הזיהוי ולשחזור הנתונים
- השתמשנו ב-DLP API כדי לצנזר נתונים ממחרוזת וגם מתמונה