授予 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 Console 及 gcloud 指令列工具來新增和移除執行個體、磁碟、映像檔和快照上的 Cloud IAM 繫結。

如要更新資源上所有成員的 Cloud IAM 政策,請參閱取得及設定資源政策一節。

主控台

  1. 找出您要新增權限的資源,前往該資源對應的頁面。
  2. 找出您要更新的資源,選取該資源旁邊的核取方塊。
  3. 按一下 [Show info panel] (顯示資訊面板) 來展開權限欄。
  4. 如要新增成員:
    1. 在「Add members」(新增成員) 欄位中,新增一或多位成員。
    2. 在 [請選取角色] 下拉式選單中,選取一或多個角色。
    3. 按一下 [Add] (新增) 即可儲存變更。
  5. 如要移除成員:
    1. 如果資源已有一或多個角色的政策繫結,這些角色會以可展開資訊卡的形式顯示。找出您要移除的一或多位成員,按一下這些成員的角色資訊卡。
    2. 按一下「delete」(刪除) 圖示 (外觀類似垃圾桶的刪除圖示) 即可移除各個角色。

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 陣列,以及這些成員的相關角色。舉例來說,如要授予 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://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 方法會以資源網址和一組權限做為輸入參數,並傳回呼叫者允許使用的一組權限。您可以在任何支援的資源上使用此方法。

如果直接使用 GCP 管理權限,通常不會叫用 testIamPermissiontestIamPermissions 適合與您的專屬軟體 (如自訂圖形使用者介面) 整合。例如,如要在 Compute Engine API 之上建構 GUI,而 GUI 具有啟動執行個體的 [start] (啟動) 按鈕,則可呼叫 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-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 政策。

如要使用 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,將 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://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 協助進行問題除錯。請修改執行個體的 Cloud IAM 政策,將執行個體的 Compute 執行個體管理員 (v1) 角色授予 alice@example.com

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

如果您想要讓 Alice 可透過 GCP Console 管理執行個體,請授予 Alice 具有 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 Console 查看執行個體,同時有權限可在執行個體上呼叫任何方法。如果 Alice 還需要其他資源 (例如子網路或防火牆) 的權限,您就必須授予她適合的預先定義角色 (例如網路使用者)。

後續步驟

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

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

這個網頁
Compute Engine 說明文件