本页面介绍了如何使用 Policy Simulator 模拟对 IAM 允许政策的更改。此外,本页面还介绍了如何解读模拟结果以及如何应用模拟的允许政策(如果您选择这样做)。
此功能仅根据允许政策评估访问权限。
如需了解如何模拟对其他类型政策的更改,请参阅以下内容:
准备工作
-
启用 Policy Simulator 和 Resource Manager API。
启用 API 所需的角色
如需启用 API,您需要拥有
serviceusage.services.enable权限。如果您创建了项目,则可能已经通过 Owner 角色 (roles/owner) 获得了此权限。否则,您可以通过 Service Usage Admin 角色 (roles/serviceusage.serviceUsageAdmin) 获得此权限。了解如何授予角色。 - 可选:了解允许政策的 Policy Simulator 的工作原理。
所需权限
在模拟对允许政策的更改之前,您需要确保您拥有适当的权限。运行模拟需要某些权限;其他权限则不需要,但有助于您从模拟中获得最完整的结果。
如需详细了解 Identity and Access Management (IAM) 角色,请参阅了解角色。
必需的目标资源权限
模拟的目标资源是要模拟其允许政策的资源。
如需获得运行模拟所需的权限,请让管理员向您授予目标资源的以下 IAM 角色:
- Cloud Asset Viewer (
roles/cloudasset.viewer) - Simulator Admin (
roles/policysimulator.admin) - Security Reviewer (
roles/iam.securityReviewer) -
应用模拟政策更改:Security Admin (
roles/iam.securityAdmin)
如需详细了解如何授予角色,请参阅管理对项目、文件夹和组织的访问权限。
这些预定义角色具有运行模拟所需的权限。如需查看所需的确切权限,请展开所需权限部分:
所需权限
如需运行模拟,需要具备以下权限:
-
cloudasset.assets.searchAllResources -
policysimulator.replays.run -
service.resource.getIamPolicy,其中resource是目标资源的资源类型,service是拥有该资源的 Google Cloud 服务的名称。 -
应用模拟的政策更改:
service.resource.setIamPolicy,其中resource是目标资源的资源类型,service是拥有该资源的 Google Cloud 服务的名称。
必需的主机资源权限
模拟的托管资源是创建并运行模拟的项目、文件夹或组织。主机资源不需要与目标资源以任何方式相关。
设置主机资源的方式取决于您使用的平台。
控制台
主机资源是资源选择器中显示的项目、文件夹或组织。

如需更改主机资源,请在资源选择器中选择其他项目、文件夹或组织。
gcloud
主机资源是当前配额项目。如需设置配额项目,请使用 gcloud auth application-default set-quota-project 命令。
REST
每次发送请求时,您手动指定主机资源。如需了解详情,请参阅本页面上的模拟政策更改。
如需获得运行模拟所需的权限,请让管理员向您授予主机资源的 Simulator Admin (roles/policysimulator.admin) IAM 角色。
如需详细了解如何授予角色,请参阅管理对项目、文件夹和组织的访问权限。
此预定义角色具有运行模拟所需的权限。如需查看所需的确切权限,请展开所需权限部分:
所需权限
如需运行模拟,需要具备以下权限:
-
policysimulator.replayResults.list -
policysimulator.replays.create -
policysimulator.replays.get
建议的权限数
为了获得最佳的模拟结果,我们建议您拥有特定的 IAM 和 Google Workspace 权限。如果您没有以上部分或全部权限,则仍可以运行模拟。但是,运行没有这些权限的模拟可能会导致未知的访问权限更改数量增加,因为您可能无法检索可能影响模拟结果的信息。
建议的 IAM 权限
我们建议您在运行模拟时拥有 Organization Security Reviewer 角色 (roles/iam.securityReviewer)。或者,如果您已拥有 Security Admin 角色 (roles/iam.securityAdmin),则无需授予任何其他角色。
这些角色可为您提供以下权限,帮助您从模拟中获得最完整的结果:
- 定义了自定义角色的任何相关项目、文件夹或组织的
iam.roles.get和iam.roles.list权限。如果某个项目、文件夹或组织是您要模拟其允许政策的资源的祖先或后代,则该项目、文件夹或组织是相关的。 service.resource.getIamPolicy,其中resource是可以具有允许政策的资源类型的名称,service是拥有该资源的Google Cloud 服务的名称。在运行模拟时,我们建议您对每个符合以下条件的资源拥有此权限:
例如,假设您要模拟项目的允许政策。如果访问日志包含对项目中 Cloud Storage 存储桶的访问尝试,您需要该存储桶的
storage.buckets.getIamPolicy权限。如果项目具有具有允许政策的父文件夹,则您还需要该文件夹的resourcemanager.folders.getIamPolicy权限。
建议的 Google Workspace 权限
我们建议您有权检索原始允许政策和建议的允许政策中每个 Google 群组的群组成员资格信息。
Google Workspace 超级用户和群组管理员通常有权查看群组成员资格。如果您不是超级用户或群组管理员,请让 Google Workspace 管理员执行以下操作:创建自定义 Google Workspace 管理员角色,其中包含groups.read权限(位于Admin API 权限),然后将其授予您。这样,您就可以查看网域中所有群组的成员资格,并更有效地模拟对允许政策的更改。
模拟政策更改
按照以下步骤模拟对允许政策的更改。
控制台
以下示例演示了如何模拟对项目的允许政策的更改。但是,您可以模拟对任何具有允许政策的资源的允许政策的更改。
修改主账号的权限,然后点击模拟,而不是点击测试更改:
在 Google Cloud 控制台中,前往 IAM 页面。
通过修改现有主账号的权限,创建建议的对允许政策更改:
- 找到要修改其访问权限的主账号,然后点击右侧的修改 按钮。
- 通过添加新角色或者撤消或更改现有角色来修改主账号的访问权限。
要模拟建议的更改,请点击测试更改。
几分钟后, Google Cloud 控制台会将模拟结果显示为访问权限更改列表。如需了解详情,请参阅本页面上的了解 Policy Simulator 结果。

如果现有允许政策与模拟的允许政策之间的访问权限没有变化,则 Google Cloud 控制台不会显示任何访问权限更改。
gcloud
如需模拟对允许政策的更改,请遵循读取-修改-写入模式,但要模拟允许政策而不是写入允许政策。
通过运行以下命令来读取当前允许政策:
gcloud resource-type get-iam-policy resource-id --format=format > filepath
替换以下值:
resource-type:您要模拟其允许政策的资源的类型。例如projects。resource-id:您要模拟其允许政策的资源的 ID。例如my-project。format:响应的格式。使用值json或yaml。filepath:指向允许政策的新输出文件的路径。
例如,以下命令会以 JSON 格式获取项目
my-project的允许政策,并将其保存到用户的主目录:gcloud projects get-iam-policy my-project --format=json > ~/policy.json
修改
get-iam-policy命令返回的 JSON 或 YAML 允许政策,以反映您要模拟的更改。您可以对允许政策进行多种更改。例如,您可以在角色绑定中添加或移除主账号,或者从允许政策中移除角色绑定。
运行以下命令以模拟对允许政策的更改:
gcloud iam simulator replay-recent-access \ full-resource-name \ filepath \ --format=format
替换以下值:
full-resource-name:您要模拟其允许政策的资源的完整资源名称。完整资源名称是一个 URI,由服务名称和资源路径组成。例如,如果您要模拟项目的允许政策,则可以使用
//cloudresourcemanager.googleapis.com/projects/project- id,其中project-id是您要模拟其允许政策的项目的 ID。如需完整的资源名称格式列表,请参阅完整资源名称。
filepath:指向包含您要模拟的修改后允许政策的文件的路径。例如~/proposed_policy.json。format:响应的格式。例如json或yaml。
几分钟后,该命令会输出重放结果的列表,说明主账号的访问权限在应用建议的允许政策后会如何变化。这些结果还列出了模拟期间出现的任何错误,包括由于不受支持的资源类型而导致的任何错误。
请参阅此页面上的了解政策模拟器结果,了解如何读取结果。如需了解如何保存模拟结果而不是输出结果,请参阅保存模拟结果。
以下是涉及用户
my-user@example.com的允许政策模拟的示例响应。在这种情况下,如果应用了建议的更改,my-user@example.com可能不再拥有项目my-project的resourcemanager.projects.list和resourcemanager.projects.get权限,并且肯定不再拥有项目my-project的resourcemanager.projects.update权限:[ { "accessTuple": { "fullResourceName": "//cloudresourcemanager.googleapis.com/projects/my-project", "permission": "resourcemanager.projects.list", "principal": "my-user@example.com" }, "diff": { "accessDiff": { "accessChange": "ACCESS_MAYBE_REVOKED", "baseline": { "accessState": "GRANTED" }, "simulated": { "accessState": "UNKNOWN_INFO_DENIED", "errors": [ { "code": 7, "details": [ { "@type": "type.googleapis.com/google.rpc.ResourceInfo", "description": "Missing permission to retrieve IAM policies above the resource in hierarchy.", "resourceName": "//cloudresourcemanager.googleapis.com/projects/my-project", "resourceType": "cloudresourcemanager.googleapis.com/projects" } ], "message": "Missing permission to get relevant IAM policies." } ], "policies": [ { "access": "UNKNOWN_INFO_DENIED", "policy": {} } ] } } }, "lastSeenDate": { "day": 12, "month": 1, "year": 2021 } }, { "accessTuple": { "fullResourceName": "//cloudresourcemanager.googleapis.com/projects/my-project", "permission": "resourcemanager.projects.get", "principal": "my-user@example.com" }, "diff": { "accessDiff": { "accessChange": "ACCESS_MAYBE_REVOKED", "baseline": { "accessState": "GRANTED" }, "simulated": { "accessState": "UNKNOWN_INFO_DENIED", "errors": [ { "code": 7, "details": [ { "@type": "type.googleapis.com/google.rpc.ResourceInfo", "description": "Missing permission to view group membership.", "resourceName": "group:everyone@example.com", "resourceType": "Google group" } ], "message": "Missing permission to view group membership." }, { "code": 7, "details": [ { "@type": "type.googleapis.com/google.rpc.ResourceInfo", "description": "Missing permission to retrieve IAM policies above the resource in hierarchy.", "resourceName": "//cloudresourcemanager.googleapis.com/projects/my-project", "resourceType": "cloudresourcemanager.googleapis.com/projects" } ], "message": "Missing permission to get relevant IAM policies." } ], "policies": [ { "access": "UNKNOWN_INFO_DENIED", "bindingExplanations": [ { "access": "UNKNOWN_INFO_DENIED", "memberships": { "group:everyone@example.com": { "membership": "MEMBERSHIP_UNKNOWN_INFO_DENIED" } }, "role": "roles/owner" } ], "fullResourceName": "//cloudresourcemanager.googleapis.com/projects/my-project", "policy": { "bindings": [ { "members": [ "group:everyone@example.com" ], "role": "roles/owner" } ], "etag": "BwWgJSIInYA=", "version": 3 } }, { "access": "UNKNOWN_INFO_DENIED", "policy": {} } ] } } }, "lastSeenDate": { "day": 10, "month": 1, "year": 2021 } }, { "accessTuple": { "fullResourceName": "//cloudresourcemanager.googleapis.com/projects/my-project", "permission": "resourcemanager.projects.update", "principal": "my-user@example.com" }, "diff": { "accessDiff": { "accessChange":