使用列级访问权限控制限制访问权限

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

本页面中的说明同时涉及 BigQuery 和 Data Catalog 的使用。

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

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

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

准备工作

  1. Sign in to your Google Cloud account. If you're new to Google Cloud, create an account to evaluate how our products perform in real-world scenarios. New customers also get $300 in free credits to run, test, and deploy workloads.
  2. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Go to project selector

  3. Make sure that billing is enabled for your Google Cloud project.

  4. Enable the Data Catalog and BigQuery Data Policy APIs.

    Enable the APIs

  5. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Go to project selector

  6. Make sure that billing is enabled for your Google Cloud project.

  7. Enable the Data Catalog and BigQuery Data Policy APIs.

    Enable the APIs

  8. 新项目中会自动启用 BigQuery;但对于已存在的项目,您可能需要手动激活 BigQuery。

    Enable the BigQuery API.

    Enable the API

角色与权限

有多个角色与用户和服务账号的政策标记相关。

  • 负责管理政策标记的用户或服务账号必须具有 Data Catalog Policy Tag Admin 角色。Policy Tag Admin 角色可以管理分类和政策标记,并可授予或移除与政策标记关联的 IAM 角色。
  • 针对列级访问权限控制强制执行访问权限控制的用户或服务账号必须具有 BigQuery Admin 角色或 BigQuery Data Owner 角色。BigQuery 角色可以管理数据政策,这些政策将用于对分类强制执行访问权限控制。
  • 如需在 Google Cloud 控制台中查看组织中所有项目的分类和政策标记,用户需要具有 Organization Viewer 角色。否则,控制台将仅显示与所选项目关联的分类和政策标记。
  • 如果用户或服务账号需要查询受列级访问权限控制保护的数据,那么他们必须具有 Data Catalog Fine-Grained Reader 角色才能访问此类数据。

如需详细了解所有与政策标记相关的角色,请参阅用于列级访问权限控制的角色

Data Catalog Policy Tag Admin 角色

Data Catalog Policy Tag Admin 角色可以创建和管理数据政策标记。

如需授予 Policy Tag Admin 角色,您必须对要为其授予该角色的项目拥有 resourcemanager.projects.setIamPolicy 权限。如果您没有 resourcemanager.projects.setIamPolicy 权限,请让 Project Owner 授予您此权限或代您执行以下步骤。

  1. 在 Google Cloud 控制台中,转到 IAM 页面。

    打开 IAM 页面

  2. 如果列表中包含要授予该角色的用户的电子邮件地址,请选择该电子邮件地址,然后点击修改(铅笔图标)。然后点击添加其他角色

    如果列表中不包含该用户的电子邮件地址,请点击 添加,然后在新建主账号框中输入该电子邮件地址。

  3. 点击选择角色下拉列表。

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

  5. 点击保存

BigQuery Admin 和 Data Owner 角色

BigQuery Admin 和 Data Owner 角色可以管理数据政策。

如需授予上述两种角色之一,您必须对要为其授予该角色的项目拥有 resourcemanager.projects.setIamPolicy 权限。如果您没有 resourcemanager.projects.setIamPolicy 权限,请让 Project Owner 授予您此权限或代您执行以下步骤。

  1. 在 Google Cloud 控制台中,转到 IAM 页面。

    打开 IAM 页面

  2. 如果列表中包含要授予该角色的用户的电子邮件地址,请选择该电子邮件地址,然后点击修改(铅笔图标)。然后点击添加其他角色

    如果列表中不包含该用户的电子邮件地址,请点击 添加,然后在新建主账号框中输入该电子邮件地址。

  3. 点击选择角色下拉列表。

  4. 点击 BigQuery,然后点击 BigQueryBigQuery

  5. 点击保存

Organization Viewer 角色

Organization Viewer 角色可让用户查看有关其组织资源的详细信息。如需授予此角色,您必须拥有组织的 resourcemanager.organizations.setIamPolicy 权限。

Data Catalog Fine-Grained Reader 角色

如果用户需要访问受列级访问权限控制保护的数据,那么他们需要具有 Data Catalog Fine-Grained Reader 角色。此角色会在您配置政策标记时分配给主账号。

如需向用户授予政策标记的 Fine-Grained Reader 角色,您必须对包含该政策标记分类的项目拥有 datacatalog.taxonomies.setIamPolicy 权限。如果您没有 datacatalog.taxonomies.setIamPolicy 权限,请让 Project Owner 授予您此权限或代您执行相关操作。

如需了解相关说明,请参阅设置政策标记的权限

设置列级访问权限控制

通过完成以下任务来设置列级访问权限控制:

  • 创建政策标记分类。
  • 将主账号与政策标记相关联,并授予主账号 Data Catalog Fine-Grained Reader 角色。
  • 将政策标记与 BigQuery 表列相关联。
  • 对包含政策标记的分类强制执行访问权限控制。

创建分类

您必须为需要创建分类的用户或服务账号授予 Data Catalog Policy Tag Admin 角色。

控制台

  1. 在 Google Cloud 控制台中打开政策标记分类页面。

    打开“政策标记分类”页面

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

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

API

如需使用现有分类,请调用 taxonomies.import,而无需执行以下过程中的前两个步骤。

  1. 调用 taxonomies.create 以创建分类。
  2. 调用 taxonomies.policytag.create 以创建政策标记。

设置政策标记的权限

您必须为需要创建分类的用户或服务账号授予 Data Catalog Policy Tag Admin 角色。

控制台

  1. 在 Google Cloud 控制台中打开政策标记分类页面。

    打开“政策标记分类”页面

  2. 点击包含相关政策标记的分类名称。

  3. 选择一个或多个政策标记。

  4. 如果信息面板处于隐藏状态,请点击显示信息面板

  5. 信息面板中,您可以查看所选政策标记的角色和主账号。将 Policy Tags Admin 角色添加到将创建和管理政策标记的账号。将 Fine-Grained Reader 角色添加到计划访问受列级访问权限控制保护的数据的账号。您还可以使用此面板从账号移除角色或修改其他权限。

  6. 点击保存

API

调用 taxonomies.policytag.setIamPolicy 将主账号分配给相应的角色,以授予对政策标记的访问权限。

为列设置政策标记

设置政策标记的用户或服务账号需要具有 datacatalog.taxonomies.getbigquery.tables.setCategory 权限。Data Catalog Policy Tags Admin 和 Project Viewer 角色均包含 datacatalog.taxonomies.get。BigQuery Admin (roles/bigquery.admin) 和 BigQuery Data Owner (roles/bigquery.dataOwner) 角色均包含 bigquery.tables.setCategory

如需在 Google Cloud 控制台中查看组织中所有项目的分类和政策标记,用户需要 resourcemanager.organizations.get 权限,该权限包含在 Organization Viewer 角色中。

控制台

使用 Google Cloud 控制台修改架构,以便设置政策标记。

  1. 在 Google Cloud 控制台中打开 BigQuery 页面。

    转到 BigQuery 页面

  2. 在 BigQuery Explorer 中,找到并选择要更新的表。系统会打开该表的表架构。

  3. 点击修改架构

  4. 当前架构屏幕中,选择目标列,然后点击添加政策标记

  5. 添加政策标记屏幕中,找到并选择要应用于该列的政策标记。

  6. 点击选择。屏幕应类似于如下所示:

    修改架构。

  7. 点击保存

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;对于新表,则调用 tables.insert。使用您传入的 Table 对象的 schema 属性在架构定义中设置政策标记。请参阅命令行示例架构,了解如何设置政策标记。

使用现有表时,首选 tables.patch 方法,因为 tables.update 方法会替换整个表资源。

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

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

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

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

执行访问权限控制

按照以下说明启用或停用对访问权限控制的强制执行。

强制执行访问权限控制时需要创建相应的数据政策。如果您使用 Google Cloud 控制台强制执行访问权限控制,则系统会为您执行此操作。如果要使用 BigQuery Data Policy API 强制执行访问权限控制,则必须明确创建该数据政策。

强制执行访问权限控制的用户或服务账号必须具有 BigQuery Admin 角色或 BigQuery Data Owner 角色。此外,他们还必须具有 Data Catalog Admin 角色或 Data Catalog Viewer 角色。

控制台

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

  1. 在 Google Cloud 控制台中打开政策标记分类页面。

    打开“政策标记分类”页面

  2. 点击您要强制执行其列级访问权限控制的分类。

  3. 如果尚未启用强制执行访问权限控制,请点击强制执行访问权限控制以将其启用。

如需停止强制执行访问权限控制(如果已启用),请点击强制执行访问权限控制以切换控制。

如果您的数据政策与分类中的任何政策标记相关联,则您必须先删除分类中的所有数据政策,然后才能停止强制执行访问权限控制。如果您使用 BigQuery Data Policy API 删除数据政策,则必须删除 dataPolicyTypeDATA_MASKING_POLICY 的所有数据政策。如需了解详情,请参阅删除数据政策

API

如需强制执行访问权限控制,请调用 create 并传入 DataPolicy 资源,其中 dataPolicyType 字段设置为 COLUMN_LEVEL_SECURITY_POLICY

如需停止强制执行访问权限控制(如果已启用),请删除与分类关联的数据政策。为此,您可以对该数据政策调用 delete 方法。

如果您的数据政策与分类中的任何政策标记相关联,您必须先删除分类中的所有数据政策,然后才能停止强制执行访问权限控制。如需了解详情,请参阅删除数据政策

使用政策标记

本部分介绍如何查看、修改和删除政策标记。

查看政策标记

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

  1. 在 Google Cloud 控制台中打开政策标记分类页面。

    打开“政策标记分类”页面

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

在架构中查看政策标记

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

查看政策标记的权限

  1. 在 Google Cloud 控制台中打开政策标记分类页面。

    打开“政策标记分类”页面

  2. 点击包含相关政策标记的分类名称。

  3. 选择一个或多个政策标记。

  4. 如果信息面板处于隐藏状态,请点击显示信息面板

  5. 信息面板中,您可以查看所选政策标记的角色和主账号。

更新政策标记的权限

您必须为需要创建分类的用户或服务账号授予 Data Catalog Policy Tag Admin 角色。

控制台

  1. 在 Google Cloud 控制台中打开政策标记分类页面。

    打开“政策标记分类”页面

  2. 点击包含相关政策标记的分类名称。

  3. 选择一个或多个政策标记。

  4. 如果信息面板处于隐藏状态,请点击显示信息面板

  5. 信息面板中,您可以查看所选政策标记的角色和主账号。将 Policy Tags Admin 角色添加到将创建和管理政策标记的账号。将 Fine-Grained Reader 角色添加到计划访问受列级访问权限控制保护的数据的账号。您还可以使用此面板从账号移除角色或修改其他权限。

  6. 点击保存

API

调用 taxonomies.policytag.setIamPolicy 将主账号分配给相应的角色,以授予对政策标记的访问权限。

检索政策标记资源名称

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

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

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

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

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

    复制资源名称。

清除政策标记

更新表架构以从列中清除政策标记。您可以使用 Google Cloud 控制台、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 方法。

删除政策标记

您可以删除分类中的一个或多个政策标记,也可以删除分类及其包含的所有政策标记。删除政策标记会自动移除政策标记与其应用到的任何列之间的关联性。

删除与数据政策关联的政策标记时,数据政策最长可能需要 30 分钟才会一并被删除。如果您希望立即删除数据政策,那么您可以直接删除数据政策

如需删除分类中的一个或多个政策标记,请按以下步骤操作:

  1. 在 Google Cloud 控制台中打开政策标记分类页面。

    打开“政策标记分类”页面

  2. 点击包含要删除的标记的分类的名称。
  3. 点击修改
  4. 点击要删除的政策标记旁边的
  5. 点击保存
  6. 点击确认

如需删除整个分类,请按以下步骤操作:

  1. 在 Google Cloud 控制台中打开政策标记分类页面。

    打开“政策标记分类”页面

  2. 点击包含要删除的标记的分类的名称。
  3. 点击删除政策标记分类
  4. 输入分类名称,然后点击删除

使用列级访问权限控制查询数据

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

常见问题解答

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

可以。视图派生自底层表。在通过视图访问受保护的列时,表采用的列级访问权限控制也同样适用。

BigQuery 中具有两种视图:逻辑视图和已获授权的视图。这两种类型的视图都派生自源表,并且都与表的列级访问权限控制保持一致。

列级访问权限控制是否适用于 STRUCTRECORD 列?

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

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

您可以使用 GoogleSQL 来查询受列级访问权限控制保护的表。

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

查询是否记录在 Cloud Logging 中?

政策标记检查记录在 Logging 中。如需了解详情,请参阅列级访问权限控制的审核日志记录

复制表操作是否会受列级访问权限控制的影响?

可以。您无法复制您无权访问的列。

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

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

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

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

列级访问权限控制是否与 Virtual Private Cloud 兼容?

是,列级访问权限控制与 VPC 兼容且互为补充。

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

如需对列级访问权限控制和动态数据遮盖的政策标记和数据政策强制使用 VPC,您必须在边界中限制以下 API:

问题排查

我看不到 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 分钟才能完成传播。

我没有权限从具有列级安全性的表中读取数据

您需要不同级层(例如组织、文件夹、项目和政策标记)的 Fine-Grained Reader 角色Masked Reader 角色。Fine-Grained Reader 角色授予原始数据访问权限,而 Masked Reader 角色授予对遮盖数据的访问权限。您可以使用 IAM 问题排查工具在项目级层检查此权限。