使用自訂機構政策的允許政策

本頁說明如何使用 Organization Policy Service 自訂限制,限制對下列 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. In the Google Cloud console, go to the project selector page.

      Go to project selector

    2. Select or create a Google Cloud project.

必要的角色

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

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

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

所需權限

如要管理組織政策,您必須具備下列權限:

  • orgpolicy.* 機構
  • 測試本頁面所述的機構政策: resourcemanager.projects.setIamPolicy 專案

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

建立自訂限制

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

如要建立自訂限制,請使用下列格式建立 YAML 檔案:

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. 開頭,且只能包含大寫英文字母、小寫英文字母或數字。例如,custom.denyProjectIAMAdmin。這個欄位的長度上限為 70 個字元。

  • RESOURCE_NAME:包含要限制物件和欄位的Google Cloud 資源完整名稱。例如:iam.googleapis.com/AllowPolicy

  • CONDITION:針對支援服務資源的代表項目編寫的 CEL 條件。這個欄位的長度上限為 1000 個字元。如要進一步瞭解可編寫條件的資源,請參閱「支援的資源」。例如:resource.bindings.exists(binding, RoleNameMatches(binding.role, ['roles/resourcemanager.projectIamAdmin']))

  • ACTION:如果符合 condition,應採取的動作。可能的值為 ALLOWDENY

  • DISPLAY_NAME:限制條件的易記名稱。這個欄位的長度上限為 200 個字元。

  • DESCRIPTION:違反政策時,要以錯誤訊息形式顯示的限制說明。這個欄位的長度上限為 2000 個字元。

如要進一步瞭解如何建立自訂限制,請參閱「定義自訂限制」。

設定自訂限制

為新的自訂限制建立 YAML 檔案後,您必須進行設定,才能在貴機構的機構政策中使用該檔案。如要設定自訂限制,請使用 gcloud org-policies set-custom-constraint 指令:
gcloud org-policies set-custom-constraint CONSTRAINT_PATH
CONSTRAINT_PATH 替換為自訂限制檔案的完整路徑。例如:/home/user/customconstraint.yaml。 完成後,自訂限制就會顯示在 Google Cloud 機構政策清單中,做為機構政策使用。如要確認自訂限制存在,請使用 gcloud org-policies list-custom-constraints 指令:
gcloud org-policies list-custom-constraints --organization=ORGANIZATION_ID
ORGANIZATION_ID 替換為機構資源的 ID。 詳情請參閱「查看機構政策」。

強制執行自訂機構政策

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

控制台

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

    前往「機構政策」

  2. 在專案選擇工具中,選取要設定機構政策的專案。
  3. 在「Organization policies」(機構政策) 頁面上的清單中選取限制條件,即可查看該限制條件的「Policy details」(政策詳情) 頁面。
  4. 如要設定這項資源的機構政策,請按一下「管理政策」
  5. 在「編輯政策」頁面中,選取「覆寫上層政策」
  6. 按一下「新增規則」
  7. 在「Enforcement」(強制執行) 區段中,選取是否要強制執行這項機構政策。
  8. 選用:如要根據標記設定機構政策條件,請按一下「新增條件」。請注意,如果為組織政策新增條件式規則,您必須至少新增一項無條件規則,否則無法儲存政策。詳情請參閱「使用標記設定組織政策」。
  9. 按一下「測試變更」,模擬機構政策的影響。舊版受管理限制不支援政策模擬。詳情請參閱「 使用 Policy Simulator 測試組織政策變更」。
  10. 如要完成並套用機構政策,請按一下「設定政策」。這項政策最多需要 15 分鐘才會生效。

gcloud

如要建立含有布林值規則的機構政策,請建立參照限制的政策 YAML 檔案:

      name: projects/PROJECT_ID/policies/CONSTRAINT_NAME
      spec:
        rules:
        - enforce: true
    

取代下列項目:

  • PROJECT_ID:要強制執行限制的專案。
  • CONSTRAINT_NAME:您為自訂限制定義的名稱。例如:custom.denyProjectIAMAdmin

如要強制執行包含限制的機構政策,請執行下列指令:

    gcloud org-policies set-policy POLICY_PATH
    

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:您強制執行限制的專案 ID Google Cloud
  • 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 巨集 allexists。如要進一步瞭解這些巨集,請參閱「巨集來評估清單」。

說明 限制語法
禁止授予特定角色。
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 角色授予 allUsersallAuthenticatedUsers
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

這項機構政策會禁止在含有 environment=dev 標記的任何資源上,授予以 roles/storage. 開頭的角色。

身分與存取權管理支援的資源

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

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

{
  "bindings": {
    BINDINGS
  }
}

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

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

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

您只能使用支援的函式評估 resource.bindings 屬性和其欄位。系統不支援其他運算子和函式,例如 ==!=incontainsstartsWithendsWith

支援的函式

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

如要評估 bindings 陣列中的所有繫結,或 members 陣列中的所有成員,請使用 allexists 巨集。詳情請參閱本頁面的「巨集來評估清單」。

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

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

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

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

如果指定 binding 中的 roleroles/storage.adminroles/compute.admin,則傳回 true

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

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

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

如果指定 binding 中的 roleroles/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:要比對的成員名稱清單。
範例

如果成員 memberrosario@example.com: true

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

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

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

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

如果成員 memberuser: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 相關聯的所有網域中的所有身分
  • 貴機構中的所有員工身分集區
  • 組織中任何專案的所有服務帳戶和工作負載身分池
  • 與貴機構資源相關聯的所有服務代理程式
範例

如果成員 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/WorkspacePrincipaliam.googleapis.com/WorkspaceGroup,則傳回 true

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

評估清單的巨集

使用 allexists 巨集評估項目清單的條件運算式。

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

如果 conditionExpression每個 item 的評估結果為 true,就會傳回 truelist

這個巨集通常用於自訂機構政策,並搭配 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

如果 conditionExpression任何 item 的評估結果為 true,則傳回 truelist

這個巨集通常用於自訂機構政策,搭配 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 工作負載身分集區中的單一身分 principal://iam.googleapis.com/projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/POOL_ID/subject/SUBJECT_ATTRIBUTE_VALUE
iam.googleapis.com/WorkloadPoolPrincipalSet 主體組合,內含工作負載身分集區中的一組身分。舉例來說,主體組合包含工作負載身分集區中的所有主體。
  • 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 主體 allUsersallAuthenticatedUsers
  • 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。

後續步驟