透過 DLP API 和 Cloud Functions 自動將上傳至 Cloud Storage 的資料分類

1. 總覽

在現代的機構中,各種來源的資料數量不斷增加。這往往需要隔離和分類資料,以便有策略地儲存和保護資料。如果仍然需要手動資料,所費不貲且無法執行。

在本程式碼研究室中,我們會說明如何自動分類上傳至 Cloud Storage 的資料,並將資料移至對應的儲存空間值區。我們會透過 Cloud Pub/Sub、Cloud Functions、Cloud Data Loss Prevention 和 Cloud Storage 來完成這項工作。

學習內容

  • 建立 Cloud Storage 值區,做為隔離和分類管道的一部分。
  • 建立簡單的 Cloud 函式,在上傳檔案時叫用 DLP API。
  • 建立 Pub/Sub 主題和訂閱項目,讓系統在檔案處理完成時通知您。
  • 將範例檔案上傳至隔離值區,以叫用 Cloud 函式
  • 使用 DLP API 檢查及分類檔案,並將檔案移至適當的值區。

軟硬體需求

  • 已設定帳單的 Google Cloud 專案。如果沒有 Google 帳戶,請先建立帳戶

2. 開始設定

在本程式碼研究室中,我們將透過 Cloud Shell 使用指令列,佈建及管理不同的雲端資源和服務。以下指令會與 Cloud Shell 編輯器同時開啟 Cloud Shell,並複製隨附專案存放區:

請使用 gcloud config set project [PROJECT_ID] 設定,確保使用的專案正確無誤

啟用 API

在 Google Cloud 專案中啟用必要的 API:

  • Cloud Functions API:管理因應事件而執行的簡易函式。
  • Cloud Data Loss Prevention (DLP) API:提供在文字、圖片和 Google Cloud Platform 儲存空間存放區中偵測、風險分析和去識別化的方法。
  • Cloud Storage:Google Cloud Storage 是 RESTful 服務,可在 Google 的基礎架構上儲存與存取資料。

服務帳戶權限

服務帳戶是一種特殊類型的帳戶,可供應用程式和虛擬機器執行已授權的 API 呼叫。

App Engine 預設服務帳戶

App Engine 預設服務帳戶可用來代表在 App Engine 中運作的應用程式,在 Cloud 專案中執行工作。根據預設,專案中已有這個服務帳戶獲派「編輯者」角色。

首先,我們會將管理資料遺失防護工作所需的「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、儲存空間、資料儲存庫、Pub 和金鑰管理服務:

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 服務帳戶。這個服務帳戶是在啟用 DLP API 時自動建立,但一開始沒有任何角色。將檢視者角色授予服務帳戶:

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. Cloud Storage 值區

現在,您需要建立 3 個 Cloud Storage 值區來儲存資料:

  • 隔離值區:我們的資料最初會上傳至這裡。
  • 機密資料值區:系統會將 DLP API 判定為機密資料的資料移至這裡。
  • 非機密資料值區:系統會將 DLP API 判定為非機密資料的資料移到這裡

使用 gsutil 指令,即可一次建立全部三個值區:

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

請記下您剛剛建立的值區名稱,稍後會用到。

4. Pub/Sub 主題和訂閱

Cloud Pub/Sub 為應用程式之間提供多種非同步訊息傳遞。發布者會建立訊息,並將訊息發布至主題訊息動態消息。「訂閱者」會透過「訂閱」接收這些訊息。在此情況下,我們會利用 Cloud 函式,在資料遺失防護工作執行後將檔案移至各自的值區。

首先,請建立主題。每次檔案新增至隔離儲存空間值區時,系統就會在這裡發布訊息。將範本命名為「classify-topic」

gcloud pubsub topics create classify-topic

主題發布訊息時,系統會通知「訂閱項目」。讓我們建立名為「classify-sub」的 Pub/Sub 訂閱項目:

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

訂閱項目會觸發第二個 Cloud 函式,觸發資料遺失防護工作,以便檢查檔案並移至正確位置。

5. Cloud Functions

透過 Cloud Functions,我們可以部署以事件為基礎的輕量非同步單一用途函式,而且不必管理伺服器或執行階段環境。我們將使用位於 dlp-cloud-functions-tutorials/gcs-dlp-classification-python/ 提供的 main.py 檔案部署 2 個 Cloud 函式

替換變數

我們必須先替換 main.py 檔案中的一些變數,才能建立函式。

在 Cloud Shell 編輯器中,使用先前建立的對應值區取代第 28 至 34 行的專案 ID 值和值區變數,藉此調整 main.py:

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 中,將目錄變更為 main.py 檔案所在的 gcs-dlp-classification-python:

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

現在要部署一些函式了。

首先,請部署 create_DLP_job 函式,將 [YOUR_QUARANTINE_BUCKET] 替換為正確的值區名稱。有新檔案上傳至指定的 Cloud Storage 隔離值區時,就會觸發這個函式,並為每個上傳檔案建立資料遺失防護工作:

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

接下來,請部署 resolve_DLP 函式,指出主題是該函式的觸發事件。這個函式會監聽上述函式中後續資料遺失防護工作啟動的 Pub/Sub 通知。收到 Pub/Sub 通知後,系統會立即從資料遺失防護工作中尋找結果,並將檔案移至機密值區或非機密值區:

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

驗證

使用 gcloud functions describe 指令,確認兩個 Cloud 函式都已成功部署:

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]

如要查看我們已開始進行的一系列事件,請先前往 Cloud Functions 頁面:

按一下 create_DLP_job 函式的「動作」選單,然後選取「查看記錄」:

89211a959bf30392.png

在這個函式的記錄中,我們發現每個檔案至少都有 4 個項目,指出:

  • 已開始執行函式
  • 函式已針對特定檔案觸發
  • 已建立工作
  • 函式已執行完畢

c864dff5a03c75a9.png

每個檔案的 create_DLP_job 函式就會啟動相應的資料遺失防護工作。請前往「DLP 工作」頁面,查看佇列中的資料遺失防護工作清單:

系統會列出待處理、執行中或完成的工作。每個檔案都對應我們上傳的檔案:

6af34e72ecb83faf.png

您可以按一下任一工作的 ID 來查看詳細資料,

如果您返回「Cloud Functions」頁面並檢查 resolve_DLP 函式的記錄檔,每個檔案都至少會顯示 8 個項目,這代表:

  • 已開始執行函式
  • 已收到 Pub/Sub 通知
  • 對應 DLP 工作的名稱
  • 狀態碼
  • 機密資料的執行個體數量 (如有)
  • 檔案會移至的值區
  • DLP 工作已完成剖析檔案
  • 函式已執行完畢

5025bd672cba90a0.png

一旦對 resolve_DLP 函式的所有呼叫都執行完畢,請再次查看隔離值區的內容:

gsutil ls gs://[YOUR_QUARANTINE_BUCKET]

這次必須完全空白。不過,如果您對其他值區執行相同的指令,會發現我們的檔案會完美分離至對應的值區!

7. 清除

我們已經介紹瞭如何搭配 Cloud Functions 使用 DLP API 進行資料分類,現在讓我們清除建立的所有資源吧。

刪除專案

如有需要,您可以刪除整個專案。前往 GCP Console 的「Cloud Resource Manager」頁面。

在專案清單中,選取處理中的專案,然後按一下「Delete」(刪除)。系統會提示您輸入專案 ID。輸入 PIN 碼,然後按一下「關閉」

或者,您也可以透過 gcloud 直接從 Cloud Shell 刪除整個專案:

gcloud projects delete [PROJECT_ID]

如果想逐一刪除不同元件,請按照下一節的說明操作。

Cloud Functions

使用 gcloud 刪除兩個 Cloud 函式:

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 刪除 Pub/Sub 訂閱:

gcloud pubsub subscriptions delete classify-sub

最後,使用 gcloud 刪除 Pub/Sub 主題:

gcloud pubsub topics delete classify-topic

8. 恭喜!

太厲害了!你做到了。您已瞭解如何搭配使用 DLP API 和 Cloud Functions 來自動化檔案分類!

涵蓋內容

  • 我們建立 Cloud Storage 值區來儲存機密資料和非機密資料
  • 我們建立了 Pub/Sub 主題和訂閱項目,藉此觸發 Cloud 函式
  • 我們建立了 Cloud Functions 來啟動 DLP 工作,根據檔案中的機密資料分類檔案。
  • 我們上傳測試資料並檢查了 Cloud FunctionsStackdriver 記錄,瞭解處理流程