表访问权限控制简介

本文档简要介绍了 BigQuery 表 ACL。

借助 BigQuery Table ACL,您可以对表和视图等资源设置表级层权限。表级层权限决定了可以访问表或视图的用户、群组和服务帐号。您可以在无需向用户提供完整的数据集访问权限的情况下授权用户访问特定的表或视图。例如,向用户授予 BigQuery Data Viewer (roles/bigquery.dataViewer) 角色,以仅允许该用户查询表或视图,而不具有完整的数据集访问权限。

使用 Identity and Access Management 政策控制访问权限

您可以使用 Identity and Access Management (IAM) 政策来配置针对表或视图的访问权限控制政策。

查看表或视图的 IAM 政策

创建表或视图后,您可以通过以下方式查看 IAM 政策:

设置表或视图的 IAM 政策

您可以通过以下方式设置或更新针对资源的访问权限控制政策:

视图还可以引用您使用 BigQuery 表 ACL 共享的其他源表和视图。

使用 BigQuery 表 ACL 进行访问是额外的。如需详细了解额外的访问权限控制,请参阅控制对视图的访问权限。BigQuery 表 ACL 不支持 deny 权限。

您可以使用 tables.testIamPermissions 方法测试用户是否有权访问特定表或视图。如需了解详情,请参阅 测试权限

如需详细了解如何设置政策以及分步说明,请参阅控制对表和视图的访问权限

用例示例

对于那些用商店专营权的所有者去分享 inventory 表的公司来说,Alice是数据所有者。该表所属的数据集中包含 Alice 不希望与特许经营店所有者共享的其他表。

Bob 是商店专营权所有者。Alice 使用 bq 命令行工具向 Bob 和另一个特许经营店所有者授予 inventory 表的 BigQuery Data Viewer (roles/bigquery.dataViewer) 角色。现在,Bob 可以直接查询 inventory 表,而无需访问整个数据集。

为了让 Bob 查看 Bob 有权访问的表的列表,Alice 可以向 Bob 授予数据集的 bigquery.tables.list 权限。BigQuery Metadata Viewer (roles/bigquery.metadataViewer) 角色具有 bigquery.tables.list 权限。

IAM 政策

表级层访问权限控制以 IAM 为基础构建。IAM 允许您通过设置政策来控制谁(用户)对哪些资源具有什么访问权限(角色)。政策定义向哪些成员授予何种角色并强制执行,此政策会附加到资源。经过身份验证的成员尝试访问资源时,IAM 会检查资源的政策以确定是否允许该操作。

对于 BigQuery 表 ACL,资源是 BigQuery 表,成员是表的用户。

以下示例显示了包含以下角色的政策:

  • alice@example.com 已被授予 BigQuery Data Owner (roles/bigquery.dataOwner) 角色。

  • bob@example.com 已被授予 BigQuery Data Viewer (roles/bigquery.dataViewer) 角色。

{
  "bindings":[
    {
      "members":[
        "user:alice@example.com"
      ],
      "role":"roles/bigquery.dataOwner"
    },
    {
      "members":[
        "user:bob@example.com"
      ],
      "role":"roles/bigquery.dataViewer"
    }
  ],
  "etag":"ABAC",
  "version":1
}

如需详细了解 IAM 政策,请参阅了解政策

BigQuery 表 ACL 权限

如需设置或更改对表或视图的访问权限,您必须拥有 bigquery.tables.setIamPolicy 权限。以下 BigQuery 预定义角色具有 bigquery.tables.setIamPolicy 权限。

  • BigQuery Admin (roles/bigquery.admin)
  • BigQuery Data Owner (roles/bigquery.dataOwner)

如需检索表或视图上设置的访问权限,您必须具有 bigquery.tables.getIamPolicy 权限。以下 BigQuery 预定义角色具有 bigquery.tables.getIamPolicy 权限。

  • BigQuery Admin (roles/bigquery.admin)
  • BigQuery Data Editor (roles/bigquery.dataEditor)
  • BigQuery Metadata Viewer (roles/bigquery.metadataViewer)
  • BigQuery Data Owner (roles/bigquery.dataOwner)
  • BigQuery Data Viewer (roles/bigquery.dataViewer)

政策更改转化耗时

对政策所做的任何更改通常会在 60 秒内生效。但是,在某些情况下,此类更改可能需要长达 7 分钟才能在整个系统中完全传播。如需了解详情,请参阅 授予、更改和撤消对资源的访问权限。此外,在本文档中,请参阅对缓存的影响

对缓存的影响

如果启用了缓存,则在帐号无法再访问表后,帐号可以查看之前授权的查询结果。具体而言,如果用户之前成功运行了查询,然后您移除了用户的访问权限,则用户可以从查询结果缓存中获取结果。BigQuery 仅会缓存已获授权的访问,且仅缓存几分钟。

对时间旅行的影响

FOR SYSTEM_TIME AS OF 子句是 BigQuery 的“时间旅行”功能,可让您检索最多 7 天内的数据。如果您使用此功能,BigQuery 将对您的请求应用当前表 ACL。如果您之前有权访问该表,但该访问权限已被移除,则您无法访问该表以前的版本。

复制表时的影响

在将数据复制到新表时,源表上的表 ACL 都不会自动复制。如果您希望通过复制创建的新表上有表 ACL,则需要在新表上明确设置表 ACL。

与授权视图进行比较

BigQuery 还使用授权视图提供访问权限。已获授权的视图可让您与特定用户和群组共享查询结果,而无需为其授予底层表的访问权限。已获授权的视图访问权限始终为只读。

例如,授权视图 dept_view 允许用户 joe@example.com 按部门查看平均工资,但不允许查看底层 salary 数据集中每个人的薪资。如果 dept_view 有权访问数据源,则 joe@example.com 只需要拥有 dept_view 的权限。

常规视图与已授权的视图之间的主要区别在于权限用于控制对源表数据的访问的权限。系统会以最终用户的权限检查常规视图对源表数据的访问。已获授权的视图对源表数据的访问使用其自身的权限进行检查。

添加 BigQuery 表 ACL 后,您可以通过以下选项访问表:

  • 与用户共享数据集,包括其所有源表。此选项是在数据集级层设置的 IAM 访问权限控制。
  • 创建一个已获授权的视图来访问用户没有 IAM 访问权限的源数据。源数据根据授权视图自身的授权来访问,而不是根据用户的授权。此选项是授权视图功能。
  • 与特定用户共享表或视图,而不是共享父数据集中的所有数据。此选项为 BigQuery 表 ACL 功能。

与其他 BigQuery 功能的兼容性

在 IAM 访问模型中,权限是额外的。资源权限继承自父资源,如资源层次结构中所述。任何添加到资源的权限都会授予额外的访问权限。表 ACL 只能允许更多访问权限;它不能移除任何数据集或 Google Cloud 项目访问权限。如果 BigQuery 功能无法检查表级层的访问权限,则会回退到现有的数据集级层访问权限控制。因此,BigQuery 表 ACL 与其他 BigQuery 功能兼容。

与 VPC Service Controls 的兼容性

VPC Service Controls 使用 IAM 来控制对 BigQuery 和 Cloud Storage 等服务的访问权限。BigQuery 表 ACL 使用 IAM 更加精细的控制对各个 BigQuery 表的访问。由于它们使用 IAM 的方式是互补的,因此 VPC Service Controls 与 BigQuery 表 ACL 兼容。

审核日志记录

为表或视图设置政策是管理员活动。始终记录管理员活动。要查看日志记录的活动,请使用 Cloud Audit Logs 查找 methodName 设置 "google.iam.v1.IAMPolicy.SetIamPolicy" 的发生实例。

Table ACL 日志记录

限制

  • 不支持表格级层的授权视图。只能为授权视图授予对整个数据集的访问权限。但是,您可以使用 BigQuery 表 ACL 为用户提供对单个表或视图的访问权限。

  • 目前,如果直接共享表而不共享其底层数据集,则共享表不会显示在 Data Catalog 搜索结果中。

  • 当您查询通配符表时,系统不会检查表级层访问权限控制。如果您打算共享用户在查询中使用表通配符访问的表,则必须向用户授予对包含这些表的数据集的访问权限。

  • 与通配符表类似,INFORMATION_SCHEMA 数据集下的表不受表级层访问权限控制。它们还需要数据集级层权限。

后续步骤