搜索 IAM 政策

借助 Cloud Asset API,您可以使用自定义查询语言来搜索项目、文件夹或组织内的 Identity and Access Management (IAM) 政策。

准备工作

调用 SearchAllIamPolicies

gcloud

您可以使用 gcloud asset search-all-iam-policies 命令调用 SearchAllIamPolicies。您必须运行 Cloud SDK 302.0.0 或更高版本。您可以使用 gcloud version 命令检查您的版本。

gcloud asset search-all-iam-policies \
  --scope=SCOPE \
  --query=QUERY \
  --page-size=PAGE_SIZE

其中:

  • (可选)SCOPE:范围可以是项目、文件夹或组织。搜索范围仅限于此范围内的 IAM 政策。调用者必须被授予所需范围的 cloudasset.assets.searchAllIamPolicies 权限。如果未指定,将使用已配置的项目属性。如需查找已配置的项目,请运行 gcloud config get-value project。如需更改此设置,请运行 gcloud config set project PROJECT_ID

    允许使用的值包括:

    • projects/PROJECT_ID(例如,“projects/foo-bar”)
    • projects/PROJECT_NUMBER(例如,“projects/12345678”)
    • folders/FOLDER_NUMBER(例如,“folders/1234567”)
    • organizations/ORGANIZATION_NUMBER(例如,“organizations/123456”)
  • (可选)QUERY:查询语句。如需了解详情,请参阅如何构建查询。如果未指定或为空,它将搜索指定 scope 中的所有 IAM 政策。请注意,查询字符串会与每个 IAM 政策绑定进行比较,包括其成员、角色和 IAM 条件。返回的 IAM 政策将仅包含与查询匹配的绑定。如需详细了解 IAM 政策结构,请参阅 IAM 政策文档

    示例:

    • policy:amy@gmail.com,查找指定用户“amy@gmail.com”的 IAM 政策绑定。
    • policy:roles/compute.admin,查找指定 Compute Admin 角色的 IAM 政策绑定。
    • policy:comp*,以查找包含“comp”作为绑定中任何字词的前缀的 IAM 政策绑定。
    • policy.role.permissions:storage.buckets.update,查找指定包含“storage.buckets.update”权限的角色的 Cloud IAM 政策绑定。请注意,如果调用者对角色包含的权限没有 iam.roles.get 访问权限,则指定此角色的政策绑定会从搜索结果中删除。
    • policy.role.permissions:upd* 以查找 IAM,政策绑定将包含“upd”的角色用作绑定中的任何字词的前缀。请注意,如果调用者对角色包含的权限没有 iam.roles.get 访问权限,则指定此角色的政策绑定会从搜索结果中删除。
    • resource:organizations/123456,查找设置在“organizations/123456”上的 IAM 政策绑定。
    • resource=//cloudresourcemanager.googleapis.com/projects/myproject,查找在名为“myproject”的项目上设置的 IAM 政策绑定。
    • Important,查找任何可搜索字段(包含的权限除外)中包含“Important”一词的 IAM 政策绑定。
    • resource:(instance1 OR instance2) policy:amy,查找设置在资源“instance1”或“instance2”上并指定用户“amy”的 IAM 政策绑定。
  • (可选)PAGE_SIZE:搜索结果分页的页面大小。最大值是 500。如果该值设为 0,将选择相应默认值。

  • 查找您的 organizations/123456 中包含 mycompany.com 网域的所有 IAM 政策绑定:

    gcloud asset search-all-iam-policies \
      --scope='organizations/123456' \
      --query='policy:"domain:mycompany.com"'
    
  • 查找您的 organizations/123456 中向 myuser@mycompany.com 授予 Owner (roles/owner) 基本角色的 IAM 政策绑定:

    gcloud asset search-all-iam-policies \
      --scope='organizations/123456' \
      --query='policy:(roles/owner myuser@mycompany.com)'
    
  • 查找您的 organizations/123456 中在 projects/12345678 上设置的所有 IAM 政策绑定:

    gcloud asset search-all-iam-policies \
      --scope='organizations/123456' \
      --query='resource:projects/12345678'
    

API

您可以使用项目的有效 OAuth 令牌调用 SearchAllIamPolicies。要从 Cloud Shell 或可使用 gcloud 命令的任何控制台调用 SearchAllIamPolicies 方法,请执行以下操作:

  1. 如果您尚未配置项目的 OAuth 同意屏幕,则需要进行配置。您将需要在 OAuth 同意屏幕上输入电子邮件地址和产品名称。

    1. 转到项目的 OAuth 同意屏幕
      配置同意屏幕
    2. 输入您要显示的应用名称
    3. 支持电子邮件地址下,选择要显示为公开联系人的电子邮件地址。这必须是您的电子邮件地址或您拥有的 Google 群组。
    4. 根据需要添加任何可选详细信息。
    5. 点击保存。
  2. 为您的项目创建 OAuth 令牌。如需了解详情,请参阅设置 OAuth 2.0

    1. 转到“创建 OAuth 客户端 ID”页面
      创建 OAuth 客户端
    2. 选择桌面应用作为应用类型
    3. 点击创建
  3. 下载 client_secret.json 文件。

    1. 转到“凭据”页面
    2. 在新的客户端 ID 的右侧,点击下载 JSON
    3. 将文件安全地存储在只有您的应用可以访问的位置。
  4. 通过以下命令使用 JSON 文件登录。

    gcloud auth application-default login --client-id-file=YOUR_JSON_FILE
    

    请注意,此命令将提示您打开链接。确保该页面显示您在 OAuth 同意屏幕中设置的应用名称

  5. 使用以下命令为您的帐号生成身份验证令牌:

    TOKEN=$(gcloud auth application-default print-access-token)
    
  6. 您现在可以使用 curl 命令查询 IAM 政策。

    PAGE_SIZE=PAGE_SIZE
    PAGE_TOKEN="PAGE_TOKEN"
    SCOPE="SCOPE"
    QUERY="QUERY"
    curl -s -G \
        -H "Authorization: Bearer $TOKEN" \
        -d "page_size=$PAGE_SIZE" \
        -d "page_token=$PAGE_TOKEN" \
        --data-urlencode "query=$QUERY" \
        "https://cloudasset.googleapis.com/v1/$SCOPE:searchAllIamPolicies"
    
  • (可选)SCOPE:范围可以是项目、文件夹或组织。搜索范围仅限于此范围内的 IAM 政策。调用者必须被授予所需范围的 cloudasset.assets.searchAllIamPolicies 权限。

    允许使用的值包括:

    • projects/PROJECT_ID(例如,“projects/foo-bar”)
    • projects/PROJECT_NUMBER(例如,“projects/12345678”)
    • folders/FOLDER_NUMBER(例如,“folders/1234567”)
    • organizations/ORGANIZATION_NUMBER(例如,“organizations/123456”)
  • (可选)QUERY:查询语句。如需了解详情,请参阅如何构建查询。如果未指定或为空,它将搜索指定 scope 中的所有 IAM 政策。请注意,查询字符串会与每个 IAM 政策绑定进行比较,包括其成员、角色和 IAM 条件。返回的 IAM 政策将仅包含与查询匹配的绑定。如需详细了解 IAM 政策结构,请参阅 IAM 政策文档

    示例:

    • policy:amy@gmail.com,查找指定用户“amy@gmail.com”的 IAM 政策绑定。
    • policy:roles/compute.admin,查找指定 Compute Admin 角色的 IAM 政策绑定。
    • policy:comp*,以查找包含“comp”作为绑定中任何字词的前缀的 IAM 政策绑定。
    • policy.role.permissions:storage.buckets.update,查找指定包含“storage.buckets.update”权限的角色的 Cloud IAM 政策绑定。请注意,如果调用者对角色包含的权限没有 iam.roles.get 访问权限,则指定此角色的政策绑定会从搜索结果中删除。
    • policy.role.permissions:upd* 以查找 IAM,政策绑定将包含“upd”的角色用作角色权限中的任何字词的前缀。请注意,如果调用者对角色包含的权限没有 iam.roles.get 访问权限,则指定此角色的政策绑定会从搜索结果中删除。
    • resource:organizations/123456,查找设置在“organizations/123456”上的 IAM 政策绑定。
    • resource=//cloudresourcemanager.googleapis.com/projects/myproject,查找在名为“myproject”的项目上设置的 IAM 政策绑定。
    • Important,查找任何可搜索字段(包含的权限除外)中包含“Important”一词的 IAM 政策绑定。
    • resource:(instance1 OR instance2) policy:amy,查找设置在资源“instance1”或“instance2”上并指定用户“amy”的 IAM 政策绑定。
  • (可选)PAGE_SIZE:搜索结果分页的页面大小。最大值是 2000。如果该值设为 0,将选择相应默认值。

  • (可选)PAGE_TOKEN:表示对此方法的上一次调用的下一批结果的令牌。page_token 必须与上一次调用的响应中 next_page_token 的值相同。

客户端库和 API 参考文档

如何构建查询

如需详细了解查询语言,请参阅查询语法

如需详细了解各种实际用例的示例查询,请参阅搜索 IAM 政策示例

按绑定信息查询 IAM 政策

要搜索 IAM 政策,查询表达式将采用以下格式:

policy:QUERY

成员

IAM 政策绑定支持五种类型的成员

  1. Google 帐号,例如 user:user@gmail.com
  2. Google 群组,例如 group:devs@googlegroups.com
  3. Cloud Identity 和 G Suite 网域,例如 domain:google.com
  4. 服务帐号,例如 serviceAccount:my-other-app@appspot.gserviceaccount.com
  5. 特殊标识符,例如 allUsersallAuthenticatedUsers

您可以使用以下语法将对政策的查询限制为与特定用户相关:

policy:"user:amy@mycompany.com"

请注意,user:amy@mycompany.com 必须带有双引号,因为它包含特殊字符 :。如果查询值足够独特,或者您想要搜索电子邮件地址,而不管成员类型为何,则可以省略查询字符串中的 user:group: 前缀。例如,以下查询可能仅匹配一个用户:

policy:amy@mycompany.com
示例:按成员查询
  • 查找指定用户 Amy 的所有 IAM 政策绑定:

    policy:amy
    
  • 查找指定网域 mydomain.com 的所有 IAM 政策绑定:

    policy:mydomain.com
    
  • 查找指定用户 AmyJohn 的所有 IAM 政策绑定:

    policy:(amy john)
    
  • 查找指定用户 AmyJohn 的所有 IAM 政策绑定:

    policy:(amy OR john)
    
  • 在您的组织中查找包含 amy@mycompany.com 的所有 IAM 政策绑定:

    policy:amy@mycompany.com
    
  • 在您的组织中查找包含 mycompany.com 网域的所有 IAM 政策绑定:

    policy:"domain:mycompany.com"
    
  • 查找为 mycompany.gserviceaccount.com 服务帐号分配角色的所有 IAM 政策绑定:

    policy:"serviceAccount:mycompany.gserviceaccount.com"
    
  • 查找为 admins 群组分配角色的所有 IAM 政策绑定:

    policy:"group:admins"
    
  • 查找为所有用户分配角色的所有 IAM 政策绑定:

    policy:allUsers
    
  • 查找为所有经过身份验证的用户分配角色的所有 IAM 政策绑定:

    policy:allAuthenticatedUsers
    
  • 查找为 amy@mycompany.commycompany.com 网域分配角色的所有 IAM 政策绑定:

    policy:(amy@mycompany.com OR "domain:mycompany.com")
    

角色

IAM 政策绑定支持不同类型的角色。所有 IAM 角色名称都以 roles/ 前缀开头。

  1. 基本角色:引入 IAM 之前就存在的三个角色:Owner (roles/owner)、Editor (roles/editor) 和 Viewer (roles/viewer)。
  2. 预定义角色:IAM 提供预定义角色,可授予对不同资源的精细访问权限。查看所有预定义角色
  3. 自定义角色:用户定义的 IAM 角色,包含一组经过挑选的权限。

您可以使用以下语法将对政策的查询限制为与特定角色相关:

policy:roles/role-name

请注意,如果查询值足够独特,您可以将查询字符串中的 roles/ 前缀省略。例如,以下查询可能只匹配角色 roles/cloudasset.owner

policy:cloudasset.owner
示例:按角色查询
  • 查找指定 owner 角色的所有 IAM 政策绑定。

    policy:roles/owner
    
  • 查找向 amy@mycompany.com 分配 Owner 角色的所有 IAM 政策绑定:

    policy:(roles/owner amy@mycompany.com)
    
  • 查找将 compute.admin 角色分配给电子邮件地址包含 john 的成员的所有 IAM 政策绑定:

    policy:(roles/compute.admin john)
    
  • 查找将 viewer 角色授予前缀为“swe”或“sde”的用户的所有 IAM 政策绑定。

    policy:(roles/viewer (swe* OR sde*))
    

按包含的权限查询 IAM 政策

政策中的角色可能包含一组权限。如需了解详情,请参阅 IAM 权限参考。您可以将查询限制为包含特定权限的政策。查询表达式采用以下格式:

  • 完全匹配:policy.role.permissions=QUERY
  • 部分匹配:policy.role.permissions:QUERY
示例:按权限查询
  • 查找包含 compute.instances.create 权限的所有 IAM 政策绑定。

    policy.role.permissions:compute.instances.create
    policy.role.permissions=compute.instances.create
    
  • 查找包含 compute.instances 相关权限的所有 IAM 政策绑定。

    policy.role.permissions:compute.instances
    
  • 查找包含权限 cloudasset.assets.export...(例如 cloudasset.assets.exportAssetscloudasset.assets.exportIamPolicyAnalysis)的所有 IAM 政策绑定:

    policy.role.permissions:cloudasset.assets.export*
    
  • 查找授予更改 IAM 政策的权限的所有 IAM 政策绑定。

    policy.role.permissions:setIamPolicy
    
  • 查找包含同时具有 compute.instances.createcompute.disks.create 权限的角色的所有 IAM 政策绑定。

    policy.role.permissions:(compute.instances.create compute.disks.create)
    
  • 查找包含 compute.instances.create 权限并指定用户 amy 的所有 IAM 政策绑定。

    policy.role.permissions:compute.instances.create policy:amy
    policy.role.permissions=compute.instances.create policy:amy
    

按资源名称查询 IAM 政策

执行搜索时,您可以指定完整资源名称,以便仅搜索直接在该资源上设置的政策。查询表达式采用以下格式:

  • 完全匹配:resource=QUERY
  • 部分匹配:resource:QUERY

示例:按资源名称查询

  • 查找对完整资源名称完全匹配 //cloudresourcemanager.googleapis.com/projects/myproject 的资源直接设置的所有 IAM 政策绑定:

    resource=//cloudresourcemanager.googleapis.com/projects/myproject
    
  • 查找其完整资源名称包含 myproject 字样的所有资源的所有 IAM 政策绑定:

    resource:myproject
    
  • 查找对资源的完整资源名称包含前缀为 myproj 的字词的所有 IAM 政策绑定:

    resource:myproj*
    
  • 查找直接在给定服务类型的资源上设置的所有 IAM 政策绑定:

    resource:cloudresourcemanager
    
  • 查找在 myprojectmyfolder 上设置的所有 IAM 政策绑定:

    resource:(myproject OR myfolder)
    
  • 查找在 cloudresourcemanager 资源上设置并将 Owner 角色分配给 gmail.com 用户的所有 IAM 政策绑定:

    resource:cloudresourcemanager policy:(roles/owner gmail.com)
    

按自由文本查询 IAM 政策

您也可以直接使用自由文本查询,而无需指定字段。然后,只要有可搜索字段(例如政策绑定字段、资源名称)与查询匹配,它就会返回政策。

示例:按自由文本查询

  • 查找您的 scope 中元数据字段(例如,政策绑定、资源名称)包含 Important 一词的所有 IAM 政策绑定:

    Important
    
  • 查找您的 scope 中元数据字段(例如,政策绑定、资源名称)包含任何词前缀的 import 的所有 IAM 政策绑定:

    import*