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

借助 Compute Engine 资源的 Cloud IAM 政策,您可以通过管理特定资源(如虚拟机实例、磁盘和映像)的 Cloud IAM 角色来授予对这些资源的访问权限。这样一来,您便可灵活应用最小权限原则。例如,仅向协作者授予其工作所需的特定资源的访问权限。

资源同时也会继承其父级资源的政策。对资源有效的政策包括为该资源设置的政策,以及该资源从资源层次结构中的父级资源继承而来的政策。

当您将成员与某个资源绑定或针对某个资源设置政策时,成员将不会收到邀请电子邮件。系统会直接更新每位成员的访问权限。

如需详细了解可纳入 Cloud IAM 政策的成员类型(例如用户或群组),请参阅 Cloud IAM 文档

准备工作

支持的资源

目前,您可以授予对以下 Compute Engine 资源的访问权限:

您还可以授予对以下资源的访问权限,但授予对这些资源的访问权限的功能目前处于测试版阶段,因此您必须使用关联的 gcloud beta测试版 API 命令:

添加和移除针对资源的成员绑定

资源的 Cloud IAM 绑定会向该资源的成员授予特定角色。您可以使用 Google Cloud Console 和 gcloud 命令行工具添加和移除针对实例、磁盘、映像和快照的 Cloud IAM 绑定。

如要针对资源的所有成员更新 Cloud IAM 政策,请参阅获取和设置资源的政策

控制台

  1. 找到您要为其添加权限的资源,并转到该资源对应的页面。
  2. 选中要更新的资源旁边的复选框。
  3. 点击显示信息面板以展开权限列。
  4. 如要添加成员,请执行以下操作:
    1. 添加成员字段中,添加一个或多个成员。
    2. 选择角色下拉菜单中,选择一个或多个角色。
    3. 点击添加以保存更改。
  5. 如要移除成员,请执行以下操作:
    1. 如果资源的一个或多个角色被指定了政策绑定,则这些角色会以可扩展卡片的形式显示。找到您要移除的一个或多个成员,并点击这些成员的角色卡片。
    2. 点击删除图标 (类似垃圾桶的删除图标) 以移除每个角色。

gcloud

如要向资源成员授予角色,请使用资源的 add-iam-policy-binding 子命令并搭配 --member--role 标志。

gcloud compute [RESOURCE_TYPE] add-iam-policy-binding [RESOURCE_NAME] \
    --member='[MEMBER]' \
    --role='[ROLE]'

或者,如要移除政策绑定,请使用资源的 remove-iam-policy-binding 子命令并搭配 --member--role 标志。

gcloud compute [RESOURCE_TYPE] remove-iam-policy-binding [RESOURCE_NAME] \
    --member='[MEMBER]' \
    --role='[ROLE]'

其中:

  • [RESOURCE_TYPE] 是资源类型,可能的值包括 disksimagesinstancesinstance-templatessole-tenancy node-groupssole-tenancy node-templatessnapshots
  • [RESOURCE_NAME] 是资源的名称,例如 my_instance
  • [MEMBER] 是要添加绑定的成员。
    • 格式应为 user|group|serviceAccount:emaildomain:domain,例如 user:test-user@gmail.comgroup:admins@example.comserviceAccount:test123@example.domain.comdomain:example.domain.com
    • 您也可以使用以下某个特殊值:
      • allUsers:互联网上的任何用户(无论是否拥有 Google 帐号)。
      • allAuthenticatedUsers:使用 Google 帐号或服务帐号进行身份验证的任何用户。
  • [ROLE] 是要为该成员添加的角色

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

获取和设置资源的政策

资源的 Cloud IAM 政策是由一系列语句所组成,这些语句定义了该资源访问权限的授予对象。

您可以使用“读取-修改-写入”模式更新资源的政策,这种模式会先检索资源当前的 Cloud IAM 政策,然后更新并完成政策设置。请参阅 Cloud IAM 文档详细了解此模式。

gcloud

在执行 gcloud 命令时,您可以使用 JSON 或 YAML 文件来获取或设置资源的政策。本节中的示例使用 JSON。

  1. 执行资源的 get-iam-policy 子命令来检索要修改的政策。

    gcloud compute [RESOURCE_TYPE] get-iam-policy [RESOURCE_NAME] --format json > policy.json
    

    其中:

    • [RESOURCE_TYPE] 是资源类型,可能的值包括 disksimagesinstancesinstance-templatessnapshots
    • [RESOURCE_NAME] 是资源的名称。

    例如,如要针对名为 example-disk 的磁盘检索 Cloud IAM 政策,请运行以下命令:

    gcloud compute disks get-iam-policy example-disk --format json > policy.json
    
  2. 空白的 JSON 政策文件将类似如下所示。etag 属性可用于验证自上次请求之后政策是否发生了更改。

    {
      "etag": "ACAB"
    }
    
  3. 使用文本编辑器更新 JSON 文件。构造包含数组的 bindings 对象。数组中的每个对象都有一个 members 数组以及与这些成员关联的角色。例如,如要向 all-devs@example.comsome-devs@other-place.com 群组授予 roles/compute.imageUser 角色,并向 bob@example.com 授予 roles/compute.storageAdmin 角色,请将 JSON 文件更新为以下内容:

    {
      "bindings": [
        {
          "members": [
            "group:all-devs@example.com",
            "group:other-devs@other-place.com"
          ],
          "role": "roles/compute.imageUser"
        },
        {
          "members": [
            "user:bob@example.com"
          ],
          "role": "roles/compute.storageAdmin"
        }
      ],
      "etag": "ACAB"
    }
    
  4. 执行资源的 set-iam-policy 子命令并提供包含新政策的 JSON 文件的路径,以更新政策。为确保该命令成功运行,JSON 文件中的 etag 值必须与资源当前的 etag 值匹配。

    gcloud compute [RESOURCE_TYPE] set-iam-policy [RESOURCE_NAME] policy.json
    

    例如,如要针对名为 example-disk 的磁盘设置 Cloud IAM 政策,请运行以下命令:

    gcloud compute disks set-iam-policy example-disk policy.json
    
  5. 该命令会输出更新后的政策,其中包括更新后的 etag 值。

    bindings:
    - members:
      - user:bob@example.com
        role: roles/compute.storageAdmin
    - members:
      - group:all-devs@example.com
      - group:other-devs@other-place.com
        role: roles/compute.imageUser
    etag: BwUjMhXbSPU=
    

API

如要修改现有政策,请执行以下操作:

  1. 调用资源的 getIamPolicy() 方法来检索现有政策。

    例如,您可以对磁盘进行如下调用:

    GET https://compute.googleapis.com/compute/v1/projects/[PROJECT_ID]/zones/[ZONE]/disks/[DISK_NAME]/getIamPolicy
    
  2. 该请求会返回政策,其中包括 bindings 数组(如果存在任何绑定)和 etag 值。etag 属性可用于验证自上次请求之后政策是否发生了更改。

    {
      "etag": "BwVvzaUs8EY=",
      "bindings":[
        {
          "role":"roles/compute.storageAdmin",
          "members":[
            "user:bob@example.com",
            "serviceAccount:service-account@my-project.iam.gserviceaccount.com"
          ]
        },
        {
          "role":"roles/compute.imageUser",
          "members":[
            "user:email1@gmail.com",
            "user:email2@gmail.com",
            "user:email3@gmail.com"
          ]
        }
      ]
    }
    
  3. 根据需要修改政策,然后调用 setIamPolicy() 来设置更新后的政策。

    例如,如果您要撤消 email2@gmail.comcompute.imageUser 角色,应按如下所示发出请求。

    POST https://compute.googleapis.com/compute/v1/projects/[PROJECT_ID]/zones/[ZONE]/disks/[DISK_NAME]/setIamPolicy

    {
      "etag": "BwVvzaUs8EY=",
      "bindings":[
        {
          "role":"roles/compute.storageAdmin",
          "members":[
            "user:bob@example.com",
            "serviceAccount:service-account@my-project.iam.gserviceaccount.com"
          ]
        },
        {
          "role":"roles/compute.imageUser",
          "members":[
            "user:email1@gmail.com",
            "user:email3@gmail.com"
          ]
        }
      ]
    }
    
  4. 响应会显示更新后的政策,其中包括更新后的 etag 值。

    {
      "etag": "BwVwGgz7Arg=",
      "bindings":[
        {
          "role":"roles/compute.storageAdmin",
          "members":[
            "user:bob@example.com",
            "serviceAccount:service-account@my-project.iam.gserviceaccount.com"
          ]
        },
        {
          "role":"roles/compute.imageUser",
          "members":[
            "user:email1@gmail.com",
            "user:email3@gmail.com"
          ]
        }
      ]
    }
    

测试调用者是否拥有权限

testIamPermissions API 方法接受资源网址和一组权限作为输入参数,并返回调用者可以拥有的权限列表。您可以对任何受支持的资源使用此方法。

如果您直接使用 Google Cloud 管理权限,通常无需调用 testIamPermissiontestIamPermissions 适合与您的专有软件(如自定义图形界面)集成。例如,如果您是在 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"
      ]
    }
    

场景

在组织内共享特定映像

假设某公司有一组经 IT 认证的机器映像,并希望向某些团队授予对特定映像的访问权限。在未对 Compute Engine 资源设置 Cloud IAM 政策的情况下,这家公司只能通过两种方式授予访问权限:将对所有映像的访问权限授予所有人,或将映像存储在多个项目中。 对 Compute Engine 资源设置 Cloud IAM 政策后,该公司就可以将所有映像保存在单个项目中,这种做法不仅更便于管理,而且还能将各团队的访问权限限定在其工作所需的映像子集。

在以下示例中,images-project 有多个映像。all-devs@example.com 群组有权使用 ubuntu-base-v1-0 映像,但无权使用 ubuntu-v1-1-testmysql-v1 映像。此外,db-admins@example.com 群组仅有权使用 mysql-v1 映像。如要按照此设置进行配置,您可以针对 ubuntu-base-v1-0 映像设置一个向 all-devs@example.com 授予 Image User 角色的 Cloud IAM 政策,同时针对 mysql-v1 设置一个向 db-admin@example.com 授予 Image User 角色的 Cloud IAM 政策。

如要使用 gcloud 命令行工具向 all-devs@example.com 授予 shared-image 映像的使用权限,请执行以下操作:

  1. 获取 Cloud IAM 政策:

    gcloud compute images get-iam-policy shared-image --format json > policy.json
    
  2. 在文本编辑器中修改 policy.json,以向 all-devs@example.com 授予 roles/compute.imageUser 角色:

    {
      "bindings": [
        {
          "members": [
            "group:all-devs@example.com"
          ],
          "role": "roles/compute.imageUser"
        }
      ],
      "etag": "ACAB"
    }
    
  3. 将修改后的 policy.json 应用于该映像。

    gcloud compute images set-iam-policy shared-image policy.json
    

公开共享特定映像

假设您是为 Compute Engine 用户发布映像的 Google 合作伙伴。您可以针对映像设置 Cloud IAM 政策,以便与 Compute Engine 的所有经过身份验证的用户共享该政策。

如要使用 Compute Engine API 向所有 Compute Engine 用户提供 shared-image,请执行以下操作:

  1. 获取 Cloud IAM 政策。

    GET https://compute.googleapis.com/compute/v1/projects/[PROJECT_ID]/zones/[ZONE]/images/shared-image/getIamPolicy
    
  2. 该请求返回此政策。

    {
     "etag": "ACAB"
    }
    
  3. 应用修改后的政策。

    POST https://compute.googleapis.com/compute/alpha/projects/[PROJECT_ID]/zones/[ZONE]/images/shared-image/setIamPolicy
    {
      "bindings": [
        {
          "members": [
            "allAuthenticatedUsers"
          ],
          "role": "roles/compute.imageUser"
        }
      ],
      "etag": "ACAB"
    }
    
  4. 该请求返回更新后的政策。

    {
     "etag": "BwVa45js9SQ=",
     "bindings": [
       {
         "role": "roles/compute.imageUser",
         "members": [
           "allAuthenticatedUsers"
         ]
       }
     ]
    }
    

向团队成员授予对实例的访问权限以便调试问题

假设您创建了一个实例并想让 alice@example.com 帮助调试问题。您可以向 alice@example.com 授予该实例的 Compute Instance Admin (v1) 角色(只需修改该实例的 Cloud IAM 政策即可)。

如果您将该实例配置为以服务帐号的身份运行,并且想让 Alice 能够使用 SSH 进行连接、设置元数据或挂接磁盘,请向 alice@example.com 授予该实例服务帐号的 Service Account User 角色。由于这三项操作会允许 Alice 代表该服务帐号运行命令,因此您必须针对该服务帐号授予此角色。如需详细了解如何将服务帐号视为资源,请参阅服务帐号权限

如果您希望 Alice 通过 Cloud Console 管理该实例,需授予她具有 compute.projects.get 权限的角色。例如,您可以向 Alice 授予拥有此权限的 Compute Viewer 角色。此角色还可以查看项目中的所有 Compute Engine 资源,但它无法从磁盘、映像或快照中读取数据。此外,您也可以创建拥有必要权限的自定义角色

下面展示了如何使用 gcloud 执行此操作。

  1. 获取该实例的 Cloud IAM 政策。

    gcloud compute instances get-iam-policy example-instance --format json > policy.json
    
  2. 在文本编辑器中修改 policy.json

    {
      "bindings": [
        {
          "members": [
            "user:alice@example.com"
          ],
          "role": "roles/compute.instanceAdmin.v1"
        }
      ],
      "etag": "ACAB"
    }
    
  3. 将修改后的 policy.json 应用于该实例。

    gcloud compute instances set-iam-policy example-instance policy.json
    
  4. alice@example.com 授予该实例服务帐号的 Service Account User 角色。假设该实例的服务帐号为 data-reader-service-account@[PROJECT_ID].iam.gserviceaccount.com

     gcloud iam service-accounts add-iam-policy-binding \
         data-reader-service-account@[PROJECT_ID].iam.gserviceaccount.com \
         --member="user:alice@example.com" \
         --role="roles/iam.serviceAccountUser"
    

    gcloud 会返回以下内容:

     bindings:
     - members:
       - user:alice@example.com
       role: roles/iam.serviceAccountUser
     etag: BwVa42MC-aY=
    
  5. alice@example.com 授予项目的 Compute Viewer 角色

    gcloud projects add-iam-policy-binding [PROJECT_ID] \
        --member=user:alice@example.com \
        --role=roles/compute.viewer
    

    gcloud 会返回以下内容:

    bindings:
    - members:
      - user:alice@example.com
      role: roles/iam.serviceAccountUser
    [...]
    etag: BwVa42MC-aY=
    

Alice 现可在 Cloud Console 中看到该实例,并且有权对该实例调用任何方法。如果 Alice 需要对其他资源(例如,子网或防火墙)的权限,那么您需要向她授予相应的预定义角色(如网络用户)。

后续步骤

此页内容是否有用?请给出您的反馈和评价:

发送以下问题的反馈:

此网页
Compute Engine 文档