查看有效的 IAM 政策

在 IAM 中,“有效政策”描述了如何为资源沿用资源层次结构中的所有父级和祖先政策。

只有允许政策支持通过 Cloud Asset Inventory 检索。不支持以下形式的访问权限控制:

准备工作

  1. 在您将运行 Cloud Asset Inventory 命令的项目中启用 Cloud Asset Inventory API。

    启用 Cloud Asset Inventory API

  2. 确保您的账号具有调用 Cloud Asset Inventory API 的正确角色。如需了解每种通话类型的具体权限,请参阅权限

查看资源的有效政策

gcloud

gcloud asset get-effective-iam-policy \
    --scope=SCOPE_PATH \
    --names=ASSET_NAME_1,ASSET_NAME_2,...

请提供以下值:

  • SCOPE_PATH:请使用以下某个值:

    允许使用的值包括:

    • projects/PROJECT_ID,其中 PROJECT_ID 是用于检查有效 IAM 政策的顶级项目的 ID。
    • projects/PROJECT_NUMBER,其中 PROJECT_NUMBER 是用于检查有效 IAM 政策的顶级项目的编号。

      如何查找 Google Cloud 项目编号

      Google Cloud 控制台

      如需查找 Google Cloud 项目编号,请完成以下步骤:

      1. 前往 Google Cloud 控制台中的欢迎页面。

        前往“欢迎”页面

      2. 点击菜单栏中的切换器列表框。
      3. 从列表框中选择您的组织,然后搜索项目名称。 项目名称、项目编号和项目 ID 显示在欢迎标题附近。

        最多显示 4,000 个资源。如果您没有看到要查找的项目,请前往管理资源页面,然后使用该项目的名称过滤列表。

      gcloud CLI

      您可以使用以下命令检索 Google Cloud 项目编号:

      gcloud projects describe PROJECT_ID --format="value(projectNumber)"
    • folders/FOLDER_ID,其中 FOLDER_ID 是用于检查有效 IAM 政策的顶层文件夹的 ID。

      如何查找 Google Cloud 文件夹的 ID

      Google Cloud 控制台

      如需查找 Google Cloud 文件夹的 ID,请完成以下步骤:

      1. 前往 Google Cloud 控制台。

        前往 Google Cloud 控制台

      2. 点击菜单栏中的切换器列表框。
      3. 从列表框中选择您的组织。
      4. 搜索您的文件夹名称。文件夹 ID 显示在文件夹名称旁边。

      gcloud CLI

      您可以使用以下命令检索组织级 Google Cloud 文件夹的 ID:

      gcloud resource-manager folders list \
          --organization=$(gcloud organizations describe ORGANIZATION_NAME \
            --format="value(name.segment(1))") \
          --filter='"DISPLAY_NAME":"TOP_LEVEL_FOLDER_NAME"' \
          --format="value(ID)"

      其中 TOP_LEVEL_FOLDER_NAME 是文件夹名称的部分或完整字符串匹配。移除 --format 标志可查看有关找到的文件夹的更多信息。

      上一条命令不会返回文件夹内子文件夹的 ID。为此,请使用顶级文件夹的 ID 运行以下命令:

      gcloud resource-manager folders list --folder=FOLDER_ID
    • organizations/ORGANIZATION_ID,其中 ORGANIZATION_ID 是用于检查有效 IAM 政策的顶级组织的 ID。

      如何查找 Google Cloud 组织的 ID

      Google Cloud 控制台

      如需查找 Google Cloud 组织的 ID,请完成以下步骤:

      1. 前往 Google Cloud 控制台。

        前往 Google Cloud 控制台

      2. 点击菜单栏中的切换器列表框。
      3. 从列表框中选择您的组织。
      4. 点击全部标签页。组织 ID 显示在组织名称旁边。

      gcloud CLI

      您可以使用以下命令检索 Google Cloud 组织的 ID:

      gcloud organizations describe ORGANIZATION_NAME --format="value(name.segment(1))"
  • ASSET_NAME_#资产全名的逗号分隔列表。

一次最多只能检索 20 项素材资源的政策。

如需了解所有选项,请参阅 gcloud CLI 参考文档

示例

运行以下命令可查看 my-instance Compute Engine 实例上从 ID 为 my-organization-id 的组织继承的有效 IAM 政策。

如何查找 Google Cloud 组织的 ID

Google Cloud 控制台

如需查找 Google Cloud 组织的 ID,请完成以下步骤:

  1. 前往 Google Cloud 控制台。

    前往 Google Cloud 控制台

  2. 点击菜单栏中的切换器列表框。
  3. 从列表框中选择您的组织。
  4. 点击全部标签页。组织 ID 显示在组织名称旁边。

gcloud CLI

您可以使用以下命令检索 Google Cloud 组织的 ID:

gcloud organizations describe ORGANIZATION_NAME --format="value(name.segment(1))"
gcloud asset get-effective-iam-policy \
    --scope=organizations/my-organization-id \
    --names=//compute.googleapis.com/projects/my-project/zones/us-central1-a/instances/my-instance

示例响应

policyResults:
- fullResourceName: //compute.googleapis.com/projects/my-project/zones/us-central1-a/instances/my-instance
  policies:
  - attachedResource: //cloudresourcemanager.googleapis.com/projects/my-project
    policy:
      bindings:
      - members:
        - user:alex@example.com
        - user:bola@example.com
        role: roles/cloudkms.admin
      - members:
        - serviceAccount:000000000000-compute@developer.gserviceaccount.com
        role: roles/editor
  - attachedResource: //cloudresourcemanager.googleapis.com/folders/000000000000
    policy:
      bindings:
      - members:
        - user:cruz@example.com
        role: roles/resourcemanager.folderAdmin
      - members:
        - user:dani@example.com
        role: roles/resourcemanager.folderEditor
  - attachedResource: //cloudresourcemanager.googleapis.com/organizations/0000000000000
    policy:
      bindings:
      - members:
        - user:hao@example.com
        role: organizations/0000000000000/roles/CustomProjectAdmin
      - members:
        - serviceAccount:000000000000@cloudservices.gserviceaccount.com
        - user:ira@example.com
        - user:jie@example.com
        role: roles/accesscontextmanager.policyAdmin

REST

HTTP 方法和网址:

POST https://cloudasset.googleapis.com/v1/SCOPE_PATH/effectiveIamPolicies:batchGet

请求 JSON 正文:

{
  "names": [
    "ASSET_NAME_1",
    "ASSET_NAME_2",
    "..."
  ]
}

请提供以下值:

  • SCOPE_PATH:请使用以下某个值:

    允许使用的值包括:

    • projects/PROJECT_ID,其中 PROJECT_ID 是用于检查有效 IAM 政策的顶级项目的 ID。
    • projects/PROJECT_NUMBER,其中 PROJECT_NUMBER 是用于检查有效 IAM 政策的顶级项目的编号。

      如何查找 Google Cloud 项目编号

      Google Cloud 控制台

      如需查找 Google Cloud 项目编号,请完成以下步骤:

      1. 前往 Google Cloud 控制台中的欢迎页面。

        前往“欢迎”页面

      2. 点击菜单栏中的切换器列表框。
      3. 从列表框中选择您的组织,然后搜索项目名称。 项目名称、项目编号和项目 ID 显示在欢迎标题附近。

        最多显示 4,000 个资源。如果您没有看到要查找的项目,请前往管理资源页面,然后使用该项目的名称过滤列表。

      gcloud CLI

      您可以使用以下命令检索 Google Cloud 项目编号:

      gcloud projects describe PROJECT_ID --format="value(projectNumber)"
    • folders/FOLDER_ID,其中 FOLDER_ID 是用于检查有效 IAM 政策的顶层文件夹的 ID。

      如何查找 Google Cloud 文件夹的 ID

      Google Cloud 控制台

      如需查找 Google Cloud 文件夹的 ID,请完成以下步骤:

      1. 前往 Google Cloud 控制台。

        前往 Google Cloud 控制台

      2. 点击菜单栏中的切换器列表框。
      3. 从列表框中选择您的组织。
      4. 搜索您的文件夹名称。文件夹 ID 显示在文件夹名称旁边。

      gcloud CLI

      您可以使用以下命令检索组织级 Google Cloud 文件夹的 ID:

      gcloud resource-manager folders list \
          --organization=$(gcloud organizations describe ORGANIZATION_NAME \
            --format="value(name.segment(1))") \
          --filter='"DISPLAY_NAME":"TOP_LEVEL_FOLDER_NAME"' \
          --format="value(ID)"

      其中 TOP_LEVEL_FOLDER_NAME 是文件夹名称的部分或完整字符串匹配。移除 --format 标志可查看有关找到的文件夹的更多信息。

      上一条命令不会返回文件夹内子文件夹的 ID。为此,请使用顶级文件夹的 ID 运行以下命令:

      gcloud resource-manager folders list --folder=FOLDER_ID
    • organizations/ORGANIZATION_ID,其中 ORGANIZATION_ID 是用于检查有效 IAM 政策的顶级组织的 ID。

      如何查找 Google Cloud 组织的 ID

      Google Cloud 控制台

      如需查找 Google Cloud 组织的 ID,请完成以下步骤:

      1. 前往 Google Cloud 控制台。

        前往 Google Cloud 控制台

      2. 点击菜单栏中的切换器列表框。
      3. 从列表框中选择您的组织。
      4. 点击全部标签页。组织 ID 显示在组织名称旁边。

      gcloud CLI

      您可以使用以下命令检索 Google Cloud 组织的 ID:

      gcloud organizations describe ORGANIZATION_NAME --format="value(name.segment(1))"
  • ASSET_NAME_#资产全名的数组。

一次最多只能检索 20 项素材资源的政策。

如需了解所有选项,请参阅 REST 参考文档

命令示例

运行以下命令之一,查看 my-instance Compute Engine 实例上从 ID 为 my-organization-id 的组织继承的有效 IAM 政策。

如何查找 Google Cloud 组织的 ID

Google Cloud 控制台

如需查找 Google Cloud 组织的 ID,请完成以下步骤:

  1. 前往 Google Cloud 控制台。

    前往 Google Cloud 控制台

  2. 点击菜单栏中的切换器列表框。
  3. 从列表框中选择您的组织。
  4. 点击全部标签页。组织 ID 显示在组织名称旁边。

gcloud CLI

您可以使用以下命令检索 Google Cloud 组织的 ID:

gcloud organizations describe ORGANIZATION_NAME --format="value(name.segment(1))"

curl(Linux、macOS 或 Cloud Shell)

curl -X POST \
     -H "X-HTTP-Method-Override: GET" \
     -H "Authorization: Bearer $(gcloud auth print-access-token)" \
     -H "Content-Type: application/json; charset=utf-8" \
     -d '{
            "names": [
              "//compute.googleapis.com/projects/my-project/zones/us-central1-a/instances/my-instance"
            ]
          }' \
     https://cloudasset.googleapis.com/v1/organizations/my-organization-id/effectiveIamPolicies:batchGet

PowerShell (Windows)

$cred = gcloud auth print-access-token

$headers = @{ 
  "X-HTTP-Method-Override" = "GET";
  "Authorization" = "Bearer $cred"
}


$body = @"
{
  "names": [
    "//compute.googleapis.com/projects/my-project/zones/us-central1-a/instances/my-instance"
  ]
}
"@

Invoke-WebRequest `
  -Method POST `
  -Headers $headers `
  -ContentType: "application/json; charset=utf-8" `
  -Body $body `
  -Uri "https://cloudasset.googleapis.com/v1/organizations/my-organization-id/effectiveIamPolicies:batchGet" | Select-Object -Expand Content

示例响应

{
  "policyResults": [
    {
      "fullResourceName": "//compute.googleapis.com/projects/my-project/zones/us-central1-a/instances/instance-1",
      "policies": [
        {
          "attachedResource": "//cloudresourcemanager.googleapis.com/projects/my-project",
          "policy": {
            "bindings": [
              {
                "role": "roles/cloudkms.admin",
                "members": [
                  "user:alex@example.com",
                  "user:bola@example.com"
                ]
              },
              {
                "role": "roles/editor",
                "members": [
                  "serviceAccount:000000000000-compute@developer.gserviceaccount.com"
                ]
              }
            ]
          }
        },
        {
          "attachedResource": "//cloudresourcemanager.googleapis.com/folders/000000000000",
          "policy": {
            "bindings": [
              {
                "role": "roles/resourcemanager.folderAdmin",
                "members": [
                  "user:cruz@example.com"
                ]
              },
              {
                "role": "roles/resourcemanager.folderEditor",
                "members": [
                  "user:dani@example.com"
                ]
              }
            ]
          }
        },
        {
          "attachedResource": "//cloudresourcemanager.googleapis.com/organizations/000000000000",
          "policy": {
            "bindings": [
              {
                "role": "organizations/1060291660910/roles/CustomProjectAdmin",
                "members": [
                  "user:hao@example.com"
                ]
              },
              {
                "role": "roles/accesscontextmanager.policyAdmin",
                "members": [
                  "serviceAccount:000000000000@cloudservices.gserviceaccount.com",
                  "user:ira@example.com",
                  "user:jie@example.com"
                ]
              }
            ]
          }
        }
      ]
    }
  ]
}