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

1. Обзор

В современных организациях постоянно растет объем данных, поступающих из различных источников. Это часто требует помещения в карантин и классификации этих данных для их стратегического хранения и защиты – задача, которая быстро станет дорогостоящей и невозможной, если она останется ручной.

В этой лаборатории кода мы увидим, как можно автоматически классифицировать данные, загруженные в Cloud Storage, и переместить их в соответствующий сегмент хранилища. Мы достигнем этого с помощью Cloud Pub/Sub, облачных функций, предотвращения потери данных в облаке и облачного хранилища.

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

  • Создайте сегменты Cloud Storage, которые будут использоваться как часть конвейера карантина и классификации.
  • Создайте простую облачную функцию, которая вызывает API DLP при загрузке файлов.
  • Создайте тему Pub/Sub и подписку, чтобы уведомлять вас о завершении обработки файла.
  • Загрузите образцы файлов в корзину карантина, чтобы вызвать облачную функцию.
  • Используйте API DLP для проверки и классификации файлов и перемещения их в соответствующую корзину.

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

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

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

В ходе этой лабораторной работы мы будем предоставлять различные облачные ресурсы и сервисы и управлять ими с помощью командной строки через Cloud Shell . Следующее действие откроет Cloud Shell вместе с редактором Cloud Shell и клонирует репозиторий сопутствующего проекта:

Убедитесь, что вы используете правильный проект, задав его с помощью gcloud config set project [PROJECT_ID]

Включить API

Включите необходимые API в своем проекте Google Cloud:

  • API облачных функций — управляет облегченными пользовательскими функциями, выполняемыми в ответ на события.
  • API Cloud Data Loss Prevention (DLP) — предоставляет методы обнаружения, анализа рисков и деидентификации конфиденциальных фрагментов в тексте, изображениях и репозиториях хранилища Google Cloud Platform.
  • Облачное хранилище. Google Cloud Storage — это служба RESTful для хранения и доступа к вашим данным в инфраструктуре Google.

Разрешения для сервисных учетных записей

Учетная запись службы — это особый тип учетной записи, который используется приложениями и виртуальными машинами для авторизованных вызовов API.

Учетная запись службы App Engine по умолчанию

Учетная запись службы App Engine по умолчанию используется для выполнения задач в вашем облачном проекте от имени ваших приложений, работающих в App Engine. Эта учетная запись службы существует в вашем проекте по умолчанию с назначенной ролью редактора.

Сначала мы предоставим нашей сервисной учетной записи роль администратора DLP, необходимую для администрирования заданий по предотвращению потери данных:

gcloud projects add-iam-policy-binding $GOOGLE_CLOUD_PROJECT \
--member serviceAccount:$GOOGLE_CLOUD_PROJECT@appspot.gserviceaccount.com \
--role roles/dlp.admin

И, наконец, предоставьте роль агента службы DLP API, которая предоставит учетной записи службы разрешения для bigquery, хранилища, хранилища данных, pubsub и службы управления ключами:

gcloud projects add-iam-policy-binding $GOOGLE_CLOUD_PROJECT \
--member serviceAccount:$GOOGLE_CLOUD_PROJECT@appspot.gserviceaccount.com \
--role roles/dlp.serviceAgent

Учетная запись службы DLP

Помимо учетной записи службы App Engine, мы также будем использовать учетную запись службы DLP. Эта учетная запись службы была автоматически создана при включении API DLP, и изначально ей не были предоставлены роли. Давайте предоставим ему роль зрителя:

gcloud projects add-iam-policy-binding $GOOGLE_CLOUD_PROJECT \
--member serviceAccount:service-`gcloud projects list --filter="PROJECT_ID:$GOOGLE_CLOUD_PROJECT" --format="value(PROJECT_NUMBER)"`@dlp-api.iam.gserviceaccount.com \
--role roles/viewer

3. Корзины облачного хранилища

Теперь нам нужно создать 3 сегмента облачного хранилища для хранения наших данных:

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

Мы можем использовать команду gsutil, чтобы создать все три наших сегмента одним махом:

gsutil mb gs://[YOUR_QUARANTINE_BUCKET] \
gs://[YOUR_SENSITIVE_DATA_BUCKET] \
gs://[YOUR_NON_SENSITIVE_DATA_BUCKET] 

Запишите имена только что созданных сегментов — они понадобятся нам позже.

4. Тема Pub/Sub и подписка

Cloud Pub/Sub обеспечивает асинхронный обмен сообщениями между приложениями. Издатель создаст сообщение и опубликует его в ленте сообщений, называемой темой . Абонент будет получать эти сообщения по подписке . В нашем случае на основе этой подписки у нас будет облачная функция, которая будет перемещать файлы в соответствующие корзины после запуска задания DLP.

Для начала создадим тему. Сообщение будет публиковаться здесь каждый раз, когда файл добавляется в нашу корзину карантинного хранилища. Мы назовем его «классифицируемая тема».

gcloud pubsub topics create classify-topic

Подписка будет уведомлена, когда тема опубликует сообщение. Давайте создадим подписку pubsub с именем «classify-sub»:

gcloud pubsub subscriptions create classify-sub --topic classify-topic

Эта подписка активирует вторую облачную функцию, которая инициирует задание DLP, которое проверит файл и переместит его в нужное место.

5. Облачные функции

Облачные функции позволяют нам развертывать легкие, основанные на событиях, асинхронные одноцелевые функции без необходимости управлять сервером или средой выполнения. Мы собираемся развернуть две облачные функции, используя предоставленный файл main.py , расположенный в dlp-cloud-functions-tutorials/gcs-dlp-classification-python/

Заменить переменные

Прежде чем мы сможем создать наши функции, нам нужно заменить некоторые переменные в нашем файле main.py

В редакторе Cloud Shell настройте файл main.py, заменив значения идентификатора проекта и переменных сегмента в строках 28–34, используя соответствующие сегменты, созданные ранее:

main.py

PROJECT_ID = '[PROJECT_ID_HOSTING_STAGING_BUCKET]'
"""The bucket the to-be-scanned files are uploaded to."""
STAGING_BUCKET = '[YOUR_QUARANTINE_BUCKET]'
"""The bucket to move "sensitive" files to."""
SENSITIVE_BUCKET = '[YOUR_SENSITIVE_DATA_BUCKET]'
"""The bucket to move "non sensitive" files to."""
NONSENSITIVE_BUCKET = '[YOUR_NON_SENSITIVE_DATA_BUCKET]'

Кроме того, замените значение переменной темы pub/sub на тему pub/sub, созданную на предыдущем шаге:

""" Pub/Sub topic to notify once the  DLP job completes."""
PUB_SUB_TOPIC = 'classify-topic'

Развертывание функций

В Cloud Shell измените каталог на gcs-dlp-classification-python, где находится файл main.py :

cd ~/cloudshell_open/dlp-cloud-functions-tutorials/gcs-dlp-classification-python

Пришло время развернуть некоторые функции.

Сначала разверните функцию create_DLP_job , заменив [YOUR_QUARANTINE_BUCKET] правильным именем корзины. Эта функция срабатывает, когда новые файлы загружаются в назначенный карантинный сегмент Cloud Storage, и для каждого загруженного файла создается задание DLP:

gcloud functions deploy create_DLP_job --runtime python37 \
--trigger-event google.storage.object.finalize \
--trigger-resource [YOUR_QUARANTINE_BUCKET]

Затем разверните resolve_DLP , указав нашу тему в качестве триггера для нее. Эта функция прослушивает уведомления о публикации и подписке, инициированные последующим заданием DLP из функции, указанной выше. Как только он получает уведомление о публикации/подписке, он получает результаты задания DLP и перемещает файл в конфиденциальную или неконфиденциальную корзину соответственно:

gcloud functions deploy resolve_DLP --runtime python37 \
--trigger-topic classify-topic

Проверять

Убедитесь, что обе наши облачные функции были успешно развернуты с помощью команды gcloud functions describe :

gcloud functions describe create_DLP_job
gcloud functions describe resolve_DLP

В случае успешного развертывания выходные данные будут иметь статус ACTIVE .

6. Тестирование с выборочными данными

Теперь, когда все детали готовы, мы можем протестировать их с помощью нескольких примеров файлов. В Cloud Shell измените текущий рабочий каталог на sample_data :

cd ~/cloudshell_open/dlp-cloud-functions-tutorials/sample_data

Наши примеры файлов состоят из файлов txt и csv, содержащих различные фрагменты данных. Файлы с префиксом «sample_s» будут содержать конфиденциальные данные, а файлы с префиксом «sample_n» — нет. Например, файл sample_s20.csv содержит данные, отформатированные под номера социального страхования США:

sample_s20.csv

Name,SSN,metric 1,metric 2
Maria Johnson,284-73-5110,5,43
Tyler Parker,284-73-5110,8,17
Maria Johnson,284-73-5110,54,63
Maria Johnson,245-25-8698,53,19
Tyler Parker,475-15-8499,6,67
Maria Johnson,719-12-6560,75,83
Maria Johnson,616-69-3226,91,13
Tzvika Roberts,245-25-8698,94,61

С другой стороны, данные в sample_n15.csv не будут считаться конфиденциальными:

sample_n15.csv

record id,metric 1,metric 2,metric 3
1,59,93,100
2,53,13,17
3,59,67,53
4,52,93,34
5,14,22,88
6,18,88,3
7,32,49,5
8,93,46,14

Чтобы увидеть, как наша установка будет обращаться с нашими файлами, давайте загрузим все наши тестовые файлы в карантин.

ведро:

gsutil -m cp * gs://[YOUR_QUARANTINE_BUCKET]

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

gsutil ls gs://[YOUR_QUARANTINE_BUCKET]

Чтобы ознакомиться с серией мероприятий, которые мы начали, начните с перехода на страницу «Облачные функции»:

Откройте меню «Действия» для функции create_DLP_job и выберите «Просмотреть журналы»:

89211a959bf30392.png

В нашем журнале этой функции мы видим как минимум 4 записи для каждого из наших файлов, указывающие:

  • Выполнение функции началось
  • Функция была запущена для определенного файла
  • Было создано рабочее место
  • Функция завершила выполнение

c864dff5a03c75a9.png

После завершения функции create_DLP_job для каждого файла инициируется соответствующее задание DLP. Перейдите на страницу заданий DLP, чтобы просмотреть список заданий DLP в очереди:

Вы увидите список заданий, ожидающих выполнения, выполняемых или выполненных. Каждый из них соответствует одному из загруженных нами файлов:

6af34e72ecb83faf.png

Вы можете щелкнуть идентификатор любого из этих заданий, чтобы просмотреть более подробную информацию.

Если вы вернетесь на страницу «Облачные функции» и проверите журналы функцииsolve_DLP, вы увидите как минимум 8 записей для каждого файла, что указывает на:

  • Выполнение функции началось
  • Получено уведомление о публикации/подписке.
  • Имя соответствующего задания DLP.
  • Код состояния
  • Количество экземпляров конфиденциальных данных (если таковые имеются)
  • Корзина, в которую будет перемещен файл
  • Задание DLP завершило анализ файла.
  • Функция завершила выполнение

5025bd672cba90a0.png

Как только все вызовы функцииsolve_DLP завершатся, еще раз проверьте содержимое карантинной корзины:

gsutil ls gs://[YOUR_QUARANTINE_BUCKET]

На этот раз оно должно быть совершенно пустым. Однако если вы запустите ту же команду, описанную выше, для других сегментов, вы обнаружите, что наши файлы идеально разделены по соответствующим сегментам!

7. Очистка

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

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

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

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

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

gcloud projects delete [PROJECT_ID]

Если вы предпочитаете удалять различные компоненты один за другим, перейдите к следующему разделу.

Облачные функции

Удалите обе наши облачные функции с помощью gcloud:

gcloud functions delete -q create_DLP_job && gcloud functions delete -q resolve_DLP

Ведра для хранения

Удалите все загруженные файлы и удалите сегменты с помощью gsutil:

gsutil rm -r gs://[YOUR_QUARANTINE_BUCKET] \
gs://[YOUR_SENSITIVE_DATA_BUCKET] \
gs://[YOUR_NON_SENSITIVE_DATA_BUCKET] 

Паб/Саб

Сначала удалите подписку pub/sub с помощью gcloud:

gcloud pubsub subscriptions delete classify-sub

И, наконец, удалите тему pub/sub с помощью gcloud:

gcloud pubsub topics delete classify-topic

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

Ууууу! Вы сделали это. Вы узнали, как использовать DLP API вместе с облачными функциями для автоматизации классификации файлов!

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

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