服務帳戶

本頁面說明服務帳戶、存取權範圍,以及適用於服務帳戶的身分與存取權管理 (IAM) 角色。如要瞭解如何建立及使用服務帳戶,請參閱建立和啟用執行個體的服務帳戶說明文件。

服務帳戶是一種特殊帳戶,可供 Google Compute Engine 上執行的服務和應用程式與其他 Google Cloud Platform API 互動。應用程式可以利用服務帳戶憑證自行授權一組 API,然後依據授予服務帳戶和虛擬機器執行個體的權限來執行操作。此外,您也可以建立防火牆規則,根據指派給每個執行個體的服務帳戶,允許或拒絕執行個體傳輸流量。

什麼是服務帳戶?

服務帳戶是可供執行個體或應用程式用於代表您執行 API 的身分,這個身分可讓其他 Google Cloud Platform 服務識別您虛擬機器執行個體上執行的應用程式。舉例來說,如果您開發的應用程式可以讀取及寫入 Google Cloud Storage 上的檔案,那麼該應用程式就必須經過 Google Cloud Storage API 驗證。您可以建立服務帳戶,並將 Cloud Storage API 存取權授予該服務帳戶,然後更新應用程式的程式碼,將服務帳戶憑證傳輸至 Cloud Storage API,這樣就能順利通過 API 驗證,而不需在執行個體、映像檔或應用程式的程式碼中內嵌任何密鑰或使用者憑證。

如果您的服務帳戶具有必要的 IAM 權限,這些服務帳戶就能建立和管理執行個體及其他資源。您必須在專案或資源層級授予必要的 IAM 權限,服務帳戶才能修改或刪除資源。您也可以變更與執行個體相關聯的服務帳戶。

執行個體只能有一個服務帳戶,且服務帳戶建立時所在的專案必須和執行個體所屬專案相同。

適用於 Compute Engine 執行個體的服務帳戶分為下列兩種:

  • 使用者代管的服務帳戶
  • Google 代管的服務帳戶

使用者代管的服務帳戶

使用者代管的服務帳戶包含您明確建立的服務帳戶和 Compute Engine 預設服務帳戶。

新增服務帳戶

您可以利用 Google 身分與存取權管理功能自行建立及管理服務帳戶。建立帳戶之後,請將身分與存取權管理角色授予該帳戶,然後將執行個體設為以服務帳戶執行。如此一來,凡是在啟用服務帳戶的執行個體上執行的應用程式,都能利用該帳戶的憑證向其他 Google API 發送要求。

如要建立及設定新的服務帳戶,請參閱建立和啟用執行個體的服務帳戶一文。

Compute Engine 預設服務帳戶

新建立的專案內建 Compute Engine 預設服務帳戶,使用的電子郵件格式如下:

[PROJECT_NUMBER]-compute@developer.gserviceaccount.com

Google 建立預設服務帳戶後,就會自動將其新增至您的帳戶,但您仍然可以全權控管帳戶。

透過 gcloud 指令列工具或 Google Cloud Platform 主控台建立執行個體時,系統會自動將執行個體設為以預設服務帳戶執行,並設定下列存取權範圍

  • 具備 Google Cloud Storage 的唯讀權限:
    https://www.googleapis.com/auth/devstorage.read_only
  • 具備 Compute Engine 記錄檔的寫入權限:
    https://www.googleapis.com/auth/logging.write
  • 具備將指標資料發佈至 Google Cloud 專案的權限:
    https://www.googleapis.com/auth/monitoring.write
  • 具備 Google Cloud Endpoints (Alpha 測試版) 所需的 Service Management 功能的唯讀權限:
    https://www.googleapis.com/auth/service.management.readonly
  • 具備 Google Cloud Endpoints (Alpha 測試版) 所需的 Service Control 功能的讀取和寫入權限:
    https://www.googleapis.com/auth/servicecontrol

您可以在 Google Cloud Platform 主控台中變更預設服務帳戶。

不利用 gcloud 指令列工具或 Google Cloud Platform 主控台建立執行個體,改以發送要求至 API 的方式建立執行個體時,執行個體便不會內建預設服務帳戶。不過,您仍可明確指定在要求酬載中包含預設服務帳戶,藉此啟用預設服務帳戶。

您可以從專案中刪除這類服務帳戶,但這麼做可能會導致需要服務帳戶憑證的任何應用程式無法正常運作。如果您不慎刪除了預設服務帳戶,請gcloud services enable compute.googleapis.com,或嘗試重新建立預設的服務帳戶。然後您必須重新啟動現有執行個體,才能啟用新的服務帳戶。

綜上所述,預設服務帳戶具備下列屬性:

  • 由 Google Cloud Platform 主控台專案自動建立,並且具有自動產生的名稱和電子郵件地址。
  • 系統會自動將預設服務帳戶新增至您的專案中,並設為專案編輯者。
  • 透過 gcloud 指令列工具和 GCP 主控台建立的所有執行個體都會啟用預設服務帳戶,且預設服務帳戶會具備一組特定權限。如要覆寫這項設定,請在建立執行個體時指定其他服務帳戶,或明確停用執行個體的服務帳戶。

Google 代管的服務帳戶

這類服務帳戶是由 Google 建立及代管,並且會自動指派至您的專案。這些帳戶分別代表不同的 Google 服務,而且每個帳戶都能在某些情況下存取您的 Google Cloud Platform 專案。

Google API 服務帳戶

除了預設服務帳戶之外,所有啟用 Compute Engine 的專案都會內建 Google API 服務帳戶,電子郵件地址格式如下:

[PROJECT_NUMBER]@cloudservices.gserviceaccount.com

這類服務帳戶會專門用於代表您執行內部 Google 處理程序。帳戶的擁有者為 Google,而且不會在 GCP 主控台的「服務帳戶」專區中列出。根據預設,系統會自動將專案編輯者角色授予這個帳戶,並且會在 GCP 主控台的「身分與存取權管理」專區中列出。只有刪除專案時,您才能刪除這類服務帳戶。不過,您可以變更系統授予這類服務帳戶的角色,包括撤銷專案的所有存取權。

某些資源需要這類服務帳戶和已授予服務帳戶的預設編輯者權限才能存取。舉例來說,代管執行個體群組和自動調度資源功能會使用這個帳戶的憑證來建立、刪除及管理執行個體。如果撤銷服務帳戶的權限,或者以不授予建立執行個體權限的方式修改權限,就會導致代管執行個體群組或自動調度資源功能停止運作。

基於這些原因,建議您不要修改這類服務帳戶的角色。

Compute Engine System 服務帳戶

啟用 Compute Engine API 的所有專案都具備 Compute Engine System 服務帳戶,電子郵件地址格式如下:

service-[PROJECT_NUMBER]@compute-system.iam.gserviceaccount.com

這類服務帳戶可讓 Google Compute Engine 對您的專案執行服務作業。這類服務帳戶需要授予 Google Cloud 專案的服務代理人身分與存取權管理政策,同時也可讓 Compute Engine 存取 VM 執行個體上的由客戶擁有的服務。Google 具備這類帳戶的擁有權,但該帳戶僅限特定專案使用,而且會在 GCP 主控台的「服務帳戶」和「身分與存取權管理」專區中列出。根據預設,系統會自動將 compute.serviceAgent 角色授予您的專案。

只有刪除專案時,您才能刪除這類服務帳戶。不過,您可以變更系統授予這類服務帳戶的角色,以及撤銷帳戶對專案的所有存取權。撤銷或變更這類服務帳戶的權限會禁止 Compute Engine 存取 VM 上的服務帳戶身分,而且可能導致 VM 內執行的軟體發生中斷情況。

基於這些原因,建議您不要修改這類服務帳戶的角色。

服務帳戶權限

將執行個體設為以服務帳戶執行時,服務帳戶的存取權層級會因已授予執行個體的存取權範圍和已授予服務帳戶的身分與存取權管理角色而異。您必須同時設定存取權層級和身分與存取權管理角色,才能順利將執行個體設為以服務帳戶執行。主要說明如下:

  • 存取權範圍可以將執行個體具備的潛在存取權授予 API 方法。
  • 身分與存取權管理功能可以限制存取授予服務帳戶的角色。

存取權範圍和身分與存取權管理角色會在以下各節詳述。

您可以選擇多種存取權範圍,但也可以就設定 cloud-platform 存取權範圍,允許存取所有 Cloud Platform 服務,然後授予身分與存取權管理角色來限制存取權:

https://www.googleapis.com/auth/cloud-platform

舉例來說,如果您為執行個體啟用 cloud-platform 存取權範圍,然後授予下列身分與存取權管理角色:

  • roles/compute.instanceAdmin.v1
  • roles/storage.objectViewer
  • roles/compute.networkAdmin

該服務帳戶就只會具備上述三個身分與存取權管理角色所授予的權限。即使享有 Cloud Platform 存取權範圍,仍無法執行上述角色範圍外的操作。

反之,如果您一開始就授予 Cloud Storage 唯讀範圍這類較具限制性的範圍 (https://www.googleapis.com/auth/devstorage.read_only),然後為服務帳戶設定 roles/storage.objectAdmin 角色,執行個體仍舊無法管理 Google Cloud Storage 物件,即使您已授予 roles/storage.ObjectAdmin 角色亦然。這正是因為 Cloud Storage 唯讀範圍不允許執行個體控管 Cloud Storage 資料。

一般來說,所有 API 方法說明文件也都會一併列出該方法所需的存取權範圍。舉例來說,instances.insert 方法就在授權部分列出了有效的範圍清單。

存取權範圍

存取權範圍是為執行個體指定權限的傳統方法。在我們推出身分與存取權管理角色之前,只能透過存取權範圍這種機制將權限授予服務帳戶。雖然這種方法不是目前授予權限的主要方式,但當您將執行個體設為以服務帳戶執行時,仍須設定存取權範圍

存取權範圍只適用於個別執行個體:您可以在建立執行個體時設定存取權範圍,但一旦該執行個體的生命週期結束,存取權範圍就會失效。除非您已為服務帳戶所屬的專案啟用相應的 API,否則存取權範圍不會運作。舉例來說,將 Google Cloud Storage 的存取權範圍授予虛擬機器執行個體之後,您必須為專案啟用 Cloud Storage API,執行個體才能呼叫 Cloud Storage API。如果您並未為專案啟用 API,存取權範圍就不會生效。

存取權範圍範例包括:

  • https://www.googleapis.com/auth/cloud-platform - 具備所有 Google Cloud Platform 資源的完整存取權限。
  • https://www.googleapis.com/auth/compute - 具備 Google Compute Engine 方法的完整存取權限。
  • https://www.googleapis.com/auth/compute.readonly - 具備 Google Compute Engine 方法的唯讀權限。
  • https://www.googleapis.com/auth/devstorage.read_only - 具備 Google Cloud Storage 的唯讀權限。
  • https://www.googleapis.com/auth/logging.write - 具備 Google Compute Engine 記錄檔的寫入權限。

身分與存取權管理角色

除了設定存取權範圍之外,您還必須將正確的身分與存取權管理角色授予服務帳戶,才能設定該帳戶的存取權層級。舉例來說,您可以將管理 Google Cloud Storage 物件或管理 Google Cloud Storage 值區的身分與存取權管理角色授予服務帳戶 (或兩者皆授予),將帳戶設為僅具備這些角色所授予的權限。

身分與存取權管理角色僅適用於個別帳戶。因此一旦您將身分與存取權管理角色授予服務帳戶,以該服務帳戶執行的任何執行個體都能使用該角色。也請注意下列事項:

  • 部分身分與存取權管理角色目前仍為測試版。

    如果系統提供的身分與存取權管理角色沒有您所需的存取權層級,您可以授予任一原始角色 (例如專案編輯者)。

  • 您必須為執行個體設定存取權範圍,才能授予存取權。

    建立虛擬機器執行個體時,您無法略過設定存取權範圍,僅將身分與存取權管理角色授予服務帳戶。服務帳戶的存取權層級會因存取權範圍和身分與存取權管理角色的組合而異,因此您必須同時設定存取權範圍和身分與存取權管理角色,服務帳戶才能正常運作。

後續步驟

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

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

這個網頁
Compute Engine 說明文件