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

1. Обзор

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

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

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

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

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

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

2. Настройка

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

Убедитесь, что вы используете правильный проект, указав его с помощью 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, storage, datastore, pubsub и key management:

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 сегмента Cloud Storage для хранения наших данных:

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

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

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

Запишите названия созданных вами контейнеров — они понадобятся нам позже.

4. Тема публикации/подписки и подписка

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

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

gcloud pubsub topics create classify-topic

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

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

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

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

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

Замена переменных

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

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

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 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 , указав нашу тему в качестве триггера. Эта функция прослушивает уведомления pub/sub, инициированные последующим заданием DLP из функции, описанной выше. Как только она получает уведомление pub/sub, она обрабатывает результаты задания 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

Наши примеры файлов представляют собой текстовые и 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]

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

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

89211a959bf30392.png

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

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

c864dff5a03c75a9.png

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

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

6af34e72ecb83faf.png

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

Если вы вернетесь на страницу Cloud Functions и посмотрите журналы функции resolve_DLP, вы увидите как минимум 8 записей для каждого файла, указывающих на следующее:

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

5025bd672cba90a0.png

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

gsutil ls gs://[YOUR_QUARANTINE_BUCKET]

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

7. Уборка

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

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

При желании вы можете удалить весь проект. В консоли 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. Поздравляем!

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

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

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