服務帳戶

本頁說明服務帳戶和服務帳戶權限;適用於 VM 執行個體的存取權範圍與適用於服務帳戶的身分與存取權管理 (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 會建立 Compute Engine 預設服務帳戶,並將該帳戶自動新增到您的專案中,但您可以完全控制該帳戶。

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

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

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

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

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

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

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

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

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

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 內執行的軟體發生中斷情況。

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

服務帳戶權限

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

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

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

主要說明如下:

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

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

您可以選擇多種存取權範圍,但也可以只設定 cloud-platform 存取權範圍,也就是所有 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 角色所包含的權限。即使享有 Cloud Platform 存取權範圍,仍無法執行上述角色範圍外的操作。

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

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

IAM 角色

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

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

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

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

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

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

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

存取權範圍

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

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

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

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

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

存取權範圍範例包括:

  • https://www.googleapis.com/auth/cloud-platform - 具備所有 Google Cloud Platform 資源的完整存取權限。
  • 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 - 具備 Google Cloud Storage 的唯讀權限。
  • https://www.googleapis.com/auth/logging.write - 具備 Compute Engine 記錄檔的寫入權限。

後續步驟

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

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

這個網頁
Compute Engine 說明文件