将政策分析写入 BigQuery

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

准备工作

启用 Cloud Asset API。

启用 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 角色以及更强大的角色(例如群组管理员或超级用户角色)拥有此权限。如需了解详情,请参阅分配特定管理员角色

分析政策并导出结果

控制台

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

    前往政策分析器

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

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

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

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

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

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

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

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

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

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

政策分析器会运行查询,并将完整结果导出到指定表。

gcloud

借助 AnalyzeIamPolicyLongrunning 方法,您可以发出分析请求并在指定的 BigQuery 目标位置获取结果。

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

  • RESOURCE_TYPE:要将搜索范围限定到的资源类型。系统只会分析已附加到此资源及其后代的 IAM 允许政策。使用 projectfolderorganization 值。
  • RESOURCE_ID:您要将搜索范围限定到的 Google Cloud 项目、文件夹或组织的 ID。系统只会分析附加到此资源及其后代的 IAM 允许政策。项目 ID 是字母数字字符串,例如 my-project。文件夹 ID 和组织 ID 均为数字,例如 123456789012
  • PRINCIPAL:您要分析其访问权限的主帐号,格式为 PRINCIPAL_TYPE:ID,例如 user:my-user@example.com。如需查看主帐号类型的完整列表,请参阅主帐号标识符
  • PERMISSIONS:您要检查的权限的英文逗号分隔列表,例如 compute.instances.get,compute.instances.start。如果您列出了多项权限,政策分析器将检查列出的任何权限。
  • DATASET:格式为 projects/PROJECT_ID/datasets/DATASET_ID 的 BigQuery 数据集,其中 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 允许政策。使用 projectsfoldersorganizations 值。
  • RESOURCE_ID:您要将搜索范围限定到的 Google Cloud 项目、文件夹或组织的 ID。系统只会分析附加到此资源及其后代的 IAM 允许政策。项目 ID 是字母数字字符串,例如 my-project。文件夹 ID 和组织 ID 均为数字,例如 123456789012
  • FULL_RESOURCE_NAME:可选。要为其分析访问权限的资源的完整资源名称。如需查看完整资源名称格式的列表,请参阅资源名称格式
  • PRINCIPAL:可选。 要分析其访问权限的主账号,格式为 PRINCIPAL_TYPE:ID,例如 user:my-user@example.com。如需查看主帐号类型的完整列表,请参阅主帐号标识符
  • PERMISSION_1PERMISSION_2... PERMISSION_N:可选。要检查的权限,例如 compute.instances.get。如果您列出了多项权限,政策分析器将检查列出的任何权限。
  • DATASET:格式为 projects/PROJECT_ID/datasets/DATASET_ID 的 BigQuery 数据集,其中 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 政策分析结果,请执行以下操作:

控制台

  1. 在 Google Cloud 控制台中,转到 BigQuery 页面。

    转到 BigQuery

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

  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
;