管理对 Compute Engine 资源的访问权限

本指南介绍如何通过授予对特定 Compute Engine 资源(而非项目、文件夹或组织等父资源)的访问权限来实施最小权限原则。

您可以通过为资源设置 Cloud IAM 政策来授予对该资源的访问权限。该政策会将一个或多个成员(例如一个用户或一个服务帐号)绑定到一个或多个角色。每个角色都包含一系列使成员可以与资源互动的权限。

如果您授予对父资源(例如,一个项目)的访问权限,则也隐含授予了对其所有子资源(例如,该项目中的所有虚拟机)的访问权限。如需限制对资源的访问权限,请尽可能在较低级层的资源上设置 Cloud IAM 政策,而不是在项目级层或更高级层设置。

如需大致了解如何授予、更改和撤消对与 Compute Engine 无关的资源的访问权限(例如,授予对 Google Cloud 项目的访问权限),请参阅有关授予、更改和撤消对资源的访问权限的 Cloud IAM 文档。

准备工作

支持的资源

Compute Engine 支持针对以下资源的资源级访问权限控制:

其他 Compute Engine 资源不支持资源级访问权限控制,因此您必须在项目、文件夹或组织层级管理其他类型资源的访问权限。如需了解组织、文件夹或项目,请参阅资源层次结构

授予对 Compute Engine 资源的访问权限

针对某项资源为用户授予 Cloud IAM 角色之前,请了解对于某项特定资源可以授予哪些角色。如需了解详情,请参阅查看可针对资源授予的角色

如需向用户授予访问特定 Compute Engine 资源的权限,请针对该资源设置 Cloud IAM 政策

控制台

  1. 在 Google Cloud Console 中,转到相应资源页面,您可以在该页面中添加权限。
  2. 选中要更新的资源旁边的复选框。
  3. 点击显示信息面板以展开权限列。
  4. 添加成员字段中,添加一个或多个成员。
  5. 选择角色列表中,选择一个或多个角色。
  6. 点击添加以保存更改。

gcloud

如需针对某项资源向成员授予角色,请将资源的 add-iam-policy-binding 子命令与 --member--role 标志结合使用。

gcloud compute resource-type add-iam-policy-binding resource-name \
    --member='member' \
    --role='role'

替换以下内容:

  • resource-type:资源类型。 有效值包括:
    • disks
    • images
    • instances
    • instance-templates
    • regionDisks
    • sole-tenancy node-groups
    • sole-tenancy node-templates
    • snapshots
  • resource-name:资源的名称。例如 my_instance
  • member:您要向其授予相应角色的有效身份。必须采用 user|group|serviceAccount:emaildomain:domain 格式。例如:
    • user:test-user@gmail.com
    • group:admins@example.com
    • serviceAccount:test123@example.domain.com
    • domain:example.domain.com
  • role:分配此身份的角色。

如果您要授予对目前处于 Beta 版阶段的资源的访问权限,请改用 gcloud beta compute 命令。

API

如需通过 API 修改 Cloud IAM 政策,请执行以下操作:

  1. 使用资源各自的 getIamPolicy 方法来读取现有政策。例如,以下 HTTP 请求会读取虚拟机的 Cloud IAM 政策:

    POST https://compute.googleapis.com/compute/v1/projects/project-id/zones/zone/instances/instance:getIamPolicy

    替换以下内容:

    • project-id:此虚拟机所属的项目 ID。
    • zone:虚拟机所在的地区。对于区域或全球资源,请将 zones/zone 替换为 regions/regionglobal
    • instance:虚拟机实例的名称。

    Compute Engine 会在响应中返回当前政策。

  2. 使用文本编辑器修改该政策,以添加或移除成员及其关联的角色。例如,若要向 email@example.com 授予 compute.admin 角色,请将以下新绑定添加到政策中:

    {
      "members": [
        "user:email@example.com"
      ],
      "role":"roles/compute.admin"
    }
    
  3. 使用 setIamPolicy() 写入更新后的政策:

    POST https://compute.googleapis.com/compute/v1/projects/project-id/zones/zone/instances/instance:setIamPolicy

    替换以下内容:

    • project-id:此虚拟机所属的项目 ID。
    • zone:虚拟机所在的地区。对于区域或全球资源,请将 zones/zone 替换为 regions/regionglobal
    • instance:虚拟机实例的名称。

    在请求正文中,提供上一步中写入的更新后的 Cloud IAM 政策。

撤消对资源的访问权限

最佳做法是,当成员不再需要访问您的 Compute Engine 资源后,撤消其访问权限。

控制台

  1. 在 Google Cloud Console 中,转到相应资源页面,您可以在该页面中添加权限。
  2. 选中要更新的资源旁边的复选框。
  3. 点击显示信息面板以展开权限列。
  4. 点击您要从中移除成员的资源对应的角色卡片。这样会展开该卡片,并针对该资源显示具有相应角色的成员。
  5. 点击删除 ,以从该角色中移除成员。

gcloud

如需针对某项资源从成员中移除角色,请将资源的 remove-iam-policy-binding 子命令与 --member--role 标志结合使用。

gcloud compute resource-type remove-iam-policy-binding resource-name \
    --member='member' \
    --role='role'

替换以下内容:

  • resource-type:资源类型。 有效值包括:
    • disks
    • images
    • instances
    • instance-templates
    • regionDisks
    • sole-tenancy node-groups
    • sole-tenancy node-templates
    • snapshots
  • resource-name:资源的名称。 例如 my_instance
  • member:您要移除的身份。必须采用 user|group|serviceAccount:emaildomain:domain 格式。例如:
    • user:test-user@gmail.com
    • group:admins@example.com
    • serviceAccount:test123@example.domain.com
    • domain:example.domain.com
  • role:您希望从中移除身份的角色。

如果您要撤消对目前处于 Beta 版阶段的资源的访问权限,请改用 gcloud beta compute 命令。

API

如需直接通过 API 修改 Cloud IAM 政策,请执行以下操作:

  1. 使用资源各自的 getIamPolicy 方法来读取现有政策。例如,以下 HTTP 请求会读取虚拟机的 Cloud IAM 政策:

    POST https://compute.googleapis.com/compute/v1/projects/project-id/zones/zone/instances/instance:getIamPolicy

    替换以下内容:

    • project-id:此虚拟机实例的项目 ID。
    • zone:虚拟机所在的地区。对于区域或全球资源,请将 zones/zone 替换为 regions/regionglobal
    • instance:虚拟机实例的名称。

    Compute Engine 会在响应中返回当前政策。

  2. 使用文本编辑器修改该政策,以从关联角色中移除成员。例如,从 compute.admin 角色中移除 email@example.com。

    {
      "members": [
        "user:owner@example.com"
      ],
      "role":"roles/compute.admin"
    }
    
  3. 使用 setIamPolicy() 写入更新后的政策:

    POST https://compute.googleapis.com/compute/v1/projects/project-id/zones/zone/instances/instance:setIamPolicy

    替换以下内容:

    • project-id:此虚拟机所属的项目 ID。
    • zone:虚拟机所在的地区。对于区域或全球资源,请将 zones/zone 替换为 regions/regionglobal
    • instance:虚拟机实例的名称。

    在请求正文中,提供上一步中写入的更新后的 Cloud IAM 政策。

测试调用者是否拥有权限

如果您不知道身份具有哪些权限,请使用 testIamPermissions API 方法检查某个身份拥有的权限。

该方法将资源网址和一组权限作为输入参数,返回调用者可以使用的一组权限。您可以对任何受支持的资源使用此方法。

通常而言,testIamPermissions 适合与您的专有软件(如自定义图形界面)整合使用。如果您直接使用 Google Cloud 管理权限,通常无需调用 testIamPermissions

例如,如果您是基于 Compute Engine API 构建 GUI,且您的 GUI 设有用于启动实例的“开始”按钮,则可以通过调用 compute.instances.testIamPermissions() 来确定是应启用还是停用该按钮。

如需测试调用者是否拥有资源的特定权限,请执行以下操作:

  1. 向该资源发送请求,并以列表形式将要检查的权限加入请求正文中。

    例如,您可以针对实例检查 compute.instances.startcompute.instances.stopcompute.instances.delete 权限。

    POST https://compute.googleapis.com/compute/v1/projects/project-id/zones/zone/instances/instance-name/setIamPolicy
        {
          "permissions": [
            "compute.instances.start",
            "compute.instances.stop",
            "compute.instances.delete"
           ]
        }
  2. 该请求返回为调用者启用的权限。

    {
      "permissions": [
        "compute.instances.start",
        "compute.instances.stop"
      ]
    }
    

修改多个成员的资源访问权限

如需同时为多个成员修改对 Compute Engine 资源的访问权限,请查看有关如何以编程方式修改 Cloud IAM 政策的建议。

后续步骤