بررسی اجمالی پیشگیری از از دست دادن داده های ابری

۱. مرور کلی

پیشگیری از نشت داده‌های ابری (DLP) یک سرویس کاملاً مدیریت‌شده است که برای کمک به کشف، طبقه‌بندی و محافظت از اطلاعات حساس طراحی شده است. این آزمایشگاه کد، برخی از قابلیت‌های اساسی API ابری DLP را معرفی کرده و روش‌های مختلف استفاده از آن برای محافظت از داده‌ها را نشان می‌دهد.

کاری که انجام خواهید داد

  • استفاده از DLP برای بررسی رشته‌ها و فایل‌ها جهت تطبیق انواع اطلاعات
  • آشنایی با تکنیک‌های حذف هویت و استفاده از DLP برای حذف هویت داده‌ها
  • بیاموزید که چگونه داده‌هایی را که با استفاده از رمزگذاری با حفظ قالب (FPE) شناسایی نشده‌اند، دوباره شناسایی کنید.
  • استفاده از DLP برای ویرایش انواع اطلاعات از رشته‌ها و تصاویر

آنچه نیاز دارید

  • یک پروژه گوگل کلود با تنظیمات صورتحساب. اگر ندارید، باید یکی ایجاد کنید .

۲. راه‌اندازی

این آزمایشگاه کد می‌تواند بدون هیچ گونه نصب یا پیکربندی محلی، به طور کامل روی پلتفرم ابری گوگل اجرا شود.

پوسته ابری

در طول این آزمایشگاه کد، ما منابع و سرویس‌های ابری مختلف را با استفاده از خط فرمان از طریق Cloud Shell فراهم و مدیریت خواهیم کرد.

مخزن پروژه همراه را دانلود کنید:

git clone https://github.com/googleapis/nodejs-dlp

پس از دانلود کد پروژه، به دایرکتوری samples بروید و بسته‌های Node.js مورد نیاز را نصب کنید:

cd samples && npm install

با تنظیم آن با دستور gcloud زیر، مطمئن شوید که از پروژه صحیح استفاده می‌کنید:

gcloud config set project [PROJECT_ID]

فعال کردن APIها

APIهایی که باید در پروژه خود فعال کنیم عبارتند از:

  • API پیشگیری از نشت داده‌های ابری - روش‌هایی برای تشخیص، تحلیل ریسک و شناسایی‌زدایی قطعات حساس به حریم خصوصی در متن، تصاویر و مخازن ذخیره‌سازی پلتفرم ابری گوگل ارائه می‌دهد.
  • سرویس مدیریت کلید ابری (KMS) API - Google Cloud KMS به مشتریان اجازه می‌دهد تا کلیدهای رمزگذاری را مدیریت کرده و عملیات رمزنگاری را با آن کلیدها انجام دهند.

API های مورد نیاز را با دستور gcloud زیر فعال کنید:

gcloud services enable dlp.googleapis.com cloudkms.googleapis.com \
--project ${GOOGLE_CLOUD_PROJECT}

۳. بررسی رشته‌ها و فایل‌ها

دایرکتوری نمونه‌های پروژه دانلود شده در مرحله قبل شامل چندین فایل جاوا اسکریپت است که از قابلیت‌های مختلف 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 را بررسی می‌کند.

احتمال (Likelihood ): نتایج بر اساس میزان احتمال تطابق آنها طبقه‌بندی می‌شوند. احتمال می‌تواند از 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 نگاهی بیندازید:

منابع/حساب‌ها.txt

My credit card number is 1234 5678 9012 3456, and my CVV is 789.

دوباره inspect.js اجرا کنید، این بار با گزینه file:

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 برای بررسی ورودی استفاده می‌کند:

بازرسی.js

async function inspectString(
  callingProjectId,
  string,
  minLikelihood,
  maxFindings,
  infoTypes,
  customInfoTypes,
  includeQuote
) {
...
}

آرگومان‌های ارائه شده برای پارامترهای بالا برای ساخت یک شیء درخواست استفاده می‌شوند. سپس آن درخواست به تابع inspectContent ارائه می‌شود تا پاسخی دریافت شود که منجر به خروجی ما می‌شود:

بازرسی.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);

۴. هویت‌زدایی

فراتر از بازرسی و تشخیص داده‌های حساس، 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 برای شناسایی مجدد با ماسک استفاده می‌کند:

دید.js

async function deidentifyWithMask(
  callingProjectId,
  string,
  maskingCharacter,
  numberToMask
) {
...
}

یک بار دیگر، این آرگومان‌ها برای ساخت یک شیء درخواست استفاده می‌شوند. این بار به تابع deidentifyContent ارائه می‌شوند:

دید.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 همچنین امکان رمزگذاری مقادیر داده‌های حساس با استفاده از یک کلید رمزنگاری را ارائه می‌دهد.

ما با استفاده از 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

بیایید نگاهی به تابعی که برای شناسایی نکردن رشته استفاده می‌کنیم، بیندازیم:

دید.js

async function deidentifyWithFpe(
  callingProjectId,
  string,
  alphabet,
  surrogateType,
  keyName,
  wrappedKey
) {
...
}

آرگومان‌ها برای ساخت یک شیء cryptoReplaceFfxFpeConfig استفاده می‌شوند:

دید.js

  const cryptoReplaceFfxFpeConfig = {
    cryptoKey: {
      kmsWrapped: {
        wrappedKey: wrappedKey,
        cryptoKeyName: keyName,
      },
    },
    commonAlphabet: alphabet,
  };
  if (surrogateType) {
    cryptoReplaceFfxFpeConfig.surrogateInfoType = {
      name: surrogateType,
    };
  }

شیء cryptoReplaceFfxFpeConfig به نوبه خود در درخواست به API از طریق تابع deidentifyContent استفاده می‌شود:

دید.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 از متن رمزی که در مرحله قبل ایجاد کردیم استفاده خواهد کرد:

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

تابعی که برای شناسایی مجدد داده‌ها استفاده می‌شود، مشابه تابعی است که برای شناسایی مجدد آنها استفاده می‌شود:

دید.js

async function reidentifyWithFpe(
  callingProjectId,
  string,
  alphabet,
  surrogateType,
  keyName,
  wrappedKey
) {
...
}

و یک بار دیگر، آرگومان‌ها در یک درخواست به API، این بار به تابع reidentifyContent ، استفاده می‌شوند:

دید.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 نمونه که حاوی داده‌های تاریخ است نگاهی بیندازید:

منابع/تاریخ‌ها.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 ایجاد می‌شود که تاریخ‌ها به صورت تصادفی بین ۳۰ تا ۹۰ روز جابجا می‌شوند. در اینجا مثالی از خروجی تولید شده آمده است:

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 بدون تغییر باقی می‌ماند.

بیایید نگاهی به تابعی بیندازیم که با استفاده از dateshift، عدم شناسایی را مدیریت می‌کند:

دید.js

async function deidentifyWithDateShift(
  callingProjectId,
  inputCsvFile,
  outputCsvFile,
  dateFields,
  lowerBoundDays,
  upperBoundDays,
  contextFieldId,
  wrappedKey,
  keyName
) {
...
}

توجه داشته باشید که این تابع می‌تواند یک کلید پیچیده و یک نام کلید را بپذیرد، مشابه با deidentification با FPE، به طوری که ما می‌توانیم یک کلید رمزگذاری برای شناسایی مجدد یک تغییر تاریخ ارائه دهیم. آرگومان‌هایی که ارائه می‌دهیم یک شیء dateShiftConfig می‌سازند:

دید.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,
  };

۵. ویرایش رشته‌ها و تصاویر

روش دیگر برای مبهم‌سازی اطلاعات حساس، ویرایش است. ویرایش، یک مورد منطبق را با نوع اطلاعاتی که برای مطابقت با آن شناسایی شده است، جایگزین می‌کند. 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 می‌تواند به طور مشابه اطلاعات را از تصاویری که حاوی متن هستند، حذف کند. برای نشان دادن این موضوع، بیایید نگاهی به یک تصویر نمونه بیندازیم:

منابع/آزمون.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 ارائه خواهد شد:

ویرایش.js

const request = {
    parent: dlp.projectPath(callingProjectId),
    item: {
      value: string,
    },
    deidentifyConfig: {
      infoTypeTransformations: {
        transformations: [replaceWithInfoTypeTransformation],
      },
    },
    inspectConfig: {
      minLikelihood: minLikelihood,
      infoTypes: infoTypes,
    },
  };

به طور مشابه، در اینجا تابعی برای ویرایش یک تصویر آمده است:

ویرایش.js

async function redactImage(
  callingProjectId,
  filepath,
  minLikelihood,
  infoTypes,
  outputPath
) {
...}

و این درخواستی است که به تابع redactImage ارائه خواهد شد:

ویرایش.js

// Construct image redaction request
  const request = {
    parent: dlp.projectPath(callingProjectId),
    byteItem: {
      type: fileTypeConstant,
      data: fileBytes,
    },
    inspectConfig: {
      minLikelihood: minLikelihood,
      infoTypes: infoTypes,
    },
    imageRedactionConfigs: imageRedactionConfigs,
  };

۶. تمیز کردن

ما بررسی کرده‌ایم که چگونه می‌توانیم از DLP API برای پنهان کردن، غیر قابل شناسایی کردن و حذف اطلاعات حساس از داده‌های خود استفاده کنیم. اکنون زمان آن رسیده است که پروژه خود را از هرگونه منبعی که ایجاد کرده‌ایم، پاک کنیم.

حذف پروژه

در کنسول GCP، به صفحه Cloud Resource Manager بروید:

در لیست پروژه‌ها، پروژه‌ای را که روی آن کار می‌کردیم انتخاب کرده و روی «حذف» کلیک کنید. از شما خواسته می‌شود شناسه پروژه را وارد کنید. آن را وارد کرده و روی «خاموش کردن» کلیک کنید.

از طرف دیگر، می‌توانید کل پروژه را مستقیماً از Cloud Shell با gcloud حذف کنید:

gcloud projects delete $GOOGLE_CLOUD_PROJECT

۷. تبریک می‌گویم!

هورا! شما موفق شدید! Cloud DLP ابزاری قدرتمند است که دسترسی به یک پلتفرم قدرتمند بازرسی، طبقه‌بندی و شناسایی‌زدایی داده‌های حساس را فراهم می‌کند.

آنچه ما پوشش داده‌ایم

  • دیدیم که چگونه می‌توان از API Cloud DLP برای بررسی رشته‌ها و فایل‌ها برای یافتن انواع اطلاعات مختلف استفاده کرد.
  • ما یاد گرفتیم که چگونه API DLP می‌تواند رشته‌ها را با یک ماسک برای پنهان کردن انواع اطلاعات منطبق با داده‌ها، از حالت شناسایی خارج کند.
  • ما از DLP API برای استفاده از یک کلید رمزگذاری جهت شناسایی مجدد و سپس شناسایی مجدد داده‌ها استفاده کردیم.
  • ما از DLP API برای ویرایش داده‌ها از یک رشته و همچنین یک تصویر استفاده کردیم.