授予 Compute Engine 資源的存取權

Compute Engine 資源適用的 Cloud IAM 政策,可供您透過管理 VM 執行個體、磁碟和映像檔的 Cloud IAM 角色,授予上述特定資源的存取權。如此一來,您可以透過更靈活的方式落實最小權限原則;例如將協作者的權限,限制在工作所需的資源上。

資源同時也會繼承父項資源的政策。對資源來說有效的政策,除了在自身層級設定的政策外,還包括從上級資源階層繼承而來的政策。

當您將資源與成員建立繫結,或對資源設定政策時,成員並不會收到邀請電子郵件。系統會直接更新每位成員的存取權。

如要進一步瞭解可納入 Cloud IAM 政策的成員類型 (例如使用者或群組),請參閱 Cloud IAM 說明文件

事前準備

支援的資源類型

下列為目前可授予的 Compute Engine 資源存取權:

您也可以授予下列資源存取權,但這項功能目前仍屬於 Beta 版,因此您必須使用相關聯的 gcloud beta 或是 Beta 版 API 指令:

新增及移除資源的成員繫結

資源的 Cloud IAM 繫結會將特定角色授予該資源的成員。您可以利用 Google Cloud Platform 主控台和 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] 是您要為該成員新增的角色

如果您要授予目前為 Beta 版的資源存取權,請改用 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 陣列,以及與這些成員相關聯的角色。舉例來說,如要將 roles/compute.imageUser 角色授予 all-devs@example.comsome-devs@other-place.com 群組,並將 roles/compute.storageAdmin 角色授予 bob@example.com,請將 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://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.com 撤銷 compute.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-testmysql-v1 這兩個映像檔;而 db-admins@example.com 群組卻僅有權使用 mysql-v1 映像檔。如要按照此情境進行設定,您可以透過 Cloud IAM 政策將 ubuntu-base-v1-0 映像檔的映像檔使用者角色授予 all-devs@example.com;同時對 mysql-v1 映像檔設定 Cloud IAM 政策,將映像檔使用者角色授予 db-admin@example.com

如何使用 gcloud 指令列工具將 shared-image 映像檔的使用權限授予 all-devs@example.com

  1. 取得 Cloud IAM 政策。

    gcloud compute images get-iam-policy shared-image --format json > policy.json
    
  2. 在文字編輯器中修改 policy.json,將 roles/compute.imageUser 角色授予 all-devs@example.com

    {
      "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 協助偵測及修正問題,您可以修改執行個體的 Cloud IAM 政策,將 Compute 執行個體管理員 (v1) 角色授予 alice@example.com

如果您將執行個體設為以服務帳戶的形式執行,並且想讓 Alice 能夠設定中繼資料、附加磁碟及透過 SSH 進行連線,請將執行個體服務帳戶的服務帳戶使用者角色授予 alice@example.com。由於上述三項操作會允許 Alice 代表服務帳戶執行指令,因此您必須「針對」該帳戶授予指定角色。如要進一步瞭解如何將服務帳戶視為資源,請參閱服務帳戶權限

如要讓 Alice 透過 GCP 主控台管理執行個體,則須授予她具備 compute.projects.get 權限的角色。舉例來說,您可以將內含這項權限的 Compute 檢視者角色授予 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. 將專案的 Compute 檢視者角色授予 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 主控台查看執行個體,同時有權在執行個體上呼叫任何方法。如果 Alice 還需要其他資源 (例如子網路或防火牆) 的權限,您就必須授予她適合的預先定義角色 (例如網路使用者)。

後續步驟

本頁內容對您是否有任何幫助?請提供意見:

傳送您對下列選項的寶貴意見...

這個網頁
Compute Engine 說明文件