本文說明如何設定現有的虛擬機器 (VM),以便使用其他服務帳戶。服務帳戶是一種特殊的帳戶,通常由應用程式或運算工作負載使用,用於發出授權 API 呼叫。
在以下情境中,工作負載 (例如自訂應用程式) 需要存取 Google Cloud 資源或執行操作,但不需要使用者介入,就需要使用服務帳戶。如要進一步瞭解何時應使用服務帳戶,請參閱「使用服務帳戶的最佳做法」。
如果應用程式需要呼叫 Google Cloud API,Google 建議您將使用者管理的服務帳戶附加至執行應用程式或工作負載的 VM。接著,您會為服務帳戶授予 IAM 角色,讓服務帳戶 (以及在 VM 上執行的應用程式) 能夠存取Google Cloud 資源。
事前準備
-
如果尚未設定,請先設定驗證機制。驗證是指驗證身分,以便存取 Google Cloud 服務和 API 的程序。如要在本機開發環境中執行程式碼或範例,您可以選取下列任一選項,向 Compute Engine 進行驗證:
Select the tab for how you plan to use the samples on this page:
Console
When you use the Google Cloud console to access Google Cloud services and APIs, you don't need to set up authentication.
gcloud
-
After installing the Google Cloud CLI, initialize it by running the following command:
gcloud init
If you're using an external identity provider (IdP), you must first sign in to the gcloud CLI with your federated identity.
- Set a default region and zone.
REST
To use the REST API samples on this page in a local development environment, you use the credentials you provide to the gcloud CLI.
After installing the Google Cloud CLI, initialize it by running the following command:
gcloud init
If you're using an external identity provider (IdP), you must first sign in to the gcloud CLI with your federated identity.
For more information, see Authenticate for using REST in the Google Cloud authentication documentation.
-
必要的角色
如要取得在 VM 上設定服務帳戶所需的權限,請要求管理員授予您 VM 或專案的 Compute Instance 管理員 (v1) (roles/compute.instanceAdmin.v1
) IAM 角色。如要進一步瞭解如何授予角色,請參閱「管理專案、資料夾和機構的存取權」。
這個預先定義的角色包含在 VM 上設定服務帳戶所需的權限。如要查看確切的必要權限,請展開「必要權限」部分:
所需權限
如要在 VM 上設定服務帳戶,您必須具備下列權限:
-
compute.instances.setServiceAccount
-
compute.instances.stop
-
compute.instances.start
總覽
建議您為 VM 設定服務帳戶,如下所示:
- 建立新的使用者管理服務帳戶,而不使用 Compute Engine 預設服務帳戶,並為該服務帳戶授予 IAM 角色,只針對該帳戶需要的資源和作業授予相關角色。
- 將服務帳戶附加至 VM。
- 在 VM 上設定雲端平台 (
https://www.googleapis.com/auth/cloud-platform
) 範圍。這可讓 VM 的服務帳戶呼叫具有使用權限的 Google Cloud API。- 如果您使用 Google Cloud 控制台指定服務帳戶,VM 的存取權範圍會自動預設為
cloud-platform
範圍。 - 如果您使用 Google Cloud CLI 或 Compute Engine API 指定服務帳戶,可以使用
scopes
參數設定存取範圍。
- 如果您使用 Google Cloud 控制台指定服務帳戶,VM 的存取權範圍會自動預設為
設定服務帳戶
您可以建立使用者管理的服務帳戶,也可以使用 Compute Engine 預設服務帳戶。建議使用使用者自行管理的服務帳戶。
針對所選服務帳戶,請確認已指派必要的 Identity and Access Management (IAM) 角色。
使用者自行管理
如果您沒有使用者代管的服務帳戶,請建立服務帳戶。如需詳細操作說明,請參閱「設定服務帳戶」。
預設
如果您熟悉 Compute Engine 預設服務帳戶,並且想使用預設服務帳戶提供的憑證,而不想建立新的服務帳戶,那麼您可以為預設服務帳戶授予身分與存取權管理角色。
將身分與存取權管理角色指派給預設服務帳戶之前,請注意以下幾點:
為預設服務帳戶授予身分與存取權管理角色的動作,會使所有以預設服務帳戶身分執行的 VM 受到影響。舉例來說,如果您為預設服務帳戶授予
roles/storage.objectAdmin
角色,那麼以預設服務帳戶 (帳戶具有必要存取權範圍) 身分執行的所有 VM,也會獲得roles/storage.objectAdmin
角色所授予的權限。同理,如果您藉由省略特定角色來限制存取權,這也會影響所有以預設服務帳戶身分執行的 VM。根據貴機構的政策設定,系統可能會自動為預設服務帳戶授予專案的編輯者角色。強烈建議您 套用
iam.automaticIamGrantsForDefaultServiceAccounts
機構政策限制,停用自動角色授予功能。如果您是在 2024 年 5 月 3 日之後建立機構,系統預設會強制執行這項限制。如果您停用自動角色授予功能,就必須決定要將哪些角色授予預設服務帳戶,然後自行授予這些角色。
如果預設服務帳戶已具有「編輯者」角色,建議您將「編輯者」角色替換為權限較低的角色。如要安全地修改服務帳戶的角色,請使用政策模擬器查看變更的影響,然後授予及撤銷適當的角色。
如果您不確定是否要為預設服務帳戶授予 IAM 角色,請改為建立新的使用者代管服務帳戶。
附加服務帳戶並更新存取權範圍
如要變更 VM 的服務帳戶和存取權範圍,您必須暫時停止 VM。
如果服務帳戶隸屬於與 VM 不同的專案,則您必須為其他專案中的資源設定服務帳戶。
請使用下列其中一種方法,變更 VM 的服務帳戶和存取權範圍。
主控台
前往「VM instances」(VM 執行個體) 頁面。
按一下您要更新服務帳戶的執行個體。
如果 VM 未處於停止狀態,請按一下「Stop」。等待 VM 停止。
按一下 [編輯]。
向下捲動到「Service Account」(服務帳戶) 區段。
從下拉式清單中選取要指派給 VM 的服務帳戶。
- 如果您選擇使用者自行管理的服務帳戶,VM 的存取權範圍預設為建議的
cloud-platform
範圍。如果您需要為使用者管理的服務帳戶設定不同的範圍,請使用 gcloud CLI 或 Compute Engine API 來附加服務帳戶。 - 如果您選擇 Compute Engine 預設服務帳戶,可以在 Google Cloud 控制台中修改其存取範圍。
- 如要變更範圍,請在「Access Scopes」(存取權範圍) 區段中選取「Set access for each API」(針對各個 API 設定存取權),然後根據需求設定適當的範圍。
- 建議:如果不確定該如何設定適當的存取權範圍,請選擇「允許所有 Cloud API 的完整存取權」,然後再透過設定服務帳戶的 IAM 角色來限制存取權。
- 如果您選擇使用者自行管理的服務帳戶,VM 的存取權範圍預設為建議的
按一下 [儲存] 以儲存變更。
按一下「Start/Resume」,重新啟動 VM。
gcloud
使用
instances stop
指令停止 VM。將VM_NAME
替換為 VM 執行個體名稱。gcloud compute instances stop VM_NAME
附加服務帳戶。如要附加服務帳戶,請使用
instances set-service-account
指令,並提供 VM 名稱、服務帳戶電子郵件和所需範圍。如要進一步瞭解如何設定存取權範圍,請參閱最佳做法。gcloud compute instances set-service-account VM_NAME \ --service-account=SERVICE_ACCOUNT_EMAIL \ --scopes=SCOPES
更改下列內容:
SERVICE_ACCOUNT_EMAIL
:您建立的服務帳戶電子郵件地址。例如:my-sa-123@my-project-123.iam.gserviceaccount.com
。如要查看電子郵件地址,請參閱「列出服務帳戶」一文。如果您想從 VM 中移除服務帳戶,請使用
--no-service-account
標記。VM_NAME
:VM 執行個體的名稱。SCOPES
:以逗號分隔的範圍 URI 或別名清單,這些內容由--scopes
標記說明所提供。如要移除 VM 的所有範圍,請改用
--no-scopes
標記。
舉例來說,下列指令會將服務帳戶
my-sa-123@my-project-123.iam.gserviceaccount.com
指派給一個名為 example-instance 的 VM,並在該 VM 上設定相關存取權範圍,以允許對 Compute Engine 進行讀/寫存取,以及對 Cloud Storage 進行唯讀:gcloud compute instances set-service-account example-instance \ --service-account=my-sa-123@my-project-123.iam.gserviceaccount.com \ --scopes=compute-rw,storage-ro
使用
instances start
指令啟動 VM。將VM_NAME
替換為 VM 執行個體名稱。gcloud compute instances start VM_NAME
REST
使用
instances.stop
方法發出POST
要求,停止 VM:POST https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/zones/ZONE/instances/VM_NAME/stop
更改下列內容:
PROJECT_ID
:VM 所在的專案ZONE
:VM 所在的可用區VM_NAME
:要停止的 VM 名稱
請向
setServiceAccount
方法提出POST
要求,藉此附加服務帳戶:POST https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/zones/ZONE/instances/VM_NAME/setServiceAccount { "email": "SERVICE_ACCOUNT_EMAIL", "scopes": [ "SCOPE_URI", "SCOPE_URI", ... ] }
更改下列內容:
PROJECT_ID
:這項要求的專案 ID。ZONE
:這個 VM 所屬的區域。VM_NAME
:VM 名稱。SERVICE_ACCOUNT_EMAIL
:您建立的服務帳戶電子郵件地址。例如:my-sa-123@my-project-123.iam.gserviceaccount.com
。如要查看電子郵件地址,請參閱「列出服務帳戶」一文。SCOPE_URI
:必要的範圍 URI。
例如,下列要求使用了服務帳戶電子郵件
my-sa-123@my-project-123.iam.gserviceaccount.com
並設定了 Cloud Storage 和 BigQuery 範圍:POST https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/zones/ZONE/instances/VM_NAME/setServiceAccount { "email": "my-sa-123@my-project-123.iam.gserviceaccount.com", "scopes": [ "https://www.googleapis.com/auth/bigquery", "https://www.googleapis.com/auth/devstorage.read_only" ] }
使用
instances.start
方法建構POST
要求,啟動 VM:POST https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/zones/ZONE/instances/VM_NAME/start
更改下列內容:
PROJECT_ID
:VM 所在的專案ZONE
:VM 所在的可用區VM_NAME
:要啟動的 VM 名稱
查看 VM 使用的服務帳戶
如要查看專案中的所有服務帳戶,請參閱「列出服務帳戶」一文。
如果您需要識別 VM 使用的服務帳戶,請完成下列任一程序:
主控台
前往「VM instances」(VM 執行個體) 頁面。
按一下您要更新服務帳戶的執行個體。
前往「API 與身分識別管理」部分。這個部分會顯示 VM 使用的服務帳戶和存取權範圍。
gcloud
執行 gcloud compute instances describe
指令:
gcloud compute instances describe VM_NAME \ --format json
輸出結果會與下列內容相似:
{ ... "serviceAccounts":[ { "email":"123845678986-compute@developer.gserviceaccount.com", "scopes":[ "https://www.googleapis.com/auth/devstorage.full_control" ] } ] ... }
如果 VM 未使用服務帳戶,您會收到不含 serviceAccounts
屬性的回應。
中繼資料伺服器
直接從 VM 內部查詢中繼資料伺服器。向 http://metadata.google.internal/computeMetadata/v1/instance/service-accounts/
發出要求:
user@myinst:~$ curl "http://metadata.google.internal/computeMetadata/v1/instance/service-accounts/" \
-H "Metadata-Flavor: Google"
如果您在建立執行個體時啟用了一或多個服務帳戶,這個curl
指令會傳回類似以下的輸出:
123845678986-compute@developer.gserviceaccount.com/ default/
如果執行個體沒有使用任何服務帳戶,您會收到沒有內容的回應。
最佳做法
- 限制服務帳戶的權限,並定期檢查服務帳戶權限,確保權限保持最新狀態。
- 請謹慎刪除服務帳戶。請先確認重要的應用程式不再需要使用服務帳戶,然後再將其刪除。如果您不確定是否會使用服務帳戶,建議您停用服務帳戶,而不要刪除。停用的服務帳戶如果仍要使用,可重新啟用。
- 降低服務帳戶的安全風險。詳情請參閱「使用服務帳戶的最佳做法」。
後續步驟
- 詳閱「服務帳戶最佳做法」
查看「使用服務帳戶驗證工作負載」