主體可透過幾種不同的方式,使用服務帳戶進行驗證。每種驗證類型都要求主體在服務帳戶中具備特定的身分與存取權管理 (IAM) 權限。
本頁說明可授予主體的角色,讓主體模擬服務帳戶或將服務帳戶附加至資源。本文也會說明一般情況下您需要的權限。
如要瞭解如何透過服務帳戶進行驗證,請參閱「服務帳戶憑證」和「服務帳戶模擬」。
服務帳戶角色
本節說明可讓主體透過服務帳戶進行驗證的角色。如要瞭解如何授予及撤銷這些角色,請參閱管理服務帳戶的存取權。
服務帳戶使用者角色
主體可透過「服務帳戶使用者」角色 (roles/iam.serviceAccountUser
) 將服務帳戶附加至資源。當該資源上執行的程式碼需要驗證時,可以取得所連結服務帳戶的憑證。
這個角色「無法」讓主體為服務帳戶建立短期憑證,或使用 Google Cloud CLI 的 --impersonate-service-account
旗標。如要完成這些工作,您必須擁有服務帳戶的服務帳戶權杖建立者角色。
服務帳戶憑證建立者角色
主體可透過服務帳戶憑證建立者角色 (roles/iam.serviceAccountTokenCreator
),為服務帳戶建立短期憑證。
服務帳戶憑證建立者角色可讓您建立下列類型的短期憑證:
- OAuth 2.0 存取權杖,可用於向 Google API 進行驗證
- OpenID Connect (OIDC) ID 權杖
- 已簽署的 JSON Web Token (JWT) 和二進位 blob
主體也可以透過服務帳戶憑證建立者角色,使用 gcloud CLI 的 --impersonate-service-account
標記。使用這個標記時,gcloud CLI 會自動為服務帳戶建立短期憑證。
這個角色的權限包括:
iam.serviceAccounts.getAccessToken
:可建立 OAuth 2.0 存取權杖iam.serviceAccounts.getOpenIdToken
:可讓您建立 OpenID Connect (OIDC) ID 權杖iam.serviceAccounts.implicitDelegation
:允許服務帳戶在委派鏈中取得權杖iam.serviceAccounts.signBlob
:可簽署二進位大型物件iam.serviceAccounts.signJwt
:可讓您簽署 JWT
服務帳戶 OpenID Connect 身分識別權杖建立者
主體可透過服務帳戶 OpenID Connect 身分識別權杖建立者角色 (roles/iam.serviceAccountOpenIdTokenCreator
) 建立短期 OIDC ID 權杖。如果您只需要建立 OIDC ID 權杖,請使用這個角色。如需建立其他類型的權杖,請改用服務帳戶權杖建立者角色。
這個角色包含 iam.serviceAccounts.getOpenIdToken
權限,可讓您建立 OIDC ID 權杖。
Workload Identity 使用者角色
「Workload Identity 使用者」角色 (roles/iam.workloadIdentityUser
) 可讓主體模擬 GKE 工作負載的服務帳戶。
這個角色的權限包括:
iam.serviceAccounts.getAccessToken
:可建立 OAuth 2.0 存取權杖iam.serviceAccounts.getOpenIdToken
:可讓您建立 OpenID Connect (OIDC) ID 權杖
常見情境的服務帳戶權限
服務帳戶可以在多種不同的情境下使用,每個帳戶都需要特定的權限。本節將說明常見情境以及所需的權限。
將服務帳戶連結至資源
如要啟動以服務帳戶身分驗證的長時間執行工作,請將服務帳戶附加至執行該工作的資源。
權限:
- 建立資源的權限
iam.serviceAccounts.actAs
如要尋找包含這些權限的角色,請在角色清單中搜尋權限。
有幾種不同的 Google Cloud 資源可以服務帳戶身分執行長時間執行的工作。這類資源包括:
- Compute Engine VM
- App Engine 應用程式
- Cloud Run 函式
建立這些資源時,您可以選擇附加服務帳戶。這個服務帳戶會做為資源的身分。
如要建立資源並附加服務帳戶,您必須具備建立該資源的權限,以及將服務帳戶附加至資源的權限。任何包含 iam.serviceAccounts.actAs
權限的角色,都可將服務帳戶附加至資源,例如「服務帳戶使用者」角色 (roles/iam.serviceAccountUser)。
建立資源並附加服務帳戶後,即可在資源上啟動長時間執行的工作。這項作業會以附加至資源的服務帳戶身分執行,並使用該服務帳戶授權對Google Cloud API 的要求。
如要進一步瞭解如何將服務帳戶附加至資源,請參閱「將服務帳戶附加至資源」。
模擬服務帳戶
權限:
iam.serviceAccounts.getAccessToken
iam.serviceAccounts.signBlob
iam.serviceAccounts.signJwt
iam.serviceAccounts.implicitDelegation
角色:
roles/iam.serviceAccountTokenCreator
(服務帳戶憑證建立者)
被授予所需權限後,使用者 (或其他服務帳戶) 就可以在幾種常見情境下模擬服務帳戶。
首先,使用者可以以服務帳戶身分進行驗證。舉例來說,他們可以使用 iam.serviceAccounts.getAccessToken
權限並呼叫
generateAccessToken()
方法,取得服務帳戶的短期憑證。或者,他們可以使用 gcloud CLI 的 --impersonate-service-account
標記模擬服務帳戶。使用者以服務帳戶身分進行驗證時,可以向Google Cloud 發出指令,並存取服務帳戶可存取的所有資源。
其次,使用者可以使用 iam.serviceAccounts.signBlob
權限並呼叫 signBlob()
或 signJwt()
方法,取得由服務帳戶的 Google 管理私密金鑰簽署的構件。Google 代管私密金鑰一律以信託的形式儲存,絕不會直接公開。signBlob()
允許簽署任意酬載 (例如 Cloud Storage 簽署的網址),而 signJwt()
只允許簽署格式正確的 JWT。
最後,使用者可以模擬服務帳戶,無須取得該服務帳戶的憑證。這是進階用途,且只有使用 generateAccessToken()
方法的程式存取權支援此用途。在至少有 3 個服務帳戶 (即 A、B 和 C) 的情況下,如果服務帳戶 A 在 B 上獲得 iam.serviceAccounts.implicitDelegation
權限,且 B 在 C 上獲得 iam.serviceAccounts.getAccessToken
權限,服務帳戶 A 就能取得服務帳戶 C 的存取權杖。
產生 OpenID Connect (OIDC) ID 憑證
權限:
iam.serviceAccounts.getOpenIdToken
角色:
roles/iam.serviceAccountOpenIdTokenCreator
(服務帳戶 OpenID Connect 身分識別權杖建立者)
使用者 (或服務) 可以使用 iam.serviceAccounts.getOpenIdToken
權限產生由 Google OIDC 供應商 (accounts.google.com) 簽署、與 OpenID Connect (OIDC) 相容的 JWT 憑證,來代表服務帳戶的身分。
大多數的 Google API 都不會直接接受這些憑證,除非貴機構部署額外的身分聯盟來授予 Google 存取權。
產生外部私密金鑰
權限:
iam.serviceAccountKeys.create
角色:
roles/editor
(編輯者)roles/iam.serviceAccountKeyAdmin
(服務帳戶金鑰管理員)
使用者或服務可以產生外部私密金鑰內容 (RSA),以便可以用來直接以服務帳戶身分向 Google 進行驗證。這個金鑰內容之後可與應用程式預設憑證 (ADC) 程式庫或與 gcloud auth
activate-service-account
指令搭配使用。任何人只要能存取這個金鑰內容,就擁有服務帳戶可存取之所有資源的完整存取權限。這類的私密金鑰內容應視為最高風險的內容來處置,而且這個內容存在越久就越不安全。所以,為維持高度安全性,請務必輪替私密金鑰內容。
可啟用其他功能的服務帳戶權限
服務帳戶憑證的某些權限可啟用多項功能。
舉例來說,iam.serviceAccounts.signBlob
和 iam.serviceAccounts.signJwt
也允許主體為服務帳戶產生存取權杖和 ID 權杖。此外,由於 iam.serviceAccounts.signBlob
允許主體簽署任何類型的資料,因此主體也能簽署 JWT。
將這些權限新增至自訂角色前,請務必瞭解各項權限可執行的動作。
下表列出這些權限可執行的作業:
權限 | 已啟用的作業 |
---|---|
iam.serviceAccounts.getAccessToken |
取得服務帳戶的存取權杖 |
iam.serviceAccounts.getOpenIdToken |
取得服務帳戶的 ID 權杖 |
iam.serviceAccounts.signJwt |
|
iam.serviceAccounts.signBlob |
|
授予服務帳戶角色的最佳做法
若系統已向服務帳戶授予執行高權限作業的權限,將服務帳戶使用者角色或其包含的權限授予該服務帳戶的使用者時,請務必小心謹慎。
服務帳戶代表了您的服務層級安全性。服務安全性的取決因素為:擁有能管理及使用服務帳戶之 IAM 角色的使用者,以及具有這些服務帳戶服務帳戶金鑰的使用者。確保安全的最佳做法如下所示:
- 使用 IAM API 稽核服務帳戶、金鑰和這些服務帳戶的允許政策。
- 如果服務帳戶不需要服務帳戶金鑰,請停用或刪除金鑰。
- 如果使用者不需要管理或使用服務帳戶的權限,請將這些權限從適用的允許政策中移除。
- 瞭解如何授予服務帳戶特定權限,有效啟用其他功能。
- 請確保服務帳戶具備最少的權限。請謹慎使用預設服務帳戶,因為系統會自動授予這些帳戶專案的編輯者 (
roles/editor
) 角色。
如要進一步瞭解最佳做法,請參閱「使用服務帳戶的最佳做法」。