このページでは、組織のポリシー サービスのカスタム制約を使用して、次の Cloud de Confiance by S3NS リソースに対する特定のオペレーションを制限する方法について説明します。
gkebackup.googleapis.com/BackupPlangkebackup.googleapis.com/Backupgkebackup.googleapis.com/RestorePlangkebackup.googleapis.com/Restore
組織のポリシーの詳細については、カスタムの組織のポリシーをご覧ください。
組織のポリシーと制約について
Cloud de Confiance 組織のポリシー サービスを使用すると、組織のリソースをプログラマティックに一元管理できます。組織のポリシー管理者は組織のポリシーを定義できます。組織のポリシーは、Cloud de Confiance by S3NS リソース階層内のCloud de Confiance リソースやそれらのリソースの子孫に適用される、制約と呼ばれる一連の制限です。組織のポリシーは、組織レベル、フォルダレベル、またはプロジェクト レベルで適用できます。
組織のポリシーを利用することで、あらかじめ用意されたマネージド制約をさまざまな Cloud de Confiance サービスに適用できます。ただし、組織のポリシーで制限されている特定の項目をより細かくカスタマイズして制御したい場合は、カスタム制約を作成して、それを組織のポリシーで使うこともできます。
ポリシーの継承
デフォルトでは、組織のポリシーは、そのポリシーを適用したリソースの子孫に継承されます。たとえば、フォルダにポリシーを適用した場合、 Cloud de Confiance はそのフォルダ内のすべてのプロジェクトにそのポリシーを適用します。この動作の詳細と変更方法については、階層評価ルールをご覧ください。
始める前に
-
In the Cloud de Confiance console, on the project selector page, select or create a Cloud de Confiance 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.
-
Verify that billing is enabled for your Cloud de Confiance project.
-
Google Cloud CLI をインストールします。
-
フェデレーション ID(連携 ID)を使用するように gcloud CLI を構成します。
詳細については、連携 ID を使用して gcloud CLI にログインするをご覧ください。
-
gcloud CLI を初期化するには、次のコマンドを実行します。
gcloud init - 組織 ID を確認します。
必要なロール
カスタムの組織のポリシーを管理するために必要な権限を取得するには、組織のリソースに対する組織ポリシー管理者(`roles/orgpolicy.policyAdmin`)の IAM ロールを付与するよう管理者に依頼してください。ロールの付与については、プロジェクト、フォルダ、組織へのアクセス権の管理をご覧ください。
必要な権限は、カスタムロールや他の事前定義ロールから取得することもできます。
Backup for GKE でサポートされているリソース
次の表に示すのは、カスタム制約で参照できる Backup for GKE リソースです。| リソース | フィールド |
|---|---|
| gkebackup.googleapis.com/Backup |
resource.deleteLockDays
|
resource.description
| |
resource.retainDays
| |
| gkebackup.googleapis.com/BackupPlan |
resource.backupConfig.allNamespaces
|
resource.backupConfig.encryptionKey.gcpKmsEncryptionKey
| |
resource.backupConfig.includeSecrets
| |
resource.backupConfig.includeVolumeData
| |
resource.backupConfig.permissiveMode
| |
resource.backupConfig.selectedApplications.namespacedNames.name
| |
resource.backupConfig.selectedApplications.namespacedNames.namespace
| |
resource.backupConfig.selectedNamespaces.namespaces
| |
resource.backupSchedule.cronSchedule
| |
resource.backupSchedule.paused
| |
resource.backupSchedule.rpoConfig.exclusionWindows.daily
| |
resource.backupSchedule.rpoConfig.exclusionWindows.daysOfWeek.daysOfWeek
| |
resource.backupSchedule.rpoConfig.exclusionWindows.duration
| |
resource.backupSchedule.rpoConfig.targetRpoMinutes
| |
resource.cluster
| |
resource.deactivated
| |
resource.description
| |
resource.retentionPolicy.backupDeleteLockDays
| |
resource.retentionPolicy.backupRetainDays
| |
resource.retentionPolicy.locked
| |
| gkebackup.googleapis.com/Restore |
resource.backup
|
resource.description
| |
resource.filter.exclusionFilters.groupKind.resourceGroup
| |
resource.filter.exclusionFilters.groupKind.resourceKind
| |
resource.filter.exclusionFilters.name
| |
resource.filter.exclusionFilters.namespace
| |
resource.filter.inclusionFilters.groupKind.resourceGroup
| |
resource.filter.inclusionFilters.groupKind.resourceKind
| |
resource.filter.inclusionFilters.name
| |
resource.filter.inclusionFilters.namespace
| |
resource.volumeDataRestorePolicyOverrides.policy
| |
resource.volumeDataRestorePolicyOverrides.selectedPvcs.namespacedNames.name
| |
resource.volumeDataRestorePolicyOverrides.selectedPvcs.namespacedNames.namespace
| |
| gkebackup.googleapis.com/RestorePlan |
resource.backupPlan
|
resource.cluster
| |
resource.description
| |
resource.restoreConfig.allNamespaces
| |
resource.restoreConfig.clusterResourceConflictPolicy
| |
resource.restoreConfig.clusterResourceRestoreScope.allGroupKinds
| |
resource.restoreConfig.clusterResourceRestoreScope.excludedGroupKinds.resourceGroup
| |
resource.restoreConfig.clusterResourceRestoreScope.excludedGroupKinds.resourceKind
| |
resource.restoreConfig.clusterResourceRestoreScope.noGroupKinds
| |
resource.restoreConfig.clusterResourceRestoreScope.selectedGroupKinds.resourceGroup
| |
resource.restoreConfig.clusterResourceRestoreScope.selectedGroupKinds.resourceKind
| |
resource.restoreConfig.excludedNamespaces.namespaces
| |
resource.restoreConfig.namespacedResourceRestoreMode
| |
resource.restoreConfig.noNamespaces
| |
resource.restoreConfig.restoreOrder.groupKindDependencies.requiring.resourceGroup
| |
resource.restoreConfig.restoreOrder.groupKindDependencies.requiring.resourceKind
| |
resource.restoreConfig.restoreOrder.groupKindDependencies.satisfying.resourceGroup
| |
resource.restoreConfig.restoreOrder.groupKindDependencies.satisfying.resourceKind
| |
resource.restoreConfig.selectedApplications.namespacedNames.name
| |
resource.restoreConfig.selectedApplications.namespacedNames.namespace
| |
resource.restoreConfig.selectedNamespaces.namespaces
| |
resource.restoreConfig.substitutionRules.newValue
| |
resource.restoreConfig.substitutionRules.originalValuePattern
| |
resource.restoreConfig.substitutionRules.targetGroupKinds.resourceGroup
| |
resource.restoreConfig.substitutionRules.targetGroupKinds.resourceKind
| |
resource.restoreConfig.substitutionRules.targetJsonPath
| |
resource.restoreConfig.substitutionRules.targetNamespaces
| |
resource.restoreConfig.transformationRules.description
| |
resource.restoreConfig.transformationRules.fieldActions.fromPath
| |
resource.restoreConfig.transformationRules.fieldActions.op
| |
resource.restoreConfig.transformationRules.fieldActions.path
| |
resource.restoreConfig.transformationRules.fieldActions.value
| |
resource.restoreConfig.transformationRules.resourceFilter.groupKinds.resourceGroup
| |
resource.restoreConfig.transformationRules.resourceFilter.groupKinds.resourceKind
| |
resource.restoreConfig.transformationRules.resourceFilter.jsonPath
| |
resource.restoreConfig.transformationRules.resourceFilter.namespaces
| |
resource.restoreConfig.volumeDataRestorePolicy
| |
resource.restoreConfig.volumeDataRestorePolicyBindings.policy
| |
resource.restoreConfig.volumeDataRestorePolicyBindings.volumeType
|
カスタム制約を設定する
カスタム制約は、組織のポリシーを適用しているサービスでサポートされるリソース、メソッド、条件、アクションを使用して YAML ファイルで定義されます。カスタム制約の条件は、Common Expression Language(CEL)を使用して定義されます。CEL を使用してカスタム制約で条件を作成する方法については、カスタム制約の作成と管理の CEL セクションをご覧ください。
コンソール
カスタム制約を作成する手順は次のとおりです。
- Cloud de Confiance コンソールで [組織のポリシー] ページに移動します。
- プロジェクト選択ツールで、組織のポリシーを設定するプロジェクトを選択します。
- [ カスタム制約] をクリックします。
- [表示名] ボックスに、人が読める形式で制約の名前を入力します。この名前はエラー メッセージで使用されるほか、識別やデバッグにも使用できます。エラー メッセージで公開される可能性があるため、表示名に個人を特定できる情報(PII)や機密データを使用しないでください。このフィールドには、最大 200 文字まで入力できます。
-
[制約 ID] ボックスに、新しいカスタム制約の ID を入力します。カスタム制約の名前に使用できるのは、英字(大文字と小文字)と数字のみです(例:
custom.retentionPolicyEnforced)。このフィールドには、接頭辞(custom.)を除き、最大 70 文字まで入力できます(例:organizations/123456789/customConstraints/custom)。エラー メッセージで公開される可能性があるため、制約 ID に個人情報(PII)や機密データを含めないでください。 - [説明] ボックスに、人が読める形式で制約の説明を入力します。この説明は、ポリシー違反の際にエラー メッセージとして使用されます。ポリシー違反が発生した理由と、ポリシー違反を解決する方法に関する詳細を含めてください。エラー メッセージで公開される可能性があるため、説明に個人情報(PII)や機密データを含めないでください。 このフィールドには、最大 2,000 文字まで入力できます。
-
[リソースの種類] ボックスで、制限するオブジェクトとフィールドを含む Cloud de Confiance REST リソースの名前を選択します(例:
container.googleapis.com/NodePool)。ほとんどの種類のリソースは、最大 20 個のカスタム制約をサポートしています。これより多くのカスタム制約を作成しようとすると、オペレーションは失敗します。 -
[適用方法] で、REST
CREATEメソッドに制約を適用するか、CREATEメソッドとUPDATEメソッドの両方に制約を適用するかを選択します。制約に違反するリソースに対するUPDATEメソッドに制約を適用した場合、そのリソースへの変更は、違反を解決するものでない限り、組織のポリシーによってブロックされます。 - 条件を定義するには、[ 条件を編集] をクリックします。
-
[条件を追加] パネルで、サポートされているサービス リソースを参照する CEL 条件を作成します(例:
resource.management.autoUpgrade == false)。このフィールドには、最大 1,000 文字まで入力できます。CEL の使用方法の詳細については、Common Expression Language をご覧ください。 カスタム制約で使用できるサービス リソースの詳細については、カスタム制約のサポート サービスをご覧ください。 - [保存] をクリックします。
- [アクション] で、条件が満たされた場合に評価対象のメソッドを許可するか拒否するかを選択します。
- [制約を作成] をクリックします。
各サービスでサポートされているメソッドを確認するには、 カスタム制約をサポートするサービスをご覧ください。
拒否アクションは、条件が true と評価された場合に、リソースを作成または更新するオペレーションがブロックされることを意味します。
許可アクションは、条件が true と評価された場合にのみ、リソースを作成または更新するオペレーションが許可されることを意味します。条件に明記されているケースを除き、他のケースはすべてブロックされます。
各フィールドに値を入力すると、このカスタム制約に対応する YAML 構成が右側に表示されます。
gcloud
- カスタム制約を作成するには、次の形式で YAML ファイルを作成します。
-
ORGANIZATION_ID: 組織 ID(例:123456789)。 -
CONSTRAINT_NAME: 新しいカスタム制約の名前。カスタム制約の名前に使用できるのは、英字(大文字と小文字)と数字のみです(例:custom.retentionPolicyEnforced)。このフィールドには、接頭辞(custom.)を除き、最大 70 文字まで入力できます(例:organizations/123456789/customConstraints/custom)。エラー メッセージで公開される可能性があるため、制約 ID に個人情報(PII)や機密データを含めないでください。 -
RESOURCE_NAME: 制限するオブジェクトとフィールドを含む Cloud de Confianceリソースの完全修飾名。たとえば、gkebackup.googleapis.com/Backupのようにします。ほとんどの種類のリソースは、最大 20 個のカスタム制約をサポートしています。これより多くのカスタム制約を作成しようとすると、オペレーションは失敗します。 -
methodTypes: 制約が適用される REST メソッド。CREATE、またはCREATEとUPDATEの両方。制約に違反するリソースに対するUPDATEメソッドに制約を適用した場合、そのリソースへの変更は、違反を解決するものでない限り、組織のポリシーによってブロックされます。 -
CONDITION: サポート対象のサービス リソースの表現に対して記述する CEL 条件。このフィールドには、最大 1,000 文字まで入力できます。例:"resource.retainDays > 30"。 -
ACTION:conditionが満たされた場合に実行するアクション。 有効な値はALLOWとDENYです。 -
DISPLAY_NAME: 制約の名前。わかりやすい名前を入力してください。この名前はエラー メッセージで使用されるほか、識別やデバッグにも使用できます。エラー メッセージで公開される可能性があるため、表示名に個人情報(PII)や機密データを使用しないでください。このフィールドには、最大 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。
この操作が完了すると、カスタム制約が Cloud de Confiance by S3NS の組織ポリシーのリストに表示され、組織のポリシーとして使用できるようになります。
gcloud org-policies list-custom-constraints --organization=ORGANIZATION_ID
ORGANIZATION_ID は組織リソースの ID に置き換えます。
詳細については、組織のポリシーの表示をご覧ください。
カスタムの組織のポリシーを適用する
制約を適用するには、それを参照する組織のポリシーを作成し、その組織のポリシーを Cloud de Confiance by S3NS リソースに適用します。コンソール
- Cloud de Confiance コンソールで [組織のポリシー] ページに移動します。
- プロジェクト選択ツールで、組織のポリシーを設定するプロジェクトを選択します。
- [組織のポリシー] ページのリストで制約を選択して、その制約の [ポリシーの詳細] ページを表示します。
- このリソースの組織のポリシーを構成するには、[ポリシーを管理] をクリックします。
- [ポリシーの編集] ページで、[Override parent's policy] を選択します。
- [ルールを追加] をクリックします。
- [適用] セクションで、この組織のポリシーを適用するかどうかを選択します。
- 省略可: タグで組織のポリシーに条件を設定するには、[条件を追加] をクリックします。組織のポリシーに条件付きルールを追加する場合は、少なくとも 1 つは無条件のルールを追加する必要があります。そうしないとポリシーを保存できないのでご注意ください。詳細については、 タグを使用して組織のポリシーのスコープを設定するをご覧ください。
- [変更内容をテスト] をクリックして、組織のポリシーの効果をシミュレートします。詳細については、Policy Simulator で組織のポリシーの変更をテストするをご覧ください。
- ドライラン モードで組織のポリシーを適用するには、[ドライラン ポリシーを設定] をクリックします。詳細については、 組織のポリシーをテストするをご覧ください。
- ドライラン モードで組織のポリシーが想定どおりに動作することを確認したら、[ポリシーを設定] をクリックして有効なポリシーを設定します。
gcloud
- ブール値のルールを含む組織のポリシーを作成するには、制約を参照するポリシーの YAML ファイルを作成します。
-
PROJECT_ID: 制約を適用するプロジェクト。 -
CONSTRAINT_NAME: カスタム制約に定義した名前。例:custom.retentionPolicyEnforced。 -
ドライラン モードで組織のポリシーを適用するには、
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 分かかります。
カスタム組織のポリシーをテストする
次の手順では、retainDays フィールドが 30 より大きい値に設定されている場合に、ユーザーが Backup for GKE バックアップを作成できるようにするカスタムの制約とポリシーを作成する方法について説明します。
始める前に、次の準備をします。
- 組織の ID
- プロジェクト ID
制約を作成する
次のファイルに
CONSTRAINT_FILE_NAME.yamlという名前を付けて保存します。name: organizations/ORGANIZATION_ID/customConstraints/custom.retentionPolicyEnforced resourceTypes: - gkebackup.googleapis.com/Backup methodTypes: - CREATE condition: "resource.retainDays > 30" actionType: ALLOW displayName: Enforce retention policy description: Enforce backup creation with a retention policy greater than 30 days.ORGANIZATION_IDは、実際の組織 ID に置き換えます。このファイルでは、
CREATEメソッドでretainDaysフィールドが 30 より大きくなければならないという制約を定義しています。gcloud org-policies set-custom-constraintコマンドを使用して、制約を適用します。gcloud org-policies set-custom-constraint CONSTRAINT_FILE_NAME.yamlgcloud org-policies list-custom-constraintsコマンドを使用して、制約が存在することを確認します。gcloud org-policies list-custom-constraints --organization=ORGANIZATION_ID出力は次のようになります。
CUSTOM_CONSTRAINT ACTION_TYPE METHOD_TYPES RESOURCE_TYPES DISPLAY_NAME custom.retentionPolicyEnforced DENY CREATE,UPDATE gkebackup.googleapis.com/Backup Enforce retention policy ...
ポリシーを作成する
次のファイルに
POLICY_FILE_NAME.yamlという名前を付けて保存します。name: projects/PROJECT_ID/policies/custom.retentionPolicyEnforced spec: rules: - enforce: truePROJECT_IDは、実際のプロジェクト ID に置き換えます。gcloud org-policies set-policyコマンドを使用して、ポリシーを適用します。gcloud org-policies set-policy POLICY_FILE_NAME.yamlgcloud org-policies listコマンドを使用して、ポリシーが存在することを確認します。gcloud org-policies list --project=PROJECT_ID出力は次のようになります。
CONSTRAINT LIST_POLICY BOOLEAN_POLICY ETAG custom.retentionPolicyEnforced - SET CPiLkMMGEKDFq6IB-
ポリシーを適用したら、 Cloud de Confiance がポリシーの適用を開始するまで 2 分ほど待ちます。
ポリシーをテストする
retainDaysフィールドを30より大きい値に設定せずにバックアップを作成します。gcloud beta container backup-restore backups create test-backup --backup-plan=test-backup-plan --location=us-central1出力は次のようになります。
ERROR: (gcloud.beta.container.backup-restore.backups.create) FAILED_PRECONDITION: Operation denied by org policy on resource 'pprojects/test-project/locations/us-central1/backupPlans/autopilot-cluster-1-backup-1/backups/test-backup-1': ["customConstraints/custom.retentionPolicyEnforced": "Enforce backup creation with a retention policy greater than 30 days."]. - '@type': type.googleapis.com/google.rpc.DebugInfo detail: "generic::failed_precondition: Operation denied by org policy on resource\ \ 'projects/test-project/locations/us-central1/backupPlans/autopilot-cluster-1-backup-1/backups/test-backup-1':\ \ [\"customConstraints/custom.retentionPolicyEnforced\": \"Enforce backup creation with a retention \ \ policy greater than 30 days.\"]." . . . - '@type': type.googleapis.com/google.rpc.DebugInfo - '@type': type.googleapis.com/google.rpc.ErrorInfo domain: gkebackup.googleapis.com metadata: customConstraints: customConstraints/custom.backupRetainDays resource: projects/test-project/locations/us-central1/backupPlans/autopilot-cluster-1-backup-1/backups/test-backup-1 reason: CUSTOM_ORG_POLICY_VIOLATION
一般的なユースケースのカスタム組織ポリシーの例
次の表に示すのは、実際に役に立つ可能性のあるカスタム組織のポリシーです。
| 説明 | 制約の構文 |
|---|---|
| 保持期間が 20 日を超える場合にのみバックアップの作成を許可する |
name: organizations/ORGANIZATION_ID/customConstraints/custom.retainDaysLimit resourceTypes: - gkebackup.googleapis.com/Backup methodTypes: - CREATE - UPDATE condition: resource.retainDays > 20 actionType: ALLOW displayName: Minimum Backup Retention period description: Minimum Backup Retention period of 20 days is required |
| 意図した cronSchedule と異なるバックアップ プランの作成を無効にする |
name: organizations/ORGANIZATION_ID/customConstraints/custom.disableInvalidScheduleBackupPlan resourceTypes: - gkebackup.googleapis.com/BackupPlan methodTypes: - CREATE - UPDATE condition: resource.backupSchedule.cronSchedule != "5 20 * * *" actionType: DENY displayName: Backup plan cron schedule constraint description: Deny Backup plan creation or update if cron schedule is not set to 5 20 * * *. |
次のステップ
- 組織のポリシー サービスについて詳細を学習する。
- 組織のポリシーの作成と管理の方法について学習する。
- マネージドの組織のポリシーの制約全一覧を参照する。