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


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

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

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

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

准备工作

  • 查看 IAM 概览
  • 阅读 Compute Engine 访问权限控制概览
  • 熟悉 Compute Engine 的 IAM 角色
  • 如果您尚未设置身份验证,请进行设置。身份验证是通过其进行身份验证以访问 Google Cloud 服务和 API 的过程。如需从本地开发环境运行代码或示例,您可以按如下方式向 Compute Engine 进行身份验证。

    选择标签页以了解您打算如何使用本页面上的示例:

    控制台

    当您使用 Google Cloud 控制台访问 Google Cloud 服务和 API 时,无需设置身份验证。

    gcloud

    1. 安装 Google Cloud CLI,然后通过运行以下命令初始化 Google Cloud CLI:

      gcloud init
    2. 设置默认区域和可用区

    REST

    如需在本地开发环境中使用本页面上的 REST API 示例,请使用您提供给 gcloud CLI 的凭据。

      安装 Google Cloud CLI,然后通过运行以下命令初始化 Google Cloud CLI:

      gcloud init

所需的角色

如需获得管理对 Compute Engine 资源的访问权限所需的权限,请让管理员向您授予资源的 Compute Admin (roles/compute.admin) IAM 角色。如需详细了解如何授予角色,请参阅管理访问权限

此预定义角色包含管理对 Compute Engine 资源的访问权限所需的权限。如需查看所需的确切权限,请展开所需权限部分:

所需权限

必须拥有以下权限才能管理对 Compute Engine 资源的访问权限:

  • 授予或撤消对资源的访问权限:
    • 针对项目的 compute.projects.get 权限
    • 针对资源的 compute.RESOURCE_TYPE.get 权限
    • 针对资源的 compute.RESOURCE_TYPE.getIamPolicy 权限
    • 针对资源的 compute.RESOURCE_TYPE.setIamPolicy 权限
  • 测试调用者权限:针对资源的 compute.RESOURCE_TYPE.getIamPolicy 权限

    RESOURCE_TYPE 替换为您要管理其访问权限的资源。例如 instancesinstanceTemplatesimages

您也可以使用自定义角色或其他预定义角色来获取这些权限。

支持的资源

如需查看支持资源级访问权限控制的 Compute Engine 资源列表,请参阅接受 IAM 政策的资源类型并过滤出 Compute Engine

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

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

主账号(例如用户或服务账号)可以访问 Compute Engine 资源。身份是主账号的属性。主账号的身份通常由与账号关联的电子邮件地址表示。

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

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

控制台

  1. 在 Google Cloud Console 中,转到相应资源页面,您可以在该页面中添加权限。
  2. 选中要更新的资源旁边的复选框。
  3. 根据资源页面完成以下步骤。
    • 对于虚拟机实例,请点击 权限
    • 对于所有其他资源,请完成以下操作:
      1. 检查信息面板是否可见。如果未显示,请点击显示信息面板
      2. 选择权限标签页。
  4. 点击 添加主账号
  5. 添加主账号的身份,然后选择所需的角色。
  6. 要保存更改,请点击保存

gcloud

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

gcloud compute RESOURCE_TYPE add-iam-policy-binding RESOURCE_NAME \
    --member='PRINCIPAL' \
    --role='ROLE'

替换以下内容:

  • RESOURCE_TYPE:资源类型。有效值包括:
    • disks
    • images
    • instances
    • instance-templates
    • machine-images
    • reservations
    • sole-tenancy node-groups
    • sole-tenancy node-templates
    • snapshots
  • RESOURCE_NAME:资源的名称。例如 my_instance
  • PRINCIPAL:您要授予该角色的主账号的有效身份。必须采用 user|group|serviceAccount:EMAIL_ADDRESSdomain:DOMAIN_ADDRESS 格式。例如:
    • user:test-user@gmail.com
    • group:admins@example.com
    • serviceAccount:test123@example.domain.com
    • domain:example.domain.com
  • ROLE:分配给此主账号的角色。

如果您要授予对预览版资源的访问权限,请改用 gcloud beta compute 命令。

REST

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

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

    POST https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/zones/ZONE/instances/VM_NAME:getIamPolicy

    替换以下内容:

    • PROJECT_ID:此虚拟机所属项目的 ID。
    • ZONE:虚拟机的可用区。 对于区域或全球资源,请将 zones/ZONE 替换为 regions/REGIONglobal
    • VM_NAME:虚拟机实例的名称。

    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/VM_NAME:setIamPolicy

    替换以下内容:

    • PROJECT_ID:此虚拟机所属项目的 ID。
    • ZONE:虚拟机的可用区。 对于区域或全球资源,请将 zones/ZONE 替换为 regions/REGIONglobal
    • VM_NAME:虚拟机实例的名称。

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

撤消对资源的访问权限

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

控制台

  1. 在 Google Cloud Console 中,转到相应资源页面,您可以在该页面中添加权限。
  2. 选中要更新的资源旁边的复选框。
  3. 根据资源页面完成以下步骤。
    • 对于虚拟机实例,请点击 权限
    • 对于所有其他资源,请完成以下操作:
      1. 检查信息面板是否可见。如果未显示,请点击显示信息面板
      2. 选择权限标签页。
  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
    • machine-images
    • reservations
    • sole-tenancy node-groups
    • sole-tenancy node-templates
    • snapshots
  • RESOURCE_NAME:资源的名称。例如 my_instance
  • PRINCIPAL:主账号的有效身份。必须采用 user|group|serviceAccount:EMAIL_ADDRESSdomain:DOMAIN_ADDRESS 格式。例如:
    • user:test-user@gmail.com
    • group:admins@example.com
    • serviceAccount:test123@example.domain.com
    • domain:example.domain.com
  • ROLE:您希望从中移除主账号的角色。

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

REST

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

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

    POST https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/zones/ZONE/instances/VM_NAME:getIamPolicy

    替换以下内容:

    • PROJECT_ID:此虚拟机所属项目的 ID。
    • ZONE:虚拟机的可用区。 对于区域或全球资源,请将 zones/ZONE 替换为 regions/REGIONglobal
    • VM_NAME:虚拟机实例的名称。

    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/VM_NAME:setIamPolicy

    替换以下内容:

    • PROJECT_ID:此虚拟机所属项目的 ID。
    • ZONE:虚拟机的可用区。 对于区域或全球资源,请将 zones/ZONE 替换为 regions/REGIONglobal
    • VM_NAME:虚拟机实例的名称。

    在请求正文中,提供上一步中写入的更新后 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/VM_NAME/testIamPermissions
        {
          "permissions": [
            "compute.instances.start",
            "compute.instances.stop",
            "compute.instances.delete"
           ]
        }
  2. 该请求返回为调用者启用的权限。

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

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

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

后续步骤