Compute Engine 資源適用的 Cloud IAM 政策,可供您透過管理 VM 執行個體、磁碟和映像檔等特定資源的 Cloud IAM 角色,授予特定資源的存取權。如此一來,您可以靈活地落實最小權限原則,例如僅將執行作業所需之特定資源的權限授予協作者。
資源同時也會繼承父項資源的政策。有效的資源政策,是將該資源設定的政策與從資源階層結構較上層繼承而來的政策加以結合。
當您將資源與成員建立繫結,或對資源設定政策時,成員並不會收到邀請電子郵件。系統會直接更新每位成員的存取權。
如要進一步瞭解可納入 Cloud IAM 政策的成員類型 (例如使用者或群組),請參閱 Cloud IAM 說明文件。
事前準備
- 如要使用本指南中的指令列範例,請完成下列事項:
- 安裝或更新至最新版 gcloud 指令列工具。
- 設定預設地區和區域。
- 如要使用本指南中的 API 範例,請設定 API 存取權。
- 閱讀存取權控制總覽。
- 熟悉 Compute Engine 的 Cloud IAM 角色。
支援的資源
您目前可授予下列 Compute Engine 資源的存取權:
您也可以授予下列資源的存取權,但這項功能目前仍屬於 Beta 版,因此您必須使用相關聯的 gcloud beta
或是 Beta 版 API 指令:
subnetworks
(Beta 版)
新增及移除資源的成員繫結
資源的 Cloud IAM 繫結會將特定角色授予該資源的成員。您可以使用 Google Cloud Platform Console 及 gcloud
指令列工具來新增和移除執行個體、磁碟、映像檔和快照上的 Cloud IAM 繫結。
如要更新資源上所有成員的 Cloud IAM 政策,請參閱取得及設定資源政策一節。
主控台
- 找出您要新增權限的資源,前往該資源對應的頁面。
- 如為執行個體,請前往「VM instances」(VM 執行個體) 頁面。
- 如為磁碟,請前往「Disks」(磁碟) 頁面。
- 如為快照,請前往「Snapshots」(快照) 頁面。
- 如為映像檔,請前往「Images」(映像檔) 頁面。
- 找出您要更新的資源,選取該資源旁邊的核取方塊。
- 按一下 [Show info panel] (顯示資訊面板) 來展開權限欄。
- 如要新增成員:
- 在「Add members」(新增成員) 欄位中,新增一或多位成員。
- 在 [請選取角色] 下拉式選單中,選取一或多個角色。
- 按一下 [Add] (新增) 即可儲存變更。
- 如要移除成員:
- 如果資源已有一或多個角色的政策繫結,這些角色會以可展開資訊卡的形式顯示。找出您要移除的一或多位成員,按一下這些成員的角色資訊卡。
- 按一下「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]
是資源的類型,即:disks
、images
、instances
、instance-templates
、sole-tenancy node-groups
、sole-tenancy node-templates
或snapshots
。[RESOURCE_NAME]
是資源名稱,例如:my_instance
。[MEMBER]
是您要新增繫結的成員。- 格式應為
user|group|serviceAccount:email
或domain:domain
。例如,user:test-user@gmail.com
、group:admins@example.com
、serviceAccount:test123@example.domain.com
或domain:example.domain.com
。 - 您也可以使用下列特殊值:
allUsers
:網際網路上的所有使用者,無論是否擁有 Google 帳戶。allAuthenticatedUsers
:任何透過 Google 帳戶或服務帳戶進行驗證的使用者。
- 格式應為
[ROLE]
是您要為該成員新增的角色
如果您要授予目前為 Beta 版的資源存取權,請改用 gcloud beta compute
指令。
取得及設定資源政策
資源的 Cloud IAM 政策是由一系列的陳述式所組成,這類陳述式會定義該資源存取權的授予對象。
您可以利用「讀取 - 修改 - 寫入」模式更新資源政策,此模式會先擷取資源現有的 Cloud IAM 政策,接著更新並完成政策設定。如要進一步瞭解該模式,請參閱 Cloud IAM 說明文件。
gcloud
執行 gcloud
指令以取得或設定資源的政策時,可使用 JSON 或 YAML 檔案。此處的範例是使用 JSON。
執行資源的
get-iam-policy
子指令來擷取要修改的政策。gcloud compute [RESOURCE_TYPE] get-iam-policy [RESOURCE_NAME] --format json > policy.json
其中:
[RESOURCE_TYPE]
是資源的類型,即:disks
、images
、instances
、instance-templates
或snapshots
。[RESOURCE_NAME]
是資源名稱。
舉例來說,如要為名為
example-disk
的磁碟擷取 Cloud IAM 政策,請執行:gcloud compute disks get-iam-policy example-disk --format json > policy.json
空白的 JSON 政策檔案看起來與下列內容類似。
etag
屬性是用於驗證政策自上次要求以來是否有所變更。{ "etag": "ACAB" }
使用文字編輯器更新 JSON 檔案。建構包含陣列的
bindings
物件。陣列中的每個物件均有一個members
陣列,以及這些成員的相關角色。舉例來說,如要授予all-devs@example.com
和some-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" }
執行資源的
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
此指令會輸出更新後的政策,其中包含更新後的
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
如要修改既有的政策:
呼叫資源的
getIamPolicy()
方法來擷取既有政策。舉例來說,若資源是磁碟,可在資源上提出下列要求:
GET https://compute.googleapis.com/compute/v1/projects/[PROJECT_ID]/zones/[ZONE]/disks/[DISK_NAME]/getIamPolicy
要求會傳回政策,其中包括
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" ] } ] }
視需要修改政策,然後呼叫
setIamPolicy()
來設定更新後的政策。例如,如果您想撤銷
email2@gmail.com
的compute.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" ] } ] }
回應會顯示更新後的政策,其中包含經過更新的
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 管理權限,通常不會叫用 testIamPermission
。testIamPermissions
適合與您的專屬軟體 (如自訂圖形使用者介面) 整合。例如,如要在 Compute Engine API 之上建構 GUI,而 GUI 具有啟動執行個體的 [start] (啟動) 按鈕,則可呼叫 compute.instances.testIamPermissions()
來判斷應啟用或停用按鈕。
如要測試呼叫者是否擁有資源的特定權限:
傳送要求到資源,並以清單形式將您要檢查的權限加入要求主體。
舉例來說,您可能會想要檢查執行個體上的
compute.instances.start
、compute.instances.stop
和compute.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" ] }
該要求會傳回已為呼叫者啟用的權限。
{ "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
映像檔的權限:
取得 Cloud IAM 政策:
gcloud compute images get-iam-policy shared-image --format json > policy.json
在文字編輯器中修改
policy.json
,將roles/compute.imageUser
角色授予all-devs@example.com
:{ "bindings": [ { "members": [ "group:all-devs@example.com" ], "role": "roles/compute.imageUser" } ], "etag": "ACAB" }
將修改後的
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
:
取得 Cloud IAM 政策。
GET https://compute.googleapis.com/compute/v1/projects/[PROJECT_ID]/zones/[ZONE]/images/shared-image/getIamPolicy
要求會傳回政策。
{ "etag": "ACAB" }
套用修改後的政策。
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" }
要求會傳回已更新的政策。
{ "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
執行上述操作。
取得執行個體的 Cloud IAM 政策。
gcloud compute instances get-iam-policy example-instance --format json > policy.json
在文字編輯器中修改
policy.json
。{ "bindings": [ { "members": [ "user:alice@example.com" ], "role": "roles/compute.instanceAdmin.v1" } ], "etag": "ACAB" }
將修改後的
policy.json
套用至執行個體。gcloud compute instances set-iam-policy example-instance policy.json
將執行個體服務帳戶的服務帳戶使用者角色授予
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=
將專案的 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 Cloud IAM 角色。
- 進一步瞭解預先定義的 Compute Engine 角色具備哪些權限。
- 進一步瞭解如何建立自訂角色。