访问控制

概览

BigQuery 使用 Identity and Access Management (IAM) 来管理对资源的访问。BigQuery 中提供了三种类型的资源,即组织、项目和数据集。在 IAM 政策层次结构中,数据集是项目的子资源。表和视图是数据集的子资源,也就是说,它们继承其父级数据集的权限。

要授予对某资源的访问权限,请为用户、组或服务帐号分配一个或多个角色。组织和项目的角色会影响运行作业或管理项目资源的能力,而数据集的角色会影响访问或修改特定数据集内部数据的能力。

IAM 提供了两种类型的角色:预定义角色和初始角色。如果向某用户同时分配了预定义角色和初始角色,授予的权限是每个角色所拥有权限的并集。

权限和角色

预定义角色比较矩阵

您可以分配以下 BigQuery 预定义角色。

权限 dataViewer dataEditor dataOwner metadataViewer user jobUser admin
列出/获取项目
列出表
获取表元数据
获取表数据
创建表
修改/删除表
获取数据集元数据
新建数据集
修改/删除数据集 自己创建的
数据集
创建作业/查询
获取作业 自己创建的
作业
任何作业
列出作业 任何作业(来自其他用户的作业会被遮盖) 任何作业
取消作业 自己创建的
作业
自己创建的
作业
任何作业
获取/列出保存的查询
创建/更新/删除保存的查询
通过 BigQuery Storage API 创建读取会话
获得传输
创建/更新/删除传输

权限

下表介绍了 BigQuery 中提供的权限。

权限 说明
bigquery.jobs.create 创造新作业。
bigquery.jobs.listAll 列出所有作业,并检索任何用户所提交任何作业的相关元数据。*
bigquery.jobs.list 列出所有作业,并检索任何用户所提交任何作业的相关元数据。* 对于由其他用户提交的作业,详细信息和元数据会被遮盖。
bigquery.jobs.get 获取任何作业的数据和元数据。*
bigquery.jobs.update 取消任何作业。*
bigquery.datasets.create 新建空数据集。
bigquery.datasets.delete 删除数据集。
bigquery.datasets.get 获取数据集的相关元数据。
bigquery.datasets.update 更新数据集的元数据。
bigquery.tables.create 新建表。
bigquery.tables.list 列出表和表的元数据。
bigquery.tables.delete 删除表。
bigquery.tables.get 获取表元数据。
要获取表数据,您需要具备 bigquery.tables.getData 权限。
bigquery.tables.getData 获取表数据。
要获取表元数据,您需要具备 bigquery.tables.get 权限。
bigquery.tables.export 从 BigQuery 导出表数据。
bigquery.tables.update

更新表元数据。
要更新表数据,您需要具备 bigquery.tables.updateData 权限。

bigquery.tables.updateData

更新表数据。
要更新表元数据,您需要具备 bigquery.tables.update 权限。

bigquery.transfers.get 获取传输元数据。
bigquery.transfers.update 创建、更新和删除传输。
bigquery.savedqueries.create 创建已保存的查询。
bigquery.savedqueries.get 获取已保存查询的元数据。
bigquery.savedqueries.list 列出已保存的查询
bigquery.savedqueries.update 更新已保存的查询。
bigquery.savedqueries.delete 删除已保存的查询。
bigquery.readsessions.create 通过 BigQuery Storage API 创建新读取会话。

* 对于您创建的任何作业,系统将会自动为您分配该作业的 bigquery.jobs.getbigquery.jobs.update 权限。

方法所需的权限

下表列出了调用者调用每种方法所必需的权限:

方法 所需权限
datasets.delete bigquery.datasets.delete
如果目标数据集不为空,您还需要具备 bigquery.tables.delete 权限。
datasets.get bigquery.datasets.get
datasets.insert bigquery.datasets.create
datasets.list 要检查对所返回数据集拥有的权限,您需要具备 bigquery.datasets.get 权限。
datasets.patch bigquery.datasets.update
datasets.update bigquery.datasets.update
jobs.cancel bigquery.jobs.update
如果您不具备此权限,则可以取消自己的作业。
jobs.get bigquery.jobs.get
如果您不具备此权限,则可以获取自己的作业。
jobs.getQueryResults bigquery.jobs.get
要获取作业结果,您需要具备 bigquery.jobs.get 权限,或者您必须是作业所有者。此外,您还必须是要向其中写入作业结果的表的所有者。
jobs.insert 要启动作业,您需要具备 bigquery.jobs.create 权限
完成作业可能还需要其他权限。
jobs.list 要显示所有用户的所有作业,您需要具备 bigquery.jobs.list 权限。对于由其他用户提交的作业,详细信息和元数据会被遮盖。要使用 allUsers=true 参数显示所有用户的所有作业的完整详细信息,您需要具备 bigquery.jobs.listAll 权限。
jobs.query 要启动作业,您需要具备 bigquery.jobs.create 权限
完成作业可能还需要其他权限。
projects.list resourcemanager.projects.get
tabledata.insertAll bigquery.tables.updateData
tabledata.list bigquery.tables.getData
tables.delete bigquery.tables.delete
tables.get bigquery.tables.get
tables.insert bigquery.tables.create
如果该方法会创建一个视图,它还需要对视图中引用的所有表具备 bigquery.tables.getData 权限。
tables.list bigquery.tables.list
tables.patch bigquery.tables.update
tables.update bigquery.tables.update
如果该方法会更新一个视图,它还需要对视图中引用的所有表具备 bigquery.tables.getData 权限。如果您已在数据集上对视图授权,则该方法还需要对与表关联的所有数据集具备 bigquery.datasets.update 权限。
projects.transferConfigs.create bigquery.transfers.update
projects.transferConfigs.get bigquery.transfers.get
projects.transferConfigs.patch bigquery.transfers.update

角色

下表列出了 Google BigQuery API IAM 角色以及每个角色包含的所有相应权限。请注意,每个权限适用于特定资源类型。

角色 所含权限: 适用的资源类型:
roles/bigquery.metadataViewer
resourcemanager.projects.get 组织
resourcemanager.projects.list 组织
bigquery.datasets.get 数据集
bigquery.tables.list 数据集
bigquery.tables.get 数据集
roles/bigquery.dataViewer
以上所有权限和下列权限:
bigquery.tables.getData 数据集
bigquery.tables.export 数据集
roles/bigquery.dataEditor
以上所有权限和下列权限:
bigquery.datasets.create 项目
bigquery.tables.create 数据集
bigquery.tables.delete 数据集
bigquery.tables.update 数据集
bigquery.tables.updateData 数据集
roles/bigquery.dataOwner
以上所有权限和下列权限:
bigquery.datasets.delete 项目
bigquery.datasets.update 数据集
roles/bigquery.user
resourcemanager.projects.get 组织
resourcemanager.projects.list 组织
bigquery.jobs.create 项目
bigquery.jobs.list 项目
bigquery.datasets.create 项目
bigquery.datasets.get 项目
bigquery.tables.list 项目
bigquery.transfers.get 项目
bigquery.savedqueries.get 项目
bigquery.savedqueries.list 项目
bigquery.readsessions.create 项目
roles/bigquery.jobUser
resourcemanager.projects.get 组织
bigquery.jobs.create 项目
roles/bigquery.readSessionUser
resourcemanager.projects.get 组织
resourcemanager.projects.list 组织
bigquery.readsessions.create 项目
roles/bigquery.admin
其他角色拥有的所有权限和下列权限:
bigquery.jobs.get 项目
bigquery.jobs.listAll 项目
bigquery.jobs.update 项目
bigquery.savedqueries.create 项目
bigquery.savedqueries.delete 项目
bigquery.savedqueries.update 项目
bigquery.transfers.update 项目

预定义角色详细信息

预定义角色详细信息

roles/bigquery.
user

具备运行项目中的作业(包括查询)的权限。企业中的大多数人(数据科学家/分析师)应该是用户角色。具有此角色的用户不但可以枚举和取消自己的作业,还可以枚举项目中的数据集。另外,具有此角色的用户可以在项目中创建新数据集;对于这些新数据集,系统会为创建者授予 bigquery.dataOwner 角色。

说明:此角色可让数据访问权限与运行项目工作负载的权限得以分离,这在团队成员查询来自多个项目的数据时非常有用。加入数据集和表的枚举是为了帮助用户发现潜在数据源。

资源类型:

  • 组织
  • 项目

roles/bigquery.
jobUser

具备运行项目中的作业(包括查询)的权限。具有 jobUser 角色的用户可以获取其作业的相关信息以及取消自己的作业。

说明:此角色可让数据访问权限与运行项目工作负载的权限得以分离,这在团队成员查询来自多个项目的数据时非常有用。此角色不允许访问任何 BigQuery 数据。如果需要数据的访问权限,请授予数据集级层的访问权限控制。

资源类型:

  • 组织
  • 项目

roles/bigquery.
readSessionUser

通过 BigQuery Storage API 在项目中创建和使用读取会话的权限。

说明:可以借助此角色将数据访问权限与在项目中创建读取会话的权限分离开。被授予 bigquery.readSessionUser 的用户无法访问表数据。要读取数据,还必须授予 bigquery.tables.getData 权限或提供对表所属数据集的 READER 访问权限。

资源类型:

  • 组织
  • 项目

roles/bigquery.
dataViewer

应用于数据集时,dataViewer 角色会提供以下权限:

  • 读取数据集的元数据以及列出数据集中的表。
  • 从数据集的表中读取数据和元数据。

应用于项目或组织级层时,此角色还可枚举项目中的所有数据集。但若要运行作业,还需要具备其他角色。

例如,如果某用户仅对数据集具有 bigquery.dataViewer 权限而没有任何其他权限,那么该用户只能列出数据集中的表,以及使用 get() API 来读取表的内容。如果没有其他权限,该用户无法查询数据。

如需查看有权运行查询的用户的示例,请考虑以下场景。如果某用户在 projectA 中拥有 bigquery.user 权限,并对 projectA:dataset1 和 projectB:dataset2 拥有 bigquery.dataViewer 权限,那么该用户可以在使用其中任一或全部数据集的 projectA 中运行查询。

对于位于 BigQuery 存储空间以外的外部数据源,可能还需要这些非 BigQuery 数据源的其他权限。

说明:dataViewer 角色适用于只读数据访问权限。dataViewer 角色可以访问数据,但要想发出查询作业,还需要具备其他权限,例如,由 bigquery.user 或 bigquery.admin 角色授予的权限。dataViewer 角色不会产生费用。

资源类型:

  • 组织
  • 项目

roles/bigquery.
metadataViewer

应用于组织或项目级层时,metadataViewer 角色可提供以下权限:

  • 列出项目中的所有数据集,以及读取所有数据集的元数据。
  • 列出项目中的所有表和视图,以及读取所有表和视图的元数据。

运行作业还需要具备其他角色。

说明:metadataViewer 角色仅提供了元数据访问权限。具有 metadataViewer 角色的用户可以访问数据集、表和视图的元数据,但若要运行查询作业,还需要具备其他权限,例如,由 bigquery.user 角色授予的权限。

资源类型:

  • 组织
  • 项目

roles/bigquery.
dataEditor

应用于数据集时,dataEditor 角色可提供以下权限:

  • 读取数据集的元数据以及列出数据集中的表。
  • 创建、更新、获取和删除数据集的表。

应用于项目或组织级层时,此角色还可以创建新数据集。

说明:dataEditor 角色的权限比 bigquery.dataViewer 角色更宽泛,也就是说,该角色可以授予创建、更新、删除数据集内部表的权限(但不允许更改数据集本身)。

资源类型:

  • 组织
  • 项目
  • 数据集

roles/bigquery.
dataOwner

应用于数据集时,dataOwner 角色会提供以下权限:

  • 读取、更新和删除数据集。
  • 创建、更新、获取和删除数据集的表。

应用于项目或组织级层时,此角色还可以创建新数据集。

说明:dataOwner 角色的权限比 bigquery.dataEditor 角色更宽泛,也就是说,该角色增加了修改和删除所含数据集的权限。

资源类型:

  • 组织
  • 项目
  • 数据集

roles/bigquery.
admin

具备管理项目中所有资源的权限。可以管理项目中的所有数据,还可以取消其他用户正在项目中运行的作业。

说明:这是责任最宽泛、级别最高的角色,也是可在其同事执行各种分析时为他们提供支持的超级用户。

资源类型:

  • 组织
  • 项目

自定义角色

除预定义角色之外,BigQuery 还支持自定义角色。如需了解详情,请参阅 Cloud IAM 文档中的创建和管理自定义角色

不受支持的权限

以下权限只能添加到组织级层的自定义角色中,它们对项目级层或更低级层不起作用。

  • resourcemanager.projects.list

以下权限可能会以不向后兼容的方式更改,因此不建议用于生产用途。它们不在任何服务等级协议 (SLA) 或弃用政策的涵盖范围内。

  • bigquery.config.get
  • bigquery.config.update

初始 IAM 角色

初始 IAM 角色可直接映射到传统的 BigQuery 查看者/编辑者/所有者项目角色,以及读取者/写入者/所有者数据集角色。

转换初始角色

对于较为熟悉传统授权设置的用户,BigQuery 公开提供了一组初始角色作为项目级层权限(读取者、写入者、所有者)。

为了确保兼容性,每个数据集级层的传统权限均可直接映射到其等效的预定义角色。

BigQuery 传统权限 IAM 等效权限
项目 - 可以查看 初始角色 - Viewer
项目 - 可以修改 初始角色 - Editor
项目 - 为所有者 初始角色 - Owner
数据集 - READER bigquery.dataViewer
数据集 - WRITER bigquery.dataEditor
数据集 - OWNER bigquery.dataOwner

项目的初始角色

默认情况下,授予对项目的访问权限也会授予对该项目所含数据集的访问权限。可以按每个数据集覆盖默认访问权限。任何具有项目 Owner 角色的用户都可以撤消或更改任何项目角色。

创建项目时,BigQuery 会向创建了该项目的用户授予 Owner 角色。

初始角色 权限
Viewer
  • 可以在项目中启动作业。所需的其他数据集角色取决于作业类型。
  • 可以列出和获取所有作业,以及更新用户在项目中启动的作业
  • 如果您在包含任何查看者角色的项目中创建数据集,BigQuery 会为这些用户授予对新数据集的 bigquery.dataViewer 预定义角色。
Editor
  • 拥有 Viewer 的权限以及下述权限:
    • 可以在项目中创建新数据集
    • 如果您在包含任何编辑者的项目中创建数据集,BigQuery 会向这些用户授予对新数据集的 bigquery.dataEditor 预定义角色。
Owner
  • 拥有 Editor 的权限以及下述权限:
    • 可以列出项目中的所有数据集
    • 可以删除项目中的任何数据集
    • 可以列出和获取项目中运行的所有作业,包括由其他项目用户运行的作业
    • 如果您创建了数据集,则对于新数据集,BigQuery 会向所有项目所有者授予 bigquery.dataOwner 预定义角色。

      例外:当用户运行查询时,系统会创建一个匿名数据集,以用于存储缓存的结果表。只有运行查询的用户才能获得匿名数据集的 OWNER 访问权限。

您可以通过 Google Cloud Platform Console 授予或撤消项目的初始角色。您必须对项目拥有 Owner 访问权限才能授予或撤消新的项目角色。

如需详细了解如何授予或撤消项目角色的访问权限,请参阅管理项目成员

数据集的初始角色

数据集的初始角色在功能上等同于预定义角色(请参阅转换初始角色)。

可向以下实体类型授予数据集角色:

实体类型 API
单个用户(通过电子邮件地址) access.userByEmail
Google 群组(通过电子邮件地址) access.groupByEmail
预定义用户组,例如,所有用户或对数据集所属项目具有相同项目角色的用户组。 access.specialGroup

以下初始角色适用于数据集:

数据集角色 权限
READER
  • 可以读取、查询、复制或导出数据集中的表
    • 可以对数据集调用 get
    • 可以对数据集中的表调用 getlist
    • 可以对数据集中表的表数据调用 list
WRITER
  • 拥有 READER 的权限以及下述权限:
    • 可以在数据集中修改或附加数据
OWNER
  • 拥有 WRITER 的权限以及下述权限:
    • 可以对数据集调用 update
    • 可以对数据集调用 delete

注意:数据集必须至少包含一个具有 OWNER 角色的实体。具有 OWNER 角色的用户不能移除自己的 OWNER 角色。

当您创建新数据集时,BigQuery 会为以下实体添加默认数据集访问权限。您在创建数据集时指定的角色会覆盖默认值。

实体 数据集角色
所有对项目具有 Viewer 访问权限的用户 READER
所有对项目具有 Editor 访问权限的用户 WRITER
所有对项目具有 Owner 访问权限的用户

OWNER

例外:当用户运行查询时,系统会创建一个匿名数据集,以用于存储缓存的结果表。只有运行查询的用户才能获得匿名数据集的 OWNER 访问权限。

要授予或撤消数据集角色,请使用以下选项之一:

  • 在 BigQuery API 中使用 update
  • 网页界面中,点击数据集名称旁边的下拉列表,然后点击共享数据集 (Share dataset)。
  • 通过 `bq` 命令行工具使用 `bq update` 命令。使用 `--source` 标志来指定其中包含一部分 `dataset` 资源并且设置了 `access` 字段的 JSON 文件。

场景示例

以下示例涉及一组数据科学家,他们全部属于名为 AnalystGroup 的 Google 群组

拥有对数据集中的数据的读写访问权限

CompanyProject 项目包含 dataset1 和 dataset2 数据集。AnalystGroup1 是一个仅处理 dataset1 的数据科学家群组,AnalystGroup2 是一个仅处理 dataset2 的群组。数据科学家应该只对他们所处理的数据集具有完整访问权限,包括对该数据运行查询的访问权限。

拥有对数据集的读写访问权限
在数据集 CompanyProject:dataset1 上 向 AnalystGroup1 授予对 dataset1 的 WRITER 访问权限。该角色映射到预定义 IAM 角色 bigquery.dataEditor
在数据集 CompanyProject:dataset2 上 向 AnalystGroup2 授予对 dataset2 的 WRITER 访问权限。该角色映射到预定义 IAM 角色 bigquery.dataEditor
在项目 CompanyProject 上 向 AnalystGroup1 和 AnalystGroup2 授予对 CompanyProject 的 bigquery.user 访问权限。

获得数据集级层的 WRITER 访问权限后,数据科学家可以查询数据集表中的数据,但他们无权在项目中运行查询作业。要使数据科学家群组能够对其已获得访问权限的数据集运行查询作业,必须为该群组授予项目级预定义角色 bigquery.userbigquery.user 角色可授予 bigquery.jobs.create 权限。

或者,您可以将数据科学家群组添加到一个可授予 bigquery.jobs.create 权限的项目级 IAM 自定义角色

拥有项目中数据的完整访问权限

AnalystGroup 是一个处理 BigQuery 的数据科学家群组,他们负责在一个名为 CompanyProject 的项目中使用 BigQuery 的所有方面。该群组希望所有成员都具有对所有数据的读写权限。组织的其他群组处理其他 Cloud Platform 产品,但没有其他人与 BigQuery 互动。AnalystGroup 不使用任何其他 Cloud Platform 服务。

拥有项目中数据的完整访问权限
在项目 CompanyProject 上 将 AnalystGroup 添加到预定义角色 bigquery.admin

拥有组织的完整访问权限

CompanyA 是一个组织,它希望名为 Admin1 的特定人员成为其所有项目中所有 BigQuery 数据的管理员。MonitoringServiceAccount 是一个服务帐号,它负责监控组织内所有项目中所有表的大小。

拥有组织的完整访问权限
在组织 CompanyA 上

如果公司决定 MonitoringServiceAccount 还需对超过特定大小的表进行大小调整并移除早于特定时间段的数据,则需要将 MonitoringServiceAccount 添加到预定义角色 bigquery.user

拥有同一项目中数据的读取访问权限

AnalystGroup 包含一组数据科学家,他们负责一个名为 CompanyProject 的项目的分析服务。OperationsServiceAccount 是一个服务帐号,它负责通过使用批量加载作业加载特定 CompanyProject:AppLogs 数据集,将应用日志加载到 BigQuery 中。分析师不能修改日志。

拥有同一项目中数据的读取访问权限
在项目 CompanyProject 上
  • 将 OperationsServiceAccount 添加到预定义角色 bigquery.user
  • 将 AnalystGroup 添加到预定义角色 bigquery.user
在数据集 CompanyProject:AppLogs 上

拥有不同项目中的数据的读取访问权限

AnalystGroup 包含一组数据科学家,他们负责一个名为 CompanyAnalytics 的项目中的分析服务。但是,他们分析的数据单独位于名为 CompanyLogs 的项目中。OperationsServiceAccount 是一个服务帐号,它负责通过使用批量加载作业加载 CompanyLogs 项目中的各种数据集,将应用日志加载到 BigQuery 中。

AnalystGroup 只能读取 CompanyLogs 项目中的数据,而不能创建其他存储空间或在该项目中运行任何查询作业。分析师可使用项目 CompanyAnalytics 来执行他们的工作,并维护他们在 CompanyAnalytics 项目中的输出。

拥有不同项目中的数据的读取访问权限
在项目 CompanyLogs 上
在项目 CompanyAnalytics 上

以编程方式操作角色

您可以使用以下方法来以编程方式操作数据集、

项目和组织级层的预定义角色。

此页内容是否有用?请给出您的反馈和评价:

发送以下问题的反馈:

此网页
需要帮助?请访问我们的支持页面