Automatyczna klasyfikacja danych przesłanych do Cloud Storage za pomocą interfejsu DLP API i Cloud Functions

1. Omówienie

Nowoczesne organizacje otrzymują coraz większą ilość danych z różnych źródeł. Często wymaga to kwarantanny i klasyfikacji danych w celu ich strategicznego przechowywania i ochrony. Jest to zadanie, które szybko stanie się kosztowne i niewykonalne, jeśli będzie ręczne.

W ramach tego ćwiczenia w programie pokażemy, jak można automatycznie klasyfikować dane przesłane do Cloud Storage i przenieść je do odpowiedniego zasobnika na dane. Do tego celu użyjemy Cloud Pub/Sub, Cloud Functions, Cloud Data Loss Prevention i Cloud Storage.

Jakie zadania wykonasz

  • Utwórz zasobniki Cloud Storage, które będą używane w ramach potoku kwarantanny i klasyfikacji.
  • utworzyć prostą funkcję w Cloud Functions, która wywołuje interfejs DLP API po przesłaniu plików;
  • Utwórz temat Pub/Sub i subskrypcję, aby powiadomić Cię o zakończeniu przetwarzania pliku.
  • Aby wywołać funkcję w Cloud Functions, prześlij przykładowe pliki do zasobnika kwarantanny
  • Za pomocą interfejsu DLP API możesz zbadać i sklasyfikować pliki oraz przenieść je do odpowiedniego zasobnika.

Czego potrzebujesz

  • Projekt Google Cloud ze skonfigurowanymi płatnościami. Jeśli nie masz konta Google, musisz je utworzyć.

2. Przygotowanie

W ramach tych ćwiczeń w programie udostępnimy różne zasoby i usługi w chmurze oraz będziemy nimi zarządzać za pomocą wiersza poleceń w Cloud Shell. Czynność poniżej spowoduje otwarcie Cloud Shell wraz z edytorem Cloud Shell i sklonowanie repozytorium projektu towarzyszącego:

Aby mieć pewność, że korzystasz z właściwego projektu, skonfiguruj go za pomocą gcloud config set project [PROJECT_ID]

Włączanie interfejsów API

Włącz wymagane interfejsy API w projekcie Google Cloud:

  • Cloud Functions API – zarządza prostszymi funkcjami udostępnianymi przez użytkowników w reakcji na zdarzenia.
  • Cloud Data Loss Prevention (DLP) API udostępnia metody wykrywania, analizy ryzyka i deidentyfikacji poufnych fragmentów w tekście, obrazach i repozytoriach miejsca na dane Google Cloud Platform.
  • Cloud Storage – Google Cloud Storage to usługa typu REST, która służy do przechowywania danych i uzyskiwania do nich dostępu w infrastrukturze Google.

Uprawnienia kont usługi

Konto usługi to specjalny typ konta, które jest używane przez aplikacje i maszyny wirtualne do autoryzowanych wywołań interfejsu API.

Domyślne konto usługi App Engine

Domyślne konto usługi App Engine służy do wykonywania zadań w projekcie Cloud w imieniu aplikacji działających w App Engine. To konto usługi domyślnie istnieje w Twoim projekcie z przypisaną rolą edytującego.

Najpierw przyznamy naszemu kontu usługi rolę administratora DLP niezbędną do administrowania zadaniami zapobiegania utracie danych:

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

Na koniec przypisz rolę agenta usługi DLP API, która umożliwi kontu usługi uprawnienia do BigQuery, pamięci masowej, magazynu danych, pubsub i usługi zarządzania kluczami:

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

Konto usługi DLP

Oprócz konta usługi App Engine będziemy też korzystać z konta usługi DLP. To konto usługi zostało utworzone automatycznie po włączeniu interfejsu DLP API i początkowo nie ma przyznanych ról. Przyznajmy mu rolę przeglądającego:

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. Zasobniki Cloud Storage

Teraz musimy utworzyć 3 zasobniki Cloud Storage do przechowywania danych:

  • Zasobnik kwarantanny: nasze dane zostaną początkowo przesłane tutaj.
  • Zasobnik danych wrażliwych: tutaj zostaną przeniesione dane, które interfejs DLP API uzna za wrażliwe.
  • Zasobnik danych niepoufnych: dane, które według interfejsu DLP API nie mają charakteru poufnego, zostaną przeniesione tutaj

Możemy użyć polecenia gsutil, aby za jednym razem utworzyć wszystkie trzy zasobniki:

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

Zanotuj nazwy utworzonych przed chwilą zasobników – będą one potrzebne później.

4. Temat i subskrypcja Pub/Sub

Cloud Pub/Sub zapewnia wiele lub wiele asynchronicznych komunikatów między aplikacjami. Wydawca tworzy wiadomość i publikuje ją w kanale wiadomości nazywanym tematem. Subskrybent otrzyma te wiadomości w ramach subskrypcji. Na podstawie tej subskrypcji w naszym przypadku po uruchomieniu zadania DLP nastąpi przeniesienie plików przez funkcję w Cloud Functions do odpowiednich zasobników.

Najpierw utwórz temat. Za każdym razem, gdy plik zostanie dodany do naszego zasobnika kwarantanny, zostanie w nim opublikowana wiadomość. Nadamy mu nazwę „klasyfikuj-temat”.

gcloud pubsub topics create classify-topic

Użytkownicy korzystający z subskrypcji zostaną powiadomieni, gdy w temacie pojawi się wiadomość. Utwórzmy subskrypcję PubSub o nazwie „classify-sub”:

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

Ta subskrypcja wywoła drugą funkcję w Cloud Functions, która zainicjuje zadanie DLP, które sprawdzi plik i przeniesie go we właściwe miejsce.

5. Cloud Functions

Dzięki Cloud Functions możemy wdrażać lekkie, oparte na zdarzeniach i asynchroniczne funkcje działające w jednym przeznaczeniu bez konieczności zarządzania serwerem lub środowiskiem wykonawczym. Wdrożenie 2 funkcji w Cloud Functions przy użyciu dostarczonego pliku main.py znajdującego się w lokalizacji dlp-cloud-functions-tutorials/gcs-dlp-classification-python/

Zastąp zmienne

Zanim utworzymy funkcje, musimy zastąpić niektóre zmienne w pliku main.py.

W edytorze Cloud Shell dostosuj main.py, zastępując wartości identyfikatora projektu i zmiennych zasobnika w wierszach 28–34 przy użyciu odpowiednich zasobników utworzonych wcześniej:

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]'

Dodatkowo wartość zmiennej tematu Pub/Sub zastąp tematem Pub/Sub utworzonym w poprzednim kroku:

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

Wdrażanie funkcji

W Cloud Shell zmień katalogi na gcs-dlp-classification-python, gdzie znajduje się plik main.py:

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

Czas wdrożyć kilka funkcji.

Najpierw wdróż funkcję create_DLP_job, zastępując [YOUR_QUARANTINE_BUCKET] prawidłową nazwą zasobnika. Ta funkcja jest wyzwalana, gdy nowe pliki są przesyłane do wyznaczonego zasobnika kwarantanny Cloud Storage i powoduje utworzenie zadania DLP dla każdego przesłanego pliku:

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

Następnie wdróż funkcję resolve_DLP, wskazując nasz temat jako aktywator. Ta funkcja nasłuchuje powiadomienia Pub/Sub zainicjowanego z kolejnego zadania DLP przy użyciu powyższej funkcji. Gdy tylko otrzyma powiadomienie Pub/Sub, odbierze wyniki zadania DLP i odpowiednio przeniesie plik do poufnego zasobnika lub zasobnika niepoufnego:

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

Zweryfikuj

Przy użyciu polecenia gcloud functions describe sprawdź, czy obie funkcje w Cloud Functions zostały wdrożone:

gcloud functions describe create_DLP_job
gcloud functions describe resolve_DLP

Po udanym wdrożeniu dane wyjściowe będą zawierać stan ACTIVE.

6. Testowanie z użyciem przykładowych danych

Wszystkie elementy są gotowe, więc możemy przetestować różne funkcje za pomocą przykładowych plików. W Cloud Shell zmień bieżący katalog roboczy na sample_data:

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

Nasze przykładowe pliki składają się z plików txt i csv zawierających różne fragmenty danych. Pliki z prefiksem „sample_s” będzie zawierać dane wrażliwe z prefiksem „sample_n” nie. Na przykład plik sample_s20.csv zawiera dane sformatowane w taki sposób, aby wyglądały jak numery PESEL:

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

Z drugiej strony dane w pliku sample_n15.csv nie zostaną uznane za poufne:

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

Aby sprawdzić, jak nasza konfiguracja będzie traktować nasze pliki, prześlij wszystkie pliki testowe do kwarantanny.

zasobnik:

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

Początkowo nasze pliki będą znajdować się w zasobniku kwarantanny, do którego zostały przesłane. Aby to sprawdzić, natychmiast po przesłaniu plików wyświetl zawartość zasobnika kwarantanny:

gsutil ls gs://[YOUR_QUARANTINE_BUCKET]

Aby zobaczyć rozpoczętą serię wydarzeń, otwórz stronę Cloud Functions:

Kliknij menu Działania przy funkcji create_DLP_job i wybierz Wyświetl dzienniki:

89211a959bf30392.png

W dzienniku dla tej funkcji w przypadku każdego pliku widoczne są co najmniej 4 pozycje wskazujące:

  • Rozpoczęto wykonywanie funkcji
  • Funkcja została aktywowana dla określonego pliku.
  • Zadanie zostało utworzone
  • Funkcja została wykonana

c864dff5a03c75a9.png

Po zakończeniu wykonywania funkcji create_DLP_job dla każdego pliku inicjowane jest odpowiednie zadanie DLP. Przejdź na stronę zadań DLP, aby zobaczyć listę zadań DLP w kolejce:

Pojawi się lista zadań oczekujących, uruchomionych lub wykonanych. Każda z nich odpowiada jednemu z przesłanych przez nas plików:

6af34e72ecb83faf.png

Możesz kliknąć identyfikator dowolnego z tych zadań, aby wyświetlić więcej szczegółów.

Jeśli wrócisz na stronę Cloud Functions i wylogujesz się z funkcji resolve_DLP, zobaczysz co najmniej 8 pozycji dla każdego pliku:

  • Rozpoczęto wykonywanie funkcji
  • Odebrano powiadomienie Pub/Sub
  • Nazwa odpowiedniego zadania DLP
  • kod stanu,
  • liczbę wystąpień danych wrażliwych (jeśli wystąpiły).
  • Zasobnik, do którego zostanie przeniesiony plik
  • Zadanie DLP zakończyło analizę pliku
  • Funkcja została wykonana

5025bd672cba90a0.png

Gdy tylko wszystkie wywołania funkcji resolve_DLP zostaną zakończone, jeszcze raz sprawdź zawartość zasobnika kwarantanny:

gsutil ls gs://[YOUR_QUARANTINE_BUCKET]

Tym razem pole powinno być całkowicie puste. Jeśli uruchomisz to samo polecenie dla innych zasobników, przekonasz się, że nasze pliki są idealnie rozdzielone na odpowiednie zasobniki.

7. Czyszczenie

Wiesz już, jak używać interfejsu DLP API w połączeniu z Cloud Functions do klasyfikowania danych, więc teraz uporządkujmy wszystkie utworzone zasoby w naszym projekcie.

Usuwanie projektu

Jeśli wolisz, możesz usunąć cały projekt. W konsoli GCP otwórz stronę Cloud Resource Manager (Menedżer zasobów Cloud):

Na liście projektów wybierz ten, nad którym pracujemy, i kliknij Usuń. Pojawi się prośba o wpisanie identyfikatora projektu. Wpisz go i kliknij Wyłącz.

Możesz też usunąć cały projekt bezpośrednio z Cloud Shell przy użyciu gcloud:

gcloud projects delete [PROJECT_ID]

Jeśli wolisz usuwać poszczególne komponenty, przejdź do następnej sekcji.

Funkcje Cloud

Usuń obie funkcje w Cloud Functions za pomocą gcloud:

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

Zasobniki na dane

Usuń wszystkie przesłane pliki i usuń zasobniki przy użyciu polecenia gsutil:

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

Pub/Sub

Najpierw usuń subskrypcję Pub/Sub za pomocą gcloud:

gcloud pubsub subscriptions delete classify-sub

Na koniec usuń temat Pub/Sub za pomocą gcloud:

gcloud pubsub topics delete classify-topic

8. Gratulacje!

Super! Udało się. Wiesz już, jak używać interfejsu DLP API oraz Cloud Functions do automatyzacji klasyfikacji plików.

Omówione zagadnienia

  • Utworzyliśmy zasobniki Cloud Storage do przechowywania naszych danych wrażliwych i niepoufnych
  • Utworzyliśmy temat i subskrypcję Pub/Sub, aby aktywować funkcję w Cloud Functions
  • Opracowaliśmy Cloud Functions, aby uruchomić zadanie DLP, które kategoryzuje pliki na podstawie zawartych w nich danych wrażliwych.
  • Przesłaliśmy dane testowe i sprawdziliśmy nasze funkcje w Cloud Functions logi usługi Stackdriver, które pozwalają zobaczyć, jak działa ten proces