סקירה כללית של מניעת אובדן נתונים בענן

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

מניעת אובדן נתונים בענן (DLP) היא שירות שמנוהל במלואו שנועד לעזור לגלות, לסווג ולהגן על מידע רגיש. ב-codelab הזה נציג כמה מהיכולות הבסיסיות של Cloud DLP API ונדגים את הדרכים השונות שבהן אפשר להשתמש בו כדי להגן על נתונים.

מה תעשו

  • שימוש ב-DLP כדי לבדוק מחרוזות וקבצים ולמצוא התאמות לסוגי מידע
  • מידע על טכניקות להסרת פרטי הזיהוי ושימוש ב-DLP להסרת פרטי הזיהוי מהנתונים
  • איך לזהות מחדש נתונים שעברו דה-אידנטיפיקציה באמצעות הצפנה ששומרת על הפורמט (FPE)
  • שימוש ב-DLP כדי להסתיר סוגי מידע ממחרוזות ומתמונות

מה תצטרכו

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

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

אפשר להריץ את ה-codelab הזה באופן מלא ב-Google Cloud Platform בלי להתקין או להגדיר שום דבר באופן מקומי.

Cloud Shell

במהלך ה-codelab הזה, נספק ונגידר משאבים ושירותים שונים בענן באמצעות שורת הפקודה דרך 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 שכוללים מידע אישי רגיש
  • Cloud Key Management Service (KMS) API –‏ 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 *****************************

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

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

הפלט יהיה המחרוזת המקורית ללא צנזורים או ציון של סוג תחליף:

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);

הסרת פרטים מזהים מתאריכים באמצעות שינוי תאריכים

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

שיטה נוספת להסתרת מידע רגיש היא צנזורה. הצנזורה תחליף את ההתאמה לסוג המידע שאליו היא זוהתה. 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

bf3719cfeb5676ff.png

כדי לצנזר את מספר הטלפון ואת כתובת האימייל מהתמונה שלמעלה:

node redact.js -c $GOOGLE_CLOUD_PROJECT \
image resources/test.png ./redacted.png \
-t PHONE_NUMBER -t EMAIL_ADDRESS

כפי שצוין, תיווצר תמונה חדשה בשם redacted.png עם המידע המבוקש מושחר:

ce023dd95cccc40f.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 כדי לצנזר נתונים ממחרוזת וגם מתמונה