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

1. 總覽

在現代組織中,來自各種來源的資料量不斷增加。這通常需要隔離及分類資料,以便策略性地儲存及保護資料,但如果仍以手動方式進行,這項工作很快就會變得既昂貴又不可能。

在本程式碼研究室中,我們將瞭解如何自動分類上傳至 Cloud Storage 的資料,並將資料移至對應的儲存空間值區。我們會使用 Cloud Pub/Sub、Cloud Functions、Cloud Data Loss Prevention 和 Cloud Storage 達成這個目標。

學習內容

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

軟硬體需求

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

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 是專為儲存及存取 Google 基礎架構資料且符合 REST 樣式的服務。

服務帳戶權限

服務帳戶是特殊類型的帳戶,應用程式和虛擬機器可透過這類帳戶發出授權 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/Sub 和金鑰管理服務的權限:

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 bucket

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

  • 隔離區儲存空間:資料一開始會上傳至這個位置。
  • 機密資料 bucket:DLP API 判斷為機密的資料會移至這個 bucket。
  • 非機密資料 bucket:DLP API 判斷為非機密的資料會移至這個 bucket

我們可以一次使用 gsutil 指令建立所有三個 bucket:

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

請記下剛才建立的 bucket 名稱,後續步驟會用到。

4. Pub/Sub 主題和訂閱項目

Cloud Pub/Sub 可在應用程式之間提供多對多的非同步訊息傳遞功能。發布者會建立訊息,並發布至稱為「主題」的訊息來源。訂閱者會透過訂閱項目接收這些訊息。根據該訂閱項目,在本例中,DLP 工作執行完畢後,Cloud Function 會將檔案移至各自的 bucket。

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

gcloud pubsub topics create classify-topic

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

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

該訂閱項目會觸發第二個 Cloud Function,啟動 DLP 工作來檢查檔案,並將檔案移至適當位置。

5. Cloud Functions

Cloud Functions 可讓我們部署依事件執行的簡易非同步單一用途函式,完全不必管理伺服器或執行階段環境。我們將使用 dlp-cloud-functions-tutorials/gcs-dlp-classification-python/ 中的 main.py 檔案,部署 2 個 Cloud 函式

取代變數

建立函式前,我們需要先替換 main.py 檔案中的部分變數。

在 Cloud Shell 編輯器中,調整 main.py,將第 28 到 34 行的專案 ID 和 bucket 變數值,替換為先前建立的對應 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 主題變數的值,替換為上一步建立的 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 隔離區 bucket,就會觸發這項函式,並為每個上傳的檔案建立 DLP 工作:

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

接著,請部署 resolve_DLP 函式,並將主題指定為觸發條件。這個函式會監聽從上述函式啟動的後續 DLP 作業所發起的 Pub/Sub 通知。收到 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

我們的範例檔案包含 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

如要瞭解設定會如何處理檔案,請將所有測試檔案上傳至隔離區

bucket:

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

一開始,檔案會放在我們上傳檔案的隔離區值區中。如要驗證這點,請在上傳檔案後立即列出隔離 bucket 的內容:

gsutil ls gs://[YOUR_QUARANTINE_BUCKET]

如要查看我們啟動的一連串事件,請先前往 Cloud Functions 頁面:

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

89211a959bf30392.png

在函式的記錄中,我們看到每個檔案至少有 4 個項目,指出:

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

c864dff5a03c75a9.png

每個檔案的 create_DLP_job 函式完成後,系統就會啟動對應的 DLP 工作。前往 DLP 工作頁面,查看佇列中的 DLP 工作清單:

畫面上會列出「待處理」、「執行中」或「已完成」的工作。每個檔案都對應我們上傳的其中一個檔案:

6af34e72ecb83faf.png

點選任一工作 ID 即可查看詳細資料。

返回 Cloud Functions 頁面並查看 resolve_DLP 函式的記錄,您會看到每個檔案至少有 8 個項目,表示:

  • 函式執行作業已啟動
  • 收到 Pub/Sub 通知
  • 對應的資料遺失防護工作名稱
  • 狀態碼
  • 機密資料的例項數量 (如有)
  • 檔案要移至的值區
  • 資料遺失防護工作已完成檔案剖析
  • 函式已執行完畢

5025bd672cba90a0.png

所有對 resolve_DLP 函式的呼叫執行完畢後,請再次查看隔離區儲存空間的內容:

gsutil ls gs://[YOUR_QUARANTINE_BUCKET]

這次應該完全空白。不過,如果您對其他值區執行上述相同指令,就會發現檔案已完美地分別存放在對應的值區中!

7. 清除

我們已瞭解如何搭配使用 DLP API 和 Cloud Functions 來分類資料,現在要清除專案中建立的所有資源。

刪除專案

如有需要,也可以刪除整個專案。前往 GCP 主控台的「Cloud Resource Manager」頁面:

在專案清單中,選取我們一直在處理的專案,然後按一下「刪除」。系統會提示您輸入專案 ID。輸入後,按一下「關機」

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

gcloud projects delete [PROJECT_ID]

如要逐一刪除不同元件,請參閱下一節。

Cloud Functions

使用 gcloud 刪除這兩個雲端函式:

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

儲存空間 Bucket

使用 gsutil 移除所有上傳的檔案,並刪除 buckets:

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 Function
  • 我們建立了 Cloud Functions,可啟動 DLP 工作,根據檔案中包含的機密資料進行分類
  • 我們上傳了測試資料,並查看 Cloud Functions 的 Stackdriver 記錄,瞭解實際運作情形