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
Чтобы удалить номер телефона и адрес электронной почты с изображения выше:
node redact.js -c $GOOGLE_CLOUD_PROJECT \ image resources/test.png ./redacted.png \ -t PHONE_NUMBER -t EMAIL_ADDRESS
Как указано, новое изображение с именем redacted.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 для редактирования данных как из строки, так и из изображения.