限制 IAM 服務帳戶的使用方式

機構政策服務提供可在機構政策中使用的限制,以限定 Identity and Access Management (IAM) 服務帳戶的使用。

許多限制會決定服務帳戶和其他資源是否能以特定方式建立或設定。這些限制不具有追溯性,不會影響之前建立和設定的服務帳戶。

事前準備

您必須擁有修改機構政策的權限才能設定限制。例如,orgpolicy.policyAdmin 角色具有設定組織政策限制的權限。請參閱「建立機構政策」頁面,進一步瞭解如何管理機構層級的政策。

代管限制

下列限制是受管理限制類型,可設為 true 或 false。受管理限制是以自訂機構政策平台為基礎建構而成。

如要瞭解如何建立機構政策來強制執行受管理限制,請參閱「建立機構政策」。

禁止將「擁有者」和「編輯者」角色授予預設服務帳戶

部分 Google Cloud 服務會自動建立預設服務帳戶。建立預設服務帳戶時,系統會自動將專案的編輯者角色 (roles/editor) 授予該帳戶。使用者也可能會在稍後選擇將高權限角色 (例如「編輯者」或「擁有者」角色 roles/owner) 授予預設服務帳戶。

「編輯者」和「擁有者」角色是權限較高的基本角色。您不應將這些角色授予任何正式環境中的主體,包括預設服務帳戶。

如要禁止預設服務帳戶取得「編輯者」或「擁有者」角色,請使用 iam.managed.preventPrivilegedBasicRolesForDefaultServiceAccounts 管理的限制。這項限制可防止系統自動或手動將編輯者或擁有者角色授予預設服務帳戶。

停用服務帳戶建立功能

您可以使用iam.managed.disableServiceAccountCreation代管限制來停用新服務帳戶的建立。這可讓您集中管理服務帳戶,而不會限制開發人員在專案上的其他權限。

如果您在專案中強制執行這項限制,部分服務就無法自動建立 Google Cloud預設服務帳戶。因此,如果專案執行的工作負載需要模擬服務帳戶,專案可能沒有工作負載可用的服務帳戶。如要解決這個問題,您可以啟用跨專案的服務帳戶模擬功能。啟用這項功能後,您可以在集中式專案中建立服務帳戶,然後將服務帳戶附加至其他專案中的資源。

如要進一步瞭解如何整理服務帳戶,請參閱「服務帳戶的建立位置」。

禁止建立繫結至服務帳戶的 API 金鑰

您可以使用 iam.managed.disableServiceAccountApiKeyCreation 受管理限制,停用繫結至服務帳戶的 API 金鑰建立作業。設定此限制後,使用者就無法在受限專案中,建立繫結至服務帳戶的 API 金鑰。

這項限制預設為強制執行。

停用服務帳戶金鑰建立功能

您可以使用 iam.managed.disableServiceAccountKeyCreation 管理限制,禁止建立新的外部服務帳戶金鑰和 Cloud Storage HMAC 金鑰。這可用來控制服務帳戶的非代管長期憑證。設定此限制後,即無法為受限專案的服務帳戶建立使用者代管憑證。

停用服務帳戶金鑰上傳功能

您可以使用 iam.managed.disableServiceAccountKeyUpload 管理限制,禁止將外部公開金鑰上傳至服務帳戶。設定此限制後,使用者就無法將公開金鑰上傳至受限專案的服務帳戶。

使用布林值規則的代管限制 (舊版)

下列限制是舊版受管理限制類型,具有設為 true 或 false 的布林規則

停用預設服務帳戶的自動角色授予功能

部分 Google Cloud 服務會自動建立預設服務帳戶。建立預設服務帳戶時,系統會自動將專案的編輯者角色 (roles/editor) 授予該服務帳戶。

為提升安全性,我們強烈建議您停用自動角色授予功能。使用 iam.automaticIamGrantsForDefaultServiceAccounts 舊版管理限制,停用自動角色授予功能。

停用服務帳戶建立功能

您可以使用 iam.disableServiceAccountCreation 舊版代管限制,禁止建立新的服務帳戶。這可讓您集中管理服務帳戶,而不會限制開發人員在專案上的其他權限。

如果您在專案中強制執行這項限制,部分服務就無法自動建立 Google Cloud預設服務帳戶。因此,如果專案執行的工作負載需要模擬服務帳戶,專案可能沒有工作負載可用的服務帳戶。如要解決這個問題,您可以啟用跨專案的服務帳戶模擬功能。啟用這項功能後,您可以在集中式專案中建立服務帳戶,然後將服務帳戶附加至其他專案中的資源。

如要進一步瞭解如何整理服務帳戶,請參閱「服務帳戶的建立位置」。

停用服務帳戶金鑰建立功能

您可以使用 iam.disableServiceAccountKeyCreation 舊版管理限制,禁止建立新的外部服務帳戶金鑰和 Cloud Storage HMAC 金鑰。這可用來控制服務帳戶的非代管長期憑證。設定此限制後,即無法為受限專案的服務帳戶建立使用者代管憑證。

停用服務帳戶金鑰上傳功能

您可以使用 iam.disableServiceAccountKeyUpload 舊版管理限制,禁止將外部公開金鑰上傳至服務帳戶。設定此限制後,使用者就無法將公開金鑰上傳至受限專案的服務帳戶。

禁止將服務帳戶附加至其他專案中的資源

每個服務帳戶都位於特定專案中。您可以使用iam.disableCrossProjectServiceAccountUsage舊版代管限制,禁止將專案中的服務帳戶附加至其他專案的資源。

如要允許跨專案使用服務帳戶,請參閱「啟用跨專案的服務帳戶模擬功能」。

限制在跨專案使用服務帳戶時移除專案防刪除鎖定功能

允許將專案的服務帳戶附加至其他專案的資源時,IAM 會新增專案留置權,防止您刪除專案。根據預設,只要擁有專案的 resourcemanager.projects.updateLiens 權限,就能刪除防刪除鎖定。

如果您強制執行iam.restrictCrossProjectServiceAccountLienRemoval舊版resourcemanager.projects.updateLiens受管理限制,主體必須具備機構的resourcemanager.projects.updateLiens權限,才能刪除留置權。

如果任何專案允許跨專案模擬服務帳戶,建議您強制執行這項限制。

在建立叢集時停用 Workload Identity

您可以使用 iam.disableWorkloadIdentityClusterCreation 舊版受管理限制,要求所有新的 Google Kubernetes Engine 叢集在建立時停用 Workload Identity 功能。如要嚴格控管貴機構的服務帳戶存取權,建議您除了停用服務帳戶建立和服務帳戶金鑰建立功能外,也停用 Workload Identity。

已啟用 Workload Identity Federation for GKE 的現有 GKE 叢集不會受到影響,仍會照常運作。

使用布林值規則設定代管限制 (舊版)

控制台

如要設定機構政策,強制執行限制服務帳戶用量的限制:

  1. 前往 Google Cloud 控制台的「Organization policies」(組織政策) 頁面。

    前往「Organization policies」(組織政策)

  2. 在專案選擇工具中,選取要限制服務帳戶用量的機構。

  3. 按一下這個頁面列出的其中一項服務帳戶使用限制。

  4. 按一下「Manage Policy」(管理政策)

  5. 在「套用對象」下方,選取「覆寫上層政策」

  6. 點選「新增規則」

  7. 在「Enforcement」(強制執行) 下方,選取「On」 (開啟)。

  8. 如要強制執行這項政策,請按一下「設定政策」

gcloud

政策可透過 Google Cloud CLI 進行設定。

如要限制服務帳戶用量,請執行下列指令:

gcloud resource-manager org-policies enable-enforce \
    --organization 'ORGANIZATION_ID' \
    CONSTRAINT_NAME

其中 CONSTRAINT_NAME 是您要強制執行的限制。

如要停用強制執行功能,可執行相同指令搭配

disable-enforce
指令。

如要瞭解如何在機構政策中使用限制,請參閱「建立機構政策」。

布林值規則的受管理限制 (舊版) 範例

以下程式碼片段顯示強制執行 iam.disableServiceAccountCreation 舊版受管理限制的機構政策,可防止建立服務帳戶:

name: organizations/012345678901/policies/iam.disableServiceAccountCreation
spec:
  rules:
  - enforce: true

使用清單規則管理限制 (舊版)

下列限制是舊版受管理限制的類型,具有清單規則,且設為值清單。

延長 OAuth 2.0 存取權杖的生命週期

您可以建立 OAuth 2.0 存取權杖,為服務帳戶提供短期憑證。根據預設,存取權杖的生命週期長度上限為 1 小時 (3,600 秒)。不過,您可以將最大生命週期延長至 12 小時。如要這麼做,請先找出要延長存取權杖生命週期的服務帳戶,然後將這些服務帳戶新增至機構政策 (須含 constraints/iam.allowServiceAccountCredentialLifetimeExtension 舊版受管理限制)。

限制服務帳戶金鑰的生命週期

服務帳戶金鑰可讓您以服務帳戶身分驗證要求。根據預設,服務帳戶金鑰不會過期。如要變更這項預設值,請為專案、資料夾或機構中所有新建立的金鑰設定到期時間。

如要設定到期時間,請使用 constraints/iam.serviceAccountKeyExpiryHours 舊版管理限制,指定新建立的金鑰有效時數。超過這段時間後,服務帳戶金鑰就會過期,無法再使用。

這項舊版受管理限制接受下列 ALLOW 值,但不接受 DENY 值。最佳做法是使用符合需求的最短到期時間:

  • 1h:1 小時
  • 8h:8 小時
  • 24h:24 小時 (1 天)
  • 168h:168 小時 (7 天)
  • 336h:336 小時 (14 天)
  • 720h:720 小時 (30 天)
  • 1440h:1,440 小時 (60 天)
  • 2160h:2,160 小時 (90 天)

constraints/iam.serviceAccountKeyExpiryHours 限制無法與父項政策合併。如要強制執行這項限制,必須取代或沿用父項政策。

指定允許的外部識別資訊提供者

如果您使用工作負載身分聯盟,允許外部身分存取 Google Cloud 資源,則可指定允許的外部身分提供者。根據預設,系統會允許所有提供者。如要設定限制,請使用 constraints/iam.workloadIdentityPoolProviders 舊版受管理限制,並採用下列格式指定允許的供應商 URI:

  • Amazon Web Services (AWS):https://sts.amazonaws.com

    如要限制允許的 AWS 帳戶,請使用本頁所述的constraints/iam.workloadIdentityPoolAwsAccounts舊版受管理限制

  • Microsoft Azure:https://sts.windows.net/azure-tenant-id

  • 支援 OpenID Connect (OIDC) 的其他識別資訊提供者:使用識別資訊提供者的簽發者 URI。

指定允許的 AWS 帳戶

如果您使用工作負載身分聯盟,允許外部身分存取 Google Cloud 資源,可以指定允許哪些 AWS 帳戶存取資源。根據預設,任何 AWS 帳戶的工作負載都可以存取您的 Google Cloud 資源。如要限制允許的 AWS 帳戶,請使用 constraints/iam.workloadIdentityPoolAwsAccounts 舊版受管理限制,指定允許的帳戶 ID 清單。

自動停用外洩的服務帳戶金鑰

Google Cloud 偶爾會偵測到特定服務帳戶金鑰遭到公開,例如在公開存放區中偵測到金鑰。如要指定 Google Cloud 對這些金鑰執行的操作,請使用iam.serviceAccountKeyExposureResponse舊版受管理限制。受監控的金鑰包括長效型服務帳戶金鑰,以及與服務帳戶繫結的 API 金鑰。

這項舊版受管理限制接受下列 ALLOW 值,但不接受 DENY 值。

  • DISABLE_KEY:如果 Google Cloud 偵測到外洩的金鑰,就會自動停用該金鑰。此外,系統也會建立 Cloud 稽核記錄事件,並將外洩金鑰的通知傳送給專案擁有者和安全聯絡人

  • WAIT_FOR_ABUSE: Google Cloud 不會主動停用外洩的金鑰。 不過,如果公開金鑰的使用方式對平台造成負面影響, Google Cloud 仍可能會停用這些金鑰。無論公開的金鑰是否已停用, Google Cloud 都會建立 Cloud 稽核記錄事件,並將公開金鑰的通知傳送給專案擁有者和安全性聯絡人

當 Google Cloud 偵測到或停用外洩金鑰時,也會執行下列動作:

  • 產生 Cloud 稽核記錄事件。

    • 當 Google Cloud 偵測到金鑰外洩時,系統會在「濫用事件記錄」中建立濫用事件。

    • Google Cloud 停用金鑰時,稽核記錄會包含主體 gcp-compromised-key-response@system.gserviceaccount.com 的停用動作。

  • 設定公開或停用金鑰的 extendedStatus.value 欄位。擴充狀態欄位包含偵測到洩漏的位置。

強烈建議您將這項限制設為 DISABLE_KEY。將這項限制設為 WAIT_FOR_ABUSE 會增加外洩金鑰遭濫用的風險。

如果您決定將限制設為 WAIT_FOR_ABUSE,建議您訂閱 Cloud Audit Logs 事件、在重要聯絡人中查看安全聯絡人資訊,並確保安全聯絡人及時回覆通知。

iam.serviceAccountKeyExposureResponse 限制無法與父項政策合併。如要強制執行這項限制,必須取代父項政策。

使用清單規則設定受管理限制 (舊版)

控制台

如要設定包含舊版受管理限制的機構政策:

  1. 前往 Google Cloud 控制台的「Organization policies」(組織政策) 頁面。

    前往「Organization policies」(組織政策)

  2. 在專案選擇工具中,選取要設定組織政策的資源。

  3. 在「Organization policies」(機構政策) 頁面中,從清單選取限制。系統隨即顯示該限制的「Policy details」(政策詳細資料) 頁面。

  4. 如要更新這項資源的機構政策,請按一下「管理政策」

  5. 在「Policy enforcement」(強制執行) 下方,選取強制執行選項:

    • 如要合併與評估機構政策,請選取「與上層合併」。如要進一步瞭解繼承和資源階層,請參閱「階層評估」。
    • 如要覆寫從父項資源繼承的政策,請選取「取代」
  6. 點選「新增規則」

  7. 在「Policy values」(政策值) 底下,選取「Custom」(自訂)。

  8. 在「Perimeter type」(Perimeter 類型),選取「Allow」(允許)

  9. 在「Custom values」(自訂值)下方,輸入舊版受管理限制的第一個值。

    1. 如要新增更多值,請按一下「新增值」來建立更多資料列,並在每個資料列中新增一個值。
  10. 新增完值後,按一下「完成」

  11. 如要強制執行這項政策,請按一下「設定政策」

gcloud

政策可透過 Google Cloud CLI 進行設定:

gcloud resource-manager org-policies allow \
    CONSTRAINT_NAME \
    VALUE_1 [VALUE_N ...] \
    --organization=ORGANIZATION_ID \

替換下列值:

  • CONSTRAINT_NAME:舊版代管限制的名稱。例如:constraints/iam.allowServiceAccountCredentialLifetimeExtension
  • VALUE_1VALUE_N...: 舊版受管理限制的值。

如要瞭解如何在機構政策中使用限制,請參閱「建立機構政策」。

含有清單規則的代管限制 (舊版) 範例

以下程式碼片段顯示強制執行 iam.allowServiceAccountCredentialLifetimeExtension 舊版受管理限制的機構政策,可延長所列服務帳戶的 OAuth 2.0 存取權杖最長生命週期:

name: organizations/012345678901/policies/iam.allowServiceAccountCredentialLifetimeExtension
spec:
  rules:
  - values:
      allowedValues:
      - SERVICE_ACCOUNT_ADDRESS

使用標記有條件地強制執行限制

標記可用來在強制執行機構政策時,納入或排除已標記的資源。建立標記並附加至服務帳戶後,您可以在政策中新增條件,有條件地將標記的服務帳戶納入或排除在強制執行範圍之外。

如要進一步瞭解如何搭配使用標記與組織政策,請參閱「使用標記設定組織政策的範圍」。

錯誤訊息

停用服務帳戶建立功能

如果已強制執行 iam.disableServiceAccountCreation,建立服務帳戶時會失敗並顯示以下錯誤:

FAILED_PRECONDITION: Service account creation is not allowed on this project.

禁止建立繫結至服務帳戶的 API 金鑰

如果已強制執行 iam.managed.disableServiceAccountApiKeyCreation,建立繫結至服務帳戶的 API 金鑰時會失敗並顯示以下錯誤:

FAILED_PRECONDITION: Operation denied by org policy:
["constraints/iam.managed.disableServiceAccountApiKeyCreation":
"When enforced, disables creation of API Keys bound to service accounts."]

停用服務帳戶金鑰建立功能

如果已強制執行 iam.disableServiceAccountKeyCreation,建立服務帳戶時會失敗並顯示以下錯誤:

FAILED_PRECONDITION: Key creation is not allowed on this service account.

在建立叢集時停用 Workload Identity

如果強制執行 iam.disableWorkloadIdentityClusterCreation,建立啟用 Workload Identity 的 GKE 叢集時會失敗,並顯示下列錯誤:

FAILED_PRECONDITION: Workload Identity is disabled by the organization
policy constraints/iam.disableWorkloadIdentityClusterCreation. Contact your
administrator to enable this feature.

已知問題疑難排解

預設服務帳戶

套用 iam.disableServiceAccountCreation 限制會禁止在該專案內建立服務帳戶。這項限制也會影響Google Cloud 服務,這些服務預設在啟用時會自動在專案中建立服務帳戶,例如:

  • Compute Engine
  • GKE
  • App Engine
  • Dataflow

套用 iam.disableServiceAccountCreation 限制時,由於無法建立預設服務帳戶,嘗試啟用這些服務會失敗。

如何解決這個問題:

  1. 暫時移除 iam.disableServiceAccountCreation 限制。
  2. 啟用所需的服務。
  3. 建立任何其他所需的服務帳戶。
  4. 最後,重新套用限制。