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

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

资源还会沿用其父级资源的政策。资源的有效政策是指为该资源设置的政策与从资源层次结构中更高层级沿用而来的政策的集合。

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

请参阅 Cloud IAM 文档,详细了解可以包含在 Cloud IAM 政策中的成员类型(例如用户或组)。

准备工作

支持的资源

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

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

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

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

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

Console

  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 角色:

    {
      "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://www.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://www.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 方法将资源网址和一组权限作为输入参数,并返回调用者可以使用的一组权限。您可以对任何受支持的资源使用此方法。

如果您直接使用 GCP 管理权限,通常无需调用 testIamPermissiontestIamPermissions 旨在与您的专有软件(如自定义图形界面)集成。例如,如果您在 Compute Engine API 的基础上构建 GUI,且 GUI 有启动实例的“开始”按钮,则可以通过调用 compute.instances.testIamPermissions() 来确定是应该启用还是禁用该按钮。

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

  1. 向该资源发送请求,并在请求正文中包含要检查的权限列表。

    例如,对于实例,您可以检查 compute.instances.startcompute.instances.stopcompute.instances.delete

    POST https://www.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-test 映像或 mysql-v1 映像。此外,db-admins@example.com 组只有权使用 mysql-v1 映像。要配置此设置,您可以针对 ubuntu-base-v1-0 映像设置一个向 all-devs@example.com 授予映像用户角色的 Cloud IAM 政策,然后针对 mysql-v1 设置一个向 db-admin@example.com 授予映像用户角色的 Cloud IAM 政策。

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

  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://www.googleapis.com/compute/v1/projects/[PROJECT_ID]/zones/[ZONE]/images/shared-image/getIamPolicy
    
  2. 该请求返回此政策。

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

    POST https://www.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 授予实例的计算实例管理员 (v1) 角色,只需修改实例的 Cloud IAM 政策即可。

如果实例配置为以服务帐号的身份运行,并且您希望 Alice 能够使用 SSH 进行连接、设置元数据或附加磁盘,请向 alice@example.com 授予该实例服务帐号的服务帐号用户角色。授予该服务帐号的这个角色是必要步骤,因为这三个操作使 Alice 能够代表该实例的服务帐号运行命令。请参阅服务帐号权限,详细了解如何将服务帐号视为资源。

如果您希望 Alice 通过 GCP Console 管理实例,请向她授予拥有 compute.projects.get 权限的角色。例如,您可以向 Alice 授予拥有此权限的计算查看者角色。此角色还可以查看项目中的所有 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 授予该实例服务帐号的服务帐号用户角色。假设该实例的服务帐号是 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 授予项目的计算查看者角色

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

后续步骤

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

发送以下问题的反馈:

此网页
Compute Engine 文档