Dataflow 安全与权限

Dataflow 流水线既可以在本地运行(用于对小型数据集执行测试),也可以通过 Dataflow 托管式服务在 Google Cloud 托管资源上运行。无论是在本地运行还是在云端运行,您的流水线及其工作器均使用权限系统来维护对流水线文件和资源的安全访问。Dataflow 权限根据用于访问流水线资源的角色进行分配。下列部分介绍了与本地流水线及云端流水线关联的角色和权限、默认设置,以及如何检查您项目的权限。

准备工作

请参阅 Platform 概览,了解 Google Cloud 项目标识符。这些标识符包括项目名称、项目 ID 和项目编号。

本地流水线的安全性和权限

Google Cloud 帐号

您在本地运行时,您的 Apache Beam 流水线将以使用 gcloud 命令行工具可执行文件配置的 Google Cloud 帐号运行。因此,在本地运行的 Apache Beam SDK 操作和您的 Google Cloud 帐号可以访问相同的文件和资源。

要列出您选为默认帐号的 Google Cloud 帐号,请运行 gcloud config list 命令。

Google Cloud 上的流水线的安全性和权限

当您运行流水线时,Dataflow 使用如下两个服务帐号来管理安全性和权限:Dataflow 服务帐号和控制器服务帐号。Dataflow 服务会在作业创建请求发出期间使用 Dataflow 服务帐号来执行各种操作(例如,代表您检查项目配额以及创建工作器实例),并在作业执行期间使用该帐号来管理作业。在您提交作业后,工作器实例使用控制器服务帐号访问输入和输出资源。

Dataflow 服务帐号

在执行 Dataflow 流水线的过程中,Dataflow 服务会代表您操作资源(例如,创建额外的虚拟机)。当您在 Dataflow 服务上运行您的流水线时,该流水线会使用服务帐号 (service-<project-number>@dataflow-service-producer-prod.iam.gserviceaccount.com)。此帐号会在您创建 Dataflow 项目时自动创建,并会拥有相应项目的 Dataflow Service Agent 角色以及在该项目下运行 Dataflow 作业(包括启动 Compute Engine 工作器)所必需的权限。该帐号专供 Dataflow 服务使用,并且是您项目的专属帐号。

您可以使用 gcloud命令行工具查看 Dataflow 服务帐号的权限,方法是在 Shell 或终端中输入以下命令:

gcloud iam roles describe roles/dataflow.serviceAgent

由于 Google Cloud 服务预期会拥有相应项目及其资源的读写权限,因此建议您不要更改系统为您的项目自动设定的默认权限。如果您从 Identity and Access Management (IAM) 政策中移除该服务帐号的权限,相关帐号将仍然存在,因为它们归 Dataflow 服务所有。如果 Dataflow 服务帐号失去对某个项目的权限,Dataflow 将无法启动虚拟机,也无法执行其他管理任务。

控制器服务帐号

Compute Engine 实例在云端执行 Apache Beam SDK 操作。这些工作器使用您项目的控制器服务帐号来访问您流水线的文件和其他资源。此外,Dataflow 还使用控制器服务帐号执行“元数据”操作,此类操作既不会在您的本地客户端上运行,也不会在 Compute Engine 工作器上运行。这些操作可以执行多项任务,如确定输入大小以及访问 Cloud Storage 文件。

如需让控制器服务帐号能够创建、运行和检查作业,请确保该帐号具有 roles/dataflow.adminroles/dataflow.worker 角色,此外还拥有 iam.serviceAccounts.actAs 权限。

默认控制方服务帐号

默认情况下,工作器将您项目的 Compute Engine 默认服务帐号用作控制方服务帐号。当您从 Google Cloud Console 的 API 页面为项目启用 Compute Engine API 时,系统会自动创建此服务帐号 (<project-number>-compute@developer.gserviceaccount.com)。

Compute Engine 默认服务帐号拥有对项目资源的广泛访问权限,因此可以轻松开始使用 Dataflow。但是,对于生产工作负载,我们建议您仅使用您所需的角色和权限创建新的服务帐号。

指定用户管理的控制器服务帐号

如果您要创建和使用具有精细访问权限控制的资源,则可以创建一个用户管理的服务帐号,并将其用作控制器服务帐号。

如果您没有用户管理的服务帐号,则必须创建服务帐号,并设置该服务帐号所需的 IAM 角色。您的服务帐号必须至少拥有 Dataflow Worker 角色,并且可能还需要其他角色才能使用作业所需的 Cloud Platform 资源(例如 BigQuery、Pub/Sub,或者向 Cloud Storage 写入数据)。例如,如果您的作业会从 BigQuery 读取数据,则您的服务帐号还必须至少具有 bigquery.dataViewer 角色。

用户管理的服务帐号可以与作业位于同一项目中,也可以位于不同的项目中。如果服务帐号和作业位于不同的项目中,则必须先配置服务帐号,然后才能运行作业。此外,您还必须为用户管理的服务帐号上的以下 Google 管理服务帐号授予 Service Account Token Creator 角色:

  • Compute Engine 默认服务帐号 (<project-number>-compute@developer.gserviceaccount.com)
  • Dataflow Service Agent (service-<project-number>@dataflow-service-producer-prod.iam.gserviceaccount.com)

Java

运行流水线作业时,请使用 --serviceAccount 选项并指定服务帐号: --serviceAccount=my-service-account-name@<project-id>.iam.gserviceaccount.com

Python

运行流水线作业时,请使用 --service_account_email 选项并指定服务帐号: --service_account_email=my-service-account-name@<project-id>.iam.gserviceaccount.com

您可以从 Cloud Console 的“权限”页面获取您项目的服务帐号列表。

跨多个 Google Cloud 项目访问 Google Cloud 资源

您的 Apache Beam 流水线可以访问其他 Google Cloud 项目中的 Google Cloud 资源。这些资源包括:

Java

  • Cloud Storage 存储分区
  • BigQuery 数据集
  • Pub/Sub 主题和订阅
  • Firestore 数据集

Python

  • Cloud Storage 存储分区
  • BigQuery 数据集
  • Pub/Sub 主题和订阅
  • Firestore 数据集

要确保 Apache Beam 流水线可以跨多个项目访问这些资源,您需要使用这些资源的相应访问权限控制机制向您 Dataflow 项目的控制方服务帐号明确授予访问权限。

跨 Google Cloud 项目访问 Cloud Storage 存储分区

如需使您的 Dataflow 项目有权访问其他 Google Cloud 项目拥有的 Cloud Storage 存储分区,请为 Dataflow 项目的控制器服务帐号授予该存储分区的访问权限。您可以使用 Cloud Storage 访问权限控制机制来授予所需的访问权限。

如需获取您的 Dataflow 项目的服务帐号列表,请查看 Cloud Console 中的“IAM 和管理”页面。获得帐号名称后,您可以运行 gsutil 命令,向项目的服务帐号授予该存储分区及其内容的所有权(读写权限)。

要授权您的 Dataflow 项目的服务帐号访问另一个项目中的 Cloud Storage 存储分区,请在 shell 或终端窗口中使用以下命令:gsutil acl ch -u <project-number>-compute@developer.gserviceaccount.com:OWNER gs://<bucket>

授权您的 Dataflow 项目的服务帐号访问另一个项目中的 Cloud Storage 存储分区的现有内容,请在 shell 或终端窗口中使用以下命令:gsutil -m acl ch -r -u <project-number>-compute@developer.gserviceaccount.com:OWNER gs://<bucket>

前一个命令仅授予现有资源的访问权限。如果向 Dataflow 项目的服务帐号授予存储分区的默认权限,则该帐号可以访问未来会添加到该存储分区的资源:gsutil defacl ch -u <project-number>-compute@developer.gserviceaccount.com:OWNER gs://<bucket>

跨 Google Cloud 项目访问 BigQuery 数据集

您可以使用 BigQueryIO API 访问其他 Google Cloud 项目(即不是您使用 Dataflow 的项目)拥有的 BigQuery 数据集。如要让 BigQuery 来源和接收器正常运行,下列两个帐号必须要有权访问您的 Dataflow 作业从中读取数据或向其中写入数据的所有 BigQuery 数据集:

您可能需要配置 BigQuery,以向这些帐号明确授予访问权限。请参阅BigQuery 访问权限控制,详细了解如何使用 BigQuery 页面BigQuery API 授予 BigQuery 数据集的访问权限。

例如,如果您的 Google Cloud 帐号是 abcde@gmail.com,并且您在项目编号为 123456789 的项目中执行 Dataflow 作业,则如下帐号都必须获得所用 BigQuery 数据集的访问权限:abcde@gmail.com123456789-compute@developer.gserviceaccount.com

跨 Google Cloud 项目访问 Pub/Sub 主题和订阅

如需访问归不同 Google Cloud 项目所有的 Pub/Sub 主题或订阅,请使用 Pub/Sub 的 Identity and Access Management 功能来设置跨项目权限。Dataflow 使用控制器服务帐号运行您的作业,请向此服务帐号授予访问其他项目中的 Pub/Sub 资源的权限。

需要以下 Pub/Sub 角色的权限:

  • roles/pubsub.subscriber
  • roles/pubsub.viewer

如需更多信息并了解演示如何使用 Pub/Sub 的 Identity and Access Management 功能的一些代码示例,请参阅示例使用场景:跨项目通信

跨 Google Cloud 项目访问 Firestore

如需访问其他 Google Cloud 项目拥有的 Firestore 数据库(采用原生模式或 Datastore 模式),请将 Dataflow 项目的 Compute Engine (<project-number>-compute@developer.gserviceaccount.com) 服务帐号添加为该 Firestore 所属项目的 Editor。此外,在 https://console.cloud.google.com/project/<project-id>/apiui/apiview/firestore/overview 为这两个项目启用 Firestore API。

数据访问权限和安全

Dataflow 服务使用多种安全机制来确保数据的安全性和私密性。这些机制适用于下列情景:

  • 当您向该服务提交流水线时
  • 当该服务计算您的流水线时
  • 当您在流水线执行期间和执行之后请求访问遥测数据和指标时

提交流水线

您的 Google Cloud 项目权限可控制对 Dataflow 服务的访问权限。任何获得了修改权限或所有者权限的项目成员均可向该服务提交流水线。如需提交流水线,您必须使用 gcloud 命令行工具进行身份验证。完成身份验证后,系统将使用 HTTPS 协议提交您的流水线。如需了解如何使用 Google Cloud 帐号凭据进行身份验证,请参阅与您使用的语言对应的快速入门

流水线评估

临时数据

评估流水线时,可能会生成临时数据,这些临时数据会存储在本地工作器中或 Cloud Storage 中。临时数据会进行静态加密,并且在流水线评估结束后不会持久保存。

Java

默认情况下,系统会在 Dataflow 作业完成后删除 Compute Engine 虚拟机,无论作业成功与否都是如此。这意味着相关联的永久性磁盘以及所有可能存储在该磁盘上的中间数据都会被删除。如需查看 Cloud Storage 中存储的中间数据,请前往您作为 --stagingLocation 和/或 --tempLocation 提供的 Cloud Storage 路径子位置。如果您要将输出写入 Cloud Storage 文件,则系统可能会在写入操作完成之前,在输出位置创建临时文件。

Python

默认情况下,系统会在 Dataflow 作业完成后删除 Compute Engine 虚拟机,无论作业成功与否都是如此。这意味着相关联的永久性磁盘以及所有可能存储在该磁盘上的中间数据都会被删除。如需查看 Cloud Storage 中存储的中间数据,请前往您作为 --staging_location 和/或 --temp_location 提供的 Cloud Storage 路径子位置。如果您要将输出写入 Cloud Storage 文件,则系统可能会在写入操作完成之前,在输出位置创建临时文件。

记录的数据

Cloud Logging 中存储的信息主要由您的 Dataflow 程序中的代码生成。Dataflow 服务可能还会在 Cloud Logging 中生成警告和错误数据,不过这些会是该服务添加到日志中的唯一中间数据。

运行中数据

在流水线评估过程中,有两种模式可以传输数据:

  • 从数据源读取数据/向接收器写入数据时传输数据。
  • 在流水线内部处理数据时,在工作器实例之间传输数据。

所有与 Google Cloud 来源和接收器的通信均会进行加密并通过 HTTPS 传输。所有工作器间通信均通过专用网络进行,并受您项目的权限和防火墙规则限制。

数据存放区域

流水线的逻辑是针对个别 Compute Engine 实例进行评估的。 您可以指定这些实例所在的地区,以及指定它们用来进行通信的专用网络所在的地区。Google 的基础架构中发生的辅助计算依赖于元数据(如 Cloud Storage 位置或文件大小)。您的数据不会离开相应地区,也不会打破您的安全边界。

遥测数据和指标

遥测数据和关联指标均进行了静态加密,并且这些数据的访问权限由您的 Google Cloud 项目的读取权限控制。

建议您使用流水线的基础云端资源中提供的安全机制。这些机制包括数据源和接收器(如 BigQuery 和 Cloud Storage)的数据安全功能。此外,最好不要在单个项目中混用不同的信任级别。