Обзор предотвращения потери данных в облаке

1. Обзор

Предотвращение потери данных в облаке (DLP) — это полностью управляемый сервис, предназначенный для обнаружения, классификации и защиты конфиденциальной информации. В этой кодовой лаборатории будут представлены некоторые базовые возможности Cloud DLP API и продемонстрированы различные способы его использования для защиты данных.

Что ты будешь делать

  • Используйте DLP для проверки строк и файлов на предмет соответствия типов информации.
  • Узнайте о методах деидентификации и используйте DLP для деидентификации данных.
  • Узнайте, как повторно идентифицировать данные, которые были деидентифицированы с помощью шифрования с сохранением формата (FPE).
  • Используйте DLP для удаления типов информации из строк и изображений.

Что вам понадобится

  • Проект Google Cloud с настроенной оплатой. Если у вас его нет, вам придется его создать .

2. Приступаем к настройке

Эта лаборатория кода может полностью работать на Google Cloud Platform без какой-либо локальной установки или настройки.

Облачная оболочка

В ходе этой лабораторной работы мы будем предоставлять различные облачные ресурсы и сервисы и управлять ими с помощью командной строки через 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 (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 :

ресурсы/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 для проверки входных данных:

проверить.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);

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

Деидентификация с помощью шифрования с сохранением формата

API DLP также предлагает возможность шифровать значения конфиденциальных данных с помощью криптографического ключа.

Начнем с использования Cloud KMS для создания связки ключей:

gcloud kms keyrings create dlp-keyring --location global

Теперь мы можем создать ключ, который будем использовать для шифрования данных:

gcloud kms keys create dlp-key \
--purpose='encryption' \
--location=global \
--keyring=dlp-keyring

API DLP будет принимать упакованный ключ, зашифрованный с помощью созданного нами ключа 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 может аналогичным образом удалять информацию из изображений, содержащих текст. Для демонстрации давайте взглянем на пример изображения:

ресурсы/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

Вот функция, которая используется для редактирования строки:

Редакт.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,
  };

6. Очистка

Мы изучили, как можно использовать API DLP для маскировки, деидентификации и удаления конфиденциальной информации из наших данных. Теперь пришло время очистить наш проект от всех созданных нами ресурсов.

Удалить проект

В консоли GCP перейдите на страницу диспетчера облачных ресурсов :

В списке проектов выберите проект, над которым мы работали, и нажмите «Удалить» . Вам будет предложено ввести идентификатор проекта. Введите его и нажмите «Выключить».

Альтернативно вы можете удалить весь проект непосредственно из Cloud Shell с помощью gcloud:

gcloud projects delete $GOOGLE_CLOUD_PROJECT

7. Поздравляем!

Ууууу! Вы сделали это! Cloud DLP — это мощный инструмент, который обеспечивает доступ к мощной платформе проверки, классификации и деидентификации конфиденциальных данных.

Что мы рассмотрели

  • Мы увидели, как API Cloud DLP можно использовать для проверки строк и файлов на наличие нескольких типов информации.
  • Мы узнали, как API DLP может деидентифицировать строки с помощью маски, чтобы скрыть типы информации, соответствующие данным.
  • Мы использовали API DLP, чтобы использовать ключ шифрования для деидентификации, а затем повторной идентификации данных.
  • Мы использовали DLP API для редактирования данных как из строки, так и из изображения.