排查 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 响应或 Google Cloud 控制台中的 BigQuery 的输出。

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

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

检查错误,确定正文、资源和权限。

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

从 Cloud Audit Logs 获取信息

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

  1. 在 Google Cloud 控制台中,前往 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 资源拥有哪些访问权限。

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

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

  1. 在 Google Cloud 控制台中,前往政策分析器页面。

    前往“政策分析器”

    或者,您也可以在导航菜单中依次选择 IAM 和管理> 政策分析器

  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 角色。您选择的角色应遵循最小权限原则。

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

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

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

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

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

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

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

后续步骤