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

本頁面說明如何使用組織政策服務自訂限制,限制對下列 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.

      Roles required to select or create a project

      • Select a project: Selecting a project doesn't require a specific IAM role—you can select any project that you've been granted a role on.
      • Create a project: To create a project, you need the Project Creator role (roles/resourcemanager.projectCreator), which contains the resourcemanager.projects.create permission. Learn how to grant roles.

必要的角色

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

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

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

所需權限

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

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

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

設定自訂限制

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

控制台

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

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

    前往組織政策

  2. 在專案選擇工具中,選取要設定組織政策的專案。
  3. 按一下「自訂限制」
  4. 在「顯示名稱」方塊中,輸入容易理解的限制名稱。這個名稱會顯示在錯誤訊息中,可用於識別和偵錯。請勿在顯示名稱中使用 PII 或機密資料,因為錯誤訊息可能會顯示這類名稱。這個欄位最多可包含 200 個半形字元。
  5. 在「Constraint ID」(限制 ID) 方塊中,輸入新自訂限制的名稱。自訂限制只能包含字母 (包括大寫和小寫) 或數字,例如 custom.disableGkeAutoUpgrade。這個欄位最多可包含 70 個字元,前置字元 (custom.) 不計入,例如 organizations/123456789/customConstraints/custom。請勿在限制 ID 中輸入 PII 或機密資料,因為錯誤訊息可能會顯示上述資訊。
  6. 在「說明」方塊中,輸入使用者可理解的限制說明。違反政策時,系統會顯示這項說明做為錯誤訊息。請提供違反政策的詳細原因,以及如何解決問題。請勿在說明中輸入 PII 或機密資料,因為錯誤訊息可能會顯示上述資訊。這個欄位最多可輸入 2000 個字元。
  7. 在「Resource type」方塊中,選取包含要限制物件和欄位的 Google Cloud REST 資源名稱,例如 container.googleapis.com/NodePool。大多數資源類型最多支援 20 個自訂限制。如果嘗試建立更多自訂限制,作業會失敗。
  8. 在「強制執行方法」下方,選取要對 REST 「CREATE」方法強制執行限制,還是對「CREATE」和「UPDATE」方法都強制執行限制。如果您對違反限制的資源使用 UPDATE 方法強制執行限制,除非變更可解決違規問題,否則機構政策會封鎖對該資源的變更。
  9. 並非所有 Google Cloud 服務都支援這兩種方法。如要查看各項服務支援的方法,請在「 支援的服務」中找出該服務。

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

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

  13. 按一下「建立限制」
  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 個字元。
    • RESOURCE_NAME:內含您要限制的物件或欄位的 Google Cloud資源完整名稱,例如: iam.googleapis.com/AllowPolicy
    • CONDITION:針對支援服務資源表示法所撰寫的 CEL 條件。這個欄位最多可輸入 1,000 個半形字元。例如: resource.bindings.exists(binding, RoleNameMatches(binding.role, ['roles/resourcemanager.projectIamAdmin']))
    • 如要進一步瞭解可編寫條件的資源,請參閱「支援的資源」。

    • ACTION:符合 condition 時採取的動作。 可能的值為 ALLOWDENY
    • 如果條件評估結果為 true,表示允許執行建立或更新資源的作業。這也表示系統會封鎖條件中明確列出的情況以外的所有其他情況。

      如果條件評估結果為 true,系統會封鎖建立或更新資源的作業。

    • DISPLAY_NAME:限制的易記名稱。這個欄位最多可包含 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」(組織政策) 頁面。

    前往組織政策

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

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:您強制執行限制的專案 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. 開頭的角色。

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 屬性和其欄位。系統不支援其他運算子和函式,例如 ==!=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.comtrue

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

如果成員 member 開頭為 memberPrefixes 中列出的至少一個字串,則傳回 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 Workload Identity Pool 中的單一身分 principal://iam.googleapis.com/projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/POOL_ID/subject/SUBJECT_ATTRIBUTE_VALUE
iam.googleapis.com/WorkloadPoolPrincipalSet 主體組合,內含工作負載身分集區中的一組身分。舉例來說,主體組合包含 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 主體 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。

後續步驟