對於部分 Google Cloud 資源,您可以指定使用者管理的服務帳戶,做為資源的預設身分。這個程序稱為將服務帳戶「附加」至資源,或將服務帳戶「關聯」至資源。 當在資源上執行的程式碼存取 Google Cloud 服務和資源時,會使用附加至資源的服務帳戶做為身分。舉例來說,如果您將服務帳戶附加至 Compute Engine 執行個體,且執行個體上的應用程式使用用戶端程式庫呼叫 API,這些應用程式就會自動使用附加的服務帳戶進行驗證和授權。 Google Cloud
本頁面說明如何設定服務帳戶,以便將其附加至資源。
事前準備
Enable the IAM and Resource Manager APIs.
請務必瞭解 IAM 中的服務帳戶運作方式。
必要的角色
如要取得將服務帳戶附加至資源所需的權限,請要求管理員授予您服務帳戶的「服務帳戶使用者」 (roles/iam.serviceAccountUser
) IAM 角色。如要進一步瞭解如何授予角色,請參閱「管理專案、資料夾和機構的存取權」。
這個預先定義的角色包含 iam.serviceAccounts.actAs
權限,這是將服務帳戶附加至資源時的必要權限。
將服務帳戶附加至資源
在大多數情況下,您必須在建立資源時將服務帳戶附加至該資源。資源建立完成後,您就無法變更附加至資源的服務帳戶。Compute Engine 執行個體是這項規則的例外狀況,您可以視需要變更附加至執行個體的服務帳戶。
將服務帳戶附加至資源前,請務必先設定服務帳戶。如果服務帳戶和資源位於相同專案,或位於不同專案,這個程序會有所不同。設定服務帳戶後,即可建立資源,並將服務帳戶附加至該資源。
為相同專案中的資源設定
將服務帳戶附加至同一專案中的其他資源之前,請先授予服務帳戶角色,讓服務帳戶可以存取適當的資源,就像您會授予任何其他主體角色一樣。
為其他專案中的資源設定
在某些情況下,您可能需要將服務帳戶附加至其他專案中的資源。舉例來說,如果您在單一專案中建立所有服務帳戶,可能需要將其中一個服務帳戶附加至其他專案中的新資源。
將服務帳戶附加至其他專案中的資源前,請先完成下列步驟:
- 在服務帳戶所在的專案中,按照本頁的步驟啟用跨專案附加服務帳戶的功能。
- 找出要建立資源的專案。
找出要附加服務帳戶的資源類型,以及擁有該資源類型的服務。
舉例來說,如果您要建立 Pub/Sub 訂閱項目,則 Pub/Sub 是擁有該資源的服務。
找出服務的服務專員電子郵件地址。
不同服務會使用不同的服務專員。詳情請參閱「服務代理程式」。
將服務帳戶憑證建立者角色 (
roles/iam.serviceAccountTokenCreator
) 授予服務代理人:控制台
前往 Google Cloud 控制台的「Service accounts」(服務帳戶) 頁面。
選取擁有要附加至資源的服務帳戶的專案。
按一下要附加至資源的服務帳戶電子郵件地址。
前往「權限」分頁,然後找到「可存取這個服務帳戶的主體」部分。
按一下「授予存取權」
,然後輸入服務代理的電子郵件地址。按一下「選取角色」,輸入
Service Account Token Creator
,然後按一下該角色。按一下 [儲存] 以儲存變更。
選用:如要將角色授予其他服務專員,請重複上述步驟。
gcloud
使用
gcloud iam service-accounts add-iam-policy-binding
指令:gcloud iam service-accounts add-iam-policy-binding \ SERVICE_ACCOUNT_NAME@PROJECT_ID.iam.gserviceaccount.com \ --member=serviceAccount:SERVICE_AGENT_EMAIL \ --role=roles/iam.serviceAccountTokenCreator
替換下列值:
SERVICE_ACCOUNT_NAME
:您要附加至資源的使用者管理服務帳戶名稱。PROJECT_ID
:使用者管理的服務帳戶所在專案的 ID。SERVICE_AGENT_EMAIL
:服務專員的電子郵件地址。
這個指令會列印使用者管理服務帳戶的更新允許政策。
選用:如要將角色授予其他服務代理程式,請再次執行指令。
REST
如要授予這項角色,請使用讀取 - 修改 - 寫入模式,更新使用者管理服務帳戶的允許政策。
首先,請讀取使用者管理的服務帳戶的允許政策:
projects.serviceAccounts.getIamPolicy
方法會傳回服務帳戶的允許政策。使用任何要求資料之前,請先替換以下項目:
PROJECT_ID
:您的 Google Cloud 專案 ID。專案 ID 為英數字串,例如my-project
。-
USER_SA_NAME
:您要繫結至資源的使用者管理服務帳戶名稱。
HTTP 方法和網址:
POST https://iam.googleapis.com/v1/projects/PROJECT_ID/serviceAccounts/USER_SA_NAME@PROJECT_ID.iam.gserviceaccount.com:getIamPolicy
JSON 要求主體:
{ "requestedPolicyVersion": 3 }
如要傳送要求,請展開以下其中一個選項:
您應該會收到如下的 JSON 回應:
{ "version": 1, "etag": "BwWl3KCTUMY=", "bindings": [ { "role": "roles/iam.serviceAccountUser", "members": [ "serviceAccount:my-service-account@my-project.iam.gserviceaccount.com" ] } ] }
接下來,修改允許政策,將服務帳戶憑證建立者角色授予服務代理程式。
{ "version": 1, "etag": "BwWl3KCTUMY=", "bindings": [ { "role": "roles/iam.serviceAccountTokenCreator", "members": [ "serviceAccount:SERVICE_AGENT_EMAIL" ] }, { "role": "roles/iam.serviceAccountUser", "members": [ "serviceAccount:SERVICE_ACCOUNT_NAME@PROJECT_ID.iam.gserviceaccount.com" ] } ] }
更改下列內容:
SERVICE_AGENT_EMAIL
:服務專員的電子郵件地址SERVICE_ACCOUNT_NAME
:使用者管理的服務帳戶名稱。PROJECT_ID
:使用者管理的服務帳戶所在專案的 ID。
最後,請編寫更新後的允許政策:
projects.serviceAccounts.setIamPolicy
方法會更新服務帳戶的允許政策。使用任何要求資料之前,請先替換以下項目:
PROJECT_ID
:您的 Google Cloud 專案 ID。專案 ID 為英數字串,例如my-project
。-
USER_SERVICE_ACCOUNT_NAME
:您要繫結至資源的使用者管理服務帳戶名稱。 -
SERVICE_AGENT_EMAIL
:服務代理程式的電子郵件地址,該代理程式會為使用者管理的服務帳戶建立存取權杖。
HTTP 方法和網址:
POST https://iam.googleapis.com/v1/projects/PROJECT_ID/serviceAccounts/SERVICE_ACCOUNT_NAME@PROJECT_ID.iam.gserviceaccount.com:setIamPolicy
JSON 要求主體:
{ "policy": { "version": 1, "etag": "BwWl3KCTUMY=", "bindings": [ { "role": "roles/iam.serviceAccountTokenCreator", "members": [ "serviceAccount:SERVICE_AGENT_EMAIL" ] }, { "role": "roles/iam.serviceAccountUser", "members": [ "serviceAccount:SERVICE_ACCOUNT_NAME@PROJECT_ID.iam.gserviceaccount.com" ] } ] } }
如要傳送要求,請展開以下其中一個選項:
您應該會收到如下的 JSON 回應:
{ "version": 1, "etag": "BwWo331TkHE=", "bindings": [ { "role": "roles/iam.serviceAccountTokenCreator", "members": [ "serviceAccount:SERVICE_AGENT_EMAIL" ] }, { "role": "roles/iam.serviceAccountUser", "members": [ "serviceAccount:my-service-account@my-project.iam.gserviceaccount.com" ] } ] }
將服務帳戶附加至新資源
設定使用者代管服務帳戶後,您可以建立新資源,並將服務帳戶附加至該資源。請務必在適當的專案中建立新資源。
請參閱要建立的資源類型操作說明:
在建立資源時附加服務帳戶 | |
---|---|
AI 平台預測 | 模型版本 |
AI 平台訓練 | 工作 |
App Engine 標準環境 | 應用程式版本 |
App Engine 彈性環境 | 應用程式版本 |
Cloud Composer | 環境 |
Cloud Run 函式 | Cloud Run 函式 |
Cloud Life Sciences | 管道 |
Cloud Run | 服務 |
Cloud Scheduler | 工作 |
Cloud Source Repositories | |
Compute Engine | |
Dataproc | 叢集 |
Google Kubernetes Engine | |
筆記本 | 筆記本執行個體 |
Pub/Sub | 訂閱 |
建立資源並將服務帳戶附加至該資源後,您可以將角色授予服務帳戶,讓服務帳戶存取適當的資源。這個程序與將角色授予其他主體相同。
如要瞭解如何授予角色,請參閱「授予、變更及撤銷資源存取權」一文。
將服務帳戶附加至其他專案中的資源
根據預設,您無法在某專案中建立服務帳戶,並附加至其他專案中的資源。如要保留某專案的所有專屬服務帳戶,您必須更新該專案的機構政策。
啟用跨專案附加服務帳戶的功能
如要允許使用者將某個專案中的服務帳戶附加至其他專案中的資源,請在服務帳戶所在專案的機構政策中,檢查下列布林值限制:
確認專案
iam.disableCrossProjectServiceAccountUsage
布林值限制未強制執行。這項布林值限制會控管您是否能將服務帳戶附加至其他專案中的資源。這項限制預設會強制執行,且只能在專案層級設定,無法在資料夾或機構層級設定。
如果未強制執行這項限制,IAM 會新增專案防刪除鎖定,防止專案遭到刪除。此留置權的來源為
iam.googleapis.com/cross-project-service-accounts
。強烈建議您不要刪除這項留置權。建議:確保專案
iam.restrictCrossProjectServiceAccountLienRemoval
布林值限制已強制執行。這項布林限制可確保主體只有在機構層級擁有
resourcemanager.projects.updateLiens
權限時,才能移除專案防刪除鎖定。如果未強制執行這項限制,主體只要在專案層級具備這項權限,就能移除專案防刪除鎖定。
如要瞭解如何查看或變更機構政策中的布林限制,請參閱「建立及管理機構政策」。
禁止跨專案附加服務帳戶
如果您先前已啟用服務帳戶,允許跨專案附加,我們強烈建議您不要停用這項功能,尤其是在正式版環境中。
具體來說,在服務帳戶所在的專案中,您不應進行下列任何變更:
- 請勿更新專案的機構政策,以強制執行
iam.disableCrossProjectServiceAccountUsage
布林值限制。 - 請勿更新專案的機構政策,不要強制執行
iam.restrictCrossProjectServiceAccountLienRemoval
布林限制。 - 請勿移除來源為
iam.googleapis.com/cross-project-service-accounts
的專案防刪除鎖定,否則您將無法刪除專案。 - 請勿刪除專案。
如果您願意承擔停用這項功能帶來的風險,可以停用您在各專案中使用的服務帳戶,然後監控 Google Cloud 環境是否有問題,藉此降低風險。如果發現任何問題,可以重新啟用服務帳戶。如果沒有看到任何問題,表示您可能沒有任何資源依附於其他專案中的服務帳戶。 Google Cloud
附加服務帳戶的稽核記錄
當主體使用 iam.serviceAccounts.actAs
權限將服務帳戶附加至資源時,IAM 會產生稽核記錄。這份稽核記錄包含下列資訊:
- 將服務帳戶附加至資源的主體電子郵件地址
- 附加至資源的服務帳戶詳細資料
如需可附加服務帳戶的資源清單,請參閱本頁面的「將服務帳戶附加至新資源」一節。
如要查看這類稽核記錄的範例,請參閱「使用 iam.serviceAccounts.actAs
權限的記錄」。如要進一步瞭解稽核記錄,請參閱 Cloud 稽核記錄總覽。
後續步驟
- 瞭解如何將服務帳戶附加至 Compute Engine 執行個體。
- 查看並套用保護服務帳戶的最佳做法。
- 進一步瞭解 IAM 的稽核記錄。