組織政策服務有多項預先定義及管理的限制,可能會影響貴機構的服務帳戶。本頁面說明機構政策會產生哪些錯誤,以及解決這些錯誤的步驟。
必要的角色
如要取得排解機構政策問題所需的權限,請要求管理員授予您機構的機構政策管理員 (roles/orgpolicy.policyAdmin
) 身分與存取權管理角色。如要進一步瞭解如何授予角色,請參閱「管理專案、資料夾和機構的存取權」。
排解服務帳戶金鑰建立功能遭停用的問題
如果貴機構強制執行 iam.disableServiceAccountKeyCreation
限制,您就無法為貴機構的任何服務帳戶建立金鑰。如要進一步瞭解這項限制,請參閱「停用服務帳戶金鑰建立功能」。
金鑰建立錯誤
如果您嘗試建立服務帳戶金鑰,但該動作遭到 iam.disableServiceAccountKeyCreation
限制封鎖,系統會顯示以下錯誤訊息:
控制台
Google Cloud 控制台會顯示對話方塊,標題為「服務帳戶金鑰建立功能已停用」。對話方塊會指出機構已強制執行「iam.disableServiceAccountKeyCreation
」限制。
gcloud
ERROR: (gcloud.iam.service-accounts.keys.create) FAILED_PRECONDITION: Key
creation is not allowed on this service account.
- '@type': type.googleapis.com/google.rpc.PreconditionFailure
violations:
- description: Key creation is not allowed on this service account.
subject: projects/PROJECT_ID/serviceAccounts/SERVICE_ACCOUNT_ID@PROJECT_ID.iam.gserviceaccount.com?configvalue=SERVICE_ACCOUNT_ID%40PROJECT_ID.iam.gserviceaccount.com
type: constraints/iam.disableServiceAccountKeyCreation
REST
{
"error": {
"code": 400,
"message": "Key creation is not allowed on this service account.",
"status": "FAILED_PRECONDITION",
"details": [
{
"@type": "type.googleapis.com/google.rpc.PreconditionFailure",
"violations": [
{
"type": "constraints/iam.disableServiceAccountKeyCreation",
"subject": "projects/PROJECT_ID/serviceAccounts/SERVICE_ACCOUNT_ID@PROJECT_ID.iam.gserviceaccount.com?configvalue=SERVICE_ACCOUNT_ID%40PROJECT_ID.iam.gserviceaccount.com",
"description": "Key creation is not allowed on this service account."
}
]
}
]
}
}
服務帳戶金鑰建立錯誤的建議解決方法
如果機構政策禁止您建立服務帳戶金鑰,建議您採取下列行動:
評估是否需要服務帳戶金鑰。
我們不建議使用服務帳戶金鑰進行驗證。這是因為服務帳戶金鑰管理不當可能會帶來安全風險,增加您遭受憑證外洩、權限提升、資訊揭露和不可否認等威脅的風險。
在大多數情況下,您應使用更安全的替代方法進行驗證,而非使用服務帳戶金鑰。
如果您的用途需要服務帳戶金鑰,請為專案停用
iam.disableServiceAccountKeyCreation
限制。
如要停用機構政策限制,請關閉限制的強制執行功能,或將專案從強制執行功能中排除:
如要為整個機構停用限制的強制執行功能,請按照下列步驟操作:
確認您具備機構層級的「組織政策管理員」角色 (
roles/orgpolicy.policyAdmin
)。這個角色只能在機構中授予,不會顯示在專案的角色清單中。如要瞭解如何在機構層級授予角色,請參閱「管理專案、資料夾和機構的存取權」。
前往 Google Cloud 控制台的「Organization policies」(機構政策) 頁面。
在專案選取器中,選取要停用
iam.disableServiceAccountKeyCreation
限制的機構。在「Filter」欄位中輸入
iam.disableServiceAccountKeyCreation
。 然後在政策清單中,按一下「停用服務帳戶金鑰建立功能」。按一下「管理政策」。
在「政策來源」專區中,確認已選取「覆寫上層政策」。
在「強制執行」下方,關閉這項機構政策限制的強制執行功能。
按一下「設定政策」。
如要豁免專案,請按照下列步驟操作:
-
確認您在機構層級具備代碼管理員角色 (
roles/resourcemanager.tagAdmin
) 和機構政策管理員角色 (roles/orgpolicy.policyAdmin
)。如要瞭解如何在機構層級授予角色,請參閱「管理專案、資料夾和機構的存取權」。 -
在機構層級建立標記鍵和標記值,用於定義資源是否應豁免於機構政策。建議您建立含有
disableServiceAccountKeyCreation
鍵的標記,並將值設為enforced
和not_enforced
。如要瞭解如何建立代碼鍵和代碼值,請參閱建立及定義新代碼。
-
將
disableServiceAccountKeyCreation
標記附加至機構,並將值設為enforced
。除非以其他標記值覆寫,否則組織中的所有資源都會繼承這個標記值。如要瞭解如何將標記附加至資源,請參閱將標記附加至資源。
-
如要為每個服務帳戶免除機構政策限制,請附加
disableServiceAccountKeyCreation
標記,並將值設為not_enforced
。以這種方式為服務帳戶設定標記值,會覆寫從機構繼承的標記值。 -
建立或更新機構政策,禁止建立服務帳戶金鑰,以免對豁免資源強制執行限制。這項政策應包含下列規則:
-
設定
iam.disableServiceAccountKeyCreation
限制,確保系統不會對任何含有disableServiceAccountKeyCreation: not_enforced
標記的資源強制執行這項限制。這項規則中的條件應如下所示:"resource.matchTag('ORGANIZATION_ID/disableServiceAccountKeyCreation', 'not_enforced')"
-
設定
iam.disableServiceAccountKeyCreation
限制,以強制執行所有其他資源。
-
-
確認您在機構層級具備代碼管理員角色 (
解決服務帳戶建立功能遭停用的問題
如果貴機構強制執行 iam.disableServiceAccountCreation
限制,您就無法在貴機構的任何專案中建立服務帳戶。如要進一步瞭解這項限制,請參閱「停用服務帳戶建立功能」。
建立服務帳戶時發生錯誤
如果您嘗試建立服務帳戶,但該動作遭到 iam.disableServiceAccountCreation
限制封鎖,系統會顯示下列錯誤訊息:
控制台
Google Cloud 控制台會顯示對話方塊,標題為「服務帳戶建立失敗」。對話方塊顯示「您要求執行的操作失敗,請再試一次」。
gcloud
ERROR: (gcloud.iam.service-accounts.create) FAILED_PRECONDITION: Service account
creation is not allowed on this project.
- '@type': type.googleapis.com/google.rpc.PreconditionFailure
violations:
- description: Service account creation is not allowed on this project.
subject: projects/PROJECT_ID/serviceAccounts/?configvalue=
type: constraints/iam.disableServiceAccountCreation
REST
{
"error": {
"code": 400,
"message": "Service account creation is not allowed on this project.",
"status": "FAILED_PRECONDITION",
"details": [
{
"@type": "type.googleapis.com/google.rpc.PreconditionFailure",
"violations": [
{
"type": "constraints/iam.disableServiceAccountCreation",
"subject": "projects/PROJECT_ID/serviceAccounts/?configvalue=",
"description": "Service account creation is not allowed on this project."
}
]
}
]
}
}
服務帳戶建立錯誤的建議解決方法
如果機構政策禁止您建立服務帳戶,建議您採取下列行動:
評估是否需要服務帳戶。
請參閱「選擇服務帳戶的使用時機」,確認您的用途是否需要服務帳戶。
如果您的用途需要服務帳戶,請為專案停用
iam.disableServiceAccountCreation
限制。
如要停用機構政策限制,請關閉限制的強制執行功能,或將專案從強制執行功能中排除:
如要為整個機構停用限制的強制執行功能,請按照下列步驟操作:
確認您具備機構層級的「組織政策管理員」角色 (
roles/orgpolicy.policyAdmin
)。這個角色只能在機構中授予,不會顯示在專案的角色清單中。如要瞭解如何在機構層級授予角色,請參閱「管理專案、資料夾和機構的存取權」。
前往 Google Cloud 控制台的「Organization policies」(機構政策) 頁面。
在專案選取器中,選取要停用
iam.disableServiceAccountCreation
限制的機構。在「Filter」欄位中輸入
iam.disableServiceAccountCreation
。 然後在政策清單中,按一下「停用服務帳戶建立功能」。按一下「管理政策」。
在「政策來源」專區中,確認已選取「覆寫上層政策」。
在「強制執行」下方,關閉這項機構政策限制的強制執行功能。
按一下「設定政策」。
如要豁免專案,請按照下列步驟操作:
-
確認您在機構層級具備代碼管理員角色 (
roles/resourcemanager.tagAdmin
) 和機構政策管理員角色 (roles/orgpolicy.policyAdmin
)。如要瞭解如何在機構層級授予角色,請參閱「管理專案、資料夾和機構的存取權」。 -
在機構層級建立標記鍵和標記值,用於定義資源是否應豁免於機構政策。建議您建立含有
disableServiceAccountCreation
鍵的標記,並將值設為enforced
和not_enforced
。如要瞭解如何建立代碼鍵和代碼值,請參閱建立及定義新代碼。
-
將
disableServiceAccountCreation
標記附加至機構,並將值設為enforced
。除非以其他標記值覆寫,否則組織中的所有資源都會繼承這個標記值。如要瞭解如何將標記附加至資源,請參閱將標記附加至資源。
-
如要為專案或資料夾免除機構政策限制,請附加
disableServiceAccountCreation
標記,並將值設為not_enforced
。以這種方式為專案或資料夾設定標記值,會覆寫從機構沿用的標記值。 -
建立或更新機構政策,禁止建立服務帳戶,以免對豁免資源強制執行限制。這項政策應包含下列規則:
-
設定
iam.disableServiceAccountCreation
限制,確保系統不會對任何含有disableServiceAccountCreation: not_enforced
標記的資源強制執行這項限制。這項規則中的條件應如下所示:"resource.matchTag('ORGANIZATION_ID/disableServiceAccountCreation', 'not_enforced')"
-
設定
iam.disableServiceAccountCreation
限制,以強制執行所有其他資源。
-
-
確認您在機構層級具備代碼管理員角色 (
排解授予預設服務帳戶角色時發生的問題
使用特定Google Cloud 服務時,系統會自動建立預設服務帳戶。這些 ID 如下:
- App Engine 服務預設服務帳戶:
PROJECT_ID@appspot.gserviceaccount.com
- Compute Engine 預設服務帳戶:
PROJECT_NUMBER-compute@developer.gserviceaccount.com
除非機構政策停用這項行為,否則系統建立所有預設服務帳戶時,都會自動授予編輯者角色 (roles/editor
)。有兩項機構政策限制會禁止將「編輯者」角色授予預設服務帳戶:
iam.automaticIamGrantsForDefaultServiceAccounts
:預先定義的限制,可防止系統自動授予預設服務帳戶角色。這項限制不會阻止您日後將編輯者角色授予預設服務帳戶。constraints/iam.managed.preventPrivilegedBasicRolesForDefaultServiceAccounts
: 這項受管理限制可防止系統將「編輯者」和「擁有者」角色 (roles/owner
) 授予預設服務帳戶。
將基本角色授予服務帳戶時發生錯誤
如果專案強制執行 iam.automaticIamGrantsForDefaultServiceAccounts
限制或 constraints/iam.managed.preventPrivilegedBasicRolesForDefaultServiceAccounts
限制,專案中採用預設服務帳戶的工作負載可能會發生權限不足錯誤。如要瞭解應將哪些角色授予預設服務帳戶,請參閱為預設服務帳戶授予角色的建議解決方案。
iam.automaticIamGrantsForDefaultServiceAccounts
限制本身不會導致錯誤,不過,由於這項限制,使用預設服務帳戶的工作負載可能沒有必要的權限。
此外,如果專案強制執行 constraints/iam.managed.preventPrivilegedBasicRolesForDefaultServiceAccounts
限制,當您嘗試將「擁有者」或「編輯者」角色授予預設服務帳戶時,會看到類似下列內容的錯誤訊息:
控制台
Google Cloud 控制台會顯示對話方塊,標題為「身分與存取權管理政策更新失敗」。對話方塊會指出您嘗試對 IAM 政策所做的變更,已遭到組織政策管理員禁止,然後列出導致您無法更新的限制。列出的限制包括 customConstraints/custom.cantGrantProjectIamAdmin
限制。
gcloud
ERROR: (gcloud.projects.set-iam-policy) FAILED_PRECONDITION: Operation denied by
org policy on resource 'RESOURCE_ID':
["constraints/iam.managed.preventPrivilegedBasicRolesForDefaultServiceAccounts":
"When this constraint is enforced, it prevents anyone from granting the Editor
role (roles/editor) or the Owner role (roles/owner) to the Compute Engine and
App Engine default service accounts, at any time. To learn more about default
service accounts, see
https://cloud.google.com/iam/help/service-accounts/default. Enforcing this
constraint prevents the default service accounts from automatically being
granted the Editor role (roles/editor). This might cause permission issues for
services that use these service accounts. To learn which roles to grant to each
service account, see
https://cloud.google.com/iam/help/service-accounts/troubleshoot-roles-default."].
REST
{
"error": {
"code": 400,
"message": "Operation denied by org policy on resource
'RESOURCE_ID':
[\"constraints/iam.managed.preventPrivilegedBasicRolesForDefaultServiceAccounts\":
\"When this constraint is enforced, it prevents anyone from granting the
Editor role (roles/editor) or the Owner role (roles/owner) to the Compute
Engine and App Engine default service accounts, at any time. To learn more
about default service accounts, see
https://cloud.google.com/iam/help/service-accounts/default.\n Enforcing this
constraint prevents the default service accounts from automatically being
granted the Editor role (roles/editor). This might cause permission issues
for services that use these service accounts. To learn which roles to grant
to each service account, see
https://cloud.google.com/iam/help/service-accounts/troubleshoot-roles-default.\"].",
"status": "FAILED_PRECONDITION",
"details": [
{
"@type": "type.googleapis.com/google.rpc.ErrorInfo",
"reason": "CUSTOM_ORG_POLICY_VIOLATION",
"domain": "googleapis.com",
"metadata": {
"customConstraints": "constraints/iam.managed.preventPrivilegedBasicRolesForDefaultServiceAccounts",
"resource": "projects/PROJECT_ID"
}
}
]
}
}
建議解決方案:將角色授予預設服務帳戶
如果組織政策禁止您將「編輯者」或「擁有者」角色授予預設服務帳戶,請尋找權限較低的角色授予服務帳戶。服務帳戶所需角色取決於您使用的服務和要完成的工作。
請參閱下表,根據您使用的服務,決定要將哪個角色授予哪個預設服務帳戶:
服務 | 預設服務帳戶 | 要授予的角色 |
---|---|---|
App Engine |
App Engine 預設服務帳戶 (PROJECT_ID@appspot.gserviceaccount.com )
|
Cloud Build 帳戶角色 (roles/cloudbuild.builds.builder )
|
Compute Engine |
Compute Engine 預設服務帳戶
(PROJECT_NUMBER-compute@developer.gserviceaccount.com )
|
預設服務帳戶所需角色取決於您要完成的工作。如要瞭解所需角色,請參閱您想完成的工作說明文件,或參閱「找出合適的預先定義角色」。 決定要授予哪個角色時,請遵循 Compute Engine 說明文件「服務帳戶」頁面所述的最佳做法。 |
Cloud Build |
Compute Engine 預設服務帳戶
(PROJECT_NUMBER-compute@developer.gserviceaccount.com )
|
Cloud Build 服務帳戶角色 (roles/cloudbuild.builds.builder )
|
Cloud Deploy |
Compute Engine 預設服務帳戶
(PROJECT_NUMBER-compute@developer.gserviceaccount.com )
|
如要瞭解應授予這個服務帳戶哪些角色,請找出符合您用途的 Cloud Deploy 快速入門導覽課程,然後授予該課程中說明的角色。如需 Cloud Deploy 快速入門導覽課程清單,請參閱 Cloud Deploy 說明文件中的「快速入門」。 |
Cloud Run functions 和 Cloud Functions |
Compute Engine 預設服務帳戶
(PROJECT_NUMBER-compute@developer.gserviceaccount.com )
|
部署函式:Cloud Build 帳戶角色 ( 詳情請參閱「Cloud Build 的自訂服務帳戶」。 |
Cloud Run |
Compute Engine 預設服務帳戶
(PROJECT_NUMBER-compute@developer.gserviceaccount.com )
|
預設服務帳戶所需角色取決於您要完成的工作。如要瞭解所需角色,請參閱您想完成的工作說明文件,或參閱「找出合適的預先定義角色」。 如要瞭解 Cloud Run 角色,請參閱 Cloud Run 說明文件中的「使用 IAM 控管存取權」。 |
Google Kubernetes Engine |
Compute Engine 預設服務帳戶
(PROJECT_NUMBER-compute@developer.gserviceaccount.com )
|
Kubernetes Engine 預設節點服務帳戶角色 ( 詳情請參閱「使用最低權限的 IAM 服務帳戶」。 |
工作流程 |
Compute Engine 預設服務帳戶
(PROJECT_NUMBER-compute@developer.gserviceaccount.com )
|
預設服務帳戶所需角色取決於您要完成的工作。如要瞭解所需角色,請參閱您想完成的工作說明文件,或參閱「找出合適的預先定義角色」。 請按照 Workflows 說明文件「授予工作流程權限,以便存取 Google Cloud 資源」頁面中說明的最佳做法操作。 |