管理对 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 进行身份验证:

    Select the tab for how you plan to use the samples on this page:

    Console

    When you use the Google Cloud console to access Google Cloud services and APIs, you don't need to set up authentication.

    gcloud

    1. Install the Google Cloud CLI, then initialize it by running the following command:

      gcloud init
    2. Set a default region and zone.
    3. REST

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

        Install the Google Cloud CLI, then initialize it by running the following command:

        gcloud init

      如需了解详情,请参阅 Google Cloud 身份验证文档中的使用 REST 时进行身份验证

所需的角色

如需获得管理对 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 控制台中,前往相应资源页面,您可以在该页面中添加权限。
  2. 选中要更新的资源旁边的复选框。
  3. 根据资源页面完成以下步骤。
    • 对于虚拟机实例,请点击 权限
    • 对于所有其他资源,请完成以下操作:
      1. 检查信息面板是否可见。如果未显示,请点击显示信息面板
      2. 选择权限标签页。
  4. 点击 添加主账号
  5. 为主账号添加身份,然后选择所需的角色。
  6. 要保存更改,请点击保存

gcloud

如需向资源的主账号授予角色,请使用该资源的包含 --member--role 标志的 add-iam-policy-binding 子命令。

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 控制台中,前往相应资源页面,您可以在该页面中添加权限。
  2. 选中要更新的资源旁边的复选框。
  3. 根据资源页面完成以下步骤。
    • 对于虚拟机实例,请点击 权限
    • 对于所有其他资源,请完成以下操作:
      1. 检查信息面板是否可见。如果未显示,请点击显示信息面板
      2. 选择权限标签页。
  4. 点击您要从中移除主账号的角色卡片。这样会展开该卡片,并针对该资源显示具有相应角色的用户。
  5. 如需从该角色中移除主账号,请点击 删除

gcloud

如需从某个资源的主账号中移除角色,请使用该资源的 包含 --member--role 标志的 remove-iam-policy-binding 子命令。

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 政策的建议。

后续步骤