使用自訂機構政策來設定允許政策

本頁面說明如何使用「組織政策服務」自訂限制條件,限制對下列 Google Cloud 資源執行的特定作業:

  • iam.googleapis.com/AllowPolicy

如要進一步瞭解組織政策,請參閱「自訂組織政策」。

關於組織政策和限制

Google Cloud 組織政策服務可讓您透過程式輔助,集中控管組織的資源。組織政策管理員可以定義組織政策,也就是一組稱為「限制」的限制條件,適用於Google Cloud 資源和這些資源在Google Cloud 資源階層中的子系。您可以在組織、資料夾或專案層級,強制執行組織政策。

組織政策提供各種 Google Cloud 服務的內建代管限制。不過,如要更精細地自訂組織政策中受限的特定欄位,您也可以建立「自訂限制」,並用於組織政策。

政策繼承

根據預設,您強制執行政策的資源子系會繼承組織政策。舉例來說,如果您對資料夾強制執行政策, Google Cloud 會對該資料夾中的所有專案強制執行政策。如要進一步瞭解這項行為及變更方式,請參閱「階層評估規則」。

優點

您可以透過參照 IAM 屬性的自訂組織政策,控管允許政策的修改方式。具體來說,您可以控管下列項目:

  • 哪些人可以獲得角色
  • 哪些人的角色可以撤銷
  • 可授予的角色
  • 可撤銷哪些角色

舉例來說,您可以禁止將含有 admin 字詞的角色授予電子郵件地址結尾為 @gmail.com 的主體。

限制

  • 在模擬測試模式中,參照 IAM 屬性的自訂組織政策有一些限制。也就是說,涉及 setIamPolicy 方法的違規稽核記錄可能缺少下列欄位:

    • resourceName
    • serviceName
    • methodName
  • 系統不會針對所有與 IAM 相關的自訂組織政策違規事項產生稽核記錄。也就是說,如果自訂組織政策導致組織資源的 setIamPolicy 作業失敗,Google Cloud 就不會為該事件產生稽核記錄。

  • 參照 IAM 屬性的自訂組織政策不會影響下列項目:

  • 即使您有自訂組織政策,禁止授予擁有者角色 (roles/owner),使用者仍可收到成為擁有者的邀請。不過,雖然自訂組織政策不會阻止傳送邀請,但會阻止受邀使用者取得擁有者角色。如果受邀使用者嘗試接受邀請,系統會顯示錯誤訊息,且不會授予擁有者角色。

  • 在 Google Cloud中執行某些動作 (例如建立資源或啟用 API) 時,系統會自動將角色授予服務代理或預設服務帳戶。如果動作涉及自動授予角色,而組織政策禁止授予該角色,則整個作業可能會失敗。

    如果遇到這個問題,可以使用標記暫時停用限制,避免角色授予作業失敗。然後執行動作。動作完成後,請重新啟用限制。

事前準備

  • 如要測試參照 IAM 資源的自訂組織政策,請建立新專案。在現有專案中測試這些組織政策,可能會干擾安全性工作流程。

    1. 前往 Google Cloud 控制台的專案選取器頁面。

      前往專案選取器

    2. 選取或建立 Google Cloud 專案。

      選取或建立專案所需的角色

      • 選取專案:選取專案時,不需具備特定 IAM 角色,只要您已獲派某個專案的角色,即可選取該專案。
      • 建立專案:如要建立專案,您必須具備專案建立者角色 (roles/resourcemanager.projectCreator),其中包含 resourcemanager.projects.create 權限。瞭解如何授予角色。

必要的角色

如要取得管理組織政策所需的權限,請要求管理員授予您下列 IAM 角色:

如要進一步瞭解如何授予角色,請參閱「管理專案、資料夾和組織的存取權」。

這些預先定義的角色具備管理組織政策所需的權限。如要查看確切的必要權限,請展開「Required permissions」(必要權限) 部分:

所需權限

必須具備下列權限,才能管理組織政策:。

  • orgpolicy.* 組織
  • 在專案 resourcemanager.projects.setIamPolicy 測試本頁所述的組織政策

您或許還可透過自訂角色或其他預先定義的角色取得這些權限。

Identity and Access Management 支援的資源

IAM 支援 AllowPolicy 資源。這項資源具有 resources.bindings 屬性,會針對修改資源允許政策的所有方法傳回。所有修改資源允許政策的方法都以 setIamPolicy 結尾。

resource.bindings 屬性的結構如下,其中 BINDINGS 是在變更允許政策時修改的角色繫結陣列:

{
  "bindings": {
    BINDINGS
  }
}

resource.bindings 中的每個繫結都具有下列結構,其中 ROLE 是角色繫結中的角色名稱,MEMBERS 則是從角色繫結中新增或移除的所有主體 ID 清單:

{
  "role": "ROLE"
  "members": {
    MEMBERS
  }
}

如要查看主體 ID 的格式,請參閱「主體 ID」。

您只能使用支援的函式評估 resource.bindings 屬性及其欄位。不支援其他運算子和函式,例如 ==、!=、in、contains、startsWith 和 endsWith。

支援的函式

您可以使用下列 CEL 函式,評估繫結中的個別角色和成員。

如要評估 bindings 陣列中的所有繫結,或 members 陣列中的所有成員,請使用 all 和 exists 巨集。詳情請參閱本頁的「用於評估清單的巨集」一節。

您也可以使用邏輯運算子 && (and) 和 || (or) 編寫多部分條件。

函式 說明
RoleNameMatches(
  role,
  roleNames: list
)
  bool

如果角色 role 與 roleNames 中列出的至少一個角色完全相符,則傳回 true。

參數
role:要評估的角色。
roleNames:要比對的角色名稱清單。
範例

如果指定 binding 中的 role 為 roles/storage.admin 或 roles/compute.admin,則傳回 true:

RoleNameMatches(binding.role, ['roles/storage.admin', 'roles/compute.admin'])
RoleNameStartsWith(
  role,
  rolePrefixes: list
)
  bool

如果角色 role 的開頭為 rolePrefixes 中列出的至少一個字串,則傳回 true。

參數
role:要評估的角色。
rolePrefixes:用於比對角色開頭的字串清單。
範例

如果指定 binding 中的 role 開頭為 roles/storage,則傳回 true:

RoleNameStartsWith(binding.role, ['roles/storage'])
RoleNameEndsWith(
  role,
  roleSuffixes: list
)
  bool

如果角色 role 的結尾是 roleSuffixes 中列出的至少一個字串,則傳回 true。

參數
role:要評估的角色。
roleSuffixes:字串清單,用於比對角色結尾。
範例

如果指定 binding 中的 role 以 .admin 結尾,則傳回 true:

RoleNameEndsWith(binding.role, ['.admin'])
RoleNameContains(
  role,
  roleSubstrings: list
)
  bool

如果角色 role 包含 roleSubstrings 中列出的至少一個字串,則傳回 true。

參數
role:要評估的角色。
roleSubstrings:字串清單,用於比對角色的任何部分。
範例

如果指定 binding 中的 role 包含字串 admin,則傳回 true:

RoleNameContains(binding.role, ['admin'])
MemberSubjectMatches(
  member,
  memberNames: list
)
  bool

如果成員 member 與 memberNames 中列出的至少一個成員完全相符,則傳回 true。

如果 member 的 ID 是電子郵件地址,這個函式會評估該電子郵件地址和任何別名。

參數
member:要評估的成員。
memberNames:要比對的成員名稱清單。
範例

如果成員 member 為 rosario@example.com,則傳回 true:

MemberSubjectMatches(member, ['user:rosario@example.com'])
MemberSubjectStartsWith(
  member,
  memberPrefixes: list
)
  bool

如果成員 member 的開頭為 memberPrefixes 中列出的至少一個字串,則傳回 true。

如果 member 的 ID 是電子郵件地址,這個函式會評估該電子郵件地址和任何別名。

參數
member:要評估的成員。
memberPrefixes:用於比對成員名稱開頭的字串清單。
範例

如果成員 member 的開頭為 user:prod-,則傳回 true:

MemberSubjectStartsWith(member, ['user:prod-'])
MemberSubjectEndsWith(
  member,
  memberSuffixes: list
)
  bool

如果成員 member 的結尾是 memberSuffixes 中列出的至少一個字串,則傳回 true。

如果 member 的 ID 是電子郵件地址,這個函式會評估該電子郵件地址和任何別名。

參數
member:要評估的成員。
memberSuffixes:字串清單,用於比對成員名稱的結尾。
範例

如果成員 member 結尾為 @example.com,則傳回 true:

MemberSubjectEndsWith(member, ['@example.com'])
MemberInPrincipalSet(
  member,
  principalSets: list
)
  bool

如果成員屬於至少一個列出的主體集,則傳回 true。

參數
member:要評估的成員。

principalSets:主體集清單。如要讓函式評估為 true,成員必須至少屬於其中一個主體集。

唯一支援的主體組合是機構主體組合,格式為 //cloudresourcemanager.googleapis.com/organizations/ORGANIZATION_ID。在 MemberInPrincipalSet 函式中使用時,這個主體集包含下列主體:

  • 與 Google Workspace 客戶 ID 相關聯的所有網域中的所有身分
  • 貴組織中的所有員工身分集區
  • 組織中任何專案的所有服務帳戶和 workload identity pool
  • 與組織中資源相關聯的所有服務代理。
範例

如果成員 member 屬於 ID 為 123456789012 的 @example.com 組織,則傳回 true:

MemberInPrincipalSet(member, ['//cloudresourcemanager.googleapis.com/organizations/123456789012'])
MemberTypeMatches(
  member,
  principalType: list
)
  bool

如果成員是列出的主體類型之一,則傳回 true。

參數
member:要評估的成員。
principalType:主體類型清單。如要將函式評估為 true,成員必須是列出的主體類型之一。如要瞭解支援的主體類型,請參閱「MemberTypeMatches 支援的主體類型」。
範例

如果成員 member 的主體類型為 iam.googleapis.com/WorkspacePrincipal 或 iam.googleapis.com/WorkspaceGroup,則傳回 true:

MemberTypeMatches(member, ['iam.googleapis.com/WorkspacePrincipal', 'iam.googleapis.com/WorkspaceGroup'])

評估清單的巨集

使用 all 和 exists 巨集,評估項目清單的條件運算式。

微距 說明
list.all(
  item,
  conditionExpression
)
  bool

如果 list 中的每個 item 經 conditionExpression 評估後都傳回 true,則傳回 true。

這個巨集通常用於具有 actionType ALLOW 的自訂組織政策。舉例來說,您可以使用這個巨集,確保只有在所有修改後的主體都符合條件時,才允許執行動作。

參數
list:要評估的項目清單。
item:要評估的清單項目。舉例來說,如果您在 resource.bindings 清單上呼叫這個方法,請使用 binding 值。
conditionExpression:用於評估每個 item 的條件運算式。
範例

如果 resource.bindings 中的所有繫結都具有開頭為 roles/storage. 的角色,則傳回 true。如果任何繫結的角色開頭不是 roles/storage.,則傳回 false:

resource.bindings.all(binding, RoleNameStartsWith(binding.role, ['roles/storage.']))
list.exists(
  item,
  conditionExpression
)
  bool

如果 list 中的任何 item 經 conditionExpression 評估後為 true,則傳回 true。

這個巨集通常用於具有 actionType DENY 的自訂組織政策。舉例來說,您可以使用這個巨集,確保在任何修改後的主體符合條件時,拒絕執行動作。

參數
list:要評估的項目清單。
item:要評估的清單項目。舉例來說,如果您在 resource.bindings 清單上呼叫這個方法,請使用 binding 值。
conditionExpression:用於評估每個 item 的條件運算式。
範例

如果 resource.bindings 中的任何繫結具有開頭為 roles/storage. 的角色,則傳回 true。如果沒有任何繫結的角色開頭為 roles/storage.,則傳回 false:

resource.bindings.exists(binding, RoleNameStartsWith(binding.role, ['roles/storage.']))

含有巢狀清單的條件

一般來說,如果條件包含巢狀清單,則條件中的所有清單都應使用相同的巨集。

請見以下範例:

  • 如果政策具有 actionType ALLOW,請針對 members 清單和 bindings 清單使用 all 巨集,確保只有在所有修改後的繫結中,所有成員都符合條件時,才允許修改政策。
  • 如果政策具有 actionType DENY,請針對 members 清單和 bindings 清單使用 exists 巨集,確保在任何修改後的繫結中,只要有「任何」成員符合條件,就不允許修改政策。

在單一條件中混用巨集,可能會導致條件無法按照預期運作。

舉例來說,假設您想禁止將角色授予 example.com 組織外部的成員,example.com 組織的 ID 為 123456789012。

為達成這個目標,您需要編寫下列條件:

不建議使用 - 條件設定錯誤

"resource.bindings.all(
  binding,
  binding.members.exists(member,
    MemberInPrincipalSet(member, ['//cloudresourcemanager.googleapis.com/organizations/123456789012'])
  )
)"

這項條件似乎會防止將角色授予 example.com 組織以外的成員。不過,如果每個修改後的角色繫結中,有「任何」成員屬於 example.com 機構,條件就會評估為 true。因此,如果您將某個角色授予 example.com 組織中的成員,仍可將相同角色授予 example.com 組織外部的成員。

舉例來說,即使其中一個成員不在 example.com 組織中,下列繫結集的條件仍會評估為 true:

 "bindings": [
    {
      "members": [
        "user:raha@altostrat.com",
        "user:jie@example.com"
      ],
      "role": "roles/resourcemanager.projectCreator"
    }
  ],

建議改用下列條件:

建議:正確設定的條件

"resource.bindings.all(
  binding,
  binding.members.all(member,
    MemberInPrincipalSet(member, ['//cloudresourcemanager.googleapis.com/organizations/123456789012'])
  )
)"

對 members.bindings 陣列和 resource.bindings 陣列使用 all 巨集,可確保只有在所有繫結中的所有成員都位於 example.com 主體集時,條件才會評估為 true。

MemberTypeMatches 支援的主體類型

MemberTypeMatches 函式會要求您指定指定成員必須符合的主體類型。

下表列出可輸入的主體類型,以及該主體類型的說明。並列出與各主體類型對應的主體 ID。這些 ID 是 IAM 政策中使用的值。

主體類型 說明 主體 ID
iam.googleapis.com/ConsumerPrincipal 個人 Google 帳戶。這類帳戶的電子郵件地址通常以 gmail.com 結尾。 user:USER_EMAIL_ADDRESS
iam.googleapis.com/WorkspacePrincipal Cloud Identity 或 Google Workspace 帳戶中的 Google 帳戶。這類帳戶也稱為 受管理使用者帳戶。 user:USER_EMAIL_ADDRESS
iam.googleapis.com/ConsumerGroup 由個人 Google 帳戶建立的 Google 群組。這些群組不屬於 Cloud Identity 或 Google Workspace 帳戶。這些群組的電子郵件地址通常會以 googlegroups.com 結尾。 group:GROUP_EMAIL_ADDRESS
iam.googleapis.com/WorkspaceGroup 由 Cloud Identity 或 Google Workspace 帳戶擁有的 Google 群組。 group:GROUP_EMAIL_ADDRESS
iam.googleapis.com/Domain Cloud Identity 或 Google Workspace 帳戶。 domain:DOMAIN
iam.googleapis.com/WorkforcePoolPrincipal 員工身分集區中的單一主體。 principal://iam.googleapis.com/locations/global/workforcePools/POOL_ID/subject/SUBJECT_ATTRIBUTE_VALUE
iam.googleapis.com/WorkforcePoolPrincipalSet 主體集,包含員工身分集區中的一組身分。例如,包含員工身分集區中所有主體的主體集。
  • principalSet://iam.googleapis.com/locations/global/workforcePools/POOL_ID/group/GROUP_ID
  • principalSet://iam.googleapis.com/locations/global/workforcePools/POOL_ID/attribute.ATTRIBUTE_NAME/ATTRIBUTE_VALUE
  • principalSet://iam.googleapis.com/locations/global/workforcePools/POOL_ID/*
iam.googleapis.com/WorkloadPoolPrincipal workload identity 集區中的單一身分 principal://iam.googleapis.com/projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/POOL_ID/subject/SUBJECT_ATTRIBUTE_VALUE
iam.googleapis.com/WorkloadPoolPrincipalSet 主體集,包含 workload identity pool 中的一組身分。例如,包含 workload identity pool 中所有主體的主體集。
  • principalSet://iam.googleapis.com/projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/POOL_ID/group/GROUP_ID
  • principalSet://iam.googleapis.com/projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/POOL_ID/attribute.ATTRIBUTE_NAME/ATTRIBUTE_VALUE
  • principalSet://iam.googleapis.com/projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/POOL_ID/*
iam.googleapis.com/ServiceAccount

任何服務帳戶。服務帳戶是一種特殊類型的帳戶,代表工作負載而非人類使用者。

在 MemberTypeMatches 函式的內容中,這個主體類型不包含服務代理。

serviceAccount:SERVICE_ACCOUNT_EMAIL_ADDRESS
iam.googleapis.com/ServiceAgent 任何服務代理。服務代理是 Google Cloud 建立及管理的特殊服務帳戶。在專案中獲得角色後,服務代理可讓 Google Cloud 服務代您執行動作。 serviceAccount:SERVICE_AGENT_EMAIL_ADDRESS
iam.googleapis.com/PublicPrincipals 主體 allUsers 和 allAuthenticatedUsers。
  • allUsers
  • allAuthenticatedUsers
iam.googleapis.com/ProjectRoleReference 根據授予的角色定義的主體。這些主體也稱為「便利值」。
  • projectOwner:PROJECT_ID
  • projectEditor:PROJECT_ID
  • projectViewer:PROJECT_ID
iam.googleapis.com/ResourcePrincipal 具有內建身分的資源。 「單一資源的主體 ID」中列出的任何主體 ID。
iam.googleapis.com/ResourcePrincipalSet 具有內建身分且共用特定特徵 (例如類型或祖系) 的資源。 「資源集的主體 ID」中列出的任何 ID。
iam.googleapis.com/AgenticIdentityPoolPrincipal 單一代理身分。
  • principal://agents.global.org-ORG_ID.system.id.goog/SUBJECT_ATTRIBUTE_VALUE
  • principal://agents.global.proj-PROJECT_NUMBER.system.id.goog/SUBJECT_ATTRIBUTE_VALUE
  • principal://agents-nonprod.global.org-ORG_ID.system.id.goog/SUBJECT_ATTRIBUTE_VALUE
  • principal://agents-nonprod.global.proj-PROJECT_NUMBER.system.id.goog/SUBJECT_ATTRIBUTE_VALUE
iam.googleapis.com/AgenticIdentityPoolPrincipalSet 包含一組代理身分的主體集。
  • principalSet://agents.global.org-ORG_ID.system.id.goog/*
  • principalSet://agents.global.proj-PROJECT_NUMBER.system.id.goog/*
  • principalSet://agents-nonprod.global.org-ORG_ID.system.id.goog/*
  • principalSet://agents-nonprod.global.proj-PROJECT_NUMBER.system.id.goog/*
  • principalSet://agents.global.org-ORG_ID.system.id.goog/attribute.ATTRIBUTE_NAME/ATTRIBUTE_VALUE
  • principalSet://agents.global.proj-PROJECT_NUMBER.system.id.goog/attribute.ATTRIBUTE_NAME/ATTRIBUTE_VALUE
  • principalSet://agents-nonprod.global.org-ORG_ID.system.id.goog/attribute.ATTRIBUTE_NAME/ATTRIBUTE_VALUE
  • principalSet://agents-nonprod.global.proj-PROJECT_NUMBER.system.id.goog/attribute.ATTRIBUTE_NAME/ATTRIBUTE_VALUE

範例:principalSet://agents.global.org-123456789012.system.id.goog/*

設定自訂限制

自訂限制是在 YAML 檔案中定義,其中包含您要強制執行組織政策的服務所支援的資源、方法、條件和動作。自訂限制的條件是使用一般運算語言 (CEL) 來定義。如要進一步瞭解如何使用 CEL 在自訂限制中建構條件,請參閱「建立及管理自訂限制」的 CEL 相關章節。

控制台

如要建立自訂限制,請按照下列步驟操作:

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

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

  2. 在專案挑選器中,選取要設定組織政策的專案。
  3. 按一下「 Custom constraint」(自訂限制)。
  4. 在「Display name」(顯示名稱) 方塊中,輸入人類可讀的限制名稱。這個名稱會用於錯誤訊息,可用於識別和偵錯。請勿在顯示名稱中使用個人識別資訊 (PII) 或機密資料,因為這類名稱可能會在錯誤訊息中曝光。這個欄位最多可包含 200 個字元。
  5. 在「Constraint ID」(限制 ID) 方塊中,輸入新自訂限制的 ID。自訂限制只能包含英文字母 (包括大小寫) 或數字,例如 custom.denyProjectIAMAdmin。這個欄位最多可包含 70 個字元,不含前置字元 (custom.),例如 organizations/123456789/customConstraints/custom。請勿在限制 ID 中輸入 PII 或機密資料,因為錯誤訊息可能會顯示上述資訊。
  6. 在「Description」(說明) 方塊中,輸入人類可讀的限制說明。違反政策時,系統會將這段說明做為錯誤訊息顯示。請詳細說明違反政策的原因,以及如何解決違規問題。請勿在說明中輸入 PII 或機密資料,因為錯誤訊息可能會顯示上述資訊。這個欄位最多可輸入 2000 個字元。
  7. 在「Resource type」(資源類型) 方塊中,選取包含要限制的物件和欄位的 Google Cloud REST 資源名稱,例如 container.googleapis.com/Cluster。大多數資源類型最多支援 20 項自訂限制。如果嘗試建立更多自訂限制,作業會失敗。
  8. 在「Enforcement method」(強制執行方法) 下方,選取要對 REST CREATE 方法強制執行限制,還是同時對 CREATE 和 UPDATE 方法強制執行限制。如果使用 UPDATE 方法對違反限制的資源強制執行限制,組織政策會禁止對該資源進行變更,除非變更可解決違規問題。
  9. 如要查看各項服務支援的方法,請在「 支援自訂限制的服務」中找到該服務。

  10. 如要定義條件,請按一下 「Edit condition」(編輯條件)。
    1. 在「Add condition」(新增條件) 面板中,建立參照支援服務資源的 CEL 條件,例如 resource.management.autoUpgrade == false。這個欄位最多可輸入 1000 個字元。如要進一步瞭解 CEL 的用法,請參閱 一般運算語言。如要進一步瞭解可在自訂限制中使用的服務資源,請參閱「 支援自訂限制的服務」。
    2. 按一下 [儲存]。
  11. 在「Action」下方,選取是否要在符合條件時允許或拒絕評估的方法。
  12. 「拒絕」動作表示如果條件評估為 true,系統會禁止建立或更新資源。

    「允許」動作表示只有在條件評估為 true 時,才允許建立或更新資源。除了條件中明確列出的情況外,其他所有情況都會遭到封鎖。

  13. 按一下「Create constraint」(建立限制)。
  14. 在每個欄位中輸入值後,右側會顯示這項自訂限制的對等 YAML 設定。

gcloud

  1. 如要建立自訂限制,請使用下列格式建立 YAML 檔案:
  2. name: organizations/ORGANIZATION_ID/customConstraints/CONSTRAINT_NAME
    resourceTypes: RESOURCE_NAME
    methodTypes:
      - CREATE
    - UPDATE
    condition: "CONDITION" actionType: ACTION displayName: DISPLAY_NAME description: DESCRIPTION

    更改下列內容:

    • ORGANIZATION_ID:組織 ID,例如 123456789。
    • CONSTRAINT_NAME:新自訂限制的名稱。自訂限制只能包含英文字母 (包括大小寫) 或數字,例如 custom.denyProjectIAMAdmin。這個欄位最多可包含 70 個字元,不含前置字元 (custom.),例如 organizations/123456789/customConstraints/custom。請勿在限制 ID 中輸入 PII 或機密資料,因為錯誤訊息可能會顯示上述資訊。
    • RESOURCE_NAME:內含要限制的物件和欄位的 Google Cloud資源完整名稱,例如:iam.googleapis.com/AllowPolicy。大多數資源類型最多支援 20 項自訂限制。如果嘗試建立更多自訂限制,作業會失敗。
    • methodTypes:強制執行限制的 REST 方法。可以是 CREATE,或同時為 CREATE 和 UPDATE。如果使用 UPDATE 方法對違反限制的資源強制執行限制,組織政策會禁止變更該資源,除非變更可解決違規問題。
    • 如要查看各項服務支援的方法,請在「 支援自訂限制的服務」中找到該服務。

    • CONDITION:針對支援服務資源表示法所撰寫的 CEL 條件。這個欄位最多可輸入 1000 個字元。例如:resource.bindings.exists(binding, RoleNameMatches(binding.role, ['roles/resourcemanager.projectIamAdmin']))。
    • 如要進一步瞭解可編寫條件的資源,請參閱「支援的資源」。

    • ACTION:符合 condition 時採取動作。可能的值為 ALLOW 和 DENY。
    • 「允許」動作代表如果條件評估為 true,則允許建立或更新資源。這也表示除了條件中明確列出的情況外,其他所有情況都會遭到封鎖。

      「拒絕」動作是指如果條件評估結果為 true,系統就會禁止建立或更新資源。

    • DISPLAY_NAME:人類可讀的限制名稱。這個名稱會用於錯誤訊息,可用於識別和偵錯。請勿在顯示名稱中使用 PII 或機密資料,因為這類名稱可能會在錯誤訊息中顯示。這個欄位最多可輸入 200 個字元。
    • DESCRIPTION:違反政策時,會以錯誤訊息形式顯示且易於理解的限制說明。這個欄位最多可包含 2000 個字元。
  3. 為新的自訂限制建立 YAML 檔案後,您必須加以設定,才能用於組織的組織政策。如要設定自訂限制,請使用 gcloud org-policies set-custom-constraint 指令:
  4. gcloud org-policies set-custom-constraint CONSTRAINT_PATH

    請將 CONSTRAINT_PATH 替換成自訂限制檔案的完整路徑,例如:/home/user/customconstraint.yaml。

    這項作業完成後,自訂限制會顯示在 Google Cloud 組織政策清單中,供組織政策使用。

  5. 如要確認是否存在自訂限制,請使用 gcloud org-policies list-custom-constraints 指令:
  6. gcloud org-policies list-custom-constraints --organization=ORGANIZATION_ID

    將 ORGANIZATION_ID 替換為組織資源的 ID。

    詳情請參閱「 查看組織政策」。

強制執行自訂組織政策

如要強制執行限制,請建立參照該限制的組織政策,然後將組織政策套用至 Google Cloud 資源。

控制台

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

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

  2. 在專案挑選器中,選取要設定組織政策的專案。
  3. 在「Organization policies」(組織政策) 頁面的清單中選取限制,即可查看該限制的「Policy details」(政策詳細資料) 頁面。
  4. 如要為這項資源設定組織政策,請按一下「Manage policy」(管理政策)。
  5. 在「Edit policy」(編輯政策) 頁面,選取「Override parent's policy」(覆寫上層政策)。
  6. 按一下「Add a rule」(新增規則)。
  7. 在「Enforcement」(強制執行) 部分,選取是否要強制執行這項組織政策。
  8. 選用:如要根據標記設定組織政策的條件,請按一下「Add condition」(新增條件)。請注意,如果為組織政策新增條件式規則,您必須至少新增一項無條件規則,否則無法儲存政策。詳情請參閱「 使用標記設定組織政策範圍」。
  9. 如要在模擬測試模式下強制執行組織政策,請按一下「Set dry run policy」(設定模擬測試政策)。詳情請參閱「 測試組織政策」。
  10. 確認組織政策在模擬測試模式下運作正常後,請按一下「Set policy」(設定政策),設定正式政策。

gcloud

  1. 如要建立含有布林值規則的組織政策,請建立參照限制的政策 YAML 檔案:
  2. name: projects/PROJECT_ID/policies/CONSTRAINT_NAME
    spec:
      rules:
      - enforce: true
    
    dryRunSpec:
      rules:
      - enforce: true

    更改下列內容:

    • PROJECT_ID:要強制執行限制的專案。
    • CONSTRAINT_NAME:要為自訂限制定義的名稱,例如:custom.denyProjectIAMAdmin。
  3. 如要在模擬測試模式中強制執行組織政策,請執行下列指令並加上 dryRunSpec 旗標:
  4. gcloud org-policies set-policy POLICY_PATH --update-mask=dryRunSpec

    請將 POLICY_PATH 替換為組織政策 YAML 檔案的完整路徑。政策最多需要 15 分鐘才會生效。

  5. 確認模擬測試模式中的組織政策運作正常後,請使用 org-policies set-policy 指令和 spec 旗標設定正式政策:
  6. gcloud org-policies set-policy POLICY_PATH --update-mask=spec

    請將 POLICY_PATH 替換為組織政策 YAML 檔案的完整路徑。政策最多需要 15 分鐘才會生效。

測試自訂組織政策

您也可以選擇測試組織政策,方法是設定政策,然後嘗試執行政策應禁止的操作。

建立限制

  1. 將下列檔案儲存為 constraint-deny-project-iam-admin。

    name: organizations/ORG_ID/customConstraints/custom.denyProjectIAMAdmin
    resourceTypes: iam.googleapis.com/AllowPolicy
    methodTypes:
      - CREATE
      - UPDATE
    condition:
      "resource.bindings.exists(
        binding,
        RoleNameMatches(binding.role, ['roles/resourcemanager.projectIamAdmin']) &&
        binding.members.exists(member,
          MemberSubjectMatches(member, ['user:EMAIL_ADDRESS'])
        )
      )"
    actionType: DENY
    displayName: Do not allow EMAIL_ADDRESS to be granted the Project IAM Admin role.
    

    替換下列值:

    • ORG_ID:Google Cloud 組織的數字 ID。
    • MEMBER_EMAIL_ADDRESS:要用來測試自訂限制的主體電子郵件地址。限制生效期間,您無法在強制執行限制的專案中,將專案 IAM 管理員角色 (roles/resourcemanager.projectIamAdmin) 授予這個主體。
  2. 套用限制:

    gcloud org-policies set-custom-constraint ~/constraint-deny-project-iam-admin.yaml
    
  3. 確認限制是否存在:

    gcloud org-policies list-custom-constraints --organization=ORGANIZATION_ID
    

建立政策

  1. 將下列檔案儲存為 policy-deny-project-iam-admin.yaml:

    name: projects/PROJECT_ID/policies/custom.denyProjectIamAdmin
    spec:
      rules:
      - enforce: true
    

    將 PROJECT_ID 替換為專案 ID。

  2. 套用政策:

    gcloud org-policies set-policy ~/policy-deny-project-iam-admin.yaml
    
  3. 確認政策是否存在:

    gcloud org-policies list --project=PROJECT_ID
    

套用政策後,請等待約兩分鐘, Google Cloud 就會開始強制執行政策。

測試政策

請嘗試將專案 IAM 管理員角色 (roles/resourcemanager.projectIamAdmin) 授予您在自訂限制中加入電子郵件地址的主體。執行指令前,請先替換下列值:

  • PROJECT_ID:強制執行限制的 Google Cloud專案 ID
  • EMAIL_ADDRESS:建立組織政策限制時指定的主體電子郵件地址。
gcloud projects add-iam-policy-binding PROJECT_ID \
    --member=user:EMAIL_ADDRESS --role=roles/resourcemanager.projectIamAdmin

輸出內容如下:

Operation denied by custom org policies: ["customConstraints/custom.denyProjectIAMAdmin": "EMAIL_ADDRESS can't be granted the Project IAM Admin role."]

常見用途的自訂組織政策範例

下表提供常見用途的一些自訂限制語法。

以下範例使用 CEL 巨集 all 和 exists。如要進一步瞭解這些巨集,請參閱「評估清單的巨集」。

說明 限制語法
禁止授予特定角色。
name: organizations/ORG_ID/customConstraints/custom.denyRole
resourceTypes: iam.googleapis.com/AllowPolicy
methodTypes:
  - CREATE
  - UPDATE
condition:
"resource.bindings.exists(
    binding,
    RoleNameMatches(binding.role, ['ROLE'])
  )"
actionType: DENY
displayName: Do not allow the ROLE role to be granted
僅允許授予特定角色。
name: organizations/ORG_ID/customConstraints/custom.specificRolesOnly
resourceTypes: iam.googleapis.com/AllowPolicy
methodTypes:
  - CREATE
  - UPDATE
condition:
  "resource.bindings.all(
    binding,
    RoleNameMatches(binding.role, ['ROLE_1', 'ROLE_2'])
  )"
actionType: ALLOW
displayName: Only allow the ROLE_1 role and ROLE_2 role to be granted
禁止授予任何開頭為 roles/storage. 的角色。
name: organizations/ORG_ID/customConstraints/custom.dontgrantStorageRoles
resourceTypes: iam.googleapis.com/AllowPolicy
methodTypes:
  - CREATE
  - UPDATE
condition:
  "resource.bindings.exists(
    binding,
    RoleNameStartsWith(binding.role, ['roles/storage.'])
  )"
actionType: DENY
displayName: Prevent roles that start with "roles/storage." from being granted
防止撤銷名稱中含有 admin 的任何角色。
name: organizations/ORG_ID/customConstraints/custom.dontRevokeAdminRoles
resourceTypes: iam.googleapis.com/AllowPolicy
methodTypes:
  - REMOVE_GRANT
condition:
  "resource.bindings.exists(
    binding,
    RoleNameContains(binding.role, ['admin'])
  )"
actionType: DENY
displayName: Prevent roles with "admin" in their names from being revoked
僅允許將角色授予特定主體。
name: organizations/ORG_ID/customConstraints/custom.allowSpecificPrincipals
resourceTypes: iam.googleapis.com/AllowPolicy
methodTypes:
  - CREATE
  - UPDATE
condition:
  "resource.bindings.all(
    binding,
    binding.members.all(member,
      MemberSubjectMatches(member, ['user:USER','serviceAccount:SERVICE_ACCOUNT'])
    )
  )"
actionType: ALLOW
displayName: Only allow roles to be granted to USER and SERVICE_ACCOUNT
防止特定主體的任何角色遭到撤銷。
name: organizations/ORG_ID/customConstraints/custom.denyRemovalOfSpecificPrincipals
resourceTypes: iam.googleapis.com/AllowPolicy
methodTypes:
  - REMOVE_GRANT
condition:
  "resource.bindings.exists(
    binding,
    binding.members.exists(member,
      MemberSubjectMatches(member, ['user:USER_1','user:USER_2'])
    )
  )"
actionType: DENY
displayName: Do not allow roles to be revoked from USER_1 or USER_2
禁止將角色授予電子郵件地址結尾為 @gmail.com 的主體。
name: organizations/ORG_ID/customConstraints/custom.dontGrantToGmail
resourceTypes: iam.googleapis.com/AllowPolicy
methodTypes:
  - CREATE
  - UPDATE
condition:
  "resource.bindings.exists(
    binding,
    binding.members.exists(member,
      MemberSubjectEndsWith(member, ['@gmail.com'])
    )
  )"
actionType: DENY
displayName: Do not allow members whose email addresses end with "@gmail.com" to be granted roles
只允許將特定角色授予特定主體。
name: organizations/ORG_ID/customConstraints/custom.allowSpecificRolesAndPrincipals
resourceTypes: iam.googleapis.com/AllowPolicy
methodTypes:
  - CREATE
  - UPDATE
condition:
  "resource.bindings.all(
    binding,
    RoleNameMatches(binding.role, ['ROLE_1', 'ROLE_2'])  &&
    binding.members.all(member,
      MemberSubjectMatches(member, ['serviceAccount:SERVICE_ACCOUNT', 'group:GROUP'])
    )
  )"
actionType: ALLOW
displayName: Only allow ROLE_1 and ROLE_2 to be granted to SERVICE_ACCOUNT and GROUP
禁止將 Cloud Storage 角色授予 allUsers 和 allAuthenticatedUsers。
name: organizations/ORG_ID/customConstraints/custom.denyStorageRolesForPrincipalAllUsers
resourceTypes: iam.googleapis.com/AllowPolicy
methodTypes:
  - CREATE
  - UPDATE
condition:
  "resource.bindings.exists(
    binding,
    RoleNameStartsWith(binding.role, ['roles/storage.']) &&
    binding.members.exists(member,
      MemberSubjectMatches(member, ['allUsers', 'allAuthenticatedUsers'])
    )
  )"
actionType: DENY
displayName: Do not allow storage roles to be granted to allUsers or allAuthenticatedUsers
防止機構外部的任何身分獲派角色。
name: organizations/ORG_ID/customConstraints/custom.allowInternaldentitiesOnly
resourceTypes: iam.googleapis.com/AllowPolicy
methodTypes:
  - CREATE
  - UPDATE
condition:
  "resource.bindings.all(
    binding,
    binding.members.all(member,
      MemberInPrincipalSet(member, ['//cloudresourcemanager.googleapis.com/organizations/ORG_ID'])
    )
  )"
actionType: ALLOW
displayName: Only allow organization members to be granted roles
僅允許將角色授予服務帳戶。
name: organizations/ORG_ID/customConstraints/custom.allowServiceAccountsOnly
resourceTypes: iam.googleapis.com/AllowPolicy
methodTypes:
  - CREATE
  - UPDATE
condition:
  "resource.bindings.all(
    binding,
    binding.members.all(member,
      MemberTypeMatches(member, ['iam.googleapis.com/ServiceAccount'])
    )
  )"
actionType: ALLOW
displayName: Only allow service accounts to be granted roles
防止從角色繫結中移除 Google 代管服務代理。
name: organizations/ORG_ID/customConstraints/custom.denyRemovalOfGoogleManagedServiceAgents
resource_types: iam.googleapis.com/AllowPolicy
method_types:
  - REMOVE_GRANT
condition: |-
  resource.bindings.all(
      binding,
      binding.members.all(member,
        MemberTypeMatches(member, ['iam.googleapis.com/ServiceAgent'])
      )
    )
action_type: DENY
display_name: Deny Removal Of Google-Managed Service Agents
description: Restricts the removal of Google-managed service agents from role bindings. Please reach out to your organization admins for if you have any questions.

條件式組織政策

您可以使用標記,為自訂組織政策設定條件。舉例來說,假設您編寫了下列自訂限制,禁止授予任何開頭為 roles/storage. 的角色:

name: organizations/ORG_ID/customConstraints/custom.dontgrantStorageRoles
resourceTypes: iam.googleapis.com/AllowPolicy
methodTypes:
  - CREATE
  - UPDATE
condition:
  "resource.bindings.exists(
    binding,
    RoleNameStartsWith(binding.role, ['roles/storage.'])
  )"
actionType: DENY
displayName: Prevent roles that start with "roles/storage." from being granted

如要依條件強制執行限制,您可以建立如下的組織政策:

name: organizations/ORG_ID/policies/custom.dontgrantStorageRoles
spec:
  rules:
  - condition:
      expression: "resource.matchTag('ORG_ID/environment', 'dev')"
    enforce: true
  - enforce: false

這項組織政策會禁止將開頭為 roles/storage. 的角色,授予任何同時具有 environment=dev 標記的資源。

後續步驟