将政策分析写入 BigQuery

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

准备工作

  • 您必须为项目启用 Cloud Asset API

  • 如果您使用 API 来运行这些查询,则需要设置环境和 gcurl

    1. 设置您的环境

    2. 要设置 gcurl 别名,请完成以下步骤。

      如果您在 Compute Engine 实例上,请运行以下命令。

      alias gcurl='curl -H "Authorization: Bearer $(gcloud auth application-default print-access-token)" \
      -H "Content-Type: application/json" -X POST'
      

      如果您不在 Compute Engine 实例上,请运行以下命令。

      alias gcurl='curl -H "$(oauth2l header --json CREDENTIALS cloud-platform)" \
      -H "Content-Type: application/json" -X POST'
      

      其中,CREDENTIALS 是您的凭据文件路径,例如 ~/credentials.json

调用 AnalyzeIamPolicyLongrunning

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

gcloud

您可以使用 asset analyze-iam-policy-longrunning gcloud 命令在已启用 API 的项目上调用 AnalyzeIamPolicyLongrunning。您必须运行 Cloud SDK 314.0.0 或更高版本。您可以使用 gcloud version 命令检查您的版本。

gcloud asset analyze-iam-policy-longrunning \
    --organization="ORG_ID" \
    --full-resource-name="FULL_RESOURCE_NAME" \
    --permissions="COMMA_SEPARATED_PERMISSIONS" \
    --bigquery-dataset="projects/BQ_PROJECT_ID/datasets/BQ_DATASET_NAME" \
    --bigquery-table-prefix="BQ_TABLE_PREFIX"

例如,将谁拥有组织 123456789 下的 Compute Engine 实例 ipa-gce-instance-2compute.instances.getcompute.instances.start 权限的分析结果写入 BigQuery 数据集 projects/project1/datasets/bq-dataset-01,表前缀为 some_prefix

gcloud asset analyze-iam-policy-longrunning --organization=123456789 \
    --full-resource-name="//compute.googleapis.com/projects/project1/zones/us-central1-a/instances/ipa-gce-instance-2" \
    --permissions="compute.instances.get,compute.instances.start" \
    --bigquery-dataset="projects/project1/datasets/bq-dataset-01" \
    --bigquery-table-prefix="some_prefix"

通过帮助了解详情:

gcloud asset analyze-iam-policy-longrunning --help

REST

使用 gcurl 别名分析 IAM 政策并写入结果。

gcurl -d "$JSON_REQUEST" \
"https://cloudasset.googleapis.com/v1/organizations/${YOUR_ORG_ID}:analyzeIamPolicyLongrunning"

其中:

  • YOUR_ORG_ID 是组织 ID,例如:123456789

  • JSON_REQUEST 是 JSON 格式的分析请求。例如,分析谁拥有组织 123456789 下的 Compute Engine 实例 ipa-gce-instance-2compute.instances.getcompute.instances.start 权限,并将分析结果写入 BigQuery 数据集 projects/project1/datasets/bq-dataset-01,表前缀为 some_prefix

    JSON_REQUEST='{
      "analysisQuery":{
         "scope":"organization/123456789",
         "resourceSelector":{
            "fullResourceName":"//compute.googleapis.com/projects/project1/zones/us-central1-a/instances/ipa-gce-instance-2"
         },
         "accessSelector":{
            "permissions":[
               "compute.instances.get",
               "compute.instances.start"
            ]
         }
      },
      "outputConfig":{
         "bigqueryDestination":{
            "dataset":"projects/project1/datasets/bq-dataset-01",
            "tablePrefix":"some_prefix"
         }
      }
    }'
    

设置分区键

BigQuery 表可以分区,从而通过过滤分区来提高查询性能并降低查询费用。支持以下分区键:

  • REQUEST_TIME:收到请求的时间。

设置写入处置方式

指定目标表或分区已存在时执行的操作。另请参阅 BigQuery 写入处置方式。支持以下值:

  • WRITE_APPEND:默认值。将数据附加到表或最新分区。
  • WRITE_TRUNCATE:覆盖整个表或所有分区数据。
  • WRITE_EMPTY:返回错误。

查看 IAM 政策分析结果

如需查看 IAM 政策分析结果,请执行以下操作:

控制台

  1. 转到 Cloud Console 中的 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 参考文档。

构建查询

如需了解查询的其他用例和选项,请参阅分析 IAM 政策查询示例

查询 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
;