列级访问权限控制简介

BigQuery 通过政策标记或基于类型的数据分类,提供针对敏感列的细化访问权限。通过 BigQuery 列级访问权限控制,您可以创建用于在查询时检查用户是否具有适当访问权限的政策。例如,创建一个可以强制进行如下访问权限检查的政策:

  • 您必须在 group:high-access 中才能查看包含 TYPE_SSN 的列。

为增强列级访问权限控制,您可以选择使用动态数据遮盖预览版)。借助数据遮盖,您可以通过将列的实际值替换为 null、默认值或经过哈希处理的内容来遮盖敏感数据。

列级访问权限控制工作流

工作流

要限制列级别的数据访问权限,请执行以下操作:

  1. 定义分类和政策标记。使用 Data Catalog 为您的数据创建和管理分类和政策标记。如需了解相关准则,请参阅政策标记的最佳做法

  2. 将政策标记分配给 BigQuery 列。在 BigQuery 中,使用架构注释为要限制访问权限的每一列分配政策标记。

  3. 对分类强制执行访问权限控制。强制执行访问权限控制会为所应用分类中的所有政策标记定义访问限制。

  4. 管理对政策标记的访问权限。使用 Identity and Access Management (IAM) 政策限制对每个政策标记的访问权限。政策标记所包含的每一列均适用该政策。

如果用户在查询时尝试访问列数据,BigQuery 会检查列政策标记及其政策,以查看用户是否有权访问该数据。

用例示例

假设某个组织需要将敏感数据分为两个类别。

政策标记

如需设置列级别安全性,拥有适当权限的数据管家将执行以下步骤,以便设置数据分类的层次结构

  1. 数据管家在 Data Catalog 中创建名为“业务关键性”的分类。分类包括节点,或政策标记。

  2. 数据管家决定节点的政策包含对名为 high-tier-access 的组的访问权限。

  3. 数据管家在下的分类中创建更多节点级层。最低级层节点是叶节点,例如 employee_ssn 叶节点。数据管家可以为 employee_ssn 叶节点创建不同的访问权限政策。

  4. 数据管家为特定表列分配政策标记。在此示例中,数据管家为表中的 employee_ssn 列分配了访问权限政策。

  5. 在控制台的当前架构页面中,数据管家可以查看管理特定列的政策标记。在此示例中,employee_ssn 列位于政策标记下,因此查看 employee_ssn 的架构时,控制台会在 Policy tags 字段中显示分类名称和政策标记:Business criticality:High

    政策标记界面

    如需详细了解如何使用控制台设置政策标记,请参阅为列设置政策标记

    或者,您可以使用 bq update 命令设置政策标记。policyTagsnames 字段包含政策标记的 ID(即 projects/project-id/locations/location/taxonomies/taxonomy-id/policyTags/policytag-id):

    [
     ...
     {
       "name": "ssn",
       "type": "STRING",
       "mode": "REQUIRED",
       "policyTags": {
         "names": ["projects/project-id/locations/location/taxonomies/taxonomy-id/policyTags/policytag-id"]
       }
     },
     ...
    ]
    

    如需详细了解如何使用 bq update 命令设置政策标记,请参阅为列设置政策标记

  6. 对于政策标记,管理员执行类似步骤。

借助这种细化的访问权限,您可以通过仅控制少量数据分类政策标记来管理对多个列的访问权限。

如需详细了解这些步骤,请参阅使用列级访问权限控制限制访问权限

用于列级访问权限控制的角色

以下角色用于 BigQuery 列级访问权限控制。

需要创建和管理分类及政策标记的用户必须具有 Data Catalog Policy Tag Admin 角色。

角色/ID 权限 说明
Data Catalog Policy Tag Admin/datacatalog.policyTagAdmin datacatalog.categories.getIamPolicy
datacatalog.categories.setIamPolicy
datacatalog.taxonomies.create
datacatalog.taxonomies.delete
datacatalog.taxonomies.get
datacatalog.taxonomies.getIamPolicy
datacatalog.taxonomies.list
datacatalog.taxonomies.setIamPolicy
datacatalog.taxonomies.update
resourcemanager.projects.get
resourcemanager.projects.list

此角色在项目级应用。

此角色可授予执行以下操作的权限:

  • 创建、读取、更新和删除分类及政策标记。
  • 获取和设置有关政策标记的 IAM 政策。

必须具有 BigQuery Admin 角色或 BigQuery Data Owner 角色才能创建和管理数据政策。当您使用 Google Cloud 控制台对分类强制执行访问权限控制时,服务会以静默方式为您创建数据政策。

角色/ID 权限 说明
BigQuery Admin/bigquery.admin

BigQuery Data Owner/bigquery.dataOwner
bigquery.dataPolicies.create
bigquery.dataPolicies.delete
bigquery.dataPolicies.get
bigquery.dataPolicies.getIamPolicy
bigquery.dataPolicies.list
bigquery.dataPolicies.setIamPolicy
bigquery.dataPolicies.update

bigquery.dataPolicies.createbigquery.dataPolicies.list 权限在项目级应用。其他权限在数据政策级应用。

此角色可授予执行以下操作的权限:

  • 创建、读取、更新和删除数据政策。
  • 获取和设置有关数据政策的 IAM 政策。

需要访问安全列中的数据的用户必须具有 Data Catalog Fine-Grained Reader 角色。

角色/ID 权限 说明
Fine-Grained Reader/datacatalog.categoryFineGrainedReader datacatalog.categories.fineGrainedGet

此角色在政策标记级应用。

此角色可授予访问受政策标记限制的列内容的权限。

如需详细了解 Data Catalog 角色,请参阅 Data Catalog Identity and Access Management (IAM)。 如需详细了解 BigQuery 角色,请参阅使用 IAM 进行访问权限控制

对写入的影响

如需从受列级访问权限控制保护的列中读取数据,用户必须始终拥有通过该列的政策标记的细化读取访问权限获得的读取权限。

这适用于:

  • 表(包括通配符表)
  • 视图
  • 复制表

如需将数据写入受列级访问权限控制保护的列对应的行中,用户要求视写入类型而定。

如果写入操作是“插入”,则不需要细化的读取访问权限。 但除非用户拥有细化的读取访问权限,否则将无法读取已插入的数据。

如果写入操作是“更新”、“删除”或“合并”,则除非用户拥有读取列的细化读取权限,否则无法执行此操作。

用户可以从本地文件或从 Cloud Storage 加载数据。将数据加载到表时,BigQuery 不会检查对目标表的列是否具备 Fine-Grained Reader 权限。这是因为加载数据不需要读取目标表内容。 类似地,他们可以通过流式传输加载数据,因为流式传输加载不会检查政策标记。但如果用户没有细化的读取访问权限,将无权读取从数据流所加载的数据。

如需了解详情,请参阅使用列级访问权限控制时对写入的影响

查询表

如果用户具有数据集访问权限,并且具有 Data Catalog Fine-Grained Reader 角色,则该用户可以访问列数据。该用户可以正常运行查询。

如果用户具有数据集访问权限,但没有 Data Catalog Fine-Grained Reader 角色,则该用户无法访问列数据。如果此类用户运行 SELECT *,将会收到错误消息,其中会列出用户无法访问的列。要解决该错误,您可以采取以下任一措施:

  • 修改查询以排除此类用户无法访问的列。例如,如果用户无权访问 ssn 列,但有权访问其余列,则可以运行以下查询:

    SELECT * EXCEPT (ssn) FROM ...
    

    在上述示例中,EXCEPT 子句排除了 ssn 列。

  • 让 Data Catalog Administrator 将用户添加为相关数据类的 Data Catalog Fine-Grained Reader。错误消息会提供用户需要访问的政策标记的全名。

查询视图

列级别安全性对视图的影响与视图是否为已获授权视图无关。无论视图是否获得授权,系统均会以透明方式强制执行列级别安全性。

已获授权视图是以下之一:

  • 明确获授权访问数据集中的表的视图。
  • 隐式获授权访问数据集中的表的视图,因为它包含在已获授权数据集中。

如需了解详情,请参阅已获授权视图已获授权数据集

如果视图不是已获授权的视图

如果用户对视图的基础表和数据集拥有 IAM 访问权限,以及对视图底层表的列级访问权限,则该用户可以查询该视图中的列。否则,用户将无法查询视图中的列。

如果视图是已获授权的视图

只有视图底层表中列的列级别安全性才能控制访问权限。不会使用表级别和数据集级别 IAM 政策(如果有)检查访问权限。如果用户有权访问已获授权视图底层表中使用的政策标记,则可以查询已获授权视图中的列。

下图展示了如何评估对视图的访问权限。

访问视图

时间旅行的影响

BigQuery 允许您查询先前状态的表。您可以使用此功能查询先前时间点的行。此外,您还可以从某个时间点恢复表。

在旧版 SQL 中,您可以通过在表名称上使用时间修饰器来查询历史数据。在标准 SQL 中,您可以通过在该表使用 FOR SYSTEM_TIME AS OF 子句来查询历史数据。

假设您查询时间 t 时的表历史数据。在这种情况下:

  • 如果时间 t 的架构与表的当前架构相同,或者是表当前架构的一部分,则 BigQuery 会检查当前表的最新列级别安全性。如果允许用户读取当前列,则用户可以查询这些列的历史数据。

  • 如果时间 t 时的架构与查询中列的当前架构不同,则查询会失败。

位置注意事项

为分类选择位置时,请考虑以下限制。

政策标记

与 BigQuery 数据集和表一样,分类是区域级资源。创建分类时,您可以为分类指定区域或位置

您可以创建分类并将政策标记应用于提供 BigQuery 的所有区域中的表。但是,如需将分类中的政策标记应用于表列,分类和表必须位于同一区域位置。

虽然您无法将政策标记应用于位于不同位置的表列,但您可以通过明确在其他位置复制分类将其复制到该位置。

如果要跨多个区域位置使用相同的分类和政策标记,请参阅跨多个位置管理政策标记,详细了解如何复制分类。

单位

您无法跨组织使用引用。表和您要应用于该表列的任何政策标记必须位于同一组织中。

限制

  • 如果覆盖目标表,则系统会从表中移除任何现有政策标记,除非您使用 --destination_schema 标志指定具有政策标记的架构。以下示例展示了如何使用 --destination_schema

    bq query --destination_table mydataset.mytable2 \
      --use_legacy_sql=false --destination_schema=schema.json \
      'SELECT * FROM mydataset.mytable1'
    
  • 一列只能具有一个政策标记。

  • 一个表最多可以有 1000 个唯一政策标记。

  • 如果您启用了列级访问权限控制,则无法使用旧版 SQL。如果目标表具有任何政策标记,则任何旧版 SQL 查询都会被拒绝。

价格

列级访问权限控制要求同时使用 BigQuery 和 Data Catalog。如需了解这些产品的价格信息,请参阅以下主题:

审核日志记录

读取包含政策标记的表数据时,我们会将引用的政策标记保存在 Cloud Logging 中。但是,政策标记检查与触发该检查的查询无关。

通过 Cloud Logging,审核人员可以了解谁对哪些类型的敏感数据具有何种访问权限。如需了解详情,请参阅审核政策标记

如需详细了解 BigQuery 中的日志记录,请参阅 BigQuery 监控简介

如需详细了解 Google Cloud 中的日志记录,请参阅 Cloud Logging

后续步骤