Google Cloud の組織のポリシーを使用すると、組織のリソースをプログラムで一元管理できます。組織のポリシー管理者は組織のポリシーを定義できます。組織のポリシーは、Google Cloud のリソース階層内の Google Cloud リソースやそれらのリソースの子孫に適用される、制約と呼ばれる一連の制限です。組織のポリシーは、組織レベル、フォルダレベル、またはプロジェクト レベルで適用できます。
組織のポリシーは、さまざまな Google Cloud サービスに事前に定義された制約を提供します。ただし、組織のポリシーで制限されている特定のフィールドをカスタマイズ可能な方法でより詳細に制御する必要がある場合は、カスタムの組織のポリシーを作成することもできます。
利点
IAM 属性を参照するカスタムの組織のポリシーを使用して、許可ポリシーの変更方法を制御できます。具体的には、以下を制御できます。
- ロールを付与できるユーザー
- ロールを取り消すことができるユーザー
- 付与できるロール
- 取り消し可能なロール
たとえば、メールアドレスの末尾が @gmail.com
のプリンシパルに、admin
という単語を含むロールが付与されないようにできます。
ポリシーの継承
デフォルトでは、組織のポリシーは、そのポリシーを適用したリソースの子孫に継承されます。たとえば、フォルダにポリシーを適用した場合、そのフォルダ内のすべてのプロジェクトにそのポリシーが適用されます。この動作の詳細と変更方法については、階層評価ルールをご覧ください。
料金
事前定義の組織のポリシーやカスタムの組織のポリシーを含む組織のポリシー サービスは料金なしで利用できます。
制限事項
IAM 属性を参照するドライラン モードのカスタム組織のポリシーには、いくつかの制限があります。たとえば、setiamPolicy
メソッドに関連する違反の監査ログに、次のフィールドがない場合があります。
resourceName
serviceName
methodName
始める前に
- 組織 ID を把握していることを確認します。
-
IAM リソースを参照するカスタム組織のポリシーをテストする場合は、新しいプロジェクトを作成します。これらの組織のポリシーを既存のプロジェクトでテストすると、セキュリティ ワークフローが中断される可能性があります。
-
In the Google Cloud console, go to the project selector page.
-
Select or create a Google Cloud project.
-
必要なロール
組織のポリシーの管理に必要な権限を取得するため、次の IAM ロールを付与するように管理者に依頼してください。
-
組織に対する組織のポリシー管理者(
roles/orgpolicy.policyAdmin
) -
プロジェクトの IAM ポリシーを変更する: プロジェクトに対するプロジェクト IAM 管理者(
roles/resourcemanager.projectIamAdmin
)
ロールの付与については、プロジェクト、フォルダ、組織へのアクセス権の管理をご覧ください。
これらの事前定義ロールには、組織のポリシーの管理に必要な権限が含まれています。必要とされる正確な権限については、「必要な権限」セクションを開いてご確認ください。
必要な権限
組織のポリシーを管理するには、次の権限が必要です。
-
orgpolicy.constraints.list
-
orgpolicy.policies.create
-
orgpolicy.policies.delete
-
orgpolicy.policies.list
-
orgpolicy.policies.update
-
orgpolicy.policy.get
-
orgpolicy.policy.set
-
resourcemanager.projects.setIamPolicy
カスタムロールや他の事前定義ロールを使用して、これらの権限を取得することもできます。
カスタム制約を作成する
カスタム制約は、組織のポリシーを適用しているサービスでサポートされるリソース、メソッド、条件、アクションを使用して YAML ファイルで定義されます。カスタム制約の条件は、Common Expression Language(CEL)を使用して定義されます。CEL を使用してカスタム制約で条件を作成する方法については、カスタム制約の作成と管理の CEL セクションをご覧ください。
カスタム制約の YAML ファイルを作成するには:
name: organizations/ORG_ID/customConstraints/CONSTRAINT_NAME
resourceTypes: iam.googleapis.com/AllowPolicy
methodTypes:
METHOD_TYPE
condition: "CONDITION"
actionType: ACTION
displayName: DISPLAY_NAME
description: DESCRIPTION
次のように置き換えます。
ORG_ID
: 組織 ID(123456789
など)。CONSTRAINT_NAME
: 新しいカスタム制約に付ける名前。カスタム制約はcustom.
で始まる必要があり、大文字、小文字、数字のみを含めることができます(例:custom.denyProjectIAMAdmin
)。このフィールドの最大長は 70 文字です。接頭辞はカウントされません(例:organizations/123456789/customConstraints/custom
)。METHOD_TYPE
: 制約を適用するアクションのタイプ。プリンシパルにロールを付与する際の制約を適用する場合は、次の値を使用します。- CREATE - UPDATE
プリンシパルのロールを取り消す際に制約を適用する場合は、次の値を使用します。
- REMOVE_GRANT
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 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 リソースに適用します。コンソール
- Google Cloud コンソールで、[組織のポリシー] ページに移動します。
- プロジェクト選択ツールから、組織のポリシーを設定するプロジェクトを選択します。
- [組織のポリシー] ページのリストで制約を選択して、その制約の [ポリシーの詳細] ページを表示します。
- このリソースの組織のポリシーを構成するには、[ポリシーを管理] をクリックします。
- [ポリシーの編集] ページで、[Override parent's policy] を選択します。
- [ルールを追加] をクリックします。
- [適用] セクションで、この組織のポリシーの適用を有効にするかどうかを選択します。
- タグで組織のポリシーに条件を設定するには、[条件を追加] をクリックします。組織のポリシーに条件付きルールを追加する場合は、少なくとも 1 つは無条件のルールを追加する必要があります。そうしないとポリシーを保存できないのでご注意ください。詳細については、タグを使用した組織のポリシーの設定をご覧ください。
- カスタム制約の場合は、[変更内容をテスト] をクリックして、組織のポリシーの効果をシミュレートできます。詳細については、Policy Simulator で組織のポリシーの変更をテストするをご覧ください。
- 組織のポリシーを完成させて適用するには、[ポリシーを設定] をクリックします。ポリシーが有効になるまでに最大 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 分かかります。
カスタム組織のポリシーをテストする
必要に応じて、ポリシーを設定し、ポリシーで禁止されているアクションを試行して、組織のポリシーをテストできます。
このセクションでは、次の組織のポリシーの制約をテストする方法について説明します。
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.
このカスタム制約をテストするには、次の操作を行います。
制約を YAML ファイルにコピーし、次の値を置き換えます。
ORG_ID
: Google Cloud 組織の数値 ID。MEMBER_EMAIL_ADDRESS
: カスタム制約のテストに使用するプリンシパルのメールアドレス。制約が有効な間、このプリンシパルには、制約を適用するプロジェクトに対するプロジェクト IAM 管理者ロール(roles/resourcemanager.projectIamAdmin
)を付与できません。
カスタム制約にメールアドレスが含まれているプリンシパルに、プロジェクト 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."]
Identity and Access Management でサポートされている属性
IAM は 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 関数を使用して、binding
リソースの role
フィールドと members
フィールドを評価できます。これらの関数を使用する場合、論理演算子 &&
(and
)と ||
(or
)を使用してマルチパート条件を記述することもできます。
関数 | 説明 |
---|---|
RoleNameMatches(
bool
|
ロール
|
RoleNameStartsWith(
bool
|
ロール
|
RoleNameEndsWith(
bool
|
ロール
|
RoleNameContains(
bool
|
ロール
|
MemberSubjectMatches(
bool
|
メンバー
|
MemberSubjectEndsWith(
bool
|
メンバー
|
一般的なユースケースのカスタム組織ポリシーの例
次の表に、実際に役に立つ可能性のあるカスタム組織ポリシーの構文を示します。
次の例では、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 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 |
次のステップ
- 組織のポリシーの詳細について、組織のポリシー サービスの概要を確認する。
- 組織のポリシーの作成と管理の方法について学習する。
- 事前定義された組織のポリシーの制約の完全なリストを確認する。