排查 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 获取有关该错误的信息。
在 Google Cloud 控制台中,前往 Logs Explorer 页面。
或者,在导航菜单中,依次选择 Monitoring > Logs Explorer。
在 Logs Explorer 中,选择日志范围为项目日志。
在查询窗口中,输入以下查询,以从 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。
在查询结果中,展开与失败的操作对应的日志条目。
在
protoPayload
部分中,展开authorizationInfo
数组,然后展开authorizationInfo
数组中的每个节点。authorizationInfo
数组显示了在 API 调用期间执行的每项权限检查。如需查看错误原因,请查找
granted: false
条目。granted: false
条目显示以下信息:permission
:已检查的 IAM 权限字符串。 例如bigquery.tables.getData
。resource
:正文尝试访问的资源的完全限定名称。例如projects/myproject/datasets/mydataset/tables/mytable
。principalEmail
(如果可用):在protoPayload.authenticationInfo
中引用,这是尝试执行操作的主账号。
针对允许政策使用 Policy Analyzer
借助允许政策的 Policy Analyzer,您可以根据 IAM 允许政策,了解哪些 IAM 主账号对哪些 BigQuery 资源拥有哪些访问权限。
收集有关权限错误的信息后,您可以使用政策分析器来了解主账号为何缺少所需的访问权限。此工具会分析所有相关政策、Google 群组中的成员资格以及从父资源(例如项目、文件夹和组织)继承的权限。
如需将政策分析器用于允许政策,您需要创建分析查询,指定分析范围,然后运行查询。
在 Google Cloud 控制台中,前往政策分析器页面。
或者,您也可以在导航菜单中依次选择 IAM 和管理> 政策分析器。
点击创建自定义查询。
在配置查询页面上,输入您之前收集的信息:
在选择范围部分中,在选择查询范围字段中,验证当前项目是否显示,或点击浏览以选择其他资源。
在设置查询参数部分中,对于参数 1,选择主账号,然后在主账号字段中,输入用户、群组或服务账号的电子邮件地址。
点击
添加参数。对于参数 2,选择权限,然后在权限字段中,点击选择,选择 BigQuery 权限,然后点击添加。例如,选择
bigquery.tables.getData
。点击
添加参数。对于参数 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
- BigQuery 项目:
在自定义查询窗格中,依次点击分析 > 运行查询。
检查查询结果。结果可以是以下任一项:
- 一个空列表。如果没有结果,则表示相应的主账号没有所需的权限。您需要向主账号授予可提供相应权限的角色。
- 一个或多个结果。如果分析器找到允许政策,则表示存在某种形式的访问权限。点击每个结果中的查看绑定,即可查看提供对相应资源的访问权限的角色,相应主账号是该资源的成员。政策绑定会显示访问权限是通过群组成员身份或继承授予的,还是因 IAM 条件或 IAM 拒绝政策而被拒绝的。
找到可授予所需权限的正确 IAM 角色
确认主账号没有足够的访问权限后,下一步是找到可授予所需权限的适当的预定义或自定义 IAM 角色。您选择的角色应遵循最小权限原则。
如果您的组织使用自定义角色,您可以列出在项目或组织中创建的所有自定义角色,找到正确的角色。例如,在 Google Cloud 控制台的角色页面上,您可以按类型:自定义过滤列表,以仅查看自定义角色。
如需查找正确的预定义 IAM 角色,请按以下步骤操作。
打开 BigQuery IAM 角色和权限页面中的 BigQuery 权限部分。
在输入权限搜索栏中,输入您从错误消息、作业记录或审核日志中检索到的权限。例如
bigquery.tables.getData
。搜索结果会显示授予该权限的所有预定义 BigQuery 角色。
应用最小权限原则:在角色列表中,选择授予所需权限的权限最小的角色。例如,如果您搜索
bigquery.tables.getData
以授予查询表数据的权限,则 BigQuery Data Viewer 是授予该权限的权限最少的角色。向主账号授予适当的角色。如需了解如何向 BigQuery 资源授予 IAM 角色,请参阅使用 IAM 控制对资源的访问权限。
后续步骤
- 如需查看所有 BigQuery IAM 角色和权限的列表,请参阅 BigQuery IAM 角色和权限。
- 如需详细了解如何排查 IAM 中的允许政策和拒绝政策方面的问题,请参阅排查政策方面的问题。
- 如需详细了解 Policy Intelligence 政策分析器,请参阅允许政策的政策分析器。
- 如需详细了解政策问题排查工具,请参阅使用政策问题排查工具。