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

1. بررسی اجمالی

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

کاری که خواهی کرد

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

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

  • پروژه Google Cloud با تنظیم صورت‌حساب. اگر ندارید باید یکی بسازید .

2. راه اندازی

این کد لبه می تواند به طور کامل در پلتفرم Google Cloud بدون هیچ گونه نصب یا پیکربندی محلی اجرا شود.

پوسته ابری

در سراسر این کد، ما منابع و خدمات مختلف ابری را با استفاده از خط فرمان از طریق 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 سرویس مدیریت کلید ابری (KMS) - Google Cloud KMS به مشتریان امکان می دهد کلیدهای رمزگذاری را مدیریت کرده و با آن کلیدها عملیات رمزنگاری را انجام دهند.

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

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

3. رشته ها و فایل ها را بررسی کنید

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

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

شناسایی مجدد داده ها

برای شناسایی مجدد داده ها، API DLP از متن رمزی که در مرحله قبل ایجاد کردیم استفاده می کند:

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

منابع/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 بروید:

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

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

gcloud projects delete $GOOGLE_CLOUD_PROJECT

7. تبریک می گویم!

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

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

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