使用 IAM 控制对资源的访问权限
本文档介绍了如何查看、授予和撤消对 BigQuery 数据集以及数据集内资源(表、视图和例程)的访问权限控制。虽然模型也是数据集级资源,但您无法使用 IAM 角色授予对单个模型的访问权限。
您可以使用附加到资源的允许政策(也称为 Identity and Access Management [IAM] 政策)授予对 Google Cloud 资源的访问权限。每个资源只能附加一项允许政策。允许政策可控制对资源本身以及从允许政策沿用的任何后代资源的访问权限。
如需详细了解允许政策,请参阅 IAM 文档中的政策结构。
本文档假定您熟悉 Google Cloud中的 Identity and Access Management (IAM)。
限制
- 复制的例程中不包含例程访问控制列表 (ACL)。
- 外部数据集或关联数据集中的例程不支持访问权限控制。
- 外部数据集或关联数据集中的表不支持访问权限控制。
- 无法使用 Terraform 设置例程访问权限控制。
- 无法使用 Google Cloud SDK 设置例程访问权限控制。
- 无法使用 BigQuery 数据控制语言 (DCL) 设置例程访问权限控制。
- Data Catalog 不支持例程访问权限控制。如果用户有条件地授予了例程级别的访问权限,则不会在 BigQuery 侧边栏中看到自己的例程。如需解决此问题,请改为授予数据集级别的访问权限。
INFORMATION_SCHEMA.OBJECT_PRIVILEGES
视图不会显示例程的访问权限控制。
准备工作
授予为用户提供执行本文档中的每个任务所需权限的 Identity and Access Management (IAM) 角色。
所需的角色
如需获取修改资源 IAM 政策所需的权限,请让您的管理员授予您项目的 BigQuery Data Owner (roles/bigquery.dataOwner
) IAM 角色。
如需详细了解如何授予角色,请参阅管理对项目、文件夹和组织的访问权限。
此预定义角色包含修改资源 IAM 政策所需的权限。如需查看所需的确切权限,请展开所需权限部分:
所需权限
您需要具备以下权限才能修改资源 IAM 政策:
-
获取数据集的访问权限政策:
bigquery.datasets.get
-
设置数据集的访问权限政策:
bigquery.datasets.update
-
获取数据集的访问权限政策(仅限Google Cloud 控制台):
bigquery.datasets.getIamPolicy
-
设置数据集的访问权限政策(仅限控制台):
bigquery.datasets.setIamPolicy
-
获取表或视图的访问权限政策:
bigquery.tables.getIamPolicy
-
设置表或视图的政策:
bigquery.tables.setIamPolicy
-
获取例程的访问权限政策:
bigquery.routines.getIamPolicy
-
设置例程的访问权限政策:
bigquery.routines.setIamPolicy
-
创建 bq 工具或 SQL BigQuery 作业(可选):
bigquery.jobs.create
使用数据集访问权限控制
您可以通过向 IAM 主账号授予预定义角色或自定义角色来提供对数据集的访问权限,这些角色决定了主账号可以对数据集执行哪些操作。这也称为将允许政策附加到资源。授予访问权限后,您可以查看数据集的访问权限控制,也可以撤消对数据集的访问权限。
授予对数据集的访问权限
使用 BigQuery 网页界面或 bq 命令行工具创建数据集时,您无法授予对该数据集的访问权限。您必须先创建数据集,然后才能授予对该数据集的访问权限。
借助该 API,您可以通过使用已定义的数据集资源调用 datasets.insert
方法,在创建数据集期间授予访问权限。
项目是数据集的父资源,而数据集是表、视图、例程和模型的父资源。如果您在项目级层授予角色,数据集和数据集的资源将继承该角色及其权限。同样,当您在数据集级层授予角色时,该角色及其权限会由数据集中的资源继承。
您可以通过授予 IAM 角色访问数据集的权限,或者通过使用 IAM 条件有条件地授予访问权限,来提供对数据集的访问权限。如需详细了解如何授予条件访问权限,请参阅使用 IAM Conditions 控制访问权限。
如需在不使用条件的情况下向 IAM 角色授予对数据集的访问权限,请选择以下选项之一:
控制台
前往 BigQuery 页面。
在浏览器窗格中,展开您的项目并选择要共享的数据集。
点击 > 权限。
共享点击
添加主账号。在新的主账号字段中,输入主账号。
在选择角色列表中,选择预定义角色或自定义角色。
点击保存。
要返回数据集信息,请点击关闭。
SQL
如需向主账号授予对数据集的访问权限,请使用 GRANT
DCL 语句:
在 Google Cloud 控制台中,前往 BigQuery 页面。
在查询编辑器中,输入以下语句:
GRANT `ROLE_LIST` ON SCHEMA RESOURCE_NAME TO "USER_LIST"
请替换以下内容:
ROLE_LIST
:您要授予的角色或角色列表(以英文逗号分隔)RESOURCE_NAME
:您要授予访问权限的数据集的名称USER_LIST
:将被授予角色的用户的列表(以英文逗号分隔)如需查看有效格式的列表,请参阅
user_list
。
点击
运行。
如需详细了解如何运行查询,请参阅运行交互式查询。
以下示例向 myDataset
授予 BigQuery Data Viewer 角色:
GRANT `roles/bigquery.dataViewer`
ON SCHEMA `myProject`.myDataset
TO "user:user@example.com", "user:user2@example.com"
bq
-
In the Google Cloud console, activate Cloud Shell.
At the bottom of the Google Cloud console, a Cloud Shell session starts and displays a command-line prompt. Cloud Shell is a shell environment with the Google Cloud CLI already installed and with values already set for your current project. It can take a few seconds for the session to initialize.
要将现有数据集信息(包括访问权限控制)写入 JSON 文件,请使用
bq show
命令:bq show \ --format=prettyjson \ PROJECT_ID:DATASET > PATH_TO_FILE
请替换以下内容:
- PROJECT_ID:您的项目 ID
- DATASET:您的数据集的名称
- PATH_TO_FILE:本地机器上 JSON 文件的路径
对 JSON 文件的
access
部分进行更改。您可以将其添加到任何specialGroup
条目:projectOwners
、projectWriters
、projectReaders
、allAuthenticatedUsers
。您还可以添加以下任一项:userByEmail
、groupByEmail
和domain
。例如,数据集 JSON 文件的
access
部分可能如下所示:{ "access": [ { "role": "READER", "specialGroup": "projectReaders" }, { "role": "WRITER", "specialGroup": "projectWriters" }, { "role": "OWNER", "specialGroup": "projectOwners" }, { "role": "READER", "specialGroup": "allAuthenticatedUsers" }, { "role": "READER", "domain": "domain_name" }, { "role": "WRITER", "userByEmail": "user_email" }, { "role": "READER", "groupByEmail": "group_email" } ], ... }
修改完成后,运行
bq update
命令,并用--source
标志包括该 JSON 文件。如果数据集不在默认项目中,请按以下格式将相应项目 ID 添加到数据集名称中:PROJECT_ID:DATASET
。bq update
--source PATH_TO_FILE
PROJECT_ID:DATASET如需验证您的访问权限控制是否发生了变化,请再次使用
bq show
命令,但不要将信息写入文件:bq show --format=prettyjson PROJECT_ID:DATASET
- 启动 Cloud Shell。
-
设置要应用 Terraform 配置的默认 Google Cloud 项目。
您只需为每个项目运行一次以下命令,即可在任何目录中运行它。
export GOOGLE_CLOUD_PROJECT=PROJECT_ID
如果您在 Terraform 配置文件中设置显式值,则环境变量会被替换。
-
在 Cloud Shell 中,创建一个目录,并在该目录中创建一个新文件。文件名必须具有
.tf
扩展名,例如main.tf
。在本教程中,该文件称为main.tf
。mkdir DIRECTORY && cd DIRECTORY && touch main.tf
-
如果您按照教程进行操作,可以在每个部分或步骤中复制示例代码。
将示例代码复制到新创建的
main.tf
中。(可选)从 GitHub 中复制代码。如果端到端解决方案包含 Terraform 代码段,则建议这样做。
- 查看和修改要应用到您的环境的示例参数。
- 保存更改。
-
初始化 Terraform。您只需为每个目录执行一次此操作。
terraform init
(可选)如需使用最新的 Google 提供程序版本,请添加
-upgrade
选项:terraform init -upgrade
-
查看配置并验证 Terraform 将创建或更新的资源是否符合您的预期:
terraform plan
根据需要更正配置。
-
通过运行以下命令并在提示符处输入
yes
来应用 Terraform 配置:terraform apply
等待 Terraform 显示“应用完成!”消息。
- 打开您的 Google Cloud 项目以查看结果。在 Google Cloud 控制台的界面中找到资源,以确保 Terraform 已创建或更新它们。
Terraform
使用 google_bigquery_dataset_iam
资源可更新对数据集的访问权限。
为数据集设置访问权限政策
以下示例展示了如何使用 google_bigquery_dataset_iam_policy
资源为 mydataset
数据集设置 IAM 政策。这会替换已附加到该数据集的任何现有政策:
# This file sets the IAM policy for the dataset created by # https://github.com/terraform-google-modules/terraform-docs-samples/blob/main/bigquery/bigquery_create_dataset/main.tf. # You must place it in the same local directory as that main.tf file, # and you must have already applied that main.tf file to create # the "default" dataset resource with a dataset_id of "mydataset". data "google_iam_policy" "iam_policy" { binding { role = "roles/bigquery.admin" members = [ "user:user@example.com", ] } binding { role = "roles/bigquery.dataOwner" members = [ "group:data.admin@example.com", ] } binding { role = "roles/bigquery.dataEditor" members = [ "serviceAccount:bqcx-1234567891011-12a3@gcp-sa-bigquery-condel.iam.gserviceaccount.com", ] } } resource "google_bigquery_dataset_iam_policy" "dataset_iam_policy" { dataset_id = google_bigquery_dataset.default.dataset_id policy_data = data.google_iam_policy.iam_policy.policy_data }
为数据集设置角色成员资格
以下示例展示了如何使用 google_bigquery_dataset_iam_binding
资源为 mydataset
数据集设置给定角色的成员资格。这会替换该角色中的任何现有成员资格。数据集 IAM 政策中的其他角色会保留:
# This file sets membership in an IAM role for the dataset created by # https://github.com/terraform-google-modules/terraform-docs-samples/blob/main/bigquery/bigquery_create_dataset/main.tf. # You must place it in the same local directory as that main.tf file, # and you must have already applied that main.tf file to create # the "default" dataset resource with a dataset_id of "mydataset". resource "google_bigquery_dataset_iam_binding" "dataset_iam_binding" { dataset_id = google_bigquery_dataset.default.dataset_id role = "roles/bigquery.jobUser" members = [ "user:user@example.com", "group:group@example.com" ] }
为单个主账号设置角色成员资格
以下示例展示了如何使用 google_bigquery_dataset_iam_member
资源更新 mydataset
数据集的 IAM 政策,以向一个主账号授予角色。更新此 IAM 政策不会影响已针对相应数据集授予该角色的任何其他主账号的访问权限。
# This file adds a member to an IAM role for the dataset created by # https://github.com/terraform-google-modules/terraform-docs-samples/blob/main/bigquery/bigquery_create_dataset/main.tf. # You must place it in the same local directory as that main.tf file, # and you must have already applied that main.tf file to create # the "default" dataset resource with a dataset_id of "mydataset". resource "google_bigquery_dataset_iam_member" "dataset_iam_member" { dataset_id = google_bigquery_dataset.default.dataset_id role = "roles/bigquery.user" member = "user:user@example.com" }
如需在 Google Cloud 项目中应用 Terraform 配置,请完成以下部分中的步骤。
准备 Cloud Shell
准备目录
每个 Terraform 配置文件都必须有自己的目录(也称为“根模块”)。
应用更改
API
要在创建数据集时应用访问权限控制,请使用已定义的数据集资源来调用 datasets.insert
方法。要更新访问权限控制,请调用 datasets.patch
方法并使用 Dataset
资源中的 access
属性。
由于 datasets.update
方法会替换整个数据集资源,因此 datasets.patch
是更新访问权限控制的首选方法。
Go
试用此示例之前,请按照 BigQuery 快速入门:使用客户端库中的 Go 设置说明进行操作。 如需了解详情,请参阅 BigQuery Go API 参考文档。
如需向 BigQuery 进行身份验证,请设置应用默认凭证。如需了解详情,请参阅为客户端库设置身份验证。
通过使用DatasetMetadataToUpdate
类型将新条目附加到现有列表来设置新的访问权限列表。然后调用 dataset.Update()
函数以更新该属性。
Java
试用此示例之前,请按照 BigQuery 快速入门:使用客户端库中的 Java 设置说明进行操作。 如需了解详情,请参阅 BigQuery Java API 参考文档。
如需向 BigQuery 进行身份验证,请设置应用默认凭证。如需了解详情,请参阅为客户端库设置身份验证。
Node.js
试用此示例之前,请按照 BigQuery 快速入门:使用客户端库中的 Node.js 设置说明进行操作。 如需了解详情,请参阅 BigQuery Node.js API 参考文档。
如需向 BigQuery 进行身份验证,请设置应用默认凭证。如需了解详情,请参阅为客户端库设置身份验证。
通过使用 Dataset#metadata 方法将新条目附加到现有列表来设置新的访问权限列表。 然后调用 Dataset#setMetadata() 函数来更新该属性。Python
试用此示例之前,请按照 BigQuery 快速入门:使用客户端库中的 Python 设置说明进行操作。 如需了解详情,请参阅 BigQuery Python API 参考文档。
如需向 BigQuery 进行身份验证,请设置应用默认凭证。如需了解详情,请参阅为客户端库设置身份验证。
使用数据集的访问权限控制来设置dataset.access_entries
属性。然后调用 client.update_dataset()
函数以更新该属性。
授予数据集访问权限的预定义角色
您可以向数据集授予以下 IAM 预定义角色的访问权限。
角色 | 说明 |
---|---|
BigQuery Data Owner
(roles/bigquery.dataOwner ) |
当此角色被授予给数据集时,会授予以下权限:
|
BigQuery Data Editor
(roles/bigquery.dataEditor ) |
当此角色被授予给数据集时,会授予以下权限:
|
BigQuery Data Viewer
(roles/bigquery.dataViewer ) |
当此角色被授予给数据集时,会授予以下权限:
|
BigQuery Metadata Viewer
(roles/bigquery.metadataViewer ) |
当此角色被授予给数据集时,会授予以下权限:
|
数据集权限
大多数以 bigquery.datasets
开头的权限都适用于数据集级层。
bigquery.datasets.create
却不是这样。如需创建数据集,必须向父容器(即项目)中的角色授予 bigquery.datasets.create
权限。
下表列出了数据集的所有权限以及可应用相应权限的最低级资源。
权限 | 资源 | 操作 |
---|---|---|
bigquery.datasets.create |
项目 | 在项目中创建新数据集。 |
bigquery.datasets.get |
数据集 | 获取数据集的元数据和访问权限控制。在控制台中查看权限还需要 bigquery.datasets.getIamPolicy 权限。 |
bigquery.datasets.getIamPolicy |
数据集 | 控制台需要此权限才能向用户授予获取数据集访问权限控制的权限。应急开启。控制台还需要 bigquery.datasets.get 权限才能查看数据集。 |
bigquery.datasets.update |
数据集 | 更新数据集的元数据和访问权限控制。在控制台中更新访问权限控制还需要 bigquery.datasets.setIamPolicy 权限。 |
bigquery.datasets.setIamPolicy |
数据集 | 控制台需要此权限才能向用户授予设置数据集访问权限控制的权限。应急开启。控制台还需要 bigquery.datasets.update 权限才能更新数据集。 |
bigquery.datasets.delete |
数据集 | 删除数据集。 |
bigquery.datasets.createTagBinding |
数据集 | 将标记附加到数据集。 |
bigquery.datasets.deleteTagBinding |
数据集 | 从数据集中分离标记。 |
bigquery.datasets.listTagBindings |
数据集 | 列出数据集的标记。 |
bigquery.datasets.listEffectiveTags |
数据集 | 列出数据集的有效标记(已应用和已继承)。 |
bigquery.datasets.link |
数据集 | 创建关联数据集。 |
bigquery.datasets.listSharedDatasetUsage |
项目 | 列出您有权访问的项目中共享数据集的使用情况统计信息。查询 INFORMATION_SCHEMA.SHARED_DATASET_USAGE 视图需要此权限。 |
查看数据集的访问权限控制
您可以选择以下任一选项,查看为数据集明确设置的访问权限控制。如需查看继承的角色,请使用 BigQuery 网页界面。
控制台
前往 BigQuery 页面。
在浏览器窗格中,展开您的项目,然后选择数据集。
点击 > 权限。
共享数据集的访问权限控制会显示在数据集权限窗格中。
bq
-
In the Google Cloud console, activate Cloud Shell.
At the bottom of the Google Cloud console, a Cloud Shell session starts and displays a command-line prompt. Cloud Shell is a shell environment with the Google Cloud CLI already installed and with values already set for your current project. It can take a few seconds for the session to initialize.
要获取现有政策并将其输出到 JSON 格式的本地文件,请使用 Cloud Shell 中的
bq show
命令:bq show \ --format=prettyjson \ PROJECT_ID:DATASET > PATH_TO_FILE
请替换以下内容:
- PROJECT_ID:您的项目 ID
- DATASET:您的数据集的名称。
- PATH_TO_FILE:本地机器上 JSON 文件的路径
在 Google Cloud 控制台中,前往 BigQuery 页面。
在查询编辑器中,输入以下语句:
SELECT COLUMN_LIST FROM PROJECT_ID.`region-REGION`.INFORMATION_SCHEMA.OBJECT_PRIVILEGES WHERE object_name = "DATASET";
替换以下内容:
- COLUMN_LIST:
INFORMATION_SCHEMA.OBJECT_PRIVILEGES
视图中列的英文逗号分隔列表 - PROJECT_ID:您的项目 ID
- REGION:区域限定符
- DATASET:项目中的数据集的名称
- COLUMN_LIST:
点击
运行。
SQL
查询 INFORMATION_SCHEMA.OBJECT_PRIVILEGES
视图。检索数据集的访问权限控制的查询必须指定 object_name
。
如需详细了解如何运行查询,请参阅运行交互式查询。
示例:
此查询可获取 mydataset
的访问权限控制。
SELECT object_name, privilege_type, grantee FROM my_project.`region-us`.INFORMATION_SCHEMA.OBJECT_PRIVILEGES WHERE object_name = "mydataset";
输出应如下所示:
+------------------+-----------------------------+-------------------------+
| object_name | privilege_type | grantee |
+------------------+-----------------------------+-------------------------+
| mydataset | roles/bigquery.dataOwner | projectOwner:myproject |
| mydataset | roles/bigquery.dataViwer | user:user@example.com |
+------------------+-----------------------------+-------------------------+
API
如需查看数据集的访问权限控制,请使用定义的 dataset
资源调用 datasets.get
方法。
访问权限控制显示在 dataset
资源的 access
属性中。
Go
试用此示例之前,请按照 BigQuery 快速入门:使用客户端库中的 Go 设置说明进行操作。 如需了解详情,请参阅 BigQuery Go API 参考文档。
如需向 BigQuery 进行身份验证,请设置应用默认凭证。如需了解详情,请参阅为客户端库设置身份验证。
调用client.Dataset().Metadata()
函数。访问权限政策可在 Access
属性中找到。
Java
试用此示例之前,请按照 BigQuery 快速入门:使用客户端库中的 Java 设置说明进行操作。 如需了解详情,请参阅 BigQuery Java API 参考文档。
如需向 BigQuery 进行身份验证,请设置应用默认凭证。如需了解详情,请参阅为客户端库设置身份验证。
Node.js
试用此示例之前,请按照 BigQuery 快速入门:使用客户端库中的 Node.js 设置说明进行操作。 如需了解详情,请参阅 BigQuery Node.js API 参考文档。
如需向 BigQuery 进行身份验证,请设置应用默认凭证。如需了解详情,请参阅为客户端库设置身份验证。
使用Dataset#getMetadata()
函数检索数据集元数据。
访问权限政策可在生成的元数据对象的 access 属性中找到。
Python
试用此示例之前,请按照 BigQuery 快速入门:使用客户端库中的 Python 设置说明进行操作。 如需了解详情,请参阅 BigQuery Python API 参考文档。
如需向 BigQuery 进行身份验证,请设置应用默认凭证。如需了解详情,请参阅为客户端库设置身份验证。
调用client.get_dataset()
函数。
访问权限政策可在 dataset.access_entries
属性中找到。
撤消对数据集的访问权限
如需撤消对数据集的访问权限,请选择以下选项之一:
控制台
前往 BigQuery 页面。
在浏览器面板中,展开您的项目并选择数据集。
在详细信息面板中,点击共享 > 权限。
在数据集权限对话框中,展开要撤消其访问权限的主账号。
点击
移除主账号。在从主账号中移除角色?对话框中,点击移除。
要返回数据集详细信息,请点击关闭。
SQL
如需移除主账号对数据集的访问权限,请使用 REVOKE
DCL 语句:
在 Google Cloud 控制台中,前往 BigQuery 页面。
在查询编辑器中,输入以下语句:
REVOKE `ROLE_LIST` ON SCHEMA RESOURCE_NAME FROM "USER_LIST"
请替换以下内容:
ROLE_LIST
:您要撤消权限的角色或角色列表(以英文逗号分隔)RESOURCE_NAME
:您要撤消的权限所针对的资源的名称USER_LIST
:将撤消其角色的用户的列表(以英文逗号分隔)如需查看有效格式的列表,请参阅
user_list
。
点击
运行。
如需详细了解如何运行查询,请参阅运行交互式查询。
以下示例会撤消 myDataset
的 BigQuery Data Owner 角色:
REVOKE `roles/bigquery.dataOwner`
ON SCHEMA `myProject`.myDataset
FROM "group:group@example.com", "serviceAccount:user@test-project.iam.gserviceaccount.com"
bq
-
In the Google Cloud console, activate Cloud Shell.
At the bottom of the Google Cloud console, a Cloud Shell session starts and displays a command-line prompt. Cloud Shell is a shell environment with the Google Cloud CLI already installed and with values already set for your current project. It can take a few seconds for the session to initialize.
要将现有数据集信息(包括访问权限控制)写入 JSON 文件,请使用
bq show
命令:bq show \ --format=prettyjson \ PROJECT_ID:DATASET > PATH_TO_FILE
请替换以下内容:
- PROJECT_ID:您的项目 ID
- DATASET:您的数据集的名称
- PATH_TO_FILE:本地机器上 JSON 文件的路径
对 JSON 文件的
access
部分进行更改。您可以移除以下任何specialGroup
条目:projectOwners
、projectWriters
、projectReaders
和allAuthenticatedUsers
。您还可以移除以下任何一项:userByEmail
、groupByEmail
和domain
。例如,数据集 JSON 文件的
access
部分可能如下所示:{ "access": [ { "role": "READER", "specialGroup": "projectReaders" }, { "role": "WRITER", "specialGroup": "projectWriters" }, { "role": "OWNER", "specialGroup": "projectOwners" }, { "role": "READER", "specialGroup": "allAuthenticatedUsers" }, { "role": "READER", "domain": "domain_name" }, { "role": "WRITER", "userByEmail": "user_email" }, { "role": "READER", "groupByEmail": "group_email" } ], ... }
修改完成后,运行
bq update
命令,并用--source
标志包括该 JSON 文件。如果数据集不在默认项目中,请按以下格式将相应项目 ID 添加到数据集名称中:PROJECT_ID:DATASET
。bq update
--source PATH_TO_FILE
PROJECT_ID:DATASET如需验证您的访问权限控制是否发生了变化,请使用
show
命令,但不要将信息写入文件:bq show --format=prettyjson PROJECT_ID:DATASET
API
调用 datasets.patch
方法并使用 Dataset
资源中的 access
属性更新访问权限控制。
由于 datasets.update
方法会替换整个数据集资源,因此 datasets.patch
是更新访问权限控制的首选方法。
Go
试用此示例之前,请按照 BigQuery 快速入门:使用客户端库中的 Go 设置说明进行操作。 如需了解详情,请参阅 BigQuery Go API 参考文档。
如需向 BigQuery 进行身份验证,请设置应用默认凭证。如需了解详情,请参阅为客户端库设置身份验证。
通过使用DatasetMetadataToUpdate
类型从现有列表中移除条目来设置新的访问权限列表。然后调用 dataset.Update()
函数以更新该属性。
Java
试用此示例之前,请按照 BigQuery 快速入门:使用客户端库中的 Java 设置说明进行操作。 如需了解详情,请参阅 BigQuery Java API 参考文档。
如需向 BigQuery 进行身份验证,请设置应用默认凭证。如需了解详情,请参阅为客户端库设置身份验证。
Node.js
试用此示例之前,请按照 BigQuery 快速入门:使用客户端库中的 Node.js 设置说明进行操作。 如需了解详情,请参阅 BigQuery Node.js API 参考文档。
如需向 BigQuery 进行身份验证,请设置应用默认凭证。如需了解详情,请参阅为客户端库设置身份验证。
使用Dataset#get()
方法检索当前元数据方法,从现有列表中移除指定条目,从而更新数据集访问权限列表。修改访问权限属性以排除所需的实体,然后调用 Dataset#setMetadata()
函数来应用更新后的访问权限列表。
Python
试用此示例之前,请按照 BigQuery 快速入门:使用客户端库中的 Python 设置说明进行操作。 如需了解详情,请参阅 BigQuery Python API 参考文档。
如需向 BigQuery 进行身份验证,请设置应用默认凭证。如需了解详情,请参阅为客户端库设置身份验证。
使用数据集的访问权限控制来设置dataset.access_entries
属性。然后调用 client.update_dataset()
函数以更新该属性。
使用表和视图访问权限控制
在 BigQuery 中,视图作为表资源处理。您可以向 IAM 主账号授予预定义角色或自定义角色,以提供对表或视图的访问权限。这些角色决定了主账号可以对表或视图执行哪些操作。这也称为将允许政策附加到资源。授予访问权限后,您可以查看表或视图的访问权限控制,也可以撤消对表或视图的访问权限。
授予对表或视图的访问权限
如需实现精细的访问权限控制,您可以针对特定表或视图授予预定义或自定义 IAM 角色。表或视图还会继承在数据集级层及更高级层指定的访问权限控制。例如,如果您向某个主账号授予对某个数据集的 BigQuery Data Owner 角色,则该主账号还拥有对该数据集中的表和视图的 BigQuery Data Owner 权限。
如需授予对表或视图的访问权限,请选择以下选项之一:
控制台
前往 BigQuery 页面。
在浏览器窗格中,展开您的项目,然后选择要共享的表或视图。
点击
共享。点击
添加主账号。在新的主账号字段中,输入主账号。
在选择角色列表中,选择预定义角色或自定义角色。
点击保存。
要返回以查看表或视图详细信息,请点击关闭。
SQL
如需向主账号授予对表或视图的访问权限,请使用 GRANT
DCL 语句:
在 Google Cloud 控制台中,前往 BigQuery 页面。
在查询编辑器中,输入以下语句:
GRANT `ROLE_LIST` ON RESOURCE_TYPE RESOURCE_NAME TO "USER_LIST"
请替换以下内容:
ROLE_LIST
:您要授予权限的角色或以英文逗号分隔的角色列表RESOURCE_TYPE
:角色适用的资源类型支持的值包括
TABLE
、VIEW
、MATERIALIZED VIEW
和EXTERNAL TABLE
。RESOURCE_NAME
:您要向其授予权限的资源的名称USER_LIST
:为其授予角色的以英文逗号分隔的用户列表。如需查看有效格式的列表,请参阅
user_list
。
点击
运行。
如需详细了解如何运行查询,请参阅运行交互式查询。
以下示例会针对 myTable
授予 BigQuery Data Viewer 角色:
GRANT `roles/bigquery.dataViewer`
ON TABLE `myProject`.myDataset.myTable
TO "user:user@example.com", "user:user2@example.com"
bq
-
In the Google Cloud console, activate Cloud Shell.
At the bottom of the Google Cloud console, a Cloud Shell session starts and displays a command-line prompt. Cloud Shell is a shell environment with the Google Cloud CLI already installed and with values already set for your current project. It can take a few seconds for the session to initialize.
如需授予对表或视图的访问权限,请使用
bq add-iam-policy-binding
命令:bq add-iam-policy-binding --member=MEMBER_TYPE:MEMBER --role=ROLE --table=true RESOURCE
请替换以下内容:
- MEMBER_TYPE:成员类型,例如
user
、group
、serviceAccount
或domain
。 - MEMBER:成员的电子邮件地址或域名。
- ROLE:您要向成员授予的角色。
- RESOURCE:您要更新其政策的表或视图的名称。
- MEMBER_TYPE:成员类型,例如
- 启动 Cloud Shell。
-
设置要应用 Terraform 配置的默认 Google Cloud 项目。
您只需为每个项目运行一次以下命令,即可在任何目录中运行它。
export GOOGLE_CLOUD_PROJECT=PROJECT_ID
如果您在 Terraform 配置文件中设置显式值,则环境变量会被替换。
-
在 Cloud Shell 中,创建一个目录,并在该目录中创建一个新文件。文件名必须具有
.tf
扩展名,例如main.tf
。在本教程中,该文件称为main.tf
。mkdir DIRECTORY && cd DIRECTORY && touch main.tf
-
如果您按照教程进行操作,可以在每个部分或步骤中复制示例代码。
将示例代码复制到新创建的
main.tf
中。(可选)从 GitHub 中复制代码。如果端到端解决方案包含 Terraform 代码段,则建议这样做。
- 查看和修改要应用到您的环境的示例参数。
- 保存更改。
-
初始化 Terraform。您只需为每个目录执行一次此操作。
terraform init
(可选)如需使用最新的 Google 提供程序版本,请添加
-upgrade
选项:terraform init -upgrade
-
查看配置并验证 Terraform 将创建或更新的资源是否符合您的预期:
terraform plan
根据需要更正配置。
-
通过运行以下命令并在提示符处输入
yes
来应用 Terraform 配置:terraform apply
等待 Terraform 显示“应用完成!”消息。
- 打开您的 Google Cloud 项目以查看结果。在 Google Cloud 控制台的界面中找到资源,以确保 Terraform 已创建或更新它们。
如需检索当前政策,请调用
tables.getIamPolicy
方法。修改该政策以添加成员和/或访问权限控制。如需了解政策所需的格式,请参阅政策参考主题。
调用
tables.setIamPolicy
以写入更新后的政策。
Terraform
使用 google_bigquery_table_iam
资源可更新对表的访问权限。
为表设置访问权限政策
以下示例展示了如何使用 google_bigquery_table_iam_policy
资源为 mytable
为设置 IAM 政策。这会替换已附加到该表的任何现有政策:
# This file sets the IAM policy for the table created by # https://github.com/terraform-google-modules/terraform-docs-samples/blob/main/bigquery/bigquery_create_table/main.tf. # You must place it in the same local directory as that main.tf file, # and you must have already applied that main.tf file to create # the "default" table resource with a table_id of "mytable". data "google_iam_policy" "iam_policy" { binding { role = "roles/bigquery.dataOwner" members = [ "user:user@example.com", ] } } resource "google_bigquery_table_iam_policy" "table_iam_policy" { dataset_id = google_bigquery_table.default.dataset_id table_id = google_bigquery_table.default.table_id policy_data = data.google_iam_policy.iam_policy.policy_data }
为表设置角色成员资格
以下示例展示了如何使用 google_bigquery_table_iam_binding
资源为 mytable
表设置给定角色的成员资格。这会替换该角色中的任何现有成员资格。表 IAM 政策中的其他角色会保留。
# This file sets membership in an IAM role for the table created by # https://github.com/terraform-google-modules/terraform-docs-samples/blob/main/bigquery/bigquery_create_table/main.tf. # You must place it in the same local directory as that main.tf file, # and you must have already applied that main.tf file to create # the "default" table resource with a table_id of "mytable". resource "google_bigquery_table_iam_binding" "table_iam_binding" { dataset_id = google_bigquery_table.default.dataset_id table_id = google_bigquery_table.default.table_id role = "roles/bigquery.dataOwner" members = [ "group:group@example.com", ] }
为单个主账号设置角色成员资格
以下示例展示了如何使用 google_bigquery_table_iam_member
资源更新 mytable
表的 IAM 政策,以向一个主账号授予角色。更新此 IAM 政策不会影响已针对相应数据集授予该角色的任何其他主账号的访问权限。
# This file adds a member to an IAM role for the table created by # https://github.com/terraform-google-modules/terraform-docs-samples/blob/main/bigquery/bigquery_create_table/main.tf. # You must place it in the same local directory as that main.tf file, # and you must have already applied that main.tf file to create # the "default" table resource with a table_id of "mytable". resource "google_bigquery_table_iam_member" "table_iam_member" { dataset_id = google_bigquery_table.default.dataset_id table_id = google_bigquery_table.default.table_id role = "roles/bigquery.dataEditor" member = "serviceAccount:bqcx-1234567891011-12a3@gcp-sa-bigquery-condel.iam.gserviceaccount.com" }
如需在 Google Cloud 项目中应用 Terraform 配置,请完成以下部分中的步骤。
准备 Cloud Shell
准备目录
每个 Terraform 配置文件都必须有自己的目录(也称为“根模块”)。
应用更改
API
Go
试用此示例之前,请按照 BigQuery 快速入门:使用客户端库中的 Go 设置说明进行操作。 如需了解详情,请参阅 BigQuery Go API 参考文档。
如需向 BigQuery 进行身份验证,请设置应用默认凭证。如需了解详情,请参阅为客户端库设置身份验证。
调用资源的IAM().SetPolicy()
函数,以保存对表或视图的访问权限政策所做的更改。
Java
试用此示例之前,请按照 BigQuery 快速入门:使用客户端库中的 Java 设置说明进行操作。 如需了解详情,请参阅 BigQuery Java API 参考文档。
如需向 BigQuery 进行身份验证,请设置应用默认凭证。如需了解详情,请参阅为客户端库设置身份验证。
Node.js
试用此示例之前,请按照 BigQuery 快速入门:使用客户端库中的 Node.js 设置说明进行操作。 如需了解详情,请参阅 BigQuery Node.js API 参考文档。
如需向 BigQuery 进行身份验证,请设置应用默认凭证。如需了解详情,请参阅为客户端库设置身份验证。
调用Table#getIamPolicy()
函数以检索表或视图的当前 IAM 政策,通过添加新绑定来修改该政策,然后使用 Table#setIamPolicy()
函数保存对访问权限政策的更改。
Python
试用此示例之前,请按照 BigQuery 快速入门:使用客户端库中的 Python 设置说明进行操作。 如需了解详情,请参阅 BigQuery Python API 参考文档。
如需向 BigQuery 进行身份验证,请设置应用默认凭证。如需了解详情,请参阅为客户端库设置身份验证。
调用client.set_iam_policy()
函数以保存对表或视图的访问权限政策所做的更改。
授予对表和视图的访问权限的预定义角色
在 BigQuery 中,视图作为表资源处理。如需进行精细的访问权限控制,您可以针对特定表或视图授予预定义或自定义 IAM 角色。表或视图还会继承在数据集级层及更高级层指定的访问权限控制。例如,如果您向某个主账号授予某个数据集的 BigQuery Data Owner 角色,该主账号还拥有该数据集中的表和视图的 Data Owner 权限。
以下预定义的 IAM 角色具有表或视图的权限。
角色 | 说明 |
---|---|
BigQuery Data Owner
(roles/bigquery.dataOwner ) |
此角色在应用于表或视图时,可授予以下权限:
|
BigQuery Data Editor
(roles/bigquery.dataEditor ) |
此角色在应用于表或视图时,可授予以下权限:
|
BigQuery Data Viewer
(roles/bigquery.dataViewer ) |
此角色在应用于表或视图时,可授予以下权限:
|
BigQuery Metadata Viewer
(roles/bigquery.metadataViewer ) |
此角色在应用于表或视图时,可授予以下权限:
|
表和视图的权限
在 BigQuery 中,视图作为表资源处理。所有表级权限都适用于视图。
大多数以 bigquery.tables
开头的权限都适用于表级层。
bigquery.tables.create
和 bigquery.tables.list
不适用于表级层。如需创建和列出表或视图,必须向父容器(数据集或项目)中的角色授予 bigquery.tables.create
和 bigquery.tables.list
权限。
下表列出了表和视图的所有权限,以及可以授予这些权限的最低级别资源。
权限 | 资源 | 操作 |
---|---|---|
bigquery.tables.create |
数据集 | 在数据集中创建新表。 |
bigquery.tables.createIndex |
表格 | 在表上创建搜索索引。 |
bigquery.tables.deleteIndex |
表格 | 删除表上的搜索索引。 |
bigquery.tables.createSnapshot |
表格 | 创建表的快照。创建快照需要在表级和数据集级获得多项额外权限。如需了解详情,请参阅权限和角色,了解如何创建表快照。 |
bigquery.tables.deleteSnapshot |
表格 | 删除表的快照。 |
bigquery.tables.delete |
表格 | 删除表。 |
bigquery.tables.createTagBinding |
表格 | 创建表的资源标记绑定。 |
bigquery.tables.deleteTagBinding |
表格 | 删除表的资源标记绑定。 |
bigquery.tables.listTagBindings |
表格 | 列出表的资源标记绑定。 |
bigquery.tables.listEffectiveTags |
表格 | 列出表的有效标记(已应用和已继承)。 |
bigquery.tables.export |
表格 | 导出表的数据。运行导出作业还需要 bigquery.jobs.create 权限。 |
bigquery.tables.get |
表格 | 获取表的元数据。 |
bigquery.tables.getData |
表格 | 查询表的数据。运行查询作业还需要 bigquery.jobs.create 权限。 |
bigquery.tables.getIamPolicy |
表格 | 获取表的访问权限控制。 |
bigquery.tables.list |
数据集 | 列出数据集中的所有表和表元数据。 |
bigquery.tables.replicateData |
表格 | 复制表数据。创建副本物化视图需要此权限。 |
bigquery.tables.restoreSnapshot |
表格 | 恢复表快照。 |
bigquery.tables.setCategory |
表格 | 在表的架构中设置政策标记。 |
bigquery.tables.setColumnDataPolicy |
表格 | 为表设置列级访问权限政策。 |
bigquery.tables.setIamPolicy |
表格 | 为表设置访问权限控制。 |
bigquery.tables.update |
表格 | 更新表。此外,您还需要拥有 metadata. bigquery.tables.get 权限才能在控制台中更新表元数据。 |
bigquery.tables.updateData |
表格 | 更新表数据。 |
bigquery.tables.updateIndex |
表格 | 更新表上的搜索索引。 |
查看表或视图的访问权限控制
如需查看表或视图的访问权限控制,请选择以下选项之一:
控制台
前往 BigQuery 页面。
在浏览器窗格中,展开您的项目,展开数据集,然后选择表或视图。
点击
共享。表或视图访问权限控制将显示在共享窗格中。
bq
-
In the Google Cloud console, activate Cloud Shell.
At the bottom of the Google Cloud console, a Cloud Shell session starts and displays a command-line prompt. Cloud Shell is a shell environment with the Google Cloud CLI already installed and with values already set for your current project. It can take a few seconds for the session to initialize.
要获取现有访问权限政策并将其输出到 JSON 格式的本地文件,请使用 Cloud Shell 中的
bq get-iam-policy
命令:bq get-iam-policy \ --table=true \ PROJECT_ID:DATASET.RESOURCE > PATH_TO_FILE
替换以下内容:
- PROJECT_ID:您的项目 ID
- DATASET:您的数据集的名称
- RESOURCE:您要查看其政策的表或视图的名称
- PATH_TO_FILE:本地机器上 JSON 文件的路径
在 Google Cloud 控制台中,前往 BigQuery 页面。
在查询编辑器中,输入以下语句:
SELECT COLUMN_LIST FROM PROJECT_ID.`region-REGION`.INFORMATION_SCHEMA.OBJECT_PRIVILEGES WHERE object_schema = "DATASET" AND object_name = "TABLE";
替换以下内容:
- COLUMN_LIST:
INFORMATION_SCHEMA.OBJECT_PRIVILEGES
视图中列的英文逗号分隔列表 - PROJECT_ID:您的项目 ID
- REGION:区域限定符
- DATASET:包含表或视图的数据集的名称
- TABLE:表或视图的名称
- COLUMN_LIST:
点击
运行。
SQL
查询 INFORMATION_SCHEMA.OBJECT_PRIVILEGES
视图。检索表或视图的访问权限的查询必须指定 object_schema
和 object_name
。
如需详细了解如何运行查询,请参阅运行交互式查询。
示例:
SELECT object_name, privilege_type, grantee FROM my_project.`region-us`.INFORMATION_SCHEMA.OBJECT_PRIVILEGES WHERE object_schema = "mydataset" AND object_name = "mytable";
+------------------+-----------------------------+--------------------------+
| object_name | privilege_type | grantee |
+------------------+-----------------------------+--------------------------+
| mytable | roles/bigquery.dataEditor | group:group@example.com|
| mytable | roles/bigquery.dataOwner | user:user@example.com|
+------------------+-----------------------------+--------------------------+
API
如需检索当前政策,请调用 tables.getIamPolicy
方法。
Go
试用此示例之前,请按照 BigQuery 快速入门:使用客户端库中的 Go 设置说明进行操作。 如需了解详情,请参阅 BigQuery Go API 参考文档。
如需向 BigQuery 进行身份验证,请设置应用默认凭证。如需了解详情,请参阅为客户端库设置身份验证。
调用资源的IAM().Policy()
函数。然后调用 Roles()
函数以获取表或视图的访问权限政策。
Java
试用此示例之前,请按照 BigQuery 快速入门:使用客户端库中的 Java 设置说明进行操作。 如需了解详情,请参阅 BigQuery Java API 参考文档。
如需向 BigQuery 进行身份验证,请设置应用默认凭证。如需了解详情,请参阅为客户端库设置身份验证。
Node.js
试用此示例之前,请按照 BigQuery 快速入门:使用客户端库中的 Node.js 设置说明进行操作。 如需了解详情,请参阅 BigQuery Node.js API 参考文档。
如需向 BigQuery 进行身份验证,请设置应用默认凭证。如需了解详情,请参阅为客户端库设置身份验证。
使用Table#getIamPolicy()
函数检索表或视图的 IAM 政策。
访问权限政策详细信息可在返回的政策对象中找到。
撤消对表或视图的访问权限
如需撤消对表或视图的访问权限,请选择以下选项之一:
控制台
前往 BigQuery 页面。
在浏览器面板中,展开您的项目,展开数据集,然后选择表或视图。
在详细信息面板中,点击共享。
在共享对话框中,展开要撤消其访问权限的主账号。
点击
删除。在从主账号中移除角色?对话框中,点击移除。
要返回以查看表或视图详细信息,请点击关闭。
SQL
如需移除主账号对表或视图的访问权限,请使用 REVOKE
DCL 语句:
在 Google Cloud 控制台中,前往 BigQuery 页面。
在查询编辑器中,输入以下语句:
REVOKE `ROLE_LIST` ON RESOURCE_TYPE RESOURCE_NAME FROM "USER_LIST"
请替换以下内容:
ROLE_LIST
:您要撤消权限的角色或以英文逗号分隔的角色列表RESOURCE_TYPE
:从中撤消角色权限的资源类型支持的值包括
TABLE
、VIEW
、MATERIALIZED VIEW
和EXTERNAL TABLE
。RESOURCE_NAME
:您要撤消其权限的资源的名称USER_LIST
:将撤消其角色的以英文逗号分隔的用户列表如需查看有效格式的列表,请参阅
user_list
。
点击
运行。
如需详细了解如何运行查询,请参阅运行交互式查询。
以下示例会撤消 myTable
的 BigQuery Data Owner 角色:
REVOKE `roles/bigquery.dataOwner`
ON TABLE `myProject`.myDataset.myTable
FROM "group:group@example.com", "serviceAccount:user@myproject.iam.gserviceaccount.com"
bq
-
In the Google Cloud console, activate Cloud Shell.
At the bottom of the Google Cloud console, a Cloud Shell session starts and displays a command-line prompt. Cloud Shell is a shell environment with the Google Cloud CLI already installed and with values already set for your current project. It can take a few seconds for the session to initialize.
如需撤消对表或视图的访问权限,请使用
bq remove-iam-policy-binding
命令:bq remove-iam-policy-binding --member=MEMBER_TYPE:MEMBER --role=ROLE --table=true RESOURCE
替换以下内容:
- MEMBER_TYPE:成员类型,例如
user
、group
、serviceAccount
或domain
- MEMBER:成员的邮箱或域名
- ROLE:您要从成员中撤消的角色
- RESOURCE:您要更新其政策的表或视图的名称
- MEMBER_TYPE:成员类型,例如
如需检索当前政策,请调用
tables.getIamPolicy
方法。修改政策以移除成员和/或绑定。如需了解政策所需的格式,请参阅政策参考主题。
调用
tables.setIamPolicy
以写入更新后的政策。
API
Go
试用此示例之前,请按照 BigQuery 快速入门:使用客户端库中的 Go 设置说明进行操作。 如需了解详情,请参阅 BigQuery Go API 参考文档。
如需向 BigQuery 进行身份验证,请设置应用默认凭证。如需了解详情,请参阅为客户端库设置身份验证。
调用policy.Remove()
函数以移除访问权限。
然后,调用 IAM().SetPolicy()
函数以保存对表或视图的访问权限政策所做的更改。
Java
试用此示例之前,请按照 BigQuery 快速入门:使用客户端库中的 Java 设置说明进行操作。 如需了解详情,请参阅 BigQuery Java API 参考文档。
如需向 BigQuery 进行身份验证,请设置应用默认凭证。如需了解详情,请参阅为客户端库设置身份验证。
Node.js
试用此示例之前,请按照 BigQuery 快速入门:使用客户端库中的 Node.js 设置说明进行操作。 如需了解详情,请参阅 BigQuery Node.js API 参考文档。
如需向 BigQuery 进行身份验证,请设置应用默认凭证。如需了解详情,请参阅为客户端库设置身份验证。
使用Table#getIamPolicy()
方法检索针对表或视图的当前 IAM 政策。
修改政策以移除所需的角色或主账号,然后使用 Table#setIamPolicy()
方法应用更新后的政策。
使用例程的访问权限控制
如需就此功能提供反馈或请求支持,请发送电子邮件至 bq-govsec-eng@google.com。
您可以向 IAM 主账号授予预定义角色或自定义角色,以提供对例程的访问权限。所授予的角色决定了主账号可以对例程执行的操作。这也称为将允许政策附加到资源。授予访问权限后,您可以查看例程的访问权限控制,也可以撤消对例程的访问权限。
授予对例程的访问权限
如需实现精细的访问权限控制,您可以针对特定例程授予预定义或自定义 IAM 角色。该例程还会继承在数据集级层及更高级层指定的访问权限控制。例如,如果您向某个主账号授予数据集的 BigQuery Data Owner 角色,该主账号还拥有该数据集中例程的 Data Owner 权限。
从下列选项中选择一项:
控制台
前往 BigQuery 页面。
在浏览器窗格中,展开您的项目、数据集和例程,然后选择一个例程。
点击
共享。点击
添加成员。在新成员字段中,输入主账号。
在选择角色列表中,选择预定义角色或自定义角色。
点击保存。
如需返回到例程信息,请点击完成。
bq
-
In the Google Cloud console, activate Cloud Shell.
At the bottom of the Google Cloud console, a Cloud Shell session starts and displays a command-line prompt. Cloud Shell is a shell environment with the Google Cloud CLI already installed and with values already set for your current project. It can take a few seconds for the session to initialize.
要将现有例程信息(包括访问权限控制设置)写入 JSON 文件,请使用
bq get-iam-policy
命令:bq get-iam-policy \ PROJECT_ID:DATASET.ROUTINE \ > PATH_TO_FILE
请替换以下内容:
- PROJECT_ID:您的项目 ID
- DATASET:要更新的例程所在数据集的名称
- ROUTINE:要更新的资源的名称
- PATH_TO_FILE:本地机器上 JSON 文件的路径
对 JSON 文件的
bindings
部分进行更改。绑定操作会将一个或多个主账号绑定到单个role
。主账号可以是用户账号、服务账号、Google 群组和网域。例如,例程 JSON 文件的bindings
部分可能如下所示:{ "bindings": [ { "role": "roles/bigquery.dataViewer", "members": [ "user:user@example.com", "group:group@example.com", "domain:example.com", ] }, ], "etag": "BwWWja0YfJA=", "version": 1 }
如需更新访问政策,请使用
bq set-iam-policy
命令:bq set-iam-policy PROJECT_ID:DATASET.ROUTINE PATH_TO_FILE
如需验证您的访问权限控制是否发生了变化,请再次使用
bq get-iam-policy
命令,但不要将信息写入文件:bq get-iam-policy --format=prettyjson \\ PROJECT_ID:DATASET.ROUTINE
如需检索当前政策,请调用
routines.getIamPolicy
方法。修改该政策以添加主账号和/或绑定。如需了解政策所需的格式,请参阅政策参考主题。
调用
routines.setIamPolicy
以写入更新后的政策。
API
授予对例程的访问权限的预定义角色
如需实现精细的访问权限控制,您可以针对特定例程授予预定义或自定义 IAM 角色。该例程还会继承在数据集级层及更高级层指定的访问权限控制。例如,如果您向某个主账号授予某个数据集的 Data Owner 角色,该主账号也会通过继承获得该数据集中例程的 Data Owner 权限。
以下预定义的 IAM 角色具有对例程的权限。
角色 | 说明 |
---|---|
BigQuery Data Owner
(roles/bigquery.dataOwner ) |
当授予给例程时,此角色会授予以下权限:
您不应在例程级层授予Data Owner角色。Data Editor 还会授予例程的所有权限,但权限较少。 |
BigQuery Data Editor
(roles/bigquery.dataEditor ) |
当授予给例程时,此角色会授予以下权限:
|
BigQuery Data Viewer
(roles/bigquery.dataViewer ) |
当授予给例程时,此角色会授予以下权限:
|
BigQuery Metadata Viewer
(roles/bigquery.metadataViewer ) |
当授予给例程时,此角色会授予以下权限:
|
例程的权限
以 bigquery.routines
开头的大多数权限都适用于例程级。
bigquery.routines.create
和 bigquery.routines.list
不适用于例程级。为了创建和列出例程,必须向父容器(即数据集)中的角色授予 bigquery.routines.create
和 bigquery.routines.list
权限。
下表列出了例程的所有权限以及可授予这些权限的最低级资源。
权限 | 资源 | 说明 |
---|---|---|
bigquery.routines.create |
数据集 | 在数据集中创建例程。如需运行包含 CREATE FUNCTION 语句的查询作业,此权限还需要 bigquery.jobs.create 。 |
bigquery.routines.delete |
例程 | 删除例程 |
bigquery.routines.get |
例程 | 引用他人创建的例程。此权限还要求具有 bigquery.jobs.create 才能运行引用该例程的查询作业,并且您还需要有权访问该例程引用的任何资源(例如表或视图)。 |
bigquery.routines.list |
数据集 | 列出数据集中的例程并显示例程的元数据。 |
bigquery.routines.update |
例程 | 更新例程定义和元数据。 |
bigquery.routines.getIamPolicy |
例程 | 获取例程的访问权限控制。 |
bigquery.routines.setIamPolicy |
例程 | 为例程设置访问权限控制。 |
查看例程的访问权限控制
如需查看例程的访问权限控制,请选择以下选项之一:
控制台
前往 BigQuery 页面。
在探索器窗格中,展开您的项目,展开数据集,展开例程,然后选择一个例程。
点击
共享。例程的访问权限控制会显示在共享窗格中。
bq
bq get-iam-policy
命令不支持查看例程的访问权限控制。
SQL
INFORMATION_SCHEMA.OBJECT_PRIVILEGES
视图不会显示例程的访问权限控制。
API
如需检索当前政策,请调用 routines.getIamPolicy
方法。
撤消对例程的访问权限
如需撤消对例程的访问权限,请选择以下选项之一:
控制台
前往 BigQuery 页面。
在浏览器面板中,展开您的项目、数据集和例程,然后选择一个例程。
在详细信息面板中,点击共享 > 权限。
在例程权限对话框中,展开要撤消其访问权限的主账号。
点击
移除主账号。在从主账号中移除角色?对话框中,点击移除。
点击关闭。
bq
-
In the Google Cloud console, activate Cloud Shell.
At the bottom of the Google Cloud console, a Cloud Shell session starts and displays a command-line prompt. Cloud Shell is a shell environment with the Google Cloud CLI already installed and with values already set for your current project. It can take a few seconds for the session to initialize.
要将现有例程信息(包括访问权限控制设置)写入 JSON 文件,请使用
bq get-iam-policy
命令:bq get-iam-policy --routine PROJECT_ID:DATASET.ROUTINE > PATH_TO_FILE
请替换以下内容:
- PROJECT_ID:您的项目 ID
- DATASET:要更新的例程所在数据集的名称
- ROUTINE:要更新的资源的名称
- PATH_TO_FILE:本地机器上 JSON 文件的路径
在政策文件中,
version
的值仍为1
。此编号指的是 IAM 政策架构版本,而不是政策版本。etag
值是政策版本号。对 JSON 文件的
access
部分进行更改。您可以移除以下任何specialGroup
条目:projectOwners
、projectWriters
、projectReaders
和allAuthenticatedUsers
。您还可以移除以下任何一项:userByEmail
、groupByEmail
和domain
。例如,例程 JSON 文件的
access
部分可能如下所示:{ "bindings": [ { "role": "roles/bigquery.dataViewer", "members": [ "user:user@example.com", "group:group@example.com", "domain:google.com", ] }, ], "etag": "BwWWja0YfJA=", "version": 1 }
如需更新访问政策,请使用
bq set-iam-policy
命令:bq set-iam-policy --routine PROJECT_ID:DATASET.ROUTINE PATH_TO_FILE
如需验证您的访问权限控制是否发生了变化,请再次使用
get-iam-policy
命令,但不要将信息写入文件:bq get-iam-policy --routine --format=prettyjson PROJECT_ID:DATASET.ROUTINE
如需检索当前政策,请调用
routines.getIamPolicy
方法。修改该政策以添加主账号和/或绑定。如需了解政策所需的格式,请参阅政策参考主题。
API
查看资源的继承访问权限控制
您可以使用 BigQuery 网页界面检查资源的继承 IAM 角色。您需要拥有适当的权限才能在控制台中查看继承情况。如需检查数据集、表、视图或例程的继承情况,请执行以下操作:
在 Google Cloud 控制台中,前往 BigQuery 页面。
在浏览器窗格中,选择数据集,或展开数据集并选择表、视图或例程。
对于数据集,点击共享。对于表格、视图或例程,请点击共享。
验证在表格中显示继承的角色选项是否已启用。
展开表格中的角色。
在继承列中,六边形图标表示相应角色是否继承自父资源。
拒绝访问资源
通过 IAM 拒绝政策,您可以设置关于访问 BigQuery 资源的安全措施。您可以定义拒绝规则,以防止所选主账号使用特定权限(无论主账号被授予哪些角色)。
如需了解如何创建、更新和删除拒绝访问政策,请参阅拒绝访问资源。
特殊情况
在针对一些 BigQuery 权限创建 IAM 拒绝政策时,请考虑以下场景:
对授权资源(视图、例程、数据集或存储过程)的访问权限可让您创建、删除或操纵表,以及读取和修改表数据(即使您没有执行这些操作的直接权限)。它还可以获取模型数据或元数据,并针对底层表调用其他存储过程。此能力意味着授权资源具有以下权限:
bigquery.tables.get
bigquery.tables.list
bigquery.tables.getData
bigquery.tables.updateData
bigquery.tables.create
bigquery.tables.delete
bigquery.routines.get
bigquery.routines.list
bigquery.datasets.get
bigquery.models.getData
bigquery.models.getMetadata
如需拒绝访问这些授权资源,请在创建拒绝访问政策时将以下任一值添加到
deniedPrincipal
字段中:值 使用场景 principalSet://goog/public:all
阻止所有主账号,包括授权资源。 principalSet://bigquery.googleapis.com/projects/PROJECT_NUMBER/*
阻止指定项目中的所有 BigQuery 授权资源。 PROJECT_NUMBER
是系统为INT64
类型的项目自动生成的唯一标识符。如需将某些主账号从拒绝政策中排除,请在拒绝政策的
exceptionPrincipals
字段中指定这些主账号。例如exceptionPrincipals: "principalSet://bigquery.googleapis.com/projects/1234/*"
。BigQuery 会将作业所有者的查询结果缓存 24 小时,作业所有者可以访问这些结果,而无需对包含数据的表拥有
bigquery.tables.getData
权限。因此,针对bigquery.tables.getData
权限添加 IAM 拒绝政策不会阻止作业所有者访问缓存结果(除非缓存到期)。如需阻止作业所有者访问缓存结果,请针对bigquery.jobs.create
权限创建单独的拒绝政策。为防止在使用拒绝政策阻止数据读取操作时意外访问数据,我们建议您还要查看并撤消该数据集上的所有现有订阅。
如需创建用于查看数据集访问权限控制的 IAM 拒绝政策,请拒绝以下权限:
bigquery.datasets.get
bigquery.datasets.getIamPolicy
如需创建用于更新数据集访问权限控制的 IAM 拒绝政策,请拒绝以下权限:
bigquery.datasets.update
bigquery.datasets.setIamPolicy
后续步骤
了解如何使用 projects.testIamPermissions
方法测试用户对资源的访问权限。