BigQuery 列级安全性简介

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

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

列级别安全性工作流

工作流

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

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

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

  3. 管理对政策标记的访问权限。使用 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 角色用于 BigQuery 列级别安全性。

角色名称和 ID 包含的权限 适用对象 说明
Policy Tag Admin
datacatalog.categoryAdmin 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 政策。
通常,具有此角色的用户负责为组织设置数据治理政策。

Fine-Grained Reader
datacatalog.categoryFineGrainedReader datacatalog.categories.fineGrainedGet 政策标记 此角色有权访问受政策标记限制的 BigQuery 列的内容。

通常,具有此角色的用户负责查询数据。

如需详细了解 Data Catalog 角色,请参阅 Data Catalog Identity and Access Management (IAM)

对写入的影响

要读取受列级安全性保护的列数据,用户必须始终拥有通过在该列所属政策标记上设置的细化读取访问权限获得的读取权限。

这适用于:

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

若要将数据写入受列级安全性保护的列对应的行中,用户要求视写入类型而定。

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

如果写入操作是“更新”、“删除”或“合并”,则用户必须拥有细化的读取权限,才能执行这些操作。

除非用户拥有细化的读取权限,否则将无法从本地文件或从 Cloud Storage 加载数据。不过他们可以通过流式传输加载数据,因为流式传输加载不会检查政策标记。但如果用户没有细化的读取访问权限,将无权读取从数据流所加载的数据。

如需了解详情,请参阅通过 BigQuery 的列级安全性对写入的影响

查询表

如果用户具有数据集访问权限,并且具有 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 政策(如果有)检查访问权限。如果用户有权访问已获授权视图底层表中使用的政策标记,则可以查询已获授权视图中的列。

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

访问视图

对快照的影响

BigQuery 允许用户查询先前状态的表。您可以使用此功能查询表的先前快照中的行,还可以将表回滚到截取快照那日。

在旧版 SQL 中,您可以通过在表名称上使用快照修饰器来查询快照。在标准 SQL 中,您可以通过针对表使用 FOR SYSTEM_TIME AS OF 子句来查询快照。

查询快照的时间限制以下列最近一项为准:

  • 过去 7 天
  • 表创建时间

如果删除表后再使用相同表名称重新创建了一个表,则无法查询先前的表。

若要了解快照如何与列级别安全性配合使用,假设您已具备以下条件:

  • 您有一个起点,也就是当前时间的一个现有表。

  • 您具有该表的快照。

  • 快照的架构与起点的架构相同,或者是起点架构的一部分。也就是说,快照的所有列都包含在起点中。

如果这些假设成立,则系统会根据起点(当前)表上最新的列级安全性检查权限。如果允许用户读取当前列,则用户将能够查询这些列的快照。

如果查询中的列对应的来源表架构和快照架构不同,则检索快照的请求将失败。

位置注意事项

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

政策标记

与 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

后续步骤