使用 DLP API 和 Cloud Functions 对上传到 Cloud Storage 的数据自动分类

1. 概览

在现代组织中,来自各种来源的数据数量与日俱增。这通常需要隔离和分类数据,以便有策略地存储和保护数据。如果仍然需要手动处理数据,这项任务将很快变得成本高昂且无法完成。

在此 Codelab 中,我们将了解如何自动对上传到 Cloud Storage 的数据进行分类,并将其移动到相应的存储分区。我们将使用 Cloud Pub/Sub、Cloud Functions、Cloud Data Loss Prevention 和 Cloud Storage 完成此操作。

您将执行的操作

  • 创建 Cloud Storage 存储分区,以用作隔离和分类流水线的一部分。
  • 创建一个在上传文件时调用 DLP API 的简单 Cloud Functions 函数。
  • 创建 Pub/Sub 主题和订阅,以在文件处理完成时向您发出通知。
  • 将示例文件上传到隔离区以调用 Cloud Functions 函数
  • 使用 DLP API 对文件进行检查和分类,并将其移动到适当的存储分区。

所需条件

  • 设置了结算信息的 Google Cloud 项目。如果没有,您必须创建一个

2. 准备工作

在此 Codelab 中,我们将通过 Cloud Shell 使用命令行预配和管理不同的云资源和服务。以下命令将打开 Cloud Shell 和 Cloud Shell Editor,并克隆配套项目代码库:

使用 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 项目中的任务。默认情况下,此服务账号存在于您的项目中,并且分配有 Editor 角色。

首先,我们将向服务账号授予管理数据泄露防护作业所需的 DLP Administrator 角色:

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

最后,授予 DLP API Service Agent 角色,该角色将允许服务账号对 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 服务账号。此服务账号是在启用 DLP API 时自动创建的,最初未被授予任何角色。我们来为其授予 Viewer 角色:

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 在应用之间提供多对多的异步消息传递。发布者将创建一条消息并将其发布到称为“主题”的消息 Feed 中。订阅者将通过订阅来接收这些消息。在我们的例子中,基于该订阅,我们会在 DLP 作业运行后让 Cloud Functions 函数将文件移动到其各自的存储分区中。

首先,我们来创建一个主题。每次向我们的隔离区存储分区添加文件时,系统都会在此处发布一条消息。我们将其命名为“classify-topic”

gcloud pubsub topics create classify-topic

当主题发布消息时,订阅将收到通知。我们来创建一个名为“classify-sub”的 PubSub 订阅:

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

该订阅将触发第二个 Cloud Functions 函数,该函数将启动 DLP 作业,该作业将检查文件并将其移动到正确位置。

5. Cloud Functions

借助 Cloud Functions,我们可以部署基于事件的轻量级异步单一用途函数,而无需管理服务器或运行时环境。我们将使用提供的 main.py 文件(位于 dlp-cloud-functions-tutorials/gcs-dlp-classification-python/)部署 2 个 Cloud Functions 函数

替换变量

我们需要先替换 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 隔离区时触发,并会为每个上传的文件创建 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 命令验证两个 Cloud Functions 函数是否已成功部署:

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

在此函数的日志中,我们至少会看到每个文件对应的 4 个条目,这表明:

  • 函数执行已开始
  • 已针对特定文件触发了该函数
  • 已创建作业
  • 函数已执行完毕

c864dff5a03c75a9.png

针对每个文件的 create_DLP_job 函数完成后,系统会启动相应的 DLP 作业。前往 DLP 作业页面,查看队列中的 DLP 作业列表:

您将看到“待处理”“正在运行”或“已完成”的作业列表。其中每个文件都与我们上传的一个文件对应:

6af34e72ecb83faf

您可以点击其中任一作业的 ID 来查看更多详情。

如果您返回 Cloud Functions 页面并检查 resolve_DLP 函数,则会看到每个文件至少 8 个条目,分别表示:

  • 函数执行已开始
  • 收到 Pub/Sub 通知
  • 相应 DLP 作业的名称
  • 状态代码
  • 敏感数据的实例数(如果有)
  • 文件将移动到的存储分区
  • DLP 作业已完成文件解析
  • 函数已执行完毕

5025bd672cba90a0

在对 resolve_DLP 函数的所有调用都完成运行后,再次查看隔离区的内容:

gsutil ls gs://[YOUR_QUARANTINE_BUCKET]

这次,它应该是完全空的。不过,如果您针对其他存储分区运行相同的命令,会发现我们的文件已完全隔离到对应的存储分区中!

7. 清理

现在,我们已经了解了如何将 DLP API 与 Cloud Functions 结合使用来对数据进行分类,下面我们来清理项目,使其包含已创建的所有资源。

删除项目

如果您愿意,可以删除整个项目。在 GCP Console 中,转到 Cloud Resource Manager 页面:

在项目列表中,选择我们一直使用的项目,然后点击删除。此时,系统会提示您输入项目 ID。输入项目 ID,然后点击关停

或者,您可以使用 gcloud 直接从 Cloud Shell 中删除整个项目:

gcloud projects delete [PROJECT_ID]

如果您希望逐个删除不同的组件,请继续学习下一部分。

Cloud Functions

使用 gcloud 删除我们的两个 Cloud Functions 函数:

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 Functions 函数
  • 我们创建了 Cloud Functions,旨在启动 DLP 作业,根据文件中包含的敏感数据对文件进行分类
  • 我们上传了测试数据,并查看了 Cloud FunctionsStackdriver 日志(用于了解进程的运行情况)