服務帳戶


本頁說明服務帳戶如何搭配 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 執行個體,為執行個體上執行的應用程式提供憑證。應用程式會使用這些憑證向 API 進行驗證,並取得存取資源的授權。 Google CloudGoogle Cloud 執行個體只能連結使用者管理的服務帳戶,且只能連結一個服務帳戶。您可以在建立執行個體時或之後,變更附加至執行個體的服務帳戶。

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

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

授權判定方式

授予 Compute Engine 執行個體上代管應用程式的授權,會受到兩項個別設定的限制:授予附加服務帳戶的角色,以及您在執行個體上設定的存取權範圍。這兩項設定都必須允許存取權,執行個體上的應用程式才能存取資源。

假設您有一個應用程式會在 Cloud Storage 上讀寫檔案,則該應用程式必須先透過 Cloud Storage API 進行身分驗證。您可以建立具備 cloud-platform 範圍的執行個體,並將服務帳戶附加至該執行個體。接著,您可以將 Identity and Access Management (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」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 提供的角色授權」 Google,否則控制台的 IAM 頁面不會顯示這項服務代理人。根據預設,系統會自動將專案的 compute.serviceAgent 角色授予這個服務代理程式。

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

基於這些原因,建議您盡量不要修改這類服務代理的角色。

將服務帳戶附加至執行個體

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

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

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

如需將服務帳戶附加至 Compute Engine 執行個體的逐步說明,請參閱下列任一文件:

授權

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

此外,執行個體的存取權範圍定義預設 OAuth 範圍的方式,是依據執行個體上 gcloud CLI 和用戶端程式庫發出的要求來定義。因此,透過 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
  • 具備 Endpoints (Alpha 版) 所需 Service Management 功能的唯讀權限: Google Cloud
    https://www.googleapis.com/auth/service.management.readonly
  • 具備 Endpoints (Alpha 版) 所需 Service Control 功能的讀取或寫入權限: Google Cloud
    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 記錄檔的寫入權限。

後續步驟