使用 IAM 对组织资源进行访问权限控制

Google Cloud 提供 Identity and Access Management (IAM),可让您授予对特定 Google Cloud 资源的更细化访问权限,并防止对其他资源进行不必要的访问。IAM 允许您采用最小权限安全原则,因此您只需授予对您的资源的必要访问权限即可。

IAM 允许您通过设置 IAM 政策来控制谁(用户)哪些资源具有什么访问权限(角色)。 您可以使用 IAM 政策向用户授予特定角色,给予用户某些权限。

本页面介绍了一些 IAM 角色, 以及如何创建和管理 使用 Cloud Resource Manager API 的组织资源的 IAM 政策。 有关 IAM 的详细说明,请参阅 IAM 文档。尤其是授予、更改和撤消访问权限部分。

权限和角色

为了控制对资源的访问权限,Google Cloud 要求发出 API 请求的账号具有适当的 IAM 角色。IAM 角色包含允许用户对 Google Cloud 资源执行特定操作的权限。例如, 拥有 resourcemanager.organizations.get 权限的用户可获取详细信息 组织资源。

您不直接授予用户权限,而是向其授予角色(角色自带一个或多个权限)。

您可以针对同一项资源授予一个或多个角色。

使用预定义角色

下表列出了您可以授予的 组织资源的属性、对角色用途的说明以及 授予的权限。

角色 权限

(roles/resourcemanager.organizationAdmin)

拥有管理 IAM 政策以及查看组织、文件夹和项目的组织政策的权限。

您可以授予此角色的最低级层资源:

  • 项目

essentialcontacts.*

  • essentialcontacts.contacts.create
  • essentialcontacts.contacts.delete
  • essentialcontacts.contacts.get
  • essentialcontacts.contacts.list
  • essentialcontacts.contacts.send
  • essentialcontacts.contacts.update

iam.policybindings.*

  • iam.policybindings.get
  • iam.policybindings.list

orgpolicy.constraints.list

orgpolicy.policies.list

orgpolicy.policy.get

resourcemanager.folders.createPolicyBinding

resourcemanager.folders.deletePolicyBinding

resourcemanager.folders.get

resourcemanager.folders.getIamPolicy

resourcemanager.folders.list

resourcemanager.folders.searchPolicyBindings

resourcemanager.folders.setIamPolicy

resourcemanager.folders.updatePolicyBinding

resourcemanager.organizations.*

  • resourcemanager.organizations.createPolicyBinding
  • resourcemanager.organizations.deletePolicyBinding
  • resourcemanager.organizations.get
  • resourcemanager.organizations.getIamPolicy
  • resourcemanager.organizations.searchPolicyBindings
  • resourcemanager.organizations.setIamPolicy
  • resourcemanager.organizations.updatePolicyBinding

resourcemanager.projects.createPolicyBinding

resourcemanager.projects.deletePolicyBinding

resourcemanager.projects.get

resourcemanager.projects.getIamPolicy

resourcemanager.projects.list

resourcemanager.projects.searchPolicyBindings

resourcemanager.projects.setIamPolicy

resourcemanager.projects.updatePolicyBinding

(roles/resourcemanager.organizationViewer)

提供查看组织的权限。

您可以授予此角色的最低级层资源:

  • 组织

resourcemanager.organizations.get

roles/orgpolicy.policyAdmin

提供通过设置组织政策来指定组织要对云端资源的配置实施哪些限制的权限。

您可以授予此角色的最低级层资源:

  • 组织

orgpolicy.*

  • orgpolicy.constraints.list
  • orgpolicy.customConstraints.create
  • orgpolicy.customConstraints.delete
  • orgpolicy.customConstraints.get
  • orgpolicy.customConstraints.list
  • orgpolicy.customConstraints.update
  • orgpolicy.policies.create
  • orgpolicy.policies.delete
  • orgpolicy.policies.list
  • orgpolicy.policies.update
  • orgpolicy.policy.get
  • orgpolicy.policy.set

policysimulator.orgPolicyViolations.list

policysimulator.orgPolicyViolationsPreviews.*

  • policysimulator.orgPolicyViolationsPreviews.create
  • policysimulator.orgPolicyViolationsPreviews.get
  • policysimulator.orgPolicyViolationsPreviews.list

(roles/browser)

拥有浏览项目层次结构(包括文件夹、组织和允许政策)所需的读取权限。此角色不具备查看项目内资源的权限。

您可以授予此角色的最低级层资源:

  • 项目

resourcemanager.folders.get

resourcemanager.folders.list

resourcemanager.organizations.get

resourcemanager.projects.get

resourcemanager.projects.getIamPolicy

resourcemanager.projects.list

创建自定义角色

除了本主题中介绍的预定义角色外,您还可以创建 自定义角色是 按需定制权限创建供使用的自定义角色时 使用 Resource Manager 时,请注意以下几点: <ph type="x-smartling-placeholder">
    </ph>
  • 列出和获取权限(如 resourcemanager.projects.get/list)应始终成对授予。
  • 如果您的自定义角色包含folders.listfolders.get 权限,它还应包含 projects.listprojects.get
  • 请注意,setIamPolicy 权限为组织、文件夹和 项目资源允许用户授予所有其他权限,因此应谨慎分配。

查看组织资源的现有访问权限

您可以通过以下方式查看针对组织资源为用户授予了哪些角色 获取组织资源级 IAM 政策。您可以查看政策 使用 Google Cloud 控制台、Google Cloud CLI 或 getIamPolicy() 方法。

控制台

如需使用 Google Cloud 控制台查看在组织资源级别授予的角色,请执行以下操作:

  1. 转到 Google Cloud 控制台中的管理资源页面:

    打开“管理资源”页面

  2. 组织下拉列表中,选择您的组织资源。

  3. 选中组织资源对应的复选框。

  4. 在右侧信息面板权限下方点击一下,以展开某一角色并显示拥有该角色的所有成员。

gcloud

使用 get-iam-policy 命令:

gcloud alpha organizations get-iam-policy [ORGANIZATION_ID] --format json >
[FILENAME.JSON]

该命令会输出类似于以下内容的政策:

bindings:
- members:
- user:testuser1@gcp-test.com
role: roles/editor
- members:
- user:admin@gcp-test.com
role:roles/resourcemanager.organizationAdmin
- members:
- user:testuser2@gcp-test.com
role: roles/resourcemanager.projectCreator
etag": "BwU1aRxWk30="

API

以下代码段会返回组织资源的政策 https://cloudresourcemanager.googleapis.com/v3/organizations/12345.

请求:

POST
https://cloudresourcemanager.googleapis.com/v3/organizations/12345:getIamPolicy

响应:

{
    "bindings": [
    {
        "role": "roles/resourcemanager.organizationAdmin",
        "members": [
        "user:email1@gmail.com"
    ]
    },
    {
        "role": "roles/resourcemanager.projectCreator",
        "members": [
            "user:email2@gmail.com",
            "user:email3@gmail.com",
            "serviceAccount:my-other-app@appspot.gserviceaccount.com"
        ]
    }
    ]
    "etag": "BwUjHYKHHiQ="
}

Python

getIamPolicy() 方法可让您获取之前设置的政策。

crm = discovery.build(
    'cloudresourcemanager', 'v3', http=creds.authorize(httplib2.Http()))
policy = crm.organizations().getIamPolicy(
    resource=flags.organizationId, body={}).execute()
print json.dumps(policy, indent=2)

授予对组织资源的访问权限

组织管理员可以向团队成员授予 IAM 角色 可以访问组织的资源和 API您可以授予 授予 Google 账号电子邮件、Google 群组、服务账号或 G Suite 角色 网域。您可以使用 Google Cloud 控制台、gcloud CLI 或 该 setIamPolicy() 方法授予角色。

控制台

如需使用 Google Cloud 控制台在组织资源层级设置访问权限控制,请执行以下操作:

  1. 转到 Google Cloud 控制台中的管理资源页面:

    打开“管理资源”页面

  2. 组织下拉列表中,选择您的组织资源。

  3. 选中组织资源对应的复选框。如果您没有 文件夹资源,则组织资源将不可见。如需继续操作,请参阅有关通过 IAM 页面授予角色的说明。

  4. 如果右侧的信息面板窗格处于隐藏状态,请点击右上角的显示信息面板

  5. 信息面板窗格的权限标签页中,点击添加成员

  6. 新成员字段中,输入要添加的团队成员。 您可以指定 Google 账号电子邮件、Google 群组、服务账号或 G Suite 网域。

  7. 选择角色下拉列表中,选择您要向团队成员授予的角色。

  8. 点击添加

gcloud

如需使用 gcloud 命令设置组织资源的 IAM 政策,请执行以下操作:

  1. 使用以下命令获取组织资源的 IAM 政策 get-iam-policy 命令并将政策输出到 JSON 文件:

    gcloud alpha organizations get-iam-policy [ORGANIZATION_ID]
    --format json > [FILENAME.JSON]
    
  2. JSON 文件的内容将如下所示:

    {
        "bindings": [
        {
            "members": [
                "user:testuser1@gcp-test.com"
            ],
            "role": "roles/editor"
        },
        {
            "members": [
                "user:admin@gcp-test.com",
            ],
            "role": "roles/resourcemanager.organizationAdmin"
        },
        {
            "members": [
                "user:testuser2@gcp-test.com"
            ],
            "role": "roles/resourcemanager.projectCreator"
        },
        ],
        "etag": "BwU1aRxWk30="
    }
    
  3. 使用文本编辑器打开 JSON 文件,并向 定义 Organization Administrator 的绑定数组。例如, anotheradmin@gcp-test.com 是 Organization Administrator,则需要更改 如下所示:

    {
        "bindings": [
        {
            "members": [
                "user:testuser1@gcp-test.com"
            ],
            "role": "roles/editor"
        },
        {
            "members": [
                "user:admin@gcp-test.com",
                "user:anotheradmin@gcp-test.com"
            ],
            "role": "roles/resourcemanager.organizationAdmin"
        },
        {
            "members": [
                "user:testuser20@gcp-test.com"
            ],
            "role": "roles/resourcemanager.projectCreator"
        },
        ],
        "etag": "BwU1aRxWk30="
    }
    
  4. 通过运行以下命令来更新组织资源的政策:

    gcloud alpha organizations set-iam-policy [ORGANIZATION_ID] policy.json
    

API

请求:

POST https://cloudresourcemanager.googleapis.com/v3/organizations/12345:setIamPolicy
{
    "policy": {
    "version": "0",
    "bindings": [
    {
        "role": "roles/resourcemanager.organizationAdmin",
        "members": [
            "user:email1@gmail.com"
        ]
    },
    {
        "role": "roles/resourcemanager.projectCreator",
        "members": [
        "user:email2@gmail.com",
        "user:email3@gmail.com",
        "serviceAccount:my-other-app@appspot.gserviceaccount.com"
        ]
    }
    ]
    "etag": "BwUjHYKHHiQ="
    }
}

响应:

{
    "bindings": [
    {
        "role": "roles/resourcemanager.organizationAdmin",
        "members": [
            "user:email1@gmail.com"
        ]
    },
    {
        "role": "roles/resourcemanager.projectCreator",
        "members": [
            "user:email2@gmail.com",
            "user:email3@gmail.com",
            "serviceAccount:my-other-app@appspot.gserviceaccount.com"
        ]
    }
    ]
    "etag": "BwUjHYKJUiQ="
}

借助 setIamPolicy() 方法,您可以通过将 应用于组织资源的 IAM 政策。IAM 政策是定义谁具有什么访问权限的语句集合。

Read-Modify-Write:通常,我们按照以下模式更新资源的元数据(如政策):先读取其当前状态,接着在本地更新数据,然后发送修改后的数据以进行写入。如果两个或更多个独立进程同时尝试执行此序列,此模式可能会导致冲突。例如,假设项目的两个所有者同时尝试进行有冲突的政策更改。在某些情况下,其中一个项目所有者进行的更改可能会失败。IAM 可利用 IAM 政策的 ETag 属性来解决此问题。此属性可用来验证政策自上次请求后是否发生了更改。当您使用 ETag 值向 IAM 发出请求时,IAM 会将请求中的 ETag 值与政策所关联的现有 ETag 值进行比较。只有当 etag 值匹配时,它才会写入该政策。

更新政策时,请先使用 getIamPolicy() 获取政策,接着更新政策,然后再使用 setIamPolicy() 写入更新后的政策。 只有在 GetPolicyResponse 中的相应政策包含 ETag 值时,您才可在设置政策时使用 ETag 值。

Python

setIamPolicy() 方法可让您将政策附加到资源。setIamPolicy 方法接受一个 SetIamPolicyRequest,它包含要设置的政策和该政策要附加到的资源。该方法将返回生成的政策。使用 setIamPolicy() 更新政策时,建议遵循读取-修改-写入模式。

以下一些示例代码演示了如何为组织资源设置政策:

crm = discovery.build(
    'cloudresourcemanager', 'v3', http=creds.authorize(httplib2.Http()))
policy = crm.organizations().getIamPolicy(
    resource=flags.organizationId, body={}).execute()

admin_binding = next(
    (binding
        for binding in policy['bindings']
        if binding['role'] == 'roles/resourcemanager.organizationAdmin'),
        None)

# Add an empty Organization Administrator binding if not present.
if not admin_binding:
    admin_binding = {
        'role': 'roles/resourcemanager.organizationAdmin',
        'members': []
    }
policy['bindings'].append(admin_binding)

# Add the new Admin (if necessary).
new_admin = 'user:' + flags.adminEmail
if new_admin not in admin_binding['members']:
    admin_binding['members'].append(new_admin)
policy = crm.organizations().setIamPolicy(
    resource=flags.organizationId,
    body={
        'resource': flags.organizationId,
        'policy': policy
    }).execute()

print json.dumps(policy, indent=2)

限制用户可以看到的项目

用户可以在 Google Cloud 控制台中查看他们有权访问的所有项目,并且 ,而不管这些广告是否在用户当前 所选的组织资源。您可以使用组织政策服务来限制 查询和 Google Cloud 控制台中返回的一组项目。 这可用于限制用户只能看到自己的网域中的项目。

组织政策限制条件 constraints/resourcemanager.accessBoundaries列表限制条件 。该限制条件接受 组织资源 ID,用于定义 在查询中或 Google Cloud 控制台中向用户显示其资源。

如果用户没有No organization 对上级组织的 resourcemanager.organizations.get 权限 项目资源。这可能会使项目看起来像是一个不属于该领域的项目, 组织资源未与以下组织资源关联: 全部。如果您使用 resourcemanager.accessBoundaries 约束条件禁止 属于该组织资源的项目 根本不会出现在查询中或 Google Cloud 控制台中。任何需要执行上述操作的项目 如果资源尚未迁移到组织资源, 会强制执行此限制条件。

我们建议您将 No organization 以下的项目迁移到您的 组织资源。有关 将项目迁移到组织资源,请参阅 移动项目

如需了解如何设置组织政策,请参阅使用限制条件

测试权限

您可以为组织测试用户的 IAM 权限 具有 testIamPermissions() 方法。此方法会将您想要测试的资源网址和权限集作为输入参数,并返回用户可拥有的其中部分权限。

如果您使用testIamPermission() 直接使用 Google Cloud 控制台管理权限。testIamPermissions() 适合与您的专有软件(如自定义图形界面)集成。例如,Google Cloud 控制台使用 在内部使用 testIamPermissions() 来确定哪个界面可供使用 向已登录的用户发送

API

您可以使用 testIamPermissions() 方法来检查调用者对指定资源所拥有的指定权限。该方法会将资源名称和一组权限作为参数传递,并返回调用者拥有的部分权限。

以下一些示例代码演示了如何测试组织资源的权限:

Request:

POST https://cloudresourcemanager.googleapis.com/v3/organizations/12345:testIamPermissions

{
    "permissions":  [
        "resourcemanager.organizations.get",
        "resourcemanager.organizations.setIamPolicy"
    ]
}

Response:

{
    "permissions": [
        "resourcemanager.organizations.get"
    ]
}

Python

crm = discovery.build(
    'cloudresourcemanager', 'v3', http=creds.authorize(httplib2.Http()))

response = crm.organizations().testIamPermissions(
    resource=flags.organizationId,
    body={
        'resource': flags.organizationId,
        'permissions': [
            'resourcemanager.organizations.setIamPolicy',
            'resourcemanager.projects.patch'
        ]
    }).execute()

print json.dumps(response, indent=2)