このページでは、組織のポリシー サービスのカスタム制約を使用して、次の Google Cloud リソースに対する特定のオペレーションを制限する方法について説明します。
iam.googleapis.com/AllowPolicy
組織のポリシーの詳細については、カスタムの組織のポリシーをご覧ください。
組織のポリシーと制約について
Google Cloud 組織のポリシー サービスを使用すると、組織のリソースをプログラマティックに一元管理できます。組織のポリシー管理者は組織のポリシーを定義できます。組織のポリシーは、Google Cloud リソース階層内のGoogle Cloud リソースやそれらのリソースの子孫に適用される、制約と呼ばれる一連の制限です。組織のポリシーは、組織レベル、フォルダレベル、またはプロジェクト レベルで適用できます。
組織のポリシーを利用することで、あらかじめ用意されたマネージド制約をさまざまな Google Cloud サービスに適用できます。ただし、組織のポリシーで制限されている特定の項目をより細かくカスタマイズして制御したい場合は、カスタム制約を作成して、それを組織のポリシーで使うこともできます。
ポリシーの継承
デフォルトでは、組織のポリシーは、そのポリシーを適用したリソースの子孫に継承されます。たとえば、フォルダにポリシーを適用した場合、 Google Cloud はそのフォルダ内のすべてのプロジェクトにそのポリシーを適用します。この動作の詳細と変更方法については、階層評価ルールをご覧ください。
利点
IAM 属性を参照するカスタムの組織のポリシーを使用して、許可ポリシーの変更方法を制御できます。具体的には、以下を制御できます。
- ロールを付与できるユーザー
- ロールを取り消すことができるユーザー
- 付与できるロール
- 取り消し可能なロール
たとえば、メールアドレスの末尾が @gmail.com のプリンシパルに、admin という単語を含むロールが付与されないようにできます。
制限事項
IAM 属性を参照するドライラン モードのカスタム組織のポリシーには、いくつかの制限があります。たとえば、
setIamPolicyメソッドに関連する違反の監査ログに、次のフィールドがない場合があります。resourceNameserviceNamemethodName
IAM 関連のカスタム組織のポリシー違反に対して、監査ログは生成されません。つまり、カスタム組織ポリシーが原因で組織リソースに対する
setIamPolicyオペレーションが失敗した場合、Google Cloud はそのイベントの監査ログを生成しません。IAM 属性を参照するカスタム組織ポリシーは、以下には影響しません。
- Cloud Storage ACL によるデフォルトの付与。
- Cloud Storage のコンビニエンス値と BigQuery のデフォルト データセットへのアクセスに対するロールの自動付与。
- デフォルトの許可ポリシーによって付与されるロール。たとえば、プロジェクト作成者にプロジェクトに対するオーナーロール(
roles/owner)が自動的に付与される場合などです。
オーナーロール(
roles/owner)の付与を禁止するカスタム組織のポリシーが設定されている場合でも、ユーザーにオーナーになるための招待状を送信できます。ただし、カスタム組織のポリシーは招待状の送信を妨げませんが、招待されたユーザーにオーナーロールを付与することはできません。招待されたユーザーが招待を承諾しようとすると、エラーが発生し、オーナーロールは付与されません。Google Cloudの一部のアクション(リソースの作成や API の有効化など)では、サービス エージェントまたはデフォルトのサービス アカウントにロールが自動的に付与されます。アクションにロールの自動付与が含まれ、組織のポリシーによってそのロールを付与できない場合、オペレーション全体が失敗することがあります。
この問題が発生した場合は、タグを使用して、ロールの付与を妨げる制約を一時的に無効にできます。次に、アクションを実行します。アクションが完了したら、制約を再度有効にします。
始める前に
-
IAM リソースを参照するカスタム組織のポリシーをテストする場合は、新しいプロジェクトを作成します。これらの組織のポリシーを既存のプロジェクトでテストすると、セキュリティ ワークフローが中断される可能性があります。
-
In the Google Cloud console, go to the project selector page.
-
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 theresourcemanager.projects.createpermission. Learn how to grant roles.
-
必要なロール
組織のポリシーを管理するために必要な権限を取得するには、次の IAM ロールを付与するように管理者に依頼してください。
-
組織に対する組織のポリシー管理者(
roles/orgpolicy.policyAdmin) - このページで説明する組織のポリシーをテストする: プロジェクトに対するプロジェクト IAM 管理者(
roles/resourcemanager.projectIamAdmin)
ロールの付与については、プロジェクト、フォルダ、組織へのアクセスを管理するをご覧ください。
これらの事前定義ロールには、組織のポリシーの管理に必要な権限が含まれています。必要とされる正確な権限については、「必要な権限」セクションを開いてご確認ください。
必要な権限
組織のポリシーを管理するには、次の権限が必要です。
- 組織に対する
orgpolicy.* -
このページで説明する組織のポリシーをテストします。プロジェクトに対する
resourcemanager.projects.setIamPolicy
カスタムロールや他の事前定義ロールを使用して、これらの権限を取得することもできます。
カスタム制約を設定する
カスタム制約は、組織のポリシーを適用しているサービスでサポートされるリソース、メソッド、条件、アクションを使用して YAML ファイルで定義されます。カスタム制約の条件は、Common Expression Language(CEL)を使用して定義されます。CEL を使用してカスタム制約で条件を作成する方法については、カスタム制約の作成と管理の CEL セクションをご覧ください。
コンソール
カスタム制約を作成する方法は次のとおりです。
- Google Cloud コンソールで [組織のポリシー] ページに移動します。
- プロジェクト選択ツールで、組織のポリシーを設定するプロジェクトを選択します。
- [カスタム制約] をクリックします。
- [表示名] ボックスに、制約の名前を人が読める形式で入力します。この名前はエラー メッセージで使用されるほか、識別やデバッグにも使用できます。エラー メッセージで公開される可能性があるため、表示名に個人情報(PII)や機密データを使用しないでください。このフィールドには、最大 200 文字まで入力できます。
-
[制約 ID] ボックスに、新しいカスタム制約の名前を入力します。カスタム制約の名前には、英字(大文字と小文字)または数字のみを使用できます(例:
custom.disableGkeAutoUpgrade)。このフィールドには、接頭辞(custom.)を除き、最大 70 文字まで入力できます(例:organizations/123456789/customConstraints/custom)。エラー メッセージで公開される可能性があるため、制約 ID に個人情報(PII)や機密データを含めないでください。 - [説明] ボックスに、制約の説明を人が読める形式で入力します。この説明は、ポリシー違反の際にエラー メッセージとして使用されます。ポリシー違反が発生した理由と、ポリシー違反を解決する方法に関する詳細を含めてください。エラー メッセージで公開される可能性があるため、説明に個人情報(PII)や機密データを含めないでください。このフィールドには、最大 2,000 文字まで入力できます。
-
[リソースの種類] ボックスで、制限するオブジェクトとフィールドを含む Google Cloud REST リソースの名前を選択します(例:
container.googleapis.com/NodePool)。ほとんどの種類のリソースは、最大 20 個のカスタム制約をサポートしています。これより多くのカスタム制約を作成しようとすると、オペレーションは失敗します。 - [適用方法] で、REST CREATE メソッドに制約を適用するか、CREATE メソッドと UPDATE メソッドの両方に制約を適用するかを選択します。制約に違反するリソースに対する UPDATE メソッドに制約を適用した場合、そのリソースへの変更は、違反を解決するものでない限り、組織のポリシーによってブロックされます。
- 条件を定義するには、 [条件を編集] をクリックします。
-
[条件を追加] パネルで、サポートされているサービス リソースを参照する CEL 条件を作成します(例:
resource.management.autoUpgrade == false)。このフィールドには、最大 1,000 文字まで入力できます。CEL の使用方法の詳細については、Common Expression Language をご覧ください。カスタム制約で使用できるサービス リソースの詳細については、カスタム制約のサポート サービスをご覧ください。 - [保存] をクリックします。
- [アクション] で、条件が満たされた場合に評価対象のメソッドを許可するか拒否するかを選択します。
- [制約を作成] をクリックします。
すべての Google Cloud サービスで両方のメソッドがサポートされているわけではありません。各サービスでサポートされているメソッドを確認するには、サポートされているサービスで対象のサービスを検索してください。
拒否アクションは、条件が true と評価された場合に、リソースを作成または更新するオペレーションがブロックされることを意味します。
許可アクションは、条件が true と評価された場合にのみ、リソースを作成または更新するオペレーションが許可されることを意味します。条件に明記されているケースを除き、他のケースはすべてブロックされます。
各フィールドに値を入力すると、このカスタム制約に対応する YAML 構成が右側に表示されます。
gcloud
- カスタム制約を作成するには、次の形式で YAML ファイルを作成します。
-
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が満たされた場合に実行するアクション。有効な値はALLOWとDENYです。 -
DISPLAY_NAME: 制約の名前。わかりやすい名前を入力してください。このフィールドには、最大 200 文字まで入力できます。 -
DESCRIPTION: ポリシー違反の際にエラー メッセージとして表示される制約の説明。わかりやすい説明を入力してください。このフィールドには、最大 2,000 文字まで入力できます。 -
新しいカスタム制約の YAML ファイルを作成したら、組織内の組織のポリシーで使用できるように設定する必要があります。カスタム制約を設定するには、
gcloud org-policies set-custom-constraintコマンドを使用します。 -
カスタム制約が存在することを確認するには、
gcloud org-policies list-custom-constraintsコマンドを使用します。
name: organizations/ORGANIZATION_ID/customConstraints/CONSTRAINT_NAME resourceTypes: - RESOURCE_NAME methodTypes: - CREATE
- UPDATE condition: "CONDITION" actionType: ACTION displayName: DISPLAY_NAME description: DESCRIPTION
次のように置き換えます。
条件の書き込み先として使用できるリソースの詳細については、サポートされているリソースをご覧ください。
許可アクションは、条件が true と評価された場合に、リソースを作成または更新するオペレーションが許可されることを意味します。つまり、条件に明記されているケースを除き、他のケースはすべてブロックされます。
拒否アクションは、条件が true と評価された場合に、リソースを作成または更新するオペレーションがブロックされることを意味します。
gcloud org-policies set-custom-constraint CONSTRAINT_PATH
CONSTRAINT_PATH は、カスタム制約ファイルのフルパスに置き換えます。例: /home/user/customconstraint.yaml。
このオペレーションが完了すると、指定したカスタム制約が Google Cloud 組織のポリシーのリストに表示され、組織のポリシーとして使用できるようになります。
gcloud org-policies list-custom-constraints --organization=ORGANIZATION_ID
ORGANIZATION_ID は組織リソースの ID に置き換えます。
詳細については、組織のポリシーの表示をご覧ください。
カスタムの組織のポリシーを適用する
制約を適用するには、それを参照する組織のポリシーを作成し、その組織のポリシーを Google Cloud リソースに適用します。コンソール
- Google Cloud コンソールで [組織のポリシー] ページに移動します。
- プロジェクト選択ツールで、組織のポリシーを設定するプロジェクトを選択します。
- [組織のポリシー] ページのリストで制約を選択して、その制約の [ポリシーの詳細] ページを表示します。
- このリソースの組織のポリシーを構成するには、[ポリシーを管理] をクリックします。
- [ポリシーの編集] ページで、[Override parent's policy] を選択します。
- [ルールを追加] をクリックします。
- [適用] セクションで、この組織のポリシーを適用するかどうかを選択します。
- 省略可: タグで組織のポリシーに条件を設定するには、[条件を追加] をクリックします。組織のポリシーに条件付きルールを追加する場合は、少なくとも 1 つは無条件のルールを追加する必要があります。そうしないとポリシーを保存できないのでご注意ください。詳細については、タグを使用した組織のポリシーの設定をご覧ください。
- [変更内容をテスト] をクリックして、組織のポリシーの効果をシミュレートします。詳細については、Policy Simulator で組織のポリシーの変更をテストするをご覧ください。
- ドライラン モードで組織のポリシーを適用するには、[ドライラン ポリシーを設定] をクリックします。詳細については、ドライラン モードで組織のポリシーを作成するをご覧ください。
- ドライラン モードで組織のポリシーが想定どおりに動作することを確認したら、[ポリシーを設定] をクリックして有効なポリシーを設定します。
gcloud
- ブール値のルールを含む組織のポリシーを作成するには、制約を参照するポリシーの YAML ファイルを作成します。
-
PROJECT_ID: 制約を適用するプロジェクト。 -
CONSTRAINT_NAME: カスタム制約に定義した名前。例:custom.denyProjectIAMAdmin。 -
ドライラン モードで組織のポリシーを適用するには、
dryRunSpecフラグを指定して次のコマンドを実行します。 -
ドライラン モードで組織のポリシーが想定どおりに動作することを確認したら、
org-policies set-policyコマンドとspecフラグを使用して有効なポリシーを設定します。
name: projects/PROJECT_ID/policies/CONSTRAINT_NAME spec: rules: - enforce: true dryRunSpec: rules: - enforce: true
次のように置き換えます。
gcloud org-policies set-policy POLICY_PATH \ --update-mask=dryRunSpec
POLICY_PATH は、組織のポリシーの YAML ファイルのフルパスに置き換えます。ポリシーが有効になるまでに最大 15 分かかります。
gcloud org-policies set-policy POLICY_PATH \ --update-mask=spec
POLICY_PATH は、組織のポリシーの YAML ファイルのフルパスに置き換えます。ポリシーが有効になるまでに最大 15 分かかります。
カスタムの組織のポリシーをテストする
必要に応じて、ポリシーを設定し、ポリシーで禁止されているアクションを試行して、組織のポリシーをテストできます。
制約を作成する
次のファイルに
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)を付与できません。
制約を適用します。
gcloud org-policies set-custom-constraint ~/constraint-deny-project-iam-admin.yaml制約が存在することを確認します。
gcloud org-policies list-custom-constraints --organization=ORGANIZATION_ID
ポリシーを作成する
次のファイルに
policy-deny-project-iam-admin.yamlという名前を付けて保存します。name: projects/PROJECT_ID/policies/custom.denyProjectIamAdmin spec: rules: - enforce: truePROJECT_IDは、実際のプロジェクト ID に置き換えます。ポリシーを適用します。
gcloud org-policies set-policy ~/policy-deny-project-iam-admin.yamlポリシーが存在することを確認します。
gcloud org-policies list --project=PROJECT_ID
ポリシーを適用したら、 Google Cloud がポリシーの適用を開始するまで 2 分ほど待ちます。
ポリシーのテスト
カスタム制約にメールアドレスが含まれているプリンシパルに、プロジェクト IAM 管理者ロール(roles/resourcemanager.projectIamAdmin)を付与してみてください。コマンドを実行する前に、次の値を置き換えます。
PROJECT_ID: 制約を適用した Google Cloudプロジェクトの IDEMAIL_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 |
| 組織外の 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. |
条件付き組織のポリシー
タグを使用して、カスタムの組織のポリシーを条件付きにできます。たとえば、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 属性とそのフィールドを評価できるのは、サポートされている関数を使用する場合のみです。他の演算子や関数(==、!=、in、contains、startsWith、endsWith など)はサポートされていません。
サポートされる関数
次の CEL 関数を使用して、バインディング内の個々のロールとメンバーを評価できます。
bindings 配列内のすべてのバインディングまたは members 配列内のすべてのメンバーを評価するには、all マクロと exists マクロを使用します。詳細については、このページのリストを評価するマクロをご覧ください。
論理演算子 &&(and)と ||(or)を使用して、マルチパート条件を記述することもできます。
| 関数 | 説明 |
|---|---|
RoleNameMatches(
bool
|
ロール
|
RoleNameStartsWith(
bool
|
ロール
|
RoleNameEndsWith(
bool
|
ロール
|
RoleNameContains(
bool
|
ロール
|
MemberSubjectMatches(
bool
|
メンバー
|
MemberSubjectStartsWith(
bool
|
メンバー
|
MemberSubjectEndsWith(
bool
|
メンバー
|
MemberInPrincipalSet(
bool
|
メンバーがリスト内のプリンシパル セットの少なくとも 1 つに属している場合、
|
MemberTypeMatches(
bool
|
メンバーがリストに記載されているプリンシパル タイプのいずれかである場合は、
|
リストを評価するマクロ
all マクロと exists マクロを使用して、項目のリストに対して条件式を評価します。
| マクロ | 説明 |
|---|---|
list.all(
bool
|
このマクロは通常、
|
list.exists(
bool
|
このマクロは通常、
|
ネストされたリストを使用した条件
通常、条件にネストされたリストが含まれている場合は、条件内のすべてのリストに同じマクロを使用する必要があります。
以下の例を考えてみましょう。
- ポリシーに
actionTypeALLOWがある場合は、membersリストとbindingsリストの両方でallマクロを使用して、変更されたすべてのバインディングのすべてのメンバーが条件を満たしている場合にのみポリシーの変更が許可されるようにします。 - ポリシーに
actionTypeDENYがある場合は、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/ |
一般ユーザー向け Google アカウント。通常、これらのアカウントのメールアドレスは gmail.com で終わります。 |
user:USER_EMAIL_ADDRESS |
iam.googleapis.com/ |
Cloud Identity アカウントまたは Google Workspace アカウントに含まれる Google アカウント。これらのアカウントは、管理対象ユーザー アカウントとも呼ばれます。 | user:USER_EMAIL_ADDRESS |
iam.googleapis.com/ |
一般ユーザーの Google アカウントによって作成された Google グループ。これらのグループは、Cloud Identity アカウントまたは Google Workspace アカウントによって所有されていません。通常、これらのグループのメールアドレスは googlegroups.com で終わります。 |
group:GROUP_EMAIL_ADDRESS |
iam.googleapis.com/ |
Cloud Identity アカウントまたは Google Workspace アカウントが所有する Google グループ。 | group:GROUP_EMAIL_ADDRESS |
iam.googleapis.com/ |
Cloud Identity アカウントまたは Google Workspace アカウント。 | domain:DOMAIN |
iam.googleapis.com/ |
Workforce Identity プール内の単一のプリンシパル。 | principal://iam.googleapis.com/ |
iam.googleapis.com/ |
Workforce Identity プール内の一連の ID を含むプリンシパル セット。たとえば、Workforce Identity プール内のすべてのプリンシパルを含むプリンシパル セット。 |
|
iam.googleapis.com/ |
Workload Identity プール内の単一の ID | principal://iam.googleapis.com/projects/ |
iam.googleapis.com/ |
Workload Identity プール内の一連の ID を含むプリンシパル セット。たとえば、Workload Identity プール内のすべてのプリンシパルを含むプリンシパル セット。 |
|
iam.googleapis.com/ |
任意のサービス アカウント。サービス アカウントは、人間のユーザーではなくワークロードを表す特別なタイプのアカウントです。
|
serviceAccount:SERVICE_ACCOUNT_EMAIL_ADDRESS |
iam.googleapis.com/ |
任意のサービス エージェント。サービス エージェントは、 Google Cloud が作成および管理する特別なタイプのサービス アカウントです。プロジェクトでロールが付与されると、サービス エージェントは Google Cloud サービスがユーザーに代わってアクションを実行できるようにします。 | serviceAccount:SERVICE_AGENT_EMAIL_ADDRESS |
iam.googleapis.com/ |
プリンシパル allUsers と allAuthenticatedUsers。 |
|
iam.googleapis.com/ |
付与されたロールに基づいて定義されるプリンシパル。これらのプリンシパルは、コンビニエンス値とも呼ばれます。 |
|
iam.googleapis.com/ |
組み込み ID を持つリソース。 | 単一リソースのプリンシパル ID に記載されているプリンシパル ID のいずれか。 |
iam.googleapis.com/ |
タイプや祖先など、特定の特性を持つ組み込み ID を持つリソース。 | リソースセットのプリンシパル ID に記載されているいずれかの ID。 |
次のステップ
- 組織のポリシー サービスについて詳細を学習する。
- 組織のポリシーの作成と管理の方法について学習する。
- マネージドの組織のポリシーの制約全一覧を参照する。