【问题标题】:Is it possible to limit a Google service account to specific BigQuery datasets within a project?是否可以将 Google 服务帐户限制为项目中的特定 BigQuery 数据集?
【发布时间】:2020-05-01 07:31:33
【问题描述】:

我已经使用 GCP UI 为特定项目 Project X 设置了一个服务帐号。 Project X 内有 3 个数据集:

Dataset 1

Dataset 2

Dataset 3

如果我将角色 BigQuery Admin 分配给 Project X,则当前所有 3 个数据集都将继承该角色。

目前,所有这些数据集都继承了在项目级别分配给服务帐号的权限。有没有办法修改服务帐户的权限,使其只能访问指定的数据集?例如允许访问Dataset 1,但不允许访问Dataset 2Dataset 3

这种配置可能吗?

我尝试在 UI 中添加条件,但是当我使用 Name 资源类型并将值设置为等于 Dataset 1 时,我无法访问任何数据集 - 大概该值不是正确的。或者数据集不是有效的名称资源。

更新

添加一些关于我在发布之前已经尝试过的更多细节,以及关于我正在做什么的更多细节。

对于我的特定用例,我正在尝试通过 API(使用 Python)执行 SQL 查询以及修改 BigQuery 中的表。

案例 A: 我创建了一个角色为 'BigQuery Admin' 的服务帐户。

此角色传播到项目中的所有数据集 - 该属性是继承的,我无法从任何数据集中删除此服务帐户角色。

在这种情况下,我可以使用 Python API 查询所有数据集和表 - 正如您所期望的那样。

案例 B: 我创建了一个没有默认角色的服务帐户。

不传播任何角色,我可以通过单击 UI 中的 “共享数据集” 选项将角色分配给特定数据集,以将 “BigQuery 管理员” 角色分配给他们。

在这种情况下,我无法查询任何数据集或表,如果我尝试,则会收到以下错误:

*Forbidden: 403 POST https://bigquery.googleapis.com/bq/projects/project-x/jobs: Access Denied: Project X: User does not have bigquery.jobs.create permission in project Project X.*

即使我想要的数据集存在所需的权限(在本例中为 bigquery.jobs.create),我也无法查询数据,因为在项目级别似乎还需要 bigquery.jobs.create 权限才能使用 API .

【问题讨论】:

  • 正如@rmesteves 提到的documentation 解释了如何限制对特定数据集的访问。这不是你要找的吗?另一种可能值得考虑的方法是使用Authorized Views,但这意味着在更精细的级别(查询结果)上限制访问,尽管它确实允许您创建只有特定用户才能访问的单独数据集通过为他们分配正确的权限。
  • 我之前尝试过@rmesteves 强调的方法。我已经更新了这个问题,以添加更多关于我正在尝试做什么以及如何做的细节。在我的情况下,只允许访问授权视图是不够的 - 我希望用户能够创建/修改/删除指定数据集中的任何对象。
  • 感谢您的解释。 BQ Admin 角色确实具有 jobs.create 权限。我想知道您是如何设置权限的,因为根据错误消息,我认为该角色未设置为您的服务帐户。请详细说明您用于分配此类角色的命令/步骤。您还可以在“共享数据集”屏幕的“按名称或角色过滤”文本字段中确认分配给您的服务帐户的权限。

标签: python google-cloud-platform google-bigquery


【解决方案1】:

我将发布我发现的问题的解决方案,以防它对尝试完成相同操作的其他人有用。

在项目级别分配角色 “BigQuery 作业用户”,以便将权限 bigquery.jobs.create 分配给该项目的服务帐号。

然后,您可以手动为特定数据集分配 “BigQuery 数据编辑器” 的角色,以便通过 Python 中的 API 查询它们。通过单击 BigQuery UI 中的“共享数据集”来执行此操作。因此,对于本示例,我已将 Dataset 1Dataset 2 与服务帐户“共享”。

您现在应该能够在 Python 中查询您已为其分配 BigQuery 数据编辑者角色的数据集。

但是,对于尚未分配 “BigQuery 数据编辑器” 角色的 Dataset 3,如果您尝试查询表,这应该会返回错误:

Forbidden: 403 Access Denied: Table Project-x:dataset_1.table_1: User does not have permission to query table Project-x:dataset_1.table_1.

如上所述,我们现在有足够的权限来访问项目,但不能访问 Dataset 3 中的表 - 设计使然。

【讨论】:

  • 只是为了将来为其他人添加,这在 Google Data Studio 中也适用于我。使用“BigQuery Job User”项目权限,添加新源时,项目和仅选择的数据集在数据洞察中可见
【解决方案2】:

如您所见 here,您可以将数据集中的访问权限授予某些实体,包括服务帐户:

Google 帐户电子邮件:授予个人 Google 帐户访问权限 数据集

Google 群组:授予 Google 群组的所有成员访问权限 到数据集 Google Apps

:授予一个域中的所有用户和组 谷歌域访问数据集

服务帐号:授予服务 帐户访问数据集

任何人:输入“allUsers”授予 访问公众

所有 Google 帐户:输入 "allAuthenticatedUsers" 授予任何登录到 谷歌帐户

我建议您在BigQuery 中创建一个没有权限的service account,然后授予特定数据集的访问权限。

希望对你有帮助。

【讨论】:

  • 感谢您的回答。我以前尝试过这种方法,但它不适用于我的用例。我已经更新了问题,以添加更多关于我正在尝试做什么以及如何做的细节。
【解决方案3】:

请注意,可以在项目级别或数据集级别授予对 BigQuery 的访问权限。

数据集是您可以分配权限的最低级别,以便帐户可以访问数据集中的所有资源,例如表、视图、列和行。正如您已经注意到的,项目级别权限的权限会针对项目中的所有数据集传播(继承)。

关于您的服务帐户,默认情况下,Google Cloud 会为其分配一个类似service_accunt_name@example.gserviceaccount.com 的结构,并且在共享数据集的过程中,正如@rmesteves 评论的那样,您将需要此电子邮件地址来授予它所需的权限。

您描述的“命名资源类型”的步骤似乎不正确。请在 BigQuery 界面中尝试:

  1. 单击您要共享的数据集名称(例如,您的示例中的 Dataset1)。

  2. 然后,在屏幕右侧您会看到“共享数据集”选项,点击它。

  3. 按照说明为您的服务帐号设置 BigQuery role,例如 BigQuery 管理员、BigQuery 数据所有者、BigQuery 用户等。检查上一个链接以了解角色可以执行的操作类型。

【讨论】:

  • 感谢您的回答。我以前尝试过这种方法,但它不适用于我的用例。我已经更新了这个问题,以添加更多关于我正在尝试做什么以及如何做的细节。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-08-14
  • 2020-04-27
  • 1970-01-01
  • 2013-10-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多