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 函式的「動作」選單,然後選取「查看記錄」:
在這個函式的記錄中,我們發現每個檔案至少都有 4 個項目,指出:
- 已開始執行函式
- 函式已針對特定檔案觸發
- 已建立工作
- 函式已執行完畢
每個檔案的 create_DLP_job 函式就會啟動相應的資料遺失防護工作。請前往「DLP 工作」頁面,查看佇列中的資料遺失防護工作清單:
系統會列出待處理、執行中或完成的工作。每個檔案都對應我們上傳的檔案:
您可以按一下任一工作的 ID 來查看詳細資料,
如果您返回「Cloud Functions」頁面並檢查 resolve_DLP 函式的記錄檔,每個檔案都至少會顯示 8 個項目,這代表:
- 已開始執行函式
- 已收到 Pub/Sub 通知
- 對應 DLP 工作的名稱
- 狀態碼
- 機密資料的執行個體數量 (如有)
- 檔案會移至的值區
- DLP 工作已完成剖析檔案
- 函式已執行完畢
一旦對 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 記錄,瞭解處理流程