變更附加的服務帳戶

本文說明如何設定現有虛擬機器 (VM),改用其他服務帳戶。服務帳戶是一種特殊的帳戶,通常由應用程式或運算工作負載使用,可發出授權的 API 呼叫。

如果工作負載 (例如自訂應用程式) 需要存取 Google Cloud 資源或執行動作,但不需要使用者參與,就必須使用服務帳戶。如要進一步瞭解何時應使用服務帳戶,請參閱「使用服務帳戶的最佳做法」。

如果應用程式需要呼叫 Google Cloud API,Google 建議您將使用者管理的服務帳戶附加至執行應用程式或工作負載的 VM。接著,您會授予服務帳戶 IAM 角色,讓服務帳戶 (以及 VM 上執行的應用程式) 存取Google Cloud 資源。

事前準備

  • 如果尚未設定驗證,請先完成設定。 驗證可確認您的身分,以便存取 Google Cloud 服務和 API。如要從本機開發環境執行程式碼或範例,請選取下列其中一個選項,向 Compute Engine 進行驗證:

    選取這個頁面上範例的預計用途分頁:

    控制台

    使用 Google Cloud 控制台存取 Google Cloud 服務和 API 時,不需要設定驗證。

    gcloud

    1. 安裝 Google Cloud CLI。 完成後,執行下列指令來初始化 Google Cloud CLI:

      gcloud init

      如果您使用外部識別資訊提供者 (IdP),請先 使用聯合身分登入 gcloud CLI。

  • 設定預設區域和可用區。
  • REST

    如要在本機開發環境中使用本頁的 REST API 範例,請使用您提供給 gcloud CLI 的憑證。

      安裝 Google Cloud CLI。

      如果您使用外部識別資訊提供者 (IdP),請先 使用聯合身分登入 gcloud CLI。

    詳情請參閱 Google Cloud 驗證說明文件中的「使用 REST 進行驗證」。

必要的角色

如要取得在 VM 上設定服務帳戶所需的權限,請要求管理員在 VM 或專案中授予您「Compute 執行個體管理員 (v1) 」(roles/compute.instanceAdmin.v1) IAM 角色。如要進一步瞭解如何授予角色,請參閱「管理專案、資料夾和組織的存取權」。

這個預先定義的角色具備在 VM 上設定服務帳戶所需的權限。如要查看確切的必要權限,請展開「Required permissions」(必要權限) 部分:

所需權限

如要在 VM 上設定服務帳戶,必須具備下列權限:

  • compute.instances.setServiceAccount
  • compute.instances.stop
  • compute.instances.start

您或許還可透過自訂角色或其他預先定義的角色取得這些權限。

總覽

建議您為 VM 設定服務帳戶,方法如下:

  1. 建立新的使用者管理服務帳戶,而非使用 Compute Engine 預設服務帳戶,並僅將該服務帳戶所需的資源和作業 IAM 角色授予該服務帳戶。
  2. 將服務帳戶附加至 VM。
  3. 在 VM 上設定雲端平台 (https://www.googleapis.com/auth/cloud-platform) 範圍。這樣一來,VM 的服務帳戶就能呼叫有權使用的 Google Cloud API。
    • 如果您使用 Google Cloud 控制台指定服務帳戶,請將服務帳戶的存取權範圍設為「允許所有 Cloud API 的完整存取權」。
    • 如果您使用 Google Cloud CLI 或 Compute Engine API 指定服務帳戶,可以透過 scopes 參數設定存取權範圍。

設定服務帳戶

您可以建立使用者管理的服務帳戶,也可以使用 Compute Engine 預設服務帳戶。建議使用使用者自行管理的服務帳戶。

請確認已為所選服務帳戶指派必要的 Identity and Access Management (IAM) 角色。

使用者管理的

如果您還沒有使用者管理的服務帳戶,請建立服務帳戶。 如需詳細操作說明,請參閱「設定服務帳戶」。

預設

如果您熟悉 Compute Engine 預設服務帳戶,且想使用預設服務帳戶提供的憑證,而不建立新的服務帳戶,可以將 IAM 角色授予預設服務帳戶。

將 IAM 角色指派給預設服務帳戶前,請注意下列事項:

  • 將 IAM 角色授予預設服務帳戶,會影響所有以預設服務帳戶執行的 VM。舉例來說,如果您將 roles/storage.objectAdmin 角色授予預設服務帳戶,所有以預設服務帳戶身分執行的 VM,只要具備必要存取範圍,就會擁有 roles/storage.objectAdmin 角色授予的權限。同樣地,如果您省略特定角色來限制存取權,以預設服務帳戶執行的所有 VM 都會受到影響。

  • 視機構政策設定而定,預設服務帳戶可能會自動獲得專案的編輯者角色。強烈建議您 強制執行 iam.automaticIamGrantsForDefaultServiceAccounts 機構政策限制,停用自動角色授予功能。如果組織是在 2024 年 5 月 3 日後建立,系統預設會強制執行這項限制。

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

    如果預設服務帳戶已具備「編輯者」角色,建議您將「編輯者」角色替換為權限較少的角色。如要安全修改服務帳戶的角色,請使用 Policy Simulator 查看變更會造成的影響,然後授予及撤銷適當的角色。

如果不確定是否要將 IAM 角色授予預設服務帳戶,請改為建立新的使用者管理服務帳戶。

附加服務帳戶並更新存取權範圍

如要變更 VM 的服務帳戶和存取權範圍,請先停止 VM。 完成必要變更後,即可重新啟動 VM。

如要附加至 VM 的服務帳戶與 VM 位於不同專案,請務必為其他專案中的資源設定服務帳戶。

使用下列其中一種方法,變更 VM 上的服務帳戶和存取範圍。

控制台

  1. 前往「VM instances」(VM 執行個體) 頁面。

    前往 VM 執行個體

  2. 按一下您要更新服務帳戶的執行個體。

  3. 按一下「停止」。如果沒有「停止」選項,請依序點選 「更多動作」> 「停止」。 等待 VM 停止。

  4. 按一下 [編輯]。

  5. 向下捲動到「Service Account」(服務帳戶) 區段。

  6. 從下拉式清單中,選取要指派給 VM 的服務帳戶。

    • 如果您選擇使用者管理的服務帳戶,VM 的存取權範圍預設為建議的 cloud-platform 範圍。如果使用者代管的服務帳戶需要不同範圍,請使用 gcloud CLI 或 Compute Engine API 附加服務帳戶。
    • 如果選擇 Compute Engine 預設服務帳戶,您可以在 Google Cloud 控制台中修改其存取範圍。
      • 如要變更範圍,請在「存取權範圍」部分選取「針對各個 API 設定存取權」,然後根據需求設定適當的範圍。
      • 建議做法:如果不確定要設定哪些適當的存取權範圍,請選擇「允許所有 Cloud API 的完整存取權」,然後務必為服務帳戶設定 IAM 角色,藉此限制存取權。
  7. 按一下 [儲存] 以儲存變更。

  8. 點選「啟動/重新啟用」,重新啟動 VM。

gcloud

  1. 使用 instances stop 指令停止 VM。將 VM_NAME 替換為您的 VM 執行個體名稱。

    gcloud compute instances stop VM_NAME
    
  2. 附加服務帳戶。如要附加服務帳戶,請使用 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
    
  3. 使用 instances start 指令啟動 VM。將 VM_NAME 替換為您的 VM 執行個體名稱。

    gcloud compute instances start VM_NAME
    

REST

  1. 使用 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 名稱
  2. 對 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"
      ]
    }
    
  3. 使用 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 使用的服務帳戶,請完成下列其中一個程序:

主控台

  1. 前往「VM instances」(VM 執行個體) 頁面。

    前往 VM 執行個體

  2. 按一下您要更新服務帳戶的執行個體。

  3. 前往「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/

如果執行個體沒有使用任何服務帳戶,您會收到沒有內容的回應。

最佳做法

  • 限制服務帳戶的權限,並定期檢查服務帳戶權限,確保權限為最新狀態。
  • 請謹慎刪除服務帳戶。請先確認重要應用程式不再使用服務帳戶,再刪除該帳戶。如果不確定是否使用服務帳戶,建議停用服務帳戶,而不是刪除。如果仍需要已停用的服務帳戶,可以重新啟用。
  • 降低服務帳戶的安全風險。詳情請參閱「使用服務帳戶的最佳做法」。

後續步驟