許可ポリシーにカスタム組織ポリシーを使用する

このページでは、組織のポリシー サービスのカスタム制約を使用して、次の Google Cloud リソースに対する特定のオペレーションを制限する方法について説明します。

  • iam.googleapis.com/AllowPolicy

組織のポリシーの詳細については、カスタムの組織のポリシーをご覧ください。

組織のポリシーと制約について

Google Cloud 組織のポリシー サービスを使用すると、組織のリソースをプログラマティックに一元管理できます。組織のポリシー管理者は組織のポリシーを定義できます。組織のポリシーは、Google Cloud リソース階層内のGoogle Cloud リソースやそれらのリソースの子孫に適用される、制約と呼ばれる一連の制限です。組織のポリシーは、組織レベル、フォルダレベル、またはプロジェクト レベルで適用できます。

組織のポリシーは、さまざまな Google Cloud サービスに事前に定義された制約を提供します。ただし、組織のポリシーで制限されている特定のフィールドをカスタマイズ可能な方法でよりきめ細かく制御する必要がある場合は、カスタム制約を作成して、組織のポリシーでそれらのカスタム制約を使用することもできます。

ポリシーの継承

デフォルトでは、組織のポリシーは、そのポリシーを適用したリソースの子孫に継承されます。たとえば、フォルダにポリシーを適用した場合、 Google Cloud はそのフォルダ内のすべてのプロジェクトにそのポリシーを適用します。この動作の詳細と変更方法については、階層評価ルールをご覧ください。

利点

IAM 属性を参照するカスタムの組織のポリシーを使用して、許可ポリシーの変更方法を制御できます。具体的には、以下を制御できます。

  • ロールを付与できるユーザー
  • ロールを取り消すことができるユーザー
  • 付与できるロール
  • 取り消し可能なロール

たとえば、メールアドレスの末尾が @gmail.com のプリンシパルに、admin という単語を含むロールが付与されないようにできます。

制限事項

  • 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 ファイルで定義されます。カスタム制約の条件は、Common Expression Language(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 条件。このフィールドの最大長は 1,000 文字です。条件の書き込み先として使用できるリソースの詳細については、サポート対象のリソースをご覧ください。例: resource.bindings.exists(binding, RoleNameMatches(binding.role, ['roles/resourcemanager.projectIamAdmin']))

  • ACTION: condition が満たされている場合に実行するアクション。有効な値は ALLOWDENY です。

  • DISPLAY_NAME: 制約の名前。わかりやすい名前を入力してください。このフィールドの最大長は 200 文字です。

  • DESCRIPTION: ポリシー違反時にエラー メッセージとして表示される制約の説明。わかりやすい説明を入力してください。このフィールドの最大長は 2,000 文字です。

カスタム制約の作成方法については、カスタム制約の定義をご覧ください。

カスタム制約を設定する

新しいカスタム制約の 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 コンソールで、[組織のポリシー] ページに移動します。

    [組織のポリシー] に移動

  2. プロジェクト選択ツールで、組織のポリシーを設定するプロジェクトを選択します。
  3. [組織のポリシー] ページのリストで制約を選択して、その制約の [ポリシーの詳細] ページを表示します。
  4. このリソースの組織のポリシーを構成するには、[ポリシーを管理] をクリックします。
  5. [ポリシーの編集] ページで、[Override parent's policy] を選択します。
  6. [ルールを追加] をクリックします。
  7. [適用] セクションで、この組織のポリシーの適用を有効にするかどうかを選択します。
  8. 省略可: タグで組織のポリシーに条件を設定するには、[条件を追加] をクリックします。組織のポリシーに条件付きルールを追加する場合は、少なくとも 1 つは無条件のルールを追加する必要があります。そうしないとポリシーを保存できないのでご注意ください。詳細については、タグ付きの組織のポリシーの設定をご覧ください。
  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 がポリシーの適用を開始するまで 2 分ほど待ちます。

ポリシーのテスト

カスタム制約にメールアドレスが含まれているプリンシパルに、プロジェクト 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 マクロ 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
組織外の ID にロールが付与されないようにします。
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.

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 配列内のすべてのメンバーを評価するには、all マクロと exists マクロを使用します。詳細については、このページのリストを評価するマクロをご覧ください。

論理演算子 &&and)と ||or)を使用して、マルチパート条件を記述することもできます。

関数 説明
RoleNameMatches(
  role,
  roleNames: list
)
  bool

ロール role が、roleNames にあるロールの少なくとも 1 つと完全に一致する場合、true を返します。

パラメータ
role: 評価するロール。
roleNames: 照合するロール名のリスト。

指定された bindingroleroles/storage.admin または roles/compute.admin の場合、true を返します。

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

ロール role が、rolePrefixes にある文字列の少なくとも 1 つで始まる場合、true を返します。

パラメータ
role: 評価するロール。
rolePrefixes: ロールの先頭と照合する文字列のリスト。

指定された bindingroleroles/storage で始まる場合に true を返します。

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

ロール roleroleSuffixes にある文字列の少なくとも 1 つで終わる場合、true を返します。

パラメータ
role: 評価するロール。
roleSuffixes: ロールの末尾と照合する文字列のリスト。

指定された bindingrole.admin で終わる場合、true を返します。

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

ロール role に、roleSubstrings にある文字列が 1 つ以上含まれている場合、true を返します。

パラメータ
role: 評価するロール。
roleSubstrings: ロールの任意の部分に一致する文字列のリスト。

指定された bindingrole に文字列 admin が含まれている場合は、true を返します。

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

メンバー member が、memberNames にあるメンバーの少なくとも 1 つと完全に一致する場合、true を返します。

member の ID がメールアドレスの場合、この関数はそのメールアドレスのみを評価します。メールアドレスのエイリアスは評価しません。

パラメータ
member: 評価するメンバー。
memberNames: 照合するメンバー名のリスト。

メンバー memberrosario@example.com の場合は true を返します。

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

メンバー member が、memberPrefixes にある文字列の少なくとも 1 つで始まる場合、true を返します。

member の ID がメールアドレスの場合、この関数はそのメールアドレスのみを評価します。メールアドレスのエイリアスは評価しません。

パラメータ
member: 評価するメンバー。
memberPrefixes: メンバー名の先頭と照合する文字列のリスト。

メンバー memberuser:prod- で始まる場合、true を返します。

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

メンバー member が、memberSuffixes にある文字列の少なくとも 1 つで終わる場合、true を返します。

member の ID がメールアドレスの場合、この関数はそのメールアドレスのみを評価します。メールアドレスのエイリアスは評価しません。

パラメータ
member: 評価するメンバー。
memberSuffixes: メンバー名の末尾と照合する文字列のリスト。

メンバー member@example.com で終わる場合、true を返します。

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

メンバーがリスト内のプリンシパル セットの少なくとも 1 つに属している場合、true を返します。

パラメータ
member: 評価するメンバー。

principalSets: プリンシパル セットのリスト。関数が true と評価されるようにするには、メンバーがこれらのプリンシパル セットの少なくとも 1 つに含まれている必要があります。

サポートされているプリンシパル セットは、//cloudresourcemanager.googleapis.com/organizations/ORGANIZATION_ID 形式の組織プリンシパル セットのみです。MemberInPrincipalSet 関数で使用する場合、このプリンシパル セットには次のプリンシパルが含まれます。

  • Google Workspace のお客様 ID に関連付けられているすべてのドメイン内のすべての ID
  • 組織内のすべての Workforce Identity プール
  • 組織内の任意のプロジェクト内のすべてのサービス アカウントと Workload Identity プール
  • 組織のリソースに関連付けられているすべてのサービス エージェント

メンバー 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 に対して conditionExpressiontrue と評価される場合は、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 に対して conditionExpressiontrue と評価された場合、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 マクロを使用して、変更された任意のバインディングの任意のメンバーが条件を満たしている場合、ポリシーの変更が許可されないようにします。

1 つの条件でマクロを混在させると、意図したとおりに動作しない条件になる可能性があります。

たとえば、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 組織外のユーザーにもロールを付与できます。

たとえば、次のバインディング セットでは、メンバーの 1 人が 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 も一覧表示されます。これらの識別子は、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 Workforce Identity プール内の単一のプリンシパル。 principal://iam.googleapis.com/locations/global/workforcePools/POOL_ID/subject/SUBJECT_ATTRIBUTE_VALUE
iam.googleapis.com/WorkforcePoolPrincipalSet Workforce Identity プール内の一連の ID を含むプリンシパル セット。たとえば、Workforce Identity プール内のすべてのプリンシパルを含むプリンシパル セット。
  • 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 プール内の単一の ID principal://iam.googleapis.com/projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/POOL_ID/subject/SUBJECT_ATTRIBUTE_VALUE
iam.googleapis.com/WorkloadPoolPrincipalSet Workload Identity プール内の一連の ID を含むプリンシパル セット。たとえば、Workload Identity プール内のすべてのプリンシパルを含むプリンシパル セット。
  • 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 に記載されているプリンシパル ID のいずれか。
iam.googleapis.com/ResourcePrincipalSet タイプや祖先など、特定の特性を持つ組み込み ID を持つリソース。 リソースセットのプリンシパル ID に記載されているいずれかの ID。

次のステップ