對於部分 Google Cloud 資源,您可以指定資源做為預設身分的使用者管理服務帳戶。這個程序稱為將服務帳戶「附加」至資源,或將服務帳戶「關聯」至資源。 當資源上執行的程式碼存取 Google Cloud 服務和資源時,會使用附加至資源的服務帳戶做為身分。舉例來說,如果您將服務帳戶附加至 Compute Engine 執行個體,且執行個體上的應用程式使用用戶端程式庫呼叫 API,這些應用程式會自動使用附加的服務帳戶進行驗證和授權。 Google Cloud
本頁面說明如何設定服務帳戶,以便將其附加至資源。
事前準備
啟用 IAM 和 Resource Manager API。
啟用 API 時所需的角色
如要啟用 API,您需要服務使用情形管理員 IAM 角色 (
roles/serviceusage.serviceUsageAdmin),其中包含serviceusage.services.enable權限。瞭解如何授予角色。請務必瞭解 IAM 中的服務帳戶運作方式。
必要的角色
如要取得將服務帳戶附加至資源所需的權限,請要求管理員授予服務帳戶的服務帳戶使用者 (roles/iam.serviceAccountUser) IAM 角色。如要進一步瞭解如何授予角色,請參閱「管理專案、資料夾和組織的存取權」。
這個預先定義的角色具備 iam.serviceAccounts.actAs 權限,可將服務帳戶附加至資源。
設定機構政策
視要附加至資源的服務帳戶位置而定,您可能需要先更新專案的機構政策,才能附加服務帳戶:
如果服務帳戶與要附加的資源位於同一專案,則不需要更新專案的機構政策。
如果服務帳戶與要附加的資源位於不同專案,則必須更新含有服務帳戶的專案機構政策。詳情請參閱本頁的「啟用服務帳戶,以便跨專案附加」。
舉例來說,如果您在單一專案中建立所有服務帳戶,就可能發生這種情況。
設定服務帳戶
將服務帳戶附加至資源前,請務必先設定服務帳戶。這個程序會因服務帳戶和資源是否位於同一專案而有所不同。設定服務帳戶後,即可建立資源,並將服務帳戶附加至該資源。
為同一個專案中的資源設定
將服務帳戶附加至同一專案中的其他資源之前,請先授予服務帳戶角色,讓服務帳戶可以存取適當的資源,就像您會授予任何其他主體角色一樣。
為其他專案中的資源設定
在某些情況下,您可能需要將服務帳戶附加至其他專案中的資源。舉例來說,如果您在單一專案中建立所有服務帳戶,可能需要將其中一個服務帳戶附加至其他專案中的新資源。
如要將服務帳戶附加至其他專案中的資源,請先完成下列步驟:
- 在服務帳戶所在的專案中,按照本頁的步驟啟用服務帳戶,以便跨專案附加。
- 找出要建立資源的專案。
找出要附加服務帳戶的資源類型,以及擁有該資源類型的服務。
舉例來說,如果您要建立 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" ] } ] }
將服務帳戶附加至資源
設定使用者代管服務帳戶後,您可以建立新資源,並將服務帳戶附加至該資源。請務必在適當的專案中建立新資源。
在大多數情況下,您必須在建立資源時將服務帳戶附加至該資源。資源建立完成後,您就無法變更附加至資源的服務帳戶。Compute Engine 執行個體是這項規則的例外狀況;您可以視需要變更附加至執行個體的服務帳戶。
請參閱要建立的資源類型操作說明:
| 在建立資源時附加服務帳戶 | |
|---|---|
| AI 平台預測 | 模型版本 |
| AI 平台訓練 | 工作 |
| App Engine 標準環境 | 應用程式版本 |
| App Engine 彈性環境 | 應用程式版本 |
| Cloud Composer | 環境 |
| Cloud Run 函式 | Cloud Run 函式 |
| 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 的稽核記錄。