将政策分析写入 BigQuery

本页面介绍如何异步分析 Identity and Access Management (IAM) 政策并将结果写入 BigQuery。此过程类似于分析 IAM 政策,不同之处在于分析结果会写入 BigQuery 表。

准备工作

启用 Cloud Asset API。

启用 API 所需的角色

如需启用 API,您需要拥有 Service Usage Admin IAM 角色 (roles/serviceusage.serviceUsageAdmin),该角色包含 serviceusage.services.enable 权限。了解如何授予角色

启用 API

您必须在用于发送查询的项目中启用该 API。此资源不必与您将查询范围限定到的资源相同。

所需的角色和权限

如需运行政策分析并将结果导出到 BigQuery,您需要具备以下角色和权限。

所需 IAM 角色

如需获得分析政策并将结果导出到 BigQuery 所需的权限,请让管理员向您授予您将查询范围限定到的项目、文件夹或组织的以下 IAM 角色:

如需详细了解如何授予角色,请参阅管理对项目、文件夹和组织的访问权限

这些预定义角色包含分析政策并将结果导出到 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 角色)中。如需了解详情,请参阅分配特定管理员角色

分析政策并导出结果

控制台

  1. 在 Google Cloud 控制台中,前往“Policy Analyzer”页面。

    前往政策分析器

  2. 分析政策部分,找到要使用的查询模板,然后点击创建查询。如果您想创建自定义查询,请点击创建自定义查询

  3. 选择查询范围字段中,选择要将查询范围限定到的项目、文件夹或组织。Policy Analyzer 将分析该项目、文件夹或组织的访问权限,以及该项目、文件夹或组织中的任何资源。

  4. 确保已设置查询参数:

    • 如果您使用的是查询模板,请确认预填充的查询参数。
    • 如果您要创建自定义查询,请设置要查询的资源、正文、角色和权限。

    如需详细了解您可以创建的查询类型,请参阅分析 IAM 政策

  5. 在标有查询名称的窗格中,依次点击分析 > 仅导出结果。系统随即会打开导出结果窗格。

  6. 设置导出目标位置部分,输入以下信息:

    • 项目:BigQuery 数据集所在的项目。
    • 数据集:您要将结果导出到的 BigQuery 数据集。
    • :将写入分析结果的 BigQuery 表的前缀。如果不存在具有指定前缀的表,BigQuery 会创建一个新表。
  7. 点击继续

  8. 可选:在配置其他设置部分中,选择所需的选项:

    • 分区:是否对表进行分区。如需详细了解分区表,请参阅分区表简介
    • 写入偏好设置:指定目标表或分区已存在时执行的操作。默认情况下,如果表或分区已存在,BigQuery 会将数据附加到相应表或最新分区。
  9. 点击导出

Policy Analyzer 会运行您的查询,并将结果导出到指定表中。

gcloud

使用 AnalyzeIamPolicyLongrunning 方法,您可以发出分析请求,并在指定的 BigQuery 目标中获取结果。

在使用下面的命令数据之前,请先进行以下替换:

  • RESOURCE_TYPE:您要将搜索范围限定到的资源类型。系统只会分析附加到此资源及其后代的 IAM 允许政策。使用值 projectfolderorganization
  • 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。如果您列出了多项权限,Policy Analyzer 将检查是否具有所列的任何权限。
  • DATASET:格式为 projects/PROJECT_ID/datasets/DATASET_ID 的 BigQuery 数据集,其中 PROJECT_ID 是 Google Cloud 项目的字母数字 ID,DATASET_ID 是数据集的 ID。
  • TABLE_PREFIX:将写入分析结果的 BigQuery 表的前缀。如果不存在具有指定前缀的表,BigQuery 会创建一个新表。
  • PARTITION_KEY:可选。BigQuery 分区表的分区键。 Policy Analyzer 仅支持 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 允许政策。使用值 projectsfoldersorganizations
  • RESOURCE_ID:您要将搜索范围限定到的Google Cloud 项目、文件夹或组织的 ID。系统只会分析附加到此资源及其后代的 IAM 允许政策。项目 ID 是字母数字字符串,例如 my-project。文件夹和组织 ID 是数字,例如 123456789012
  • FULL_RESOURCE_NAME:可选。要分析其访问权限的资源的完整资源名称。如需查看完整的资源名称格式列表,请参阅资源名称格式
  • PRINCIPAL:可选。 您要分析其访问权限的正文,格式为 PRINCIPAL_TYPE:ID,例如 user:my-user@example.com。如需查看主账号类型的完整列表,请参阅主账号标识符
  • PERMISSION_1PERMISSION_2... PERMISSION_N:可选。您要检查的权限,例如 compute.instances.get。如果您列出了多项权限,Policy Analyzer 将检查是否具有所列的任何权限。
  • DATASET:格式为 projects/PROJECT_ID/datasets/DATASET_ID 的 BigQuery 数据集,其中 PROJECT_ID 是 Google Cloud 项目的字母数字 ID,DATASET_ID 是数据集的 ID。
  • TABLE_PREFIX:将写入分析结果的 BigQuery 表的前缀。如果不存在具有指定前缀的表,BigQuery 会创建一个新表。
  • PARTITION_KEY:可选。BigQuery 分区表的分区键。 Policy Analyzer 仅支持 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 政策分析结果,请执行以下操作:

控制台

  1. 在 Google Cloud 控制台中,前往 BigQuery 页面。

    前往 BigQuery

  2. 要显示数据集中的表和视图,请打开导航面板。在Explorer部分,选择项目以将其展开,然后选择数据集。

  3. 从列表中选择具有您前缀的表。带有 analysis 后缀的表包含查询和元数据(例如操作名称、请求时间和非严重错误)。带有 analysis_result 后缀的表是 {identity, role(s)/permission(s), resource} 的结果列表元组以及生成这些元组的 IAM 政策。

  4. 如需查看一组数据示例,请选择预览标签页。

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_ID123456

列出操作

表可以存储多个 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
;