利用 BigQuery 的列级安全性来限制访问权限

本页面介绍如何使用 BigQuery 列级安全性来限制对 BigQuery 列级数据的访问权限。如需了解列级安全性的一般信息,请参阅 BigQuery 列级安全性简介

本页面中的说明同时涉及 BigQuery 和 Data Catalog 的使用。如需了解这些产品的相关价格信息,请参阅以下主题:

请更新表架构,以便为列设置政策标记。您可以使用 Cloud Console、bq 命令行工具和 BigQuery API 为列设置政策标记。此外,您还可以使用以下方法在一个操作中创建表、指定架构并指定政策标记:

  • bq 命令行工具的 bq mkbq load 命令。
  • tables.insert API 方法。
  • Cloud Console 中的创建表页面。如果您使用 Cloud Console,则必须在添加或修改架构时选择以文本形式修改

准备工作

  1. 登录您的 Google 帐号。

    如果您还没有 Google 帐号,请注册一个新帐号

  2. 在 Google Cloud Console 的项目选择器页面上,选择或创建一个 Google Cloud 项目。

    转到项目选择器页面

  3. 确保您的 Cloud 项目已启用结算功能。 了解如何确认您的项目是否已启用结算功能

  4. 启用 Data Catalog API。

    启用 API

  5. 新项目会自动启用 BigQuery。如需在先前存在的项目中激活 BigQuery,请转到 启用 BigQuery API。

    启用 API

授予角色

负责管理政策标记的用户或服务帐号必须具有 Data Catalog Policy Tags Admin 角色。负责查询受列级安全性保护的数据的用户或服务帐号必须具有 Data Catalog Fine Grained Reader 角色。以下部分介绍了如何授予这些角色。

如需了解这些角色的一般信息,请参阅用于列级安全性的角色

授予 Policy Tags Admin 角色

对于要创建和管理数据政策标记的管理员,请授予其 Data Catalog Policy Tags Admin 角色。您必须对要为其授予 Policy Tags Admin 角色的项目拥有 resourcemanager.projects.setIamPolicy 权限,然后才能执行以下步骤。如果您没有 resourcemanager.projects.setIamPolicy 权限,请让 Project Owner 授予您此权限或代您执行以下步骤。

  1. 在 Google Cloud Console 中,转到 IAM 页面。

    打开 IAM 页面

  2. 如果列表中包含要授予该角色的用户的电子邮件地址,请选择该电子邮件地址,然后点击修改(铅笔图标)。如果列表中不包含该用户的电子邮件地址,请先将用户添加到您的项目,然后再继续执行下一步。

  3. 修改权限页面中,点击添加其他角色

  4. 点击 Data Catalog,然后点击 Policy Tags Admin

  5. 点击保存

如需详细了解此角色,请参阅用于列级安全性的角色

授予 Fine Grained Reader 角色

对于需要访问受列级安全性保护的数据的用户,请授予其 Data Catalog Fine Grained Reader 角色。您必须对要为其授予 Fine Grained Reader 角色的项目拥有 resourcemanager.projects.setIamPolicy 权限,然后才能执行以下步骤。如果您没有 resourcemanager.projects.setIamPolicy 权限,请让 Project Owner 授予您此权限或代您执行以下步骤。

  1. 在 Cloud Console 中打开 IAM 页面。

    打开 IAM 页面

  2. 如果列表中包含要授予该角色的用户的电子邮件地址,请选择该电子邮件地址,然后点击修改(铅笔图标)。如果列表中不包含该用户的电子邮件地址,请先将用户添加到您的项目,然后再继续执行下一步。

  3. 修改权限页面中,点击添加其他角色

  4. 点击 Data Catalog,然后点击 Fine Grained Reader

  5. 点击保存

如需详细了解此角色,请参阅用于列级安全性的角色

创建分类

您可以使用 Data Catalog 创建分类并为数据添加政策标记。

用户帐号必须具有 Data Catalog Policy Tags Admin 角色才能执行以下步骤。

  1. 在 Cloud Console 中打开 Data Catalog“分类”页面

    打开“分类”页面

  2. 点击创建分类

  3. 新建分类页面上,执行以下操作:

    1. 对于分类名称,输入您要创建的分类的名称。
    2. 对于说明,输入一项说明。
    3. 视需要更改项目下列出的项目。
    4. 视需要更改位置下列出的位置。
    5. 政策标记下,输入政策标记名称和说明。
    6. 如需为政策标记添加子政策标记,请点击添加子政策标记
    7. 如需添加另一个与政策标记级别相同的新政策标记,请点击 + 图标。

      下面显示了示例分类的新建分类页面。

      创建分类页面。

    8. 根据需要继续为您的分类添加政策标记和子政策标记。

    9. 为层次结构创建了政策标记后,点击保存

查看政策标记

如需查看您为分类创建的政策标记,请执行以下操作:

  1. 在 Cloud Console 中打开 Data Catalog“分类”页面

    打开“分类”页面

  2. 点击您要查看其政策标记的分类。分类页面即会显示分类中的政策标记。

    政策标记。

查看政策标记的权限

如需查看政策标记的权限,请执行以下操作:

  1. 在 Cloud Console 中打开 Data Catalog“分类”页面

    打开“分类”页面

  2. 点击您要分配权限的政策标记所属的分类。

  3. 点击您要分配权限的政策标记。

    选定的政策标记。

  4. 随即便可在右侧面板中查看选定政策标记的成员和权限。

    政策标记权限。

更新政策标记的权限

如需更新政策标记的权限,请执行以下操作:

  1. 在 Cloud Console 中打开 Data Catalog“分类”页面

    打开“分类”页面

  2. 点击您要更新其权限的政策标记所属的分类。

  3. 点击您要更新其权限的政策标记。

    选定的政策标记。

  4. 随即便可在右侧面板中查看选定政策标记的成员和权限。将要创建和管理政策标记的帐号添加到 Policy Tags Admin 角色。将计划访问受列级安全性保护的数据的帐号添加到 Fine Grained Reader 角色。您还可以使用此面板移除帐号或修改其他权限。

  5. 完成后,点击保存

检索政策标记资源名称

当您将政策标记应用于某个列时,需要使用政策标记资源名称。

要检索政策标记资源名称,请执行以下操作:

  1. 查看包含政策标记的分类的政策标记

  2. 找到您要复制其资源名称的政策标记。

  3. 点击复制政策标记资源名称图标。

    复制资源名称。

为列设置政策标记

设置政策标记的用户或服务帐号需要 datacatalog.taxonomies.get 权限。Policy Tags Admin 角色和 Project Viewer 角色均拥有这项权限。

控制台

要使用 Cloud Console 修改架构,请在修改架构时设置政策标记。

  1. 当前架构屏幕中,选择您的列,然后点击添加政策标记
  2. 添加政策标记屏幕中,选择要应用于该列的政策标记。
  3. 点击选择。屏幕应类似于如下所示:

    修改架构。

  4. 点击保存

或者,在使用 Cloud Console 创建表修改架构时,请在以文本形式修改架构时设置政策标记。

  1. 对于架构,请点击以文本形式修改
  2. 修改架构以便为列设置政策标记。对于 policyTagsnames 字段的值,请使用政策标记资源名称

    以文本形式修改。

bq

  1. 检索架构并将其写入本地文件。

    bq show --schema --format=prettyjson \
       project-id:dataset.table > schema.json
    

    其中:

    • project-id 是您的项目 ID。
    • dataset 是要更新的表所属的数据集的名称。
    • table 是要更新的表的名称。
  2. 修改 schema.json 以便为列设置政策标记。对于 policyTagsnames 字段的值,请使用政策标记资源名称

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

    bq update \
       project-id:dataset.table schema.json
    

API

调用 tables.patch 并使用 schema 属性在架构定义中设置政策标记。请参阅命令行示例架构,了解如何设置政策标记。

由于 tables.update 方法会替换整个表资源,因此建议使用 tables.patch 方法。

为列设置政策标记的其他方法

您还可以在以下情况下设置政策标记:

  • 使用 bq mk 创建表时。传入架构以用于创建表。
  • 使用 bq load 将数据加载到表中时。传入架构以供加载表时使用。

如需了解一般架构信息,请参阅指定架构

在架构中查看政策标记

在检查表架构时,您可以查看应用于表的政策标记。 您可以使用 Cloud Console、bq 命令行工具、BigQuery API 以及客户端库来查看架构。如需详细了解如何查看架构,请参阅获取表信息

查询具有列级安全性的数据

如果用户具有数据集访问权限,并且具有 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。错误消息会提供用户需要访问的政策标记的全名。

清除政策标记

更新表架构以从列中清除政策标记。您可以使用 Cloud Console、bq 命令行工具和 BigQuery API 方法从列中清除政策标记。

控制台

当前架构页面的政策标记下,点击 X

清除政策标记。

bq

  1. 检索架构并将其保存到本地文件。

    bq show --schema --format=prettyjson \
       project-id:dataset.table > schema.json
    

    其中:

    • project-id 是您的项目 ID。
    • dataset 是要更新的表所属的数据集的名称。
    • table 是要更新的表的名称。
  2. 修改 schema.json 以从列中清除政策标记。

    [
     ...
     {
       "name": "ssn",
       "type": "STRING",
       "mode": "REQUIRED",
       "policyTags": {
         "names": []
       }
     },
     ...
    ]
    
  3. 更新架构。

    bq update \
       project-id:dataset.table schema.json
    

API

调用 tables.patch 并使用 schema 属性在架构定义中设置政策标记。请参阅命令行示例架构,了解如何清除政策标记。

由于 tables.update 方法会替换整个表资源,因此建议使用 tables.patch 方法。

执行访问权限控制

如需执行访问权限控制,请执行以下操作:

  1. 在 Cloud Console 中打开 Data Catalog“分类”页面

    打开“分类”页面

  2. 点击您要执行其列级安全性的分类。

  3. 如果执行访问权限控制尚未打开,请点击执行访问权限控制

关闭访问权限控制

  1. 在 Cloud Console 中打开 Data Catalog“分类”页面

    打开“分类”页面

  2. 点击您要关闭其列级安全性的分类。

  3. 如果执行访问权限控制已打开,请点击执行访问权限控制将其关闭。

常见问题解答

BigQuery 列级安全性是否适用于视图?

是。视图派生自底层表。在通过视图访问受保护的列时,表采用的列级安全性也同样适用。

请注意,BigQuery 中具有两种视图:逻辑视图和已获授权的视图。这两种类型的视图都派生自源表,并且都与表的列级安全性保持一致。

列级安全性是否适用于 STRUCTRECORD 列?

是。您只能将政策标记应用于叶级字段,并且只有这些字段会受到保护。

是否可以同时使用旧版 SQL 和标准 SQL?

您可以使用标准 SQL 来查询受列级安全性保护的表。

如果目标表具有任何政策标记,则任何旧版 SQL 查询都会被拒绝。

查询是否记录在 Cloud Logging 中?

IAM 政策标记检查记录在 Logging 中。但是,政策标记检查与触发该检查的查询无关。

复制表操作是否会受列级安全性的影响?

是。您无法复制您无权访问的列。

以下操作会验证列级权限。

在将数据复制到新表时,政策标记是否会自动传播?

在大多数情况下不会。如果您将查询结果复制到新表中,系统不会为新表自动分配政策标记。因此,新表将不具备列级安全性。在将数据导出到 Cloud Storage 时也是如此。

使用表复制作业时例外。由于表复制作业不应用任何数据转换,因此政策标记会自动传播到目标表。

列级安全性是否与 Virtual Private Cloud 兼容?

是,列级安全性与 VPC 兼容且互为补充。

VPC 利用 IAM 来控制对 BigQuery 和 Cloud Storage 等服务的访问权限。列级安全性可以精细地确保 BigQuery 本身内各个列的安全性。

问题排查

我看不到 Data Catalog 角色

如果您看不到 Data Catalog Fine-Grained Reader 等角色,则可能是因为您未在项目中启用 Data Catalog API。如需了解如何启用 Data Catalog API,请参阅准备工作。启用 Data Catalog API 几分钟后,应该会显示 Data Catalog 角色。

我无法查看“分类”页面

您需要一些其他权限才能查看分类页面。例如,Data Catalog Policy Tags Admin 角色可以访问分类页面。

我执行了政策标记,但它们似乎不起作用

如果您仍收到不应具有访问权限的帐号的查询结果,则可能是该帐号收到了缓存的结果。具体而言,如果您之前成功运行了查询,然后执行了政策标记,则可能会从查询结果缓存中获得结果。默认情况下,查询结果会缓存 24 小时。如果您停用结果缓存,则查询应会立即失败。如需详细了解缓存,请参阅列级安全性的影响

通常,IAM 更新大约需要 30 秒才能完成传播。政策标记层次结构中的更改最长可能需要 30 分钟才能完成传播。