服務帳戶

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

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

什麼是服務帳戶?

服務帳戶是可供執行個體或應用程式用於代表您執行 API 要求的身分,

這個身分可用於為其他 Google Cloud Platform 服務識別在您的虛擬機器執行個體上執行的應用程式。舉例來說,假如您編寫了一個會在 Cloud Storage 上讀寫檔案的應用程式,則該應用程式必須先透過 Cloud Storage API 進行身分驗證。您可以建立服務帳戶,並對該服務帳戶授予 Cloud Storage API 的存取權,然後更新應用程式,將服務帳戶憑證傳送至 Cloud Storage API。您的應用程式可以順暢地對 API 進行身分驗證,不需在執行個體、映像檔或應用程式的程式碼中嵌入任何密鑰或使用者憑證。

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

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

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

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

使用者代管的服務帳戶

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

新增服務帳戶

您可以使用 Cloud Identity and Access Management 自行建立及管理服務帳戶。建立帳戶之後,請將 IAM 角色授予該帳戶,並設定執行個體以服務帳戶身分執行。在已啟用服務帳戶的執行個體上執行的應用程式,可以使用該帳戶的憑證向其他 Google API 發出要求。

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

Compute Engine 預設服務帳戶

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

[PROJECT_NUMBER]-compute@developer.gserviceaccount.com

Google 會建立 Compute Engine 預設服務帳戶,並將該帳戶自動新增到您的專案中,但您可以完全控制該帳戶。

Compute Engine 預設服務帳戶是透過 Cloud IAM 專案編輯者角色建立,但您可以修改服務帳戶的角色,以安全地限制服務帳戶可存取的 Google API。

您可以從專案中刪除這類服務帳戶,但這麼做可能會導致需要服務帳戶憑證的任何應用程式無法正常運作。如果您不小心刪除了 Compute Engine 預設服務帳戶,您可以在 30 天內嘗試復原帳戶。詳情請參閱建立和管理服務帳戶一文。

綜上所述,Compute Engine 預設服務帳戶具有以下屬性:

  • 由 Google Cloud Platform Console 專案自動建立,並且具有自動產生的名稱和電子郵件地址。
  • 會透過 Cloud IAM 專案編輯者角色自動新增到您的專案。
  • 系統會在所有由 gcloud 指令列工具和 GCP Console 建立的執行個體上預設啟用這類帳戶。如要覆寫這項設定,請在建立執行個體時指定其他服務帳戶,或明確停用執行個體的服務帳戶。

建立服務帳戶與執行個體間的關聯

使用 gcloud 指令列工具或 Google Cloud Platform Console 建立執行個體時,您可以指定執行個體呼叫 GCP API 時要使用的服務帳戶。系統會自動為執行個體設定下列存取權範圍

  • 具備 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

存取權範圍是依據用戶端程式庫和 gloud 發出的要求來定義預設 OAuth 範圍。因此在透過 OAuth 進行驗證時,存取權範圍可能會限制 API 方法的存取,但不會擴展至其他驗證通訊協定,例如 gRPC。因此,最佳做法是在執行個體上設定完整的 cloud-platform 存取權範圍,然後將 IAM 角色授予服務帳戶,藉此安全地限制服務帳戶的存取權。詳情請參閱服務帳戶權限

如果您是透過直接向 API 發出要求 (而不是使用 gcloud 指令列工具或 Google Cloud Platform Console) 的方式建立執行個體,執行個體就不會自動啟用預設服務帳戶。不過,您仍可明確指定在要求酬載中包含預設服務帳戶,藉此啟用預設服務帳戶。

Google 代管的服務帳戶

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

Google API 服務帳戶

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

[PROJECT_NUMBER]@cloudservices.gserviceaccount.com

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

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

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

Compute Engine System 服務帳戶

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

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

該服務帳戶是專門設計用來讓 Compute Engine 在您的專案上執行服務職責。這類服務帳戶需要授予 Google Cloud 專案的服務代理人身分與存取權管理政策,同時也可讓 Compute Engine 存取 VM 執行個體上的客戶所有服務帳戶。Google 具備這類帳戶的擁有權,但該帳戶僅限特定專案使用,而且會列在 GCP Console 的「Service Accounts」(服務帳戶) 和「IAM」(身分與存取權管理) 區段中。根據預設,系統會自動將專案的 compute.serviceAgent 角色授予這個帳戶。

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

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

服務帳戶權限

將執行個體設為以服務帳戶的形式執行時,您可以藉由授予服務帳戶 IAM 角色來定義服務帳戶具備的存取層級。如果服務帳戶沒有 IAM 角色,那麼該執行個體上的服務帳戶就無法執行任何 API 方法。

此外,執行個體的存取權範圍會針對執行個體上透過 gcloud 工具和用戶端程式庫發出的要求來定義預設的 OAuth 範圍。因此,透過 OAuth 進行驗證時,存取權範圍可能會進一步限制 API 方法的存取。但不會擴展至其他驗證通訊協定,例如 gRPC。

最佳做法是在執行個體上設定完整的 cloud-platform 存取權範圍,然後使用 IAM 角色安全地限制服務帳戶的存取權。

主要說明如下:

  • IAM 會根據授予服務帳戶的 IAM 角色限制對 API 的存取權。
  • 透過 OAuth 進行驗證時,存取權範圍可能會進一步限制 API 方法的存取。

以下章節會詳細說明存取權範圍和 IAM 角色。

您可以選擇多種存取權範圍,但也可以只設定 cloud-platform 存取權範圍,也就是所有 Google Cloud Platform 服務的 OAuth 範圍,然後藉由授予 IAM 角色來安全地限制服務帳戶存取權。

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

舉例來說,如果您在執行個體上啟用了 cloud-platform 存取權範圍,然後授予下列預先定義的 IAM 角色

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

那麼,該服務帳戶就只有這三個 IAM 角色所包含的權限。儘管您啟用了 Google Cloud Platform 存取權範圍,該帳戶仍無法執行這些角色權限以外的操作。

另一方面,如果您在執行個體上授予較具限制性的範圍,例如 Cloud Storage 唯讀範圍 (https://www.googleapis.com/auth/devstorage.read_only),並在服務帳戶上設定 roles/storage.objectAdmin 管理員角色,則根據預設,gcloud 工具和用戶端程式庫的要求將無法管理該執行個體的 Cloud Storage 物件,即使您已授予服務帳戶 roles/storage.ObjectAdmin 角色也一樣。這是因為 Cloud Storage 唯讀範圍不允許執行個體控管 Cloud Storage 資料。

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

IAM 角色

您必須授予服務帳戶適合的 IAM 角色,才能允許該服務帳戶存取相關聯的 API 方法。

舉例來說,您可以為服務帳戶授予代管 Cloud Storage 物件或 Cloud Storage 值區的 IAM 角色,也可授予同時可代管物件和值區的角色,以便將帳戶的權限限制在這些角色授予的權限範圍內。

IAM 角色僅適用於個別帳戶;也就是說,您將 IAM 角色授予服務帳戶後,以該服務帳戶身分執行的任何執行個體都可以使用該角色。此外,請注意下列事項:

  • 部分 IAM 角色目前仍為 Beta 版。

    如果預先定義的 IAM 角色並未涵蓋您需要的存取層級,您可以授予任一原始角色 (例如專案編輯者),也可以建立並授予自訂角色

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

    儘管服務帳戶的存取層級取決於授予服務帳戶的 IAM 角色,執行個體的存取權範圍仍會針對執行個體上透過 gcloud 工具和用戶端程式庫發出的要求來定義預設的 OAuth 範圍。因此,透過 OAuth 進行驗證時,存取權範圍可能會進一步限制 API 方法的存取。

存取權範圍

存取權範圍是為執行個體指定權限的傳統方法。存取權範圍並非安全機制,而是用來定義來自 gcloud 工具或用戶端程式庫的要求所使用的預設 OAuth 範圍。請注意,如果未透過 OAuth 驗證 (例如 gRPCSignBlob API) 發出要求,存取權範圍就不會產生任何作用。

將執行個體設定為以服務帳戶身分執行時,您必須設定存取權範圍

最佳做法是在執行個體上設定完整的 cloud-platform 存取權範圍,然後使用 IAM 角色安全地限制服務帳戶的 API 存取權。

存取權範圍只適用於個別執行個體。您可以在建立執行個體時設定存取權範圍,但一旦該執行個體的生命週期結束,存取權範圍就會失效。

如果您尚未為服務帳戶所屬的專案啟用相關 API,則存取權範圍不會生效。舉例來說,將 Cloud Storage 的存取權範圍授予虛擬機器執行個體之後,您必須為專案啟用 Cloud Storage API,執行個體才能呼叫 Cloud Storage API。

存取權範圍範例包括:

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

後續步驟

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

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

這個網頁
Compute Engine 說明文件