排查 BigQuery 中的 IAM 权限问题

本文档介绍了如何排查 BigQuery 中与 Identity and Access Management (IAM) 权限相关的问题。IAM 权限问题通常会导致 Access Denied 错误,例如:

  • Access Denied: Project PROJECT_ID: User does not have bigquery.jobs.create permission in project PROJECT_ID.
  • Access Denied: Project PROJECT_ID: User does not have bigquery.datasets.get permission on dataset DATASET.
  • User does not have permission to query table PROJECT_ID:DATASET.TABLE.
  • Access Denied: Table PROJECT_ID:DATASET.TABLE: User does not have permission to query table PROJECT_ID:DATASET.TABLE, or perhaps it does not exist.
  • Access Denied: User PRINCIPAL does not have permission to perform bigquery.tables.getData on resource 'projects/PROJECT_ID/datasets/DATASET/tables/TABLE'.

准备工作

  • 如需排查主账号对 BigQuery 资源的访问权限问题,请确保您拥有所需的 IAM 权限

收集有关问题的信息

排查资源访问权限问题的第一步是确定缺少的权限、被拒绝访问的 IAM 主账号,以及主账号尝试访问的资源。

从错误或作业历史记录中获取信息

如需获取有关主账号、资源和权限的信息,请检查 bq 命令行工具的输出、API 响应或 Cloud de Confiance 控制台中的 BigQuery。

例如,如果您尝试运行权限不足的查询,则会在 Cloud de Confiance 控制台的查询结果部分的作业信息标签页中看到如下所示的错误。

“查询结果”部分中的“作业信息”标签页上的“访问遭拒”错误。

检查错误,以确定主账号、资源和权限。

在某些情况下,您可以直接从错误消息中请求缺少的权限。如需了解详情,请参阅 IAM 文档中的排查权限错误消息

从 Cloud Audit Logs 获取信息

如果错误消息是一般性消息、缺少信息,或者操作在后台进程中失败,请使用 Cloud Audit Logs 的 Logs Explorer 获取有关该错误的信息。

  1. 在 Cloud de Confiance 控制台中,前往 Logs Explorer 页面。

    转到日志浏览器

    或者,在导航菜单中,依次选择 Monitoring > Logs Explorer

  2. 在 Logs Explorer 中,对于日志范围,选择项目日志

  3. 在查询窗口中,输入以下查询,以从 BigQuery 数据访问日志中获取与权限相关的错误:

    resource.type="bigquery_resource" AND
    logName="projects/PROJECT_ID/logs/cloudaudit.googleapis.com%2Fdata_access" AND
    protoPayload.status.message:"Access Denied" OR
    protoPayload.status.message:"Permission denied" OR
    protoPayload.status.code=7

    PROJECT_ID 替换为您的项目 ID。

  4. 在查询结果中,展开与失败操作对应的日志条目。

  5. protoPayload 部分中,展开 authorizationInfo 数组,然后展开 authorizationInfo 数组中的每个节点。

    authorizationInfo 数组显示了在 API 调用期间执行的每项权限检查。

  6. 如需查看错误原因,请查找 granted: false 条目。granted: false 条目显示以下信息:

    • permission:已检查的 IAM 权限字符串。 例如 bigquery.tables.getData
    • resource:主账号尝试访问的资源的完全限定名称。例如 projects/myproject/datasets/mydataset/tables/mytable
    • principalEmail(如果可用):在 protoPayload.authenticationInfo 中引用,这是尝试执行操作的主账号。

    protoPayload 中显示权限、资源和 principalEmail 的 authorizationInfo 部分。

对允许政策使用 Policy Analyzer

借助允许政策的 Policy Analyzer,您可以根据 IAM 允许政策,了解哪些 IAM 主账号具有哪些 BigQuery 资源的访问权限。

收集有关权限错误的信息后,您可以使用 Policy Analyzer 了解主账号为何缺少所需的访问权限。此工具会分析所有相关政策、Google 群组中的成员资格以及从父级资源(例如项目、文件夹和组织)继承的权限。

如需将 Policy Analyzer 用于允许政策,您需要创建分析查询,指定分析范围,然后运行查询。

  1. 在 Cloud de Confiance 控制台中,前往 Policy Analyzer 页面。

    前往 Policy Analyzer

    或者,在导航菜单中,选择 IAM 和管理 > Policy Analyzer

  2. 点击创建自定义查询

  3. 配置查询页面上,输入您之前收集的信息:

    1. 选择范围部分的选择查询范围字段中,验证当前项目是否显示,或点击浏览以选择其他资源。

    2. 设置查询参数部分的参数 1 中,选择主账号,然后在主账号字段中,输入用户、群组或服务账号的邮箱。

    3. 点击 添加参数

    4. 参数 2 中,选择权限,然后在权限字段中,点击选择,选择 BigQuery 权限,然后点击添加。例如,选择 bigquery.tables.getData

    5. 点击 添加参数

    6. 参数 3 中,选择资源,然后在资源字段中输入完全限定的资源名称。资源名称必须包含服务前缀,如以下示例所示:

      • BigQuery 项目//cloudresourcemanager.googleapis.com/projects/PROJECT_ID
      • BigQuery 数据集//bigquery.googleapis.com/projects/PROJECT_ID/datasets/DATASET
      • BigQuery 表: //bigquery.googleapis.com/projects/PROJECT/datasets/DATASET/tables/TABLE
  4. 自定义查询窗格中,点击分析 > 运行查询

  5. 检查查询结果。结果可能是以下项之一:

    • 一个空列表。如果没有结果,则确认主账号没有所需的权限。您需要向主账号授予可提供正确权限的角色
    • 一个或多个结果。如果分析器找到允许政策,则表示存在某种形式的访问权限。点击每个结果上的查看绑定,可查看提供对相应主账号是其成员的资源的访问权限的角色。政策绑定会显示访问权限是否通过群组成员资格或继承授予,或者访问权限是否被 IAM 条件IAM 拒绝政策拒绝。

查找授予所需权限的正确 IAM 角色

确认主账号没有足够的访问权限后,下一步是查找授予所需权限的适当预定义或自定义 IAM 角色。您选择的角色应遵循最小权限原则。

如果您的组织使用自定义角色,您可以列出在项目或组织中创建的所有自定义角色,找到正确的角色。例如,在 Cloud de Confiance 控制台的角色页面上,您可以按类型:自定义过滤列表,以仅查看自定义角色。

如需查找正确的预定义 IAM 角色,请按照以下步骤操作。

  1. 打开 BigQuery IAM 角色和权限页面的 BigQuery 权限部分

  2. 输入权限搜索栏中,输入您从错误消息、作业历史记录或审核日志中检索到的权限。例如 bigquery.tables.getData

    搜索结果会显示授予该权限的所有预定义 BigQuery 角色。

  3. 应用最小权限原则:在角色列表中,选择授予所需权限的权限最小的角色。例如,如果您搜索 bigquery.tables.getData 以授予查询表数据的权限,则 BigQuery Data Viewer 是授予该权限的权限最小的角色。

  4. 向主账号授予适当的角色。如需了解如何授予 BigQuery 资源的 IAM 角色,请参阅使用 IAM 控制对资源的访问权限

后续步骤