角色建议概览

使用集合让一切井井有条 根据您的偏好保存内容并对其进行分类。

角色建议可以帮助您识别并移除主帐号的多余权限,从而改善资源的安全配置。

角色建议概览

角色建议是 Recommender 所生成的建议类型之一。

每个角色建议都会针对授予多余主帐号权限的角色提出移除或替换建议。这些建议可大规模提供,通过确保主帐号仅拥有其实际需要的权限,来帮助您强制执行最小权限原则。

Recommender 使用政策数据分析来识别多余的权限。政策数据分析是基于主帐号权限使用情况的基于机器学习的发现结果。

一些建议还与横向移动数据分析相关。这些数据分析用于标识允许一个项目中的服务帐号模拟另一个项目中的服务帐号的角色。如需了解详情,请参阅横向移动数据分析是如何生成的

如何生成政策数据分析

Recommender 通过将每个主帐号在过去 90 天内使用的权限与其拥有的总权限进行比较,来生成政策数据分析。主帐号使用权限的方式有几种:

  • 直接方式,即通过调用需要相应权限的 API

    例如,IAM REST API 中的 roles.list 方法需要 iam.roles.list 权限。如果您调用 roles.list 方法,则可以使用 iam.roles.list 权限。

    同样,针对资源调用 testIamPermissions 方法时,您实际上是使用您要测试的所有权限。

  • 间接方式,即通过 Google Cloud Console 使用 Google Cloud 资源

    例如,在 Google Cloud Console 中,您可以修改 Compute Engine 虚拟机实例,该实例根据您更改的设置需要不同的权限。但是,Google Cloud 控制台还会显示需要 compute.instances.get 权限的现有设置。

    因此,在 Google Cloud Console 中修改虚拟机实例时,请使用 compute.instances.get 权限。

Recommender 会使用机器学习在主帐号的当前角色中确定主帐号将来可能需要的权限,即使主帐号在过去 90 天内未使用这些权限也一样。如需了解详情,请参阅本页面上的政策数据分析的机器学习

系统不会为所有 IAM 角色绑定生成政策数据分析。如需详细了解为何某些角色绑定可能没有政策数据分析,请参阅本页面上的可用性

如需了解如何管理政策数据分析,请参阅管理项目、文件夹和组织的政策数据分析管理 Cloud Storage 存储分区的政策数据分析

政策数据分析的机器学习

在某些情况下,主帐号可能需要获得其当前角色中包含的某些权限,但他们最近并未使用过这些权限。为了确定这些权限,Recommender 将在生成政策数据分析时使用机器学习 (ML) 模型。

此机器学习模型会针对多组信号进行训练:

  • 观察历史记录中的常见同现模式:用户过去使用了权限 A、B、C 这一事实给出了一个提示,A、B、C 权限可能在某种程度上是相关的,在 Google Cloud 上执行任务时需要一起用到这些权限。如果机器学习模型足够频繁地观察到该模式,则下次其他用户使用权限 A 和 B 时,模型会建议该用户可能也需要权限 C。

  • 角色定义中编码的领域知识:IAM 提供数百种不同的、特定于服务的预定义角色。如果某个预定义角色包含一组权限,则很大程度上意味着这些权限应该一起授予。

除了这些信号之外,该模型还使用词嵌入 (word embedding) 来计算权限在语义上的相似程度。嵌入后,语义相似的权限会彼此“接近”,且更有可能一起授予。例如,嵌入后,bigquery.datasets.getbigquery.tables.list 彼此非常接近。

Recommender 机器学习流水线中使用的所有数据都具有 k-匿名性,这意味着无法重新确定匿名数据集中的个别项。为了实现此级别的匿名性,我们会放弃所有个人身份信息 (PII),例如与每种权限使用模式相关的用户 ID。然后,我们会放弃在 Google Cloud 中出现频率不够的所有使用模式。系统会根据此匿名数据对全局模型进行训练。

联合学习是在不导出数据的情况下训练机器学习模型的机器学习过程。您可以使用“联合学习”为每个组织进一步自定义全局模型。

如何生成角色建议

如果政策数据分析表明主帐号不需要其角色中的所有权限,则 Recommender 会评估该角色以确定是否可以撤消该角色或者是否存在另一个更适合的角色。如果可以撤消该角色,Recommender 会生成一个角色建议,以便您撤消该角色。如果存在另一个更适合的角色,Recommender 会生成一个角色建议,以便您将该角色替换为建议的角色。此建议的角色可能是新的自定义角色、现有的自定义角色,或者一个或多个预定义角色。除非是针对 Google 管理的服务帐号的建议,否则角色建议绝不会建议提高主帐号的访问权限级别。

系统仅根据 IAM 访问权限控制生成角色建议。它们不考虑其他类型的访问权限控制,例如访问控制列表 (ACL) 和 Kubernetes 基于角色的访问权限控制 (RBAC)。如果您使用其他类型的访问权限控制,请在查看建议时格外小心,并考虑这些访问权限控制如何与您的允许政策相关。

此外,系统不会为所有 IAM 角色绑定生成角色建议。如需详细了解为何某些角色绑定可能没有角色建议,请参阅本页面上的可用性

角色建议中的新自定义角色

如果 Recommender 建议替换角色,则始终会建议看起来更适合主帐号需求的现有自定义角色或者一个或多个预定义角色。

如果 Recommender 发现组织中存在未映射到现有预定义角色或自定义角色的常见权限使用模式,则可能还会建议您创建新的项目级层自定义角色。此自定义角色仅包含建议的权限。您可以通过添加或移除权限来修改自定义角色建议。

如果您希望严格执行最低权限原则,请选择新的自定义角色。Recommender 会在项目级层创建自定义角色。您负责维护和更新项目的自定义角色。

如果您希望使用 Google 管理的角色,请选择预定义角色。Google Cloud 会定期通过添加或移除权限来更新这些角色。如需接收有关这些更新的通知,请订阅权限更改日志的新闻 Feed。如果您选择预定义角色,则主帐号将继续拥有至少几项权限,而且可能还有大量未使用的权限。

Recommender 在以下情况下不建议新的自定义角色:

  • 建议是针对文件夹或组织级角色。
  • 您的组织已拥有 100 个或更多自定义角色。
  • 您的项目已拥有 25 个或更多自定义角色。

此外,Recommender 在每个项目中每天最多建议 5 个新的自定义角色,并且在整个组织中每天最多建议 15 个新的自定义角色。

横向移动数据分析是如何生成的

横向移动是指一个项目中的服务帐号有权模拟另一个项目中的服务帐号。例如,服务帐号可能是在项目 A 中创建的,但具有在项目 B 中模拟服务帐号的权限。

这些权限可能导致项目之间发生一系列模拟,这些模拟会为主帐号授予对资源的意外访问权限。例如,如果主帐号模拟项目 A 中的服务帐号,则主帐号可以使用该服务帐号模拟项目 B 中的服务帐号。如果项目 B 中的服务帐号有权模拟组织中其他项目中的其他服务帐号,则主帐号可以继续使用服务帐号模拟从项目移动到项目,从而在移动时获取权限。

Recommender 通过确定符合以下条件的条件角色绑定来生成横向移动数据分析:

  • 角色绑定中的主帐号是未在项目中创建的服务帐号。
  • 该角色包含以下权限之一,可让主帐号模拟服务帐号:

    • iam.serviceAccounts.actAs
    • iam.serviceAccounts.getAccessToken
    • iam.serviceAccounts.getOpenIdToken
    • iam.serviceAccounts.implicitDelegation
    • iam.serviceAccounts.signBlob
    • iam.serviceAccounts.signJwt

如果角色绑定符合这些条件,Recommender 会生成绑定的横向移动数据分析。此数据分析包含服务帐号模拟能力的相关信息,包括它可以模拟哪些服务帐号,以及在过去 90 天内是否使用了任何模拟权限。

Recommender 本身不会使用横向移动数据分析来生成新的角色建议。这是因为,如果服务帐号在使用其模拟权限,Recommender 无法安全地建议移除它们。但是,如果由于这些权限未被使用,因此角色建议推荐移除它们,则 Recommender 会将横向移动数据分析关联到该建议。如果服务帐号跨项目具有强大且未使用的模拟权限,此关联可帮助您优先处理这些服务帐号的角色建议。

如需了解如何管理横向移动数据分析,请参阅管理横向移动数据分析

可用情况

系统不会为每个角色绑定生成政策数据分析和角色建议。请阅读以下部分,了解系统会为哪些角色绑定生成政策数据分析和建议。

政策数据分析可用性

要让 Recommender 为角色绑定生成政策数据分析,必须满足以下条件:

  • 包含角色绑定的 IAM 允许政策必须附加到以下资源之一:

    • Cloud Storage 存储桶
    • 项目
    • 文件夹
    • 组织

    Recommender 仅针对在这些资源上授予的角色生成政策数据分析。

  • 角色绑定不得具有条件。Recommender 不会为条件角色绑定生成政策数据分析。

Recommender 最长可能需要 10 天才能为新角色绑定生成政策数据分析。

横向移动数据分析可用性

系统会针对以下资源上的角色绑定生成横向移动数据分析:

  • 组织
  • 文件夹
  • 项目
  • 服务帐号

角色建议可用性

要让 Recommender 为角色绑定生成角色建议,必须满足以下条件:

  • 角色绑定必须具有与之关联的政策数据分析。此政策数据分析可作为建议的依据。
  • 角色绑定存在的时间必须超过 90 天。这样可确保 Recommender 有足够的使用情况数据来提出建议。
  • 如果角色绑定中的主帐号是 Google 管理的服务帐号,则角色绑定必须是 Owner、Editor 或 Viewer。Recommender 不会为具有其他角色的 Google 管理的服务帐号生成角色建议。如需了解详情,请参阅针对 Google 管理的服务帐号的角色建议

如果角色绑定没有任何数据分析或已经 90 天不存在,则 Google Cloud Console 中的已分析的权限列将显示 图标。

在某些情况下,Recommender 不会为存在时间超过 90 天且具有与之关联的数据分析的角色绑定生成角色建议。发生上述情况的原因如下:

  • 没有比当前角色更合适的预定义 IAM 角色。如果主帐号已具有预定义角色,且该角色可最大限度地减少其权限数量,或者所包含的权限数量少于其他预定义角色,则 Recommender 就不能推荐其他预定义角色。

    您可以通过为主帐号创建自定义角色来减少该主帐号的权限数量。

  • 主帐号是 Google 管理的服务帐号,且该角色不是基本角色。只有 Google 管理的服务帐号具有基本角色(Owner、Editor 或 Viewer)时,Recommender 才会为该服务帐号生成角色建议。如需了解详情,请参阅针对 Google 管理的服务帐号的角色建议

  • 没有其他主帐号拥有项目的 Owner 基本角色。至少有一个主帐号必须具有每个项目的 Owner 角色 (roles/owner)。如果只有一个主帐号具有此角色,则 Recommender 不会建议您撤消或替换该角色。

在这些情况下,Google Cloud 控制台中的已分析的权限列将显示主帐号的权限使用情况,但没有建议可用 图标。

优先级和严重程度

建议优先级和数据分析严重程度有助于您了解建议或数据分析的紧急程度,并据此排定优先级。

角色建议优先级

系统根据建议的紧急程度为其分配优先级。优先级范围为 P0(最高优先级)到 P4(最低优先级)。

角色建议的优先级取决于建议针对的角色绑定:

建议详细信息 优先级 说明
用于授予公开访问 Cloud Storage 存储分区的角色绑定的建议 P1 可公开访问的存储分区可供互联网上的任何人访问。移除公开访问权限后,您可以更好地控制您的数据。
针对在项目、文件夹或组织上授予基本角色(Owner、Editor 和 Viewer)的角色绑定的建议 P2 基本角色具有极大的权限,为这些角色采纳建议可以大大减少您过度授予的权限。
不授予公共访问权限或基本角色的建议 P4 虽然这些建议可帮助您减少多余的权限,但它们不会移除公开访问权限或高度宽松的基本角色,因此优先级较低。

数据分析的严重程度

系统根据数据分析的紧急程度为其分配严重性级别。严重性级别可以是 LOWMEDIUMHIGHCRITICAL

政策数据分析的严重程度取决于数据分析对应的角色绑定:

数据分析详细信息 严重程度 说明
可授予对 Cloud Storage 存储分区的公开访问权限的角色绑定的数据分析 CRITICAL 可公开访问的存储分区可供互联网上的任何人访问。移除公开访问权限后,您可以更好地控制您的数据。
可针对项目、文件夹或组织授予基本角色(Owner、Editor 和 Viewer)的角色绑定的数据分析 HIGH 基本角色具有极大的权限,处理这些角色的数据分析可能会大大减少过度授予的权限。
不授予公共访问权限或基本角色的数据分析 LOW 虽然这些数据分析结果突出显示了多余的权限,但它们不涉及公共访问权限或高度宽松的基本角色,因此优先级较低。

所有横向移动数据分析的严重程度均为 LOW

角色建议的应用方式

Recommender 不会自动应用建议,而是您必须查看建议并决定是应用还是拒绝建议。如需了解如何查看、应用和忽略角色建议,请参阅查看并应用针对项目、文件夹和组织的角色建议查看和应用 Cloud Storage 存储分区的角色建议

审核日志记录

每当您应用或拒绝建议,Recommender 会创建一个日志条目。您可以在建议历史记录中查看这些条目,也可以在 Google Cloud 审核日志中查看它们

角色建议子类型

角色建议根据其建议执行的操作可分为几个不同的子类型。如果您使用 gcloud CLI 或 REST API,则可以使用这些子类型来过滤建议。

子类型 说明
REMOVE_ROLE 建议移除主帐号的项目级、文件夹级或组织级角色。
REMOVE_ROLE_STORAGE_BUCKET 移除主帐号存储桶级角色的建议。
REPLACE_ROLE 建议将主帐号的项目级、文件夹级或组织级角色替换为权限较少的角色。建议的替代角色可能是现有的自定义角色,也可能是一个或多个预定义角色。
REPLACE_ROLE_CUSTOMIZABLE 建议使用新的自定义角色替换主帐号的角色,该角色的权限比当前角色宽松。
REPLACE_ROLE_STORAGE_BUCKET 建议将主帐号存储桶级角色替换为权限较少的角色。建议的替代角色可能是现有的自定义角色,也可能是一个或多个预定义角色。
SERVICE_AGENT_WITH_DEFAULT_ROLE 用于将 Google 所管理服务帐号的 Owner、Editor 或 Viewer 角色替换为在创建该服务帐号时自动授予它的角色的建议。如需了解详情,请参阅针对 Google 管理的服务帐号的建议
SERVICE_AGENT_WITHOUT_DEFAULT_ROLE 用于将 G Suite 服务帐号的 Owner、Editor 或 Viewer 角色替换为权限较少的角色的建议。如需了解详情,请参阅针对 Google 管理的服务帐号的建议

针对 Google 管理的服务帐号的角色建议

对于 Google 管理的服务帐号,Recommender 仅针对具有基本角色(Owner、Editor 或 Viewer)的角色绑定提供建议。

针对 Google 管理的服务帐号的建议分为两个建议子类型。

SERVICE_AGENT_WITH_DEFAULT_ROLE

某些 Google 管理的服务帐号在创建时会自动获得服务代理角色,以确保您的 Google Cloud 服务正常运行。如果您将此角色替换为基本角色(Owner、Editor 或 Viewer),角色建议可能会建议您恢复最初的服务代理角色以移除多余的权限,即使服务代理角色拥有基本角色中不包含的权限也是如此。这些建议的子类型为 SERVICE_AGENT_WITH_DEFAULT_ROLE。它们可帮助您安全移除多余的权限,同时确保所有 Google Cloud 服务正常运行。

只有 SERVICE_AGENT_WITH_DEFAULT_ROLE 建议可能推荐具有的权限不属于当前角色的角色。

SERVICE_AGENT_WITHOUT_DEFAULT_ROLE

如果 Google 管理的服务帐号在创建时没有自动获得角色,则服务帐号的建议将仅基于该服务帐号使用的权限。这些建议的子类型为 SERVICE_AGENT_WITHOUT_DEFAULT_ROLE

角色建议示例

以下示例展示了您可能会收到的建议类型。

撤消现有角色

用户 my-user@example.com 被授予项目的 Browser 角色。Browser 角色包含六项权限,可让用户查看项目中的资源。不过,在过去 90 天内,my-user@example.com 尚未查看任何资源。

因此,Recommender 会生成角色建议,来建议您撤消 my-user@example.com 的 Browser 角色:

控制台

gcloud

{
  "associatedInsights": [
    {
      "insight": "projects/123456789012/locations/global/insightTypes/google.iam.policy.Insight/insights/86c14538-dcfd-4326-afe5-ee8ac921e06a"
    }
  ],
  "content": {
    "operationGroups": [
      {
        "operations": [
          {
            "action": "remove",
            "path": "/iamPolicy/bindings/*/members/*",
            "pathFilters": {
              "/iamPolicy/bindings/*/condition/expression": "",
              "/iamPolicy/bindings/*/members/*": "user:my-user@example.com",
              "/iamPolicy/bindings/*/role": "roles/browser"
            },
            "resource": "//cloudresourcemanager.googleapis.com/projects/123456789012",
            "resourceType": "cloudresourcemanager.googleapis.com/Project"
          }
        ]
      }
    ],
    "overview": {
      "member": "user:my-user@example.com",
      "removedRole": "roles/browser",
      "resource": "//cloudresourcemanager.googleapis.com/projects/123456789012"
    }
  },
  "description": "This role has not been used during the observation window.",
  "etag": "\"9fc3241da8bfab51\"",
  "lastRefreshTime": "2022-05-20T07:00:00Z",
  "name": "projects/123456789012/locations/global/recommenders/google.iam.policy.Recommender/recommendations/fe512038-5455-49g1-8f9c-752e31c8c154",
  "primaryImpact": {
    "category": "SECURITY",
    "securityProjection": {
      "details": {
        "revokedIamPermissionsCount": 6
      }
    }
  },
  "priority": "P4",
  "recommenderSubtype": "REMOVE_ROLE",
  "stateInfo": {
    "state": "ACTIVE"
  }
}

REST

{
  "name": "projects/123456789012/locations/global/recommenders/google.iam.policy.Recommender/recommendations/fe512038-5455-49g1-8f9c-752e31c8c154",
  "description": "This role has not been used during the observation window.",
  "lastRefreshTime": "2022-05-20T07:00:00Z",
  "primaryImpact": {
    "category": "SECURITY",
    "securityProjection": {
      "details": {
        "revokedIamPermissionsCount": 6
      }
    }
  },
  "content": {
    "operationGroups": [
      {
        "operations": [
          {
            "action": "remove",
            "resourceType": "cloudresourcemanager.googleapis.com/Project",
            "resource": "//cloudresourcemanager.googleapis.com/projects/123456789012",
            "path": "/iamPolicy/bindings/*/members/*",
            "pathFilters": {
              "/iamPolicy/bindings/*/condition/expression": "",
              "/iamPolicy/bindings/*/members/*": "user:my-user@example.com",
              "/iamPolicy/bindings/*/role": "roles/browser"
            }
          }
        ]
      }
    ],
    "overview": {
      "resource": "//cloudresourcemanager.googleapis.com/projects/123456789012",
      "member": "user:my-user@example.com",
      "removedRole": "roles/browser"
    }
  },
  "stateInfo": {
    "state": "ACTIVE"
  },
  "etag": "\"9fc3241da8bfab51\"",
  "recommenderSubtype": "REMOVE_ROLE",
  "associatedInsights": [
    {
      "insight": "projects/123456789012/locations/global/insightTypes/google.iam.policy.Insight/insights/86c14538-dcfd-4326-afe5-ee8ac921e06a"
    }
  ],
  "priority": "P4"
}

替换现有角色

服务帐号被授予项目的 Editor 角色 (roles/editor)。 此基本角色包含 3000 多项权限,并且可授予针对项目的广泛访问权限。不过,在过去 90 天内,该服务帐号仅使用了其中的少数权限。

因此,Recommender 会生成角色建议,来建议您撤消 Editor 角色,并将其替换为其他两个角色的组合,从而移除数千项过度授予的权限:

控制台

gcloud

{
  "associatedInsights": [
    {
      "insight": "projects/123456789012/locations/global/insightTypes/google.iam.policy.Insight/insights/3d4ef3d6-bdf0-4330-975d-c65cb929c44d"
    }
  ],
  "content": {
    "operationGroups": [
      {
        "operations": [
          {
            "action": "add",
            "path": "/iamPolicy/bindings/*/members/-",
            "pathFilters": {
              "/iamPolicy/bindings/*/condition/expression": "",
              "/iamPolicy/bindings/*/role": "roles/iam.serviceAccountUser"
            },
            "resource": "//cloudresourcemanager.googleapis.com/projects/123456789012",
            "resourceType": "cloudresourcemanager.googleapis.com/Project",
            "value": "user:my-user@example.com"
          },
          {
            "action": "add",
            "path": "/iamPolicy/bindings/*/members/-",
            "pathFilters": {
              "/iamPolicy/bindings/*/condition/expression": "",
              "/iamPolicy/bindings/*/role": "roles/storage.objectAdmin"
            },
            "resource": "//cloudresourcemanager.googleapis.com/projects/123456789012",
            "resourceType": "cloudresourcemanager.googleapis.com/Project",
            "value": "user:my-user@example.com"
          },
          {
            "action": "remove",
            "path": "/iamPolicy/bindings/*/members/*",
            "pathFilters": {
              "/iamPolicy/bindings/*/condition/expression": "",
              "/iamPolicy/bindings/*/members/*": "user:my-user@example.com",
              "/iamPolicy/bindings/*/role": "roles/editor"
            },
            "resource": "//cloudresourcemanager.googleapis.com/projects/123456789012",
            "resourceType": "cloudresourcemanager.googleapis.com/Project"
          }
        ]
      }
    ],
    "overview": {
      "addedRoles": [
        "roles/iam.serviceAccountUser",
        "roles/storage.objectAdmin"
      ],
      "member": "user:my-user@example.com",
      "minimumObservationPeriodInDays": "0",
      "removedRole": "roles/editor",
      "resource": "//cloudresourcemanager.googleapis.com/projects/123456789012"
    }
  },
  "description": "Replace the current role with smaller predefined roles to cover the permissions needed.",
  "etag": "\"0da9a354c2a83d96\"",
  "lastRefreshTime": "2022-06-22T07:00:00Z",
  "name": "projects/123456789012/locations/global/recommenders/google.iam.policy.Recommender/recommendations/4637db3d-dba5-45eb-95ac-b4ee4b4cd14e",
  "primaryImpact": {
    "category": "SECURITY",
    "securityProjection": {
      "details": {
        "revokedIamPermissionsCount": 2998
      }
    }
  },
  "priority": "P2",
  "recommenderSubtype": "REPLACE_ROLE",
  "stateInfo": {
    "state": "ACTIVE"
  }
}

REST

{
  "name": "projects/123456789012/locations/global/recommenders/google.iam.policy.Recommender/recommendations/4637db3d-dba5-45eb-95ac-b4ee4b4cd14e",
  "description": "Replace the current role with smaller predefined roles to cover the permissions needed.",
  "lastRefreshTime": "2022-06-22T07:00:00Z",
  "primaryImpact": {
    "category": "SECURITY",
    "securityProjection": {
      "details": {
        "revokedIamPermissionsCount": 2998
      }
    }
  },
  "content": {
    "operationGroups": [
      {
        "operations": [
          {
            "action": "add",
            "resourceType": "cloudresourcemanager.googleapis.com/Project",
            "resource": "//cloudresourcemanager.googleapis.com/projects/123456789012",
            "path": "/iamPolicy/bindings/*/members/-",
            "value": "user:my-user@example.com",
            "pathFilters": {
              "/iamPolicy/bindings/*/condition/expression": "",
              "/iamPolicy/bindings/*/role": "roles/iam.serviceAccountOwner"
            }
          },
          {
            "action": "add",
            "resourceType": "cloudresourcemanager.googleapis.com/Project",
            "resource": "//cloudresourcemanager.googleapis.com/projects/123456789012",
            "path": "/iamPolicy/bindings/*/members/-",
            "value": "user:my-user@example.com",
            "pathFilters": {
              "/iamPolicy/bindings/*/condition/expression": "",
              "/iamPolicy/bindings/*/role": "roles/storage.objectAdmin"
            }
          },
          {
            "action": "remove",
            "resourceType": "cloudresourcemanager.googleapis.com/Project",
            "resource": "//cloudresourcemanager.googleapis.com/projects/123456789012",
            "path": "/iamPolicy/bindings/*/members/*",
            "pathFilters": {
              "/iamPolicy/bindings/*/condition/expression": "",
              "/iamPolicy/bindings/*/members/*": "user:my-user@example.com",
              "/iamPolicy/bindings/*/role": "roles/editor"
            }
          }
        ]
      }
    ],
    "overview": {
      "resource": "//cloudresourcemanager.googleapis.com/projects/123456789012",
      "member": "user:my-user@example.com",
      "removedRole": "roles/editor",
      "addedRoles": [
        "roles/iam.serviceAccountUser",
        "roles/storage.objectAdmin"
      ],
      "minimumObservationPeriodInDays": "0"
    }
  },
  "stateInfo": {
    "state": "ACTIVE"
  },
  "etag": "\"0da9a354c2a83d96\"",
  "recommenderSubtype": "REPLACE_ROLE",
  "associatedInsights": [
    {
      "insight": "projects/123456789012/locations/global/insightTypes/google.iam.policy.Insight/insights/3d4ef3d6-bdf0-4330-975d-c65cb929c44d"
    }
  ],
  "priority": "P2"
}

创建自定义角色

用户 my-user@example.com 被授予项目的 Cloud Trace Admin 角色 (roles/cloudtrace.admin)。该角色包含 10 项以上的权限,但政策数据分析表明,在过去 90 天内,my-user@example.com 仅使用了其中 4 项权限。

因此,Recommender 会生成一个角色建议,来建议您创建一个仅包含 my-user@example.com 实际使用的权限的自定义角色:

控制台

gcloud

REPLACE_ROLE_CUSTOMIZABLE 子类型用于指明 Recommender 建议创建一个具有所使用的权限的自定义角色。如需查看使用的权限,请获取关联的政策数据分析

{
  "associatedInsights": [
    {
      "insight": "projects/123456789012/locations/global/insightTypes/google.iam.policy.Insight/insights/2799dc04-b12e-4cf6-86aa-d81907d31f58"
    }
  ],
  "associatedResourceNames": [
    "//cloudresourcemanager.googleapis.com/projects/123456789012"
  ],
  "content": {
    "operationGroups": [
      {
        "operations": [
          {
            "action": "add",
            "path": "/iamPolicy/bindings/*/members/-",
            "pathFilters": {
              "/iamPolicy/bindings/*/condition/expression": "",
              "/iamPolicy/bindings/*/role": "roles/cloudtrace.user"
            },
            "resource": "//cloudresourcemanager.googleapis.com/projects/123456789012",
            "resourceType": "cloudresourcemanager.googleapis.com/Project",
            "value": "user:my-user@example.com"
          },
          {
            "action": "remove",
            "path": "/iamPolicy/bindings/*/members/*",
            "pathFilters": {
              "/iamPolicy/bindings/*/condition/expression": "",
              "/iamPolicy/bindings/*/members/*": "user:my-user@example.com",
              "/iamPolicy/bindings/*/role": "roles/cloudtrace.admin"
            },
            "resource": "//cloudresourcemanager.googleapis.com/projects/123456789012",
            "resourceType": "cloudresourcemanager.googleapis.com/Project"
          }
        ]
      }
    ],
    "overview": {
      "minimumObservationPeriodInDays": "0"
    }
  },
  "description": "Replace the current role with a smaller role to cover the permissions needed.",
  "etag": "\"c7f57a4725d32d66\"",
  "lastRefreshTime": "2022-06-22T07:00:00Z",
  "name": "projects/123456789012/locations/global/recommenders/google.iam.policy.Recommender/recommendations/ba1fc977-fddd-3856-a829-f69649ae8075",
  "originalContent": {},
  "primaryImpact": {
    "category": "SECURITY",
    "securityProjection": {
      "details": {},
      "revokedIamPermissionsCount": 1
    }
  },
  "priority": "P4",
  "recommenderSubtype": "REPLACE_ROLE_CUSTOMIZABLE",
  "stateInfo": {
    "state": "ACTIVE"
  },
  "targetResources": [
    "//cloudresourcemanager.googleapis.com/projects/123456789012"
  ]
}

REST

REPLACE_ROLE_CUSTOMIZABLE 子类型用于指明 Recommender 建议创建一个具有所使用的权限的自定义角色。如需查看使用的权限,请获取关联的政策数据分析

{
  "name": "projects/123456789012/locations/global/recommenders/google.iam.policy.Recommender/recommendations/ba1fc977-fddd-3856-a829-f69649ae8075",
  "description": "Replace the current role with a smaller role to cover the permissions needed.",
  "lastRefreshTime": "2022-06-22T07:00:00Z",
  "primaryImpact": {
    "category": "SECURITY",
    "securityProjection": {
      "details": {
        "revokedIamPermissionsCount": 1
      }
    }
  },
  "content": {
    "operationGroups": [
      {
        "operations": [
          {
            "action": "add",
            "resourceType": "cloudresourcemanager.googleapis.com/Project",
            "resource": "//cloudresourcemanager.googleapis.com/projects/123456789012",
            "path": "/iamPolicy/bindings/*/members/-",
            "value": "user:my-user@example.com",
            "pathFilters": {
              "/iamPolicy/bindings/*/condition/expression": "",
              "/iamPolicy/bindings/*/role": "roles/cloudtrace.user"
            }
          },
          {
            "action": "remove",
            "resourceType": "cloudresourcemanager.googleapis.com/Project",
            "resource": "//cloudresourcemanager.googleapis.com/projects/123456789012",
            "path": "/iamPolicy/bindings/*/members/*",
            "pathFilters": {
              "/iamPolicy/bindings/*/condition/expression": "",
              "/iamPolicy/bindings/*/members/*": "user:my-user@example.com",
              "/iamPolicy/bindings/*/role": "roles/cloudtrace.admin"
            }
          }
        ]
      }
    ],
    "overview": {
      "minimumObservationPeriodInDays": "0"
    }
  },
  "stateInfo": {
    "state": "ACTIVE"
  },
  "etag": "\"c7f57a4725d32d66\"",
  "recommenderSubtype": "REPLACE_ROLE_CUSTOMIZABLE",
  "associatedInsights": [
    {
      "insight": "projects/123456789012/locations/global/insightTypes/google.iam.policy.Insight/insights/2799dc04-b12e-4cf6-86aa-d81907d31f58"
    }
  ],
  "priority": "P4"
}

该角色建议还将建议另一个选项,即将现有角色替换为 Cloud Trace User 角色 (roles/cloudtrace.user)。此预定义角色包含的权限在数量上稍微少于 Cloud Trace Admin 角色。

带有机器学习建议的权限的角色替换

服务帐号被授予项目的 Editor 角色 (roles/editor)。 此基本角色包含 3000 多项权限,并且可授予针对项目的广泛访问权限。但是,政策数据分析表明,在过去 90 天内,该服务帐号只使用了不到 10 项权限。

政策数据分析还突出显示了该服务帐号将来可能需要使用的多项权限。Recommender 使用机器学习来确定这些权限。

Recommender 会生成角色建议,来建议您撤消 Editor 角色,并将其替换为 Storage Object Admin 角色 (roles/storage.objectAdmin),后者可以完全控制 Cloud Storage 存储桶中的对象。此更改会移除数千项多余的权限,但仍包括服务帐号使用的权限以及服务帐号将来可能需要的权限:

控制台

Recommender 使用机器学习 图标来标识根据 Recommender 的机器学习(而非权限使用情况)添加的权限。在此示例中,我们根据机器学习技术推荐了 resourcemanager.projects.get 权限:

gcloud

建议本身不会列出根据 Recommender 的机器学习技术(而非权限使用情况)添加的权限。而是会列在与建议相关的政策数据分析中。数据分析的所有 inferredPermissions 字段中都会列出所有基于机器学习的权限。在此示例中,我们根据机器学习技术推荐了 resourcemanager.projects.get 权限:

associatedRecommendations:
- recommendation: projects/123456789012/locations/global/recommenders/google.iam.policy.Recommender/recommendations/0573b702-96a5-4622-a916-c762e7b0731f
category: SECURITY
content:
  condition:
    description: ''
    expression: ''
    location: ''
    title: ''
  currentTotalPermissionsCount: '5069'
  exercisedPermissions:
  - permission: storage.objects.create
  - permission: storage.objects.delete
  - permission: storage.objects.get
  - permission: storage.objects.list
  inferredPermissions:
  - permission: resourcemanager.projects.get
  member: serviceAccount:my-service-account@my-project.iam.gserviceaccount.com
  role: roles/editor
description: 4 of the permissions in this role binding were used in the past 90 days.
etag: '"d3cdec23cc712bd0"'
insightSubtype: PERMISSIONS_USAGE
lastRefreshTime: '2020-07-11T07:00:00Z'
name: projects/123456789012/locations/global/insightTypes/google.iam.policy.Insight/insights/0d3ce433-f067-4e78-b6ae-03d7d1f6f040
observationPeriod: 7776000s
stateInfo:
  state: ACTIVE
targetResources:
- //cloudresourcemanager.googleapis.com/projects/123456789012
severity: HIGH

如需了解如何获取政策数据分析,请参阅查看政策数据分析

REST

建议本身不会列出根据 Recommender 的机器学习技术(而非权限使用情况)添加的权限。而是会列在与建议相关的政策数据分析中。数据分析的所有 inferredPermissions 字段中都会列出所有基于机器学习的权限。在此示例中,我们根据机器学习技术推荐了 resourcemanager.projects.get 权限:

{
  "name": "projects/123456789012/locations/global/insightTypes/google.iam.policy.Insight/insights/07841f74-02ce-4de8-bbe6-fc4eabb68568",
  "description": "4 of the permissions in this role binding were used in the past 90 days.",
  "content": {
    "role": "roles/editor",
    "member": "serviceAccount:my-service-account@my-project.iam.gserviceaccount.com",
    "condition": {
      "expression": "",
      "title": "",
      "description": "",
      "location": ""
    },
    "exercisedPermissions": [
      {
        "permission": "storage.objects.create"
      },
      {
        "permission": "storage.objects.delete"
      },
      {
        "permission": "storage.objects.get"
      },
      {
        "permission": "storage.objects.list"
      }
    ],
    "inferredPermissions": [
      {
        "permission": "resourcemanager.projects.get"
      }
    ],
    "currentTotalPermissionsCount: "5069"
  },
  "lastRefreshTime": "2020-07-12T07:00:00Z",
  "observationPeriod": "7776000s",
  "stateInfo": {
    "state": "ACTIVE"
  },
  "category": "SECURITY",
  "associatedRecommendations": [
    {
      "recommendation": "projects/123456789012/locations/global/recommenders/google.iam.policy.Recommender/recommendations/b1932220-867d-43d1-bd74-fb95876ab656"
    }
  ],
  "targetResources": [
    "//cloudresourcemanager.googleapis.com/projects/123456789012"
  ],
  "insightSubtype": "PERMISSIONS_USAGE",
  "etag": "\"d3cdec23cc712bd0\"",
  "severity": "HIGH"
}

如需了解如何获取政策数据分析,请参阅查看政策数据分析

后续步骤