服務帳戶


本頁面說明服務帳戶如何與 Compute Engine 搭配運作。

如需將服務帳戶連結至虛擬機器 (VM) 執行個體的逐步操作說明,請參閱下列任一文件:

如要瞭解建立及管理服務帳戶的最佳做法,請參閱服務帳戶最佳作業做法說明文件。

歡迎試用

如果您未曾使用過 Google Cloud,歡迎建立帳戶,親自體驗實際使用 Compute Engine 的成效。新客戶可以獲得價值 $300 美元的免費抵免額,可用於執行、測試及部署工作負載。

免費試用 Compute Engine

什麼是服務帳戶?

服務帳戶是一種特殊的帳戶,使用者通常並非真人,而是應用程式或運算工作負載。服務帳戶由 Identity and Access Management (IAM) 管理。

在 VM 中使用服務帳戶時,請注意下列事項:

  • 您可以將相同的服務帳戶附加至多個 VM,但單一 VM 只能附加一個服務帳戶。
  • 如果您將相同的服務帳戶連結至多個 VM,您之後對服務帳戶所做的任何變更都會影響所有使用該服務帳戶的 VM。這表示,如果您對這個服務帳戶所具備的身分與存取權管理角色,執行了任何變更,也會連帶影響使用這個服務帳戶的執行個體。舉例來說,如果移除了某個角色,那麼使用這個服務帳戶的所有 VM 也會失去該角色所授予的權限。

Compute Engine 如何使用服務帳戶

Compute Engine 使用兩種類型的服務帳戶:

您可以將使用者管理的服務帳戶連結至 Compute Engine 執行個體,為執行個體上執行的應用程式提供憑證。應用程式會使用這些憑證,向 Google CloudAPI 進行驗證,並取得存取 Google Cloud 資源的授權。只有使用者管理的服務帳戶可以連結至執行個體,且一個執行個體只能有一個連結的服務帳戶。您可以在建立執行個體時或之後,變更附加至執行個體的服務帳戶。

執行個體會使用服務代理,代您存取內部程序。

此外,您也可以建立防火牆規則,根據指派給每個執行個體的服務帳戶,允許或拒絕執行個體傳輸流量。

授權判定方式

提供給在 Compute Engine 執行個體上代管的應用程式授權受到兩個個別設定的限制:授予已連結服務帳戶的角色,以及您在執行個體上設定的存取權範圍。這兩種設定都必須允許存取權,應用程式才能在執行實例時存取資源。

假設您有一個會在 Cloud Storage 上讀寫檔案的應用程式,則該應用程式必須先透過 Cloud Storage API 進行身分驗證。您可以使用 cloud-platform 範圍建立執行個體,並將服務帳戶繫結至該執行個體。接著,您可以向服務帳戶授予身分與存取權管理 (IAM) 角色,讓應用程式存取適當的資源。您的應用程式會使用服務帳戶憑證驗證 Cloud Storage API,完全不需在執行個體、映像檔或應用程式程式碼中嵌入任何密鑰或使用者憑證。您的應用程式也會使用服務帳戶的 IAM 角色提供的授權,存取資源。如要進一步瞭解授權,請參閱本頁的「授權」一節。

使用者代管的服務帳戶

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

新增服務帳戶

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

如要建立及設定新的服務帳戶,請參閱「建立使用使用者管理服務帳戶的 VM」一文。

Compute Engine 預設服務帳戶

已啟用 Compute Engine API 的新專案會具備 Compute Engine 預設服務帳戶,電子郵件地址格式如下:

PROJECT_NUMBER-compute@developer.gserviceaccount.com

Compute Engine 預設服務帳戶具有下列屬性:

  • 系統會自動建立此帳戶,並為其產生名稱和電子郵件地址,並在您啟用 Compute Engine API 時將其新增至專案。您對帳戶擁有完全控制權。
  • 預設會連結至您使用 Google Cloud CLI 或 Google Cloud 控制台建立的所有 VM。如要覆寫這項設定,請在建立 VM 時指定其他服務帳戶,或明確指定不將任何服務帳戶附加至 VM。
  • 根據貴機構的政策設定,系統可能會自動為預設服務帳戶授予專案的編輯者角色。強烈建議您 套用 iam.automaticIamGrantsForDefaultServiceAccounts 機構政策限制,停用自動角色授予功能。如果您是在 2024 年 5 月 3 日之後建立機構,系統預設會強制執行這項限制。

    如果您停用自動角色授予功能,就必須決定要將哪些角色授予預設服務帳戶,然後自行授予這些角色

    如果預設服務帳戶已具有「編輯者」角色,建議您將「編輯者」角色替換為權限較低的角色。如要安全地修改服務帳戶的角色,請使用政策模擬器查看變更的影響,然後授予及撤銷適當的角色

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

如果 Compute Engine 預設服務帳戶是在 30 天前刪除,您可以嘗試按照「排解預設服務帳戶問題」一文中的程序復原服務帳戶。

服務代理

服務代理程式是由 Google Cloud 建立及管理,並自動指派給您的專案。這些帳戶代表不同的 Google Cloud 服務,且每個帳戶通常都有一定程度的 Google Cloud 資源存取權。

您無法將服務代理人連結至 Compute Engine 執行個體。

Google API 服務代理

除了預設帳戶外,所有啟用 Compute Engine 的專案都會附帶 Google API 服務代理,可透過電子郵件識別:

PROJECT_NUMBER@cloudservices.gserviceaccount.com

這個服務代理程式專門用於代表您執行內部 Google 處理程序。這個服務代理程式由 Google 擁有,不會列在 Google Cloud 控制台的「服務帳戶」區段中。根據預設,系統會自動將專案編輯者角色授予這個服務代理人,並且列在 Google Cloud 控制台的「IAM」區段中。只有在專案遭刪除時,系統才會刪除這項服務代理程式。不過,您可以變更系統授予這類服務帳戶的角色,包括撤銷專案的所有存取權。

某些資源會依賴服務代理所授予的預設編輯者權限。舉例來說,代管執行個體群組和自動調度資源會使用這個服務代理程式憑證,建立、刪除及管理執行個體。如果您撤銷此服務代理的權限,或是修改權限的方式導致系統無法授予建立執行個體的權限,這會導致代管執行個體群組和自動調整大小功能停止運作。

基於這些原因,除非角色建議明確建議您修改,否則請勿修改此服務代理程式的角色。

Compute Engine 服務代理人

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

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

這個服務代理程式是專門設計用來讓 Compute Engine 在您的專案上執行服務職責。這類服務帳戶需要授予Google Cloud 專案的服務代理人身分與存取權管理政策,同時也可讓 Compute Engine 存取 VM 執行個體上的使用者管理服務帳戶。此帳戶為 Google 所擁有,但僅供特定專案使用。除非您選取「包含 Google 提供的角色授權」,否則控制台的「IAM」頁面會隱藏這項服務代理人。 Google根據預設,系統會自動將專案的 compute.serviceAgent 角色授予這個服務代理程式。

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

基於這些原因,請盡可能避免修改此服務代理的角色。

將服務帳戶連結至執行個體

為避免應用程式擁有過多權限,建議您建立使用者管理的服務帳戶,並只授予應用程式正常運作所需的角色,然後將該帳戶連結至 Compute Engine 執行個體。程式碼接著可以使用應用程式預設憑證,透過服務帳戶提供的憑證進行驗證。

您可以在建立 Compute Engine 執行個體時,或之後,將服務帳戶連結至該執行個體。一次只能將一個服務帳戶連結至執行個體;如果您將服務帳戶連結至已連結服務帳戶的執行個體,該執行個體就不會再使用先前的服務帳戶。

將服務帳戶連結至 Compute Engine 執行個體時,您也必須確保在執行個體上設定的範圍正確無誤。否則,您的應用程式可能無法存取所需的所有 API。詳情請參閱本頁的「存取範圍」一節。

如要瞭解如何將服務帳戶連結至 Compute Engine 執行個體,請參閱下列任一文件中的逐步說明:

授權

將執行個體設為以服務帳戶的形式執行時,您可以藉由授予服務帳戶的 IAM 角色,來決定服務帳戶具備的存取層級。如果服務帳戶沒有 IAM 角色,則無法透過該執行個體上的服務帳戶存取任何資源。

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

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

主要說明如下:

  • IAM 會根據授予服務帳戶的 IAM 角色限制對 API 的存取權。
  • 存取權範圍可能會進一步限制 API 方法的存取權。

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

IAM 角色

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

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

將 IAM 角色授予服務帳戶後,在已附加該服務帳戶的執行個體上執行的任何應用程式,都會獲得該角色授予的授權。

注意事項:

  • 部分 IAM 角色仍為 Beta 版。

    如果預先定義的角色沒有您需要的存取層級,您可以建立並授予自訂角色

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

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

存取權範圍

存取權範圍是為 VM 執行個體指定授權的傳統方法。而是用來定義 gcloud CLI 或用戶端程式庫要求所使用的預設 OAuth 範圍。使用 gRPC 發出的呼叫不適用於存取權範圍。

存取權範圍只適用於個別 VM,且只會在 VM 的生命週期內保留。您可以在建立 VM 時設定存取權範圍,也可以在現有 VM 上更新存取權範圍

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

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

預設範圍

建立新的 Compute Engine 執行個體時,系統會自動為該執行個體設定下列存取權範圍:

  • 具備 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 CloudEndpoints (Alpha 版) 所需 Service Management 功能的唯讀權限:
    https://www.googleapis.com/auth/service.management.readonly
  • 具備 Google CloudEndpoints (Alpha 版) 所需 Service Control 功能的讀取或寫入權限:
    https://www.googleapis.com/auth/servicecontrol
  • 具備 Cloud Trace 的寫入權限,可讓在 VM 上執行的應用程式將追蹤記錄資料寫入專案。
    https://www.googleapis.com/auth/trace.append

範圍最佳做法

您可以選擇多種存取權範圍,但最佳做法是設定 cloud-platform 存取權範圍,也就是 Google Cloud 服務的 OAuth 範圍,然後授予 IAM 角色來控制服務帳戶的存取權。

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

範圍示例

遵循範圍最佳做法,如果您在執行個體上啟用了 cloud-platform 存取權範圍,然後授予下列預先定義的 IAM 角色

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

那麼,該服務帳戶就只有這三個角色所包含的權限。即使應用程式模擬該服務帳戶,也無法執行這些角色範圍外的操作,因為它們屬於 Google Cloud 存取權範圍。

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

存取權範圍範例包括:

  • https://www.googleapis.com/auth/cloud-platform:查看及管理指定 Google Cloud 專案中 Google Cloud 服務的資料。
  • 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 記錄檔的寫入權限。

後續步驟