本页面介绍如何异步分析 Identity and Access Management (IAM) 政策并将结果写入 BigQuery。该过程类似于分析 IAM 政策,不同之处在于分析结果会写入 BigQuery 表。
准备工作
启用 Cloud Asset API。
您必须在将用于发送查询的项目或组织中启用该 API。该资源不必与将查询范围限定到的资源相同。
所需的角色和权限
如需运行政策分析并将结果导出到 BigQuery,您需要以下角色和权限。
所需 IAM 角色
如需获取分析政策并将结果导出到 BigQuery 所需的权限,请让管理员针对您要将查询范围限定到的项目、文件夹或组织向您授予以下 IAM 角色:
-
BigQuery 数据编辑者 (
roles/bigquery.dataEditor
) -
Cloud Asset Viewer (
roles/cloudasset.viewer
) -
如需分析具有自定义 IAM 角色的政策,请执行以下操作:
Role Viewer (
roles/iam.roleViewer
) -
如需使用 Google Cloud CLI 分析政策,请执行以下操作:Service Usage Consumer (
roles/serviceusage.serviceUsageConsumer
)
如需详细了解如何授予角色,请参阅管理访问权限。
这些预定义角色包含分析政策并将结果导出到 BigQuery 所需的权限。如需查看所需的确切权限,请展开所需权限部分:
所需权限
如需分析政策并将结果导出到 BigQuery,您需要具备以下权限:
-
bigquery.datasets.create
-
bigquery.jobs.create
-
bigquery.tables.create
-
bigquery.tables.get
-
bigquery.tables.updateData
-
bigquery.tables.update
-
cloudasset.assets.analyzeIamPolicy
-
cloudasset.assets.searchAllResources
-
cloudasset.assets.searchAllIamPolicies
-
如需分析具有自定义 IAM 角色的政策,请执行以下操作:
iam.roles.get
-
如需使用 Google Cloud CLI 分析政策,请执行以下操作:
serviceusage.services.use
所需的 Google Workspace 权限
如果您想查看主帐号是否因其在某个 Google Workspace 群组中的成员资格而具有某些角色或权限,您需要 groups.read
Google Workspace 权限。Groups Reader Admin 角色以及更强大的角色(例如 Groups Admin 或 Super Admin 角色)中包含此权限。如需了解详情,请参阅分配特定管理员角色。
分析政策并导出结果
控制台
在 Google Cloud 控制台中,前往“政策分析器”页面。
在分析政策部分,找到要使用的查询模板,然后点击创建查询。如果要创建自定义查询,请点击创建自定义查询。
在选择查询范围字段中,选择要将查询范围限定到的项目、文件夹或组织。政策分析器将分析该项目、文件夹或组织的访问权限,以及该项目、文件夹或组织中的任何资源。
确保已设置查询参数:
- 如果您使用的是查询模板,请确认预填充的查询参数。
- 如果您要创建自定义查询,请设置要查询的资源、主帐号、角色和权限。
如需详细了解您可以创建的查询类型,请参阅分析 IAM 政策。
在标有查询名称的窗格中,依次点击分析 > 仅导出结果。系统随即会打开 Export results 窗格。
在设置导出目标位置部分,输入以下信息:
- 项目:BigQuery 数据集所在的项目。
- 数据集:要向其中导出结果的 BigQuery 数据集。
- 表:将向其中写入分析结果的 BigQuery 表的前缀。如果不存在具有指定前缀的表,BigQuery 会创建一个新表。
点击继续。
可选:在配置其他设置部分中,选择所需的选项:
- 分区:是否对表进行分区。如需详细了解分区表,请参阅分区表简介。
- 写入偏好设置:指定目标表或分区已存在时要执行的操作。默认情况下,如果相应表或分区已存在,BigQuery 会将数据附加到该表或最新分区。
点击导出。
政策分析器运行查询并将结果导出到指定表。
gcloud
借助 AnalyzeIamPolicyLongrunning
方法,您可以发出分析请求并在指定的 BigQuery 目标位置获取结果。
在使用下面的命令数据之前,请先进行以下替换:
RESOURCE_TYPE
:您要将搜索范围限定到的资源类型。系统只会分析附加到此资源及其后代的 IAM 允许政策。使用project
、folder
或organization
值。RESOURCE_ID
:您要将搜索范围限定到的 Google Cloud 项目、文件夹或组织的 ID。系统只会分析附加到此资源及其后代的 IAM 允许政策。项目 ID 是字母数字字符串,例如my-project
。文件夹和组织 ID 是数字,例如123456789012
。PRINCIPAL
:您要分析其访问权限的主帐号,格式为PRINCIPAL_TYPE:ID
,例如user:my-user@example.com
。如需查看主账号类型的完整列表,请参阅主账号标识符。PERMISSIONS
:您要检查的权限的逗号分隔列表,例如compute.instances.get,compute.instances.start
。如果您列出了多个权限,政策分析器将检查列出的任何权限。DATASET
:BigQuery 数据集,格式为projects/PROJECT_ID/datasets/DATASET_ID
,其中PROJECT_ID
是您的 Google Cloud 项目的字母数字 ID,DATASET_ID
是您的数据集的 ID。TABLE_PREFIX
:将向其中写入分析结果的 BigQuery 表的前缀。如果不存在具有指定前缀的表,BigQuery 会创建一个新表。PARTITION_KEY
:可选。BigQuery 分区表的分区键。政策分析器仅支持REQUEST_TIME
分区键。WRITE_DISPOSITION
:可选。指定目标表或分区已存在时执行的操作。如需查看可能值的列表,请参阅writeDisposition
。默认情况下,如果相应表或分区已存在,BigQuery 会将数据附加到该表或最新分区。
执行 gcloud asset analyze-iam-policy-longrunning 命令:
Linux、macOS 或 Cloud Shell
gcloud asset analyze-iam-policy-longrunning --RESOURCE_TYPE=RESOURCE_ID \ --full-resource-name=FULL_RESOURCE_NAME \ --identity=PRINCIPAL \ --permissions='PERMISSIONS' \ --bigquery-dataset=DATASET \ --bigquery-table-prefix=TABLE_PREFIX \ --bigquery-partition-key=PARTITION_KEY \ --bigquery-write-disposition=WRITE_DISPOSITION
Windows (PowerShell)
gcloud asset analyze-iam-policy-longrunning --RESOURCE_TYPE=RESOURCE_ID ` --full-resource-name=FULL_RESOURCE_NAME ` --identity=PRINCIPAL ` --permissions='PERMISSIONS' ` --bigquery-dataset=DATASET ` --bigquery-table-prefix=TABLE_PREFIX ` --bigquery-partition-key=PARTITION_KEY ` --bigquery-write-disposition=WRITE_DISPOSITION
Windows (cmd.exe)
gcloud asset analyze-iam-policy-longrunning --RESOURCE_TYPE=RESOURCE_ID ^ --full-resource-name=FULL_RESOURCE_NAME ^ --identity=PRINCIPAL ^ --permissions='PERMISSIONS' ^ --bigquery-dataset=DATASET ^ --bigquery-table-prefix=TABLE_PREFIX ^ --bigquery-partition-key=PARTITION_KEY ^ --bigquery-write-disposition=WRITE_DISPOSITION
您应该会收到类似如下所示的响应:
Analyze IAM Policy in progress. Use [gcloud asset operations describe projects/my-project/operations/AnalyzeIamPolicyLongrunning/1195028485971902504711950280359719028666] to check the status of the operation.
REST
借助 AnalyzeIamPolicyLongrunning
方法,您可以发出分析请求并在指定的 BigQuery 目标位置获取结果。
如需分析 IAM 允许政策并将结果导出到 BigQuery,请使用 Cloud Asset Inventory API 的 analyzeIamPolicyLongrunning
方法。
在使用任何请求数据之前,请先进行以下替换:
RESOURCE_TYPE
:您要将搜索范围限定到的资源类型。系统只会分析附加到此资源及其后代的 IAM 允许政策。使用projects
、folders
或organizations
值。RESOURCE_ID
:您要将搜索范围限定到的 Google Cloud 项目、文件夹或组织的 ID。系统只会分析附加到此资源及其后代的 IAM 允许政策。项目 ID 是字母数字字符串,例如my-project
。文件夹和组织 ID 是数字,例如123456789012
。-
FULL_RESOURCE_NAME
:可选。您要分析其访问权限的资源的完整资源名称。如需查看完整资源名称格式的列表,请参阅资源名称格式。 PRINCIPAL
:可选。 您要分析其访问权限的主帐号,格式为PRINCIPAL_TYPE:ID
,例如user:my-user@example.com
。如需查看主账号类型的完整列表,请参阅主账号标识符。PERMISSION_1
、PERMISSION_2
...PERMISSION_N
:可选。要检查的权限,例如compute.instances.get
。如果您列出多个权限,政策分析器将检查列出的任何权限。DATASET
:BigQuery 数据集,格式为projects/PROJECT_ID/datasets/DATASET_ID
,其中PROJECT_ID
是您的 Google Cloud 项目的字母数字 ID,DATASET_ID
是您的数据集的 ID。TABLE_PREFIX
:将向其中写入分析结果的 BigQuery 表的前缀。如果不存在具有指定前缀的表,BigQuery 会创建一个新表。PARTITION_KEY
:可选。BigQuery 分区表的分区键。政策分析器仅支持REQUEST_TIME
分区键。WRITE_DISPOSITION
:可选。指定目标表或分区已存在时执行的操作。如需查看可能值的列表,请参阅writeDisposition
。默认情况下,如果相应表或分区已存在,BigQuery 会将数据附加到该表或最新分区。
HTTP 方法和网址:
POST https://cloudasset.googleapis.com/v1/RESOURCE_TYPE/RESOURCE_ID:analyzeIamPolicyLongrunning
请求 JSON 正文:
{ "analysisQuery": { "resourceSelector": { "fullResourceName": "FULL_RESOURCE_NAME" }, "identitySelector": { "identity": "PRINCIPAL" }, "accessSelector": { "permissions": [ "PERMISSION_1", "PERMISSION_2", "PERMISSION_N" ] } }, "outputConfig": { "bigqueryDestination": { "dataset": "DATASET", "tablePrefix": "TABLE_PREFIX", "partitionKey": "PARTITION_KEY", "writeDisposition": "WRITE_DISPOSITION" } } }
如需发送您的请求,请展开以下选项之一:
您应该收到类似以下内容的 JSON 响应:
{ "name": "projects/my-project/operations/AnalyzeIamPolicyLongrunning/1206385342502762515812063858425027606003", "metadata": { "@type": "type.googleapis.com/google.cloud.asset.v1.AnalyzeIamPolicyLongrunningMetadata", "createTime": "2022-04-12T21:31:10.753173929Z" } }
查看 IAM 政策分析结果
如需查看 IAM 政策分析结果,请执行以下操作:
控制台
在 Google Cloud 控制台中,转到 BigQuery 页面。
要显示数据集中的表和视图,请打开导航面板。在探索器部分,选择您的项目以将其展开,然后选择数据集。
从列表中选择具有您前缀的表。带有
analysis
后缀的表包含查询和元数据(例如操作名称、请求时间和非严重错误)。带有analysis_result
后缀的表是列出{identity, role(s)/permission(s), resource}
元组以及生成这些元组的 IAM 政策的结果。要查看示例数据集,请选择预览标签页。
API
如需浏览表的数据,请调用 tabledata.list
。在 tableId
参数中,指定表的名称。
您可以配置以下可选参数来控制输出。
maxResults
是要返回的结果数上限。selectedFields
是要返回的列的逗号分隔列表;如果未指定此参数,则会返回所有列。startIndex
是要读取的起始行的索引(从零开始)。
返回的值会封装在一个 JSON 对象中,您必须对此对象进行解析,具体请参阅 tabledata.list
参考文档。
查询 BigQuery
本部分提供了 SQL 查询示例,向您展示如何使用由 AnalyzeIamPolicyLongrunning
编写的 BigQuery 表。如需详细了解 BigQuery 语法,请参阅
标准 SQL 查询语法。
大多数查询需要 OP_ID,您可以从 AnalyzeIamPolicyLongrunning
响应获取该值。例如,在 gcloud 中,您可以在“使用 [gcloud asset operations describe organizations/123456789/operations/AnalyzeIamPolicyLongrunning/123456]
检查操作状态。”中发现 OP_ID 为 123456
。
列出操作
表可以存储多个 AnalyzeIamPolicyLongrunning
操作的结果。您可以使用以下查询列出所有结果:
SELECT DISTINCT requestTime, opName FROM `BQ_PROJECT_ID.BQ_DATASET_NAME.BQ_TABLE_PREFIX_analysis` ORDER BY 1 DESC ;
列出一个操作中的分析
在一个 AnalyzeIamPolicyLongrunning
操作中,可能会生成多条分析记录。例如,如果您在请求中启用 analyze_service_account_impersonation
选项,则结果可能会包含一个主要分析(analysisId 为 0)和多个服务账号模拟分析。
您可以通过提供操作名称使用以下查询查找所有分析。
DECLARE _opName STRING DEFAULT "organizations/ORG_ID/operations/AnalyzeIamPolicyLongrunning/OP_ID"; SELECT analysisId, requestTime, TO_JSON_STRING(analysis.analysisQuery, true) as analysisQuery, analysis.fullyExplored, TO_JSON_STRING(analysis.nonCriticalErrors, true) as nonCriticalErrors FROM `BQ_PROJECT_ID.BQ_DATASET_NAME.BQ_TABLE_PREFIX_analysis` WHERE opName=_opName ORDER BY 1 ;
列出一个分析中的 ACE(访问权限控制条目)
ACE 是访问权限控制条目 {identity, role(s)/permission(s), resource}
。您可以使用以下查询列出一个分析中的 ACE。
DECLARE _opName STRING DEFAULT "organizations/ORG_ID/operations/AnalyzeIamPolicyLongrunning/OP_ID"; SELECT DISTINCT ids.name AS identity, resources.fullResourceName AS resource, accesses.role AS role, accesses.permission AS permission FROM `BQ_PROJECT_ID.BQ_DATASET_NAME.BQ_TABLE_PREFIX_analysis_result`, UNNEST(analysisResult.identityList.identities) AS ids, UNNEST(analysisResult.accessControlLists) AS acls, UNNEST(acls.accesses) AS accesses, UNNEST(acls.resources) AS resources WHERE opName=_opName AND analysisId = 0 ORDER BY 1,2,3,4 ;
列出一个分析中的 ACE(访问权限控制条目)和 IAM 政策绑定
在此查询中,我们列出了一个分析中的 ACE 和生成此 ACE 的 IAM 政策绑定。
DECLARE _opName STRING DEFAULT "organizations/ORG_ID/operations/AnalyzeIamPolicyLongrunning/OP_ID"; SELECT ids.name AS identity, resources.fullResourceName AS resource, accesses.role AS role, accesses.permission AS permission, analysisResult.attachedResourceFullName as iam_policy_attached_resource, TO_JSON_STRING(analysisResult.iamBinding, true) as iam_policy_binding FROM `BQ_PROJECT_ID.BQ_DATASET_NAME.BQ_TABLE_PREFIX_analysis_result`, UNNEST(analysisResult.identityList.identities) AS ids, UNNEST(analysisResult.accessControlLists) AS acls, UNNEST(acls.accesses) AS accesses, UNNEST(acls.resources) AS resources WHERE opName=_opName AND analysisId = 0 ORDER BY 1,2,3,4 ;
列出一个分析中的 IAM 政策绑定
在此查询中,我们列出了一个分析中显示的 IAM 政策绑定。
DECLARE _opName STRING DEFAULT "organizations/ORG_ID/operations/AnalyzeIamPolicyLongrunning/OP_ID"; SELECT DISTINCT analysisResult.attachedResourceFullName as iam_policy_attached_resource, TO_JSON_STRING(analysisResult.iamBinding, true) as iam_policy_binding FROM `BQ_PROJECT_ID.BQ_DATASET_NAME.BQ_TABLE_PREFIX_analysis_result` WHERE opName=_opName AND analysisId = 0 ORDER BY 1, 2 ;
列出一个分析中的 IAM 政策绑定及其 ACE(访问权限控制条目)
在此查询中,我们列出了一个分析中的 IAM 政策绑定及其派生 ACE
DECLARE _opName STRING DEFAULT "organizations/ORG_ID/operations/AnalyzeIamPolicyLongrunning/OP_ID"; SELECT analysisResult.attachedResourceFullName as iam_policy_attached_resource, TO_JSON_STRING(analysisResult.iamBinding, true) as iam_policy_binding, TO_JSON_STRING(analysisResult.identityList.identities, true) as identities, TO_JSON_STRING(acls.accesses, true) as accesses, TO_JSON_STRING(acls.resources, true) as resources FROM `BQ_PROJECT_ID.BQ_DATASET_NAME.BQ_TABLE_PREFIX_analysis_result`, UNNEST(analysisResult.accessControlLists) AS acls WHERE opName=_opName AND analysisId = 0 ORDER BY 1,2 ;