2.9. サードパーティーポリシーコントローラーの統合


サードパーティーポリシーを統合してポリシーテンプレート内にカスタムアノテーションを作成し、コンプライアンス標準、制御カテゴリー、制御を 1 つ以上指定します。

policy-collection/community からサードパーティーポリシーを使用することもできます。

以下のサードパーティーポリシーを統合する方法を説明します。

2.9.1. gatekeeper 制約および制約テンプレートの統合

gatekeeper は、Open Policy Agent (OPA) で実行されるカスタムリソース定義 (CRD) ベースのポリシーを適用する検証用の Webhook です。gatekeeper Operator ポリシーを使用して、クラスターに gatekeeper をインストールできます。gatekeeper ポリシーを使用して、Kubernetes リソースのコンプライアンスを評価できます。ポリシーエンジンとして OPA を活用し、ポリシー言語に Rego を使用できます。

前提条件: Gatekeeper をインストールし、Gatekeeper ポリシーをクラスターに適用するには、Red Hat Advanced Cluster Management for Kubernetes または Red Hat OpenShift Container Platform Plus サブスクリプションが必要です。Gatekeeper は、最新バージョンの Red Hat Advanced Cluster Management でサポートされるバージョン 3.11 を除く、OpenShift Container Platform のバージョンでのみサポートされます。

gatekeeper ポリシーは、Kubernetes 設定ポリシーとして Red Hat Advanced Cluster Management に作成されます。gatekeeper ポリシーには、制約テンプレート (ConstraintTemplates) と Constraints、監査テンプレート、および受付テンプレートが含まれます。詳細は、Gatekeeper upstream repository を参照してください。

Red Hat Advanced Cluster Management では、Gatekeeper バージョン 3.3.0 をサポートし、Red Hat Advanced Cluster Management gatekeeper ポリシーで以下の制約テンプレートを適用します。

  • ConstraintTemplates と制約: policy-gatekeeper-k8srequiredlabels を使用して、マネージドクラスターで gatekeeper 制約テンプレートを作成します。

    apiVersion: policy.open-cluster-management.io/v1
    kind: ConfigurationPolicy
    metadata:
      name: policy-gatekeeper-k8srequiredlabels
    spec:
      remediationAction: enforce # will be overridden by remediationAction in parent policy
      severity: low
      object-templates:
        - complianceType: musthave
          objectDefinition:
            apiVersion: templates.gatekeeper.sh/v1beta1
            kind: ConstraintTemplate
            metadata:
              name: k8srequiredlabels
            spec:
              crd:
                spec:
                  names:
                    kind: K8sRequiredLabels
                  validation:
                    # Schema for the `parameters` field
                    openAPIV3Schema:
                      properties:
                        labels:
                          type: array
                          items: string
              targets:
                - target: admission.k8s.gatekeeper.sh
                  rego: |
                    package k8srequiredlabels
                    violation[{"msg": msg, "details": {"missing_labels": missing}}] {
                      provided := {label | input.review.object.metadata.labels[label]}
                      required := {label | label := input.parameters.labels[_]}
                      missing := required - provided
                      count(missing) > 0
                      msg := sprintf("you must provide labels: %v", [missing])
                    }
        - complianceType: musthave
          objectDefinition:
            apiVersion: constraints.gatekeeper.sh/v1beta1
            kind: K8sRequiredLabels
            metadata:
              name: ns-must-have-gk
            spec:
              match:
                kinds:
                  - apiGroups: [""]
                    kinds: ["Namespace"]
                namespaces:
                  - e2etestsuccess
                  - e2etestfail
              parameters:
                labels: ["gatekeeper"]
  • 監査テンプレート: policy-gatekeeper-audit を使用して、既存の設定ミスを検出するために適用された gatekeeper ポリシーに対して、既存のリソースを定期的に確認して評価します。

    apiVersion: policy.open-cluster-management.io/v1
    kind: ConfigurationPolicy
    metadata:
      name: policy-gatekeeper-audit
    spec:
      remediationAction: inform # will be overridden by remediationAction in parent policy
      severity: low
      object-templates:
        - complianceType: musthave
          objectDefinition:
            apiVersion: constraints.gatekeeper.sh/v1beta1
            kind: K8sRequiredLabels
            metadata:
              name: ns-must-have-gk
            status:
              totalViolations: 0
  • 受付テンプレート: policy-gatekeeper-admission を使用して、gatekeeper 受付 Webhook により作成される設定ミスを確認します。

    apiVersion: policy.open-cluster-management.io/v1
    kind: ConfigurationPolicy
    metadata:
      name: policy-gatekeeper-admission
    spec:
      remediationAction: inform # will be overridden by remediationAction in parent policy
      severity: low
      object-templates:
        - complianceType: mustnothave
          objectDefinition:
            apiVersion: v1
            kind: Event
            metadata:
              namespace: openshift-gatekeeper-system # set it to the actual namespace where gatekeeper is running if different
              annotations:
                constraint_action: deny
                constraint_kind: K8sRequiredLabels
                constraint_name: ns-must-have-gk
                event_type: violation
  • 詳細は、policy-gatekeeper-sample.yaml を参照してください。
  • 詳細は、OPA ゲートキーパーとは を参照してください。
  • 他のポリシーの管理に関する詳細は、設定ポリシーの管理 を参照してください。

セキュリティーフレームワークに関する他のトピックについては、ガバナンス を参照してください。

2.9.2. ポリシージェネレーター

ポリシージェネレーターは、Kustomize を使用して Red Hat Advanced Cluster Management ポリシーを生成する Red Hat Advanced Cluster Management for Kubernetes アプリケーションライフサイクルサブスクリプション GitOps ワークフローの一部です。ポリシージェネレーターは、設定に使用される PolicyGenerator マニフェスト YAML ファイル提供の Kubernetes マニフェスト YAML ファイルから Red Hat Advanced Cluster Management ポリシーをビルドします。ポリシージェネレーターは、Kustomize ジェネレータープラグインとして実装されます。Kustomize の詳細は、Kustomize ドキュメント を参照してください。

このバージョンの Red Hat Advanced Cluster Management にバンドルされているポリシージェネレーターのバージョンは v1.10.0 です。詳細は、以下のトピックを参照してください。

2.9.2.1. ポリシージェネレーター機能

ポリシージェネレーターと Red Hat Advanced Cluster Management アプリケーションライフサイクルサブスクリプション GitOps ワークフローとの統合により、OpenShift Container Platform マネージドクラスターへの Kubernetes リソースオブジェクトの配布と、Red Hat Advanced Cluster Management ポリシーによる Kubernetes クラスターが簡素化されます。特に、ポリシージェネレーターを使用して以下のアクションを実行します。

  • Kustomize ディレクトリーから作成されたマニフェストを含む、任意の Kubernetes マニフェストファイルを Red Hat Advanced Cluster Management 設定ポリシーに変換します。
  • 生成された Red Hat Advanced Cluster Management ポリシーに挿入される前に、入力された Kubernetes マニフェストにパッチを適用します。
  • Red Hat Advanced Cluster Management for Kubernetes で、Gatekeeper ポリシー違反について報告できるように追加の設定ポリシーを生成します。
  • ハブクラスターでポリシーセットを生成します。

2.9.2.2. ポリシージェネレーターの設定構造

ポリシージェネレーターは、PolicyGenerator の種類および policy.open-cluster-management.io/v1 API バージョンのマニフェストで設定される Kustomize ジェネレータープラグインです。

プラグインを使用するには、まず、kustomization.yaml ファイルに generators セクションを追加します。以下の例を参照してください。

generators:
  - policy-generator-config.yaml

直前の例で参照される policy-generator-config.yaml ファイルは、生成するポリシーの手順が含まれる YAML ファイルです。単純な PolicyGenerator 設定ファイルは以下の例のようになります。

apiVersion: policy.open-cluster-management.io/v1
kind: PolicyGenerator
metadata:
  name: config-data-policies
policyDefaults:
  namespace: policies
  policySets: []
policies:
  - name: config-data
    manifests:
      - path: configmap.yaml

configmap.yaml は、ポリシーに含まれる Kubernetes マニフェスト YAML ファイルを表します。また、Kustomize ディレクトリー、または複数の Kubernetes マニフェスト YAML ファイルを含むディレクトリーへのパスを設定できます。以下の例を参照してください。

apiVersion: v1
kind: ConfigMap
metadata:
  name: my-config
  namespace: default
data:
  key1: value1
  key2: value2

生成された PolicyPlacementRulePlacementBinding は以下の例のようになります。

apiVersion: apps.open-cluster-management.io/v1
kind: PlacementRule
metadata:
  name: placement-config-data
  namespace: policies
spec:
  clusterConditions:
  - status: "True"
    type: ManagedClusterConditionAvailable
  clusterSelector:
    matchExpressions: []
---
apiVersion: policy.open-cluster-management.io/v1
kind: PlacementBinding
metadata:
  name: binding-config-data
  namespace: policies
placementRef:
  apiGroup: apps.open-cluster-management.io
  kind: PlacementRule
  name: placement-config-data
subjects:
- apiGroup: policy.open-cluster-management.io
  kind: Policy
  name: config-data
---
apiVersion: policy.open-cluster-management.io/v1
kind: Policy
metadata:
  annotations:
    policy.open-cluster-management.io/categories: CM Configuration Management
    policy.open-cluster-management.io/controls: CM-2 Baseline Configuration
    policy.open-cluster-management.io/standards: NIST SP 800-53
  name: config-data
  namespace: policies
spec:
  disabled: false
  policy-templates:
  - objectDefinition:
      apiVersion: policy.open-cluster-management.io/v1
      kind: ConfigurationPolicy
      metadata:
        name: config-data
      spec:
        object-templates:
        - complianceType: musthave
          objectDefinition:
            apiVersion: v1
            data:
              key1: value1
              key2: value2
            kind: ConfigMap
            metadata:
              name: my-config
              namespace: default
        remediationAction: inform
        severity: low

2.9.2.3. ポリシージェネレーター設定の参照テーブル

namespace 以外の policyDefaults セクションに含まれる全フィールドは、ポリシーごとに上書きされる可能性がある点に注意してください。

表2.14 パラメーターの表
フィールド任意または必須説明

apiVersion

必須

この値は policy.open-cluster-management.io/v1 に設定します。

kind

必須

ポリシーのタイプを指定するには、値を PolicyGenerator に設定します。

metadata.name

必須

ポリシーリソースを識別する名前。

placementBindingDefaults.name

任意

複数のポリシーが同じ配置を使用する場合、この名前を使用した結果、PlacementBinding の一意の名前が生成され、それを参照するポリシーの配列で配置バインドします。

policyDefaults

必須

namespace 以外の policies 配列のエントリーによって、ここでリスト表示されるデフォルト値は上書きされます。

policyDefaults.namespace

必須

すべてのポリシーの namespace。

policyDefaults.complianceType

任意

マニフェストとクラスターのオブジェクトを比較する場合のポリシーコントローラーの動作を決定します。使用できる値は、musthavemustonlyhave、または mustnothave です。デフォルト値は musthave です。

policyDefaults.metadataComplianceType

任意

マニフェストメタデータセクションをクラスター上のオブジェクトと比較するときに、complianceType をオーバーライドします。使用できる値は musthavemustonlyhave です。メタデータの complianceType のオーバーライドを避けるため、デフォルト値は空 ({}) です。

policyDefaults.categories

任意

policy.open-cluster-management.io/categories アノテーションで使用されるカテゴリーの配列。デフォルト値は CM Configuration Management です。

policyDefaults.controls

任意

policy.open-cluster-management.io/controls アノテーションで使用されるコントロールの配列。デフォルト値は CM-2 Baseline Configuration です。

policyDefaults.standards

任意

policy.open-cluster-management.io/standards アノテーションで使用する標準の配列。デフォルト値は NIST SP 800-53 です。

policyDefaults.policyAnnotations

任意

ポリシーの metadata.annotations セクションに含まれるアノテーションです。ポリシーで指定されていない限り、すべてのポリシーに適用されます。デフォルト値は空です ({}).。

policyDefaults.configurationPolicyAnnotations

任意

生成された設定ポリシーに設定するアノテーションのキーと値のペアです。たとえば、{"policy.open-cluster-management.io/disable-templates": "true"} というパラメーターを定義することで、ポリシーテンプレートを無効にすることができます。デフォルト値は空です ({}).。

policyDefaults.severity

任意

ポリシー違反の重大度。デフォルト値は low です。

policyDefaults.disabled

任意

ポリシーが無効になっているかどうか、つまり、ポリシーが伝播されておらず、結果としてステータスがないことを意味します。ポリシーを有効にするデフォルト値は false です。

policyDefaults.remediationAction

任意

ポリシーの修復メカニズム。パラメーターの値は enforce および inform です。デフォルト値は inform です。

policyDefaults.namespaceSelector

namespace が指定されていない namespace 付きオブジェクトに必要

オブジェクトが適用されるマネージドクラスター内の namespace を決定します。include パラメーターと exclude パラメーターは、ファイルパス式を受け入れて、名前で namespace を含めたり除外したりします。matchExpressions および matchLabels パラメーターは、ラベルによって含める namespace を指定します。Kubernetes のラベルとセレクター のドキュメントを参照してください。結果のリストは、すべてのパラメーターからの結果の共通部分を使用してコンパイルされます。

policyDefaults.evaluationInterval

任意

特定のコンプライアンス状態にある場合にポリシーが評価される頻度を指定するには、パラメーター compliant および noncompliant を使用します。マネージドクラスターの CPU リソースが少ない場合は、評価間隔を長くして Kubernetes API の CPU 使用率を減らすことができます。これらは期間を表す形式です。たとえば、"1h25m3s" は 1 時間 25 分 3 秒を表します。これらは、特定のコンプライアンス状態になった後にポリシーを評価しないように、"never" に設定することもできます。

policyDefaults.dependencies

任意

このポリシーが適用される前に、特定のコンプライアンス状態にある必要があるオブジェクトのリスト。policyDefaults.orderPoliciestrue に設定されている場合は指定できません。

policyDefaults.dependencies[].name

必須

依存しているオブジェクトの名前。

policyDefaults.dependencies[].namespace

任意

依存しているオブジェクトの namespace。デフォルトは、ポリシージェネレーターに設定されたポリシーの namespace です。

policyDefaults.dependencies[].compliance

任意

オブジェクトが必要とするコンプライアンス状態。デフォルト値は Compliant です。

policyDefaults.dependencies[].kind

任意

オブジェクトの種類。デフォルトでは、種類は Policy に設定されていますが、ConfigurationPolicy などのコンプライアンス状態を持つ他の種類にすることもできます。

policyDefaults.dependencies[].apiVersion

任意

オブジェクトの API バージョン。デフォルト値は policy.open-cluster-management.io/v1 です。

policyDefaults.extraDependencies

任意

このポリシーが適用される前に、特定のコンプライアンス状態にある必要があるオブジェクトのリスト。定義した依存関係は、dependencies リストとは別に各ポリシーテンプレート (ConfigurationPolicy など) に追加されます。policyDefaults.orderManifeststrue に設定されている場合は指定できません。

policyDefaults.extraDependencies[].name

必須

依存しているオブジェクトの名前。

policyDefaults.extraDependencies[].namespace

任意

依存しているオブジェクトの namespace。デフォルトでは、値はポリシージェネレーターに設定されたポリシーの namespace 間に設定されます。

policyDefaults.extraDependencies[].compliance

任意

オブジェクトが必要とするコンプライアンス状態。デフォルト値は Compliant です。

policyDefaults.extraDependencies[].kind

任意

オブジェクトの種類。デフォルト値は Policy ですが、ConfigurationPolicy など、コンプライアンス状態を持つ他の種類にすることもできます。

policyDefaults.extraDependencies[].apiVersion

任意

オブジェクトの API バージョン。デフォルト値は policy.open-cluster-management.io/v1 です。

policyDefaults.ignorePending

任意

ポリシージェネレーターがその依存関係が目的の状態に達するのを待機しているときに、コンプライアンスステータスチェックをバイパスします。デフォルト値は false です。

policyDefaults.orderPolicies

任意

ポリシーの dependencies を自動的に生成して、ポリシーリストで定義した順序で適用されるようにします。デフォルトでは、値は false に設定されています。policyDefaults.dependencies と同時に指定することはできません。

policyDefaults.orderManifests

任意

ポリシーテンプレートに extraDependencies を自動的に生成して、そのポリシーのマニフェストリストで定義した順序で適用されるようにします。policyDefaults.consolidateManifeststrue に設定されている場合は指定できません。policyDefaults.extraDependencies と同時に指定することはできません。

policyDefaults.consolidateManifests

任意

これは、ポリシーでラップされるすべてのマニフェストに対して設定ポリシーを 1 つ生成するかどうかを決定します。false に設定すると、マニフェストごとの設定ポリシーが生成されます。デフォルト値は true です。

policyDefaults.informGatekeeperPolicies

任意

このポリシーが、違反した gatekeeper ポリシーマニフェストを参照すると、Red Hat Advanced Cluster Management でポリシー違反を受け取るために、設定ポリシーを追加で生成する必要があるかどうかが決定されます。デフォルト値は true です。

policyDefaults.informKyvernoPolicies

任意

このポリシーが Kyverno ポリシーマニフェストを参照すると、Kyverno ポリシーの違反時に Red Hat Advanced Cluster Management でポリシー違反を受け取るために、設定ポリシーを追加で生成するかどうかが決定されます。デフォルト値は true です。

policyDefaults.policySets

任意

ポリシーが参加するポリシーセットの配列。ポリシーセットの詳細は、policySets セクションで定義できます。ポリシーがポリシーセットの一部であると、配置バインディングはそのセットに対して生成されるため、ポリシーに対しては生成されません。policies[].generatePlacementWhenInSet または policyDefaults.generatePlacementWhenInSet を設定して、policyDefaults.policySets をオーバーライドします。

policyDefaults.generatePlacementWhenInSet

任意

ポリシーがポリシーセットの一部である場合、デフォルトでは、ポリシーセットの配置が生成されるため、ジェネレーターはこのポリシーの配置を生成しません。ポリシーの配置とポリシーセットの配置の両方でポリシーをデプロイするには、generatePlacementWhenInSettrue に設定します。デフォルト値は false です。

policyDefaults.placement

任意

ポリシーの配置設定。このデフォルトは、すべてのクラスターに一致する配置設定になります。

policyDefaults.placement.name

任意

同じクラスターセレクターが含まれる配置ルールを統合するための名前を指定します。

policyDefaults.placement.placementName

任意

クラスターにすでに存在する配置を使用するには、このパラメーターを定義します。Placement は作成されませんが、PlacementBinding はポリシーをこの Placement にバインドします。

policyDefaults.placement.placementPath

任意

既存の配置を再利用するには、kustomization.yaml ファイルの相対パスを指定します。指定した場合には、デフォルトですべてのポリシーがこの配置ルールを使用します。新規 Placement を生成するには clusterSelectors を参照してください。

policyDefaults.placement.clusterSelectors

任意

クラスターセレクターを key:value の形式で定義して配置を指定します。既存のファイルを指定するには、placementPath を参照してください。

policyDefaults.placement.placementRuleName

任意

クラスターにすでに存在する配置ルールを使用するには、ここでその名前を指定します。PlacementRule は作成されませんが、PlacementBinding はポリシーをこの PlacementRule にバインドします。

policyDefaults.placement.placementRulePath

任意

既存の配置ルールを再利用するには、kustomization.yaml ファイルの相対パスを指定します。指定した場合には、デフォルトですべてのポリシーがこの配置ルールを使用します。新しい PlacementRule を生成するには、labelSelector を参照してください。

policyDefaults.placement.labelSelector

任意

クラスターセレクターを key:value の形式で定義して配置ルールを指定します。既存のファイルを指定する場合は、placementRulePath を参照してください。

policies

必須。

デフォルト値または policyDefaults で設定される値のいずれかを上書きする値と合わせて作成するポリシーのリスト。追加のフィールドと説明については、policyDefaults を参照してください。

policies[].name

必須

作成するポリシーの名前。

policies[].manifests

必須

デフォルト値、この policies 項目に設定された値、または policyDefaults に設定された値のいずれかへのオーバーライドとともに、ポリシーに含める Kubernetes オブジェクトマニフェストのリスト。追加のフィールドと説明については、policyDefaults を参照してください。consolidateManifeststrue に設定されている場合、policies.manifests レベルでオーバーライドできるのは、complianceTypemetadataComplianceType のみです。

policies[].manifests[].path

必須

単一のファイル、ファイルのフラットディレクトリー、または kustomization.yaml ファイルに関連する Kustomize ディレクトリーへのパス。ディレクトリーが Kustomize ディレクトリーの場合、ジェネレーターは、ポリシーを生成する前にディレクトリーに対して Kustomize を実行します。

policies[].manifests[].patches

任意

パスのマニフェストに適用する Kustomize パッチのリスト。複数のマニフェストがある場合は、Kustomize がパッチの適用先のマニフェストを特定できるように、パッチに apiVersionkindmetadata.name、および metadata.namespace (該当する場合) フィールドを設定する必要があります。マニフェストが 1 つの場合には、metadata.name および metadata.namespace フィールドにパッチを適用できます。

policySets

任意

作成するポリシーセットのリストです。ポリシーセットにポリシーを含めるには、policyDefaults.policySetspolicies[].policySets、または policySets.policies を使用します。

policySets[].name

必須

作成するポリシーセットの名前です。

policySets[].description

任意

作成するポリシーセットの説明です。

policySets[].policies

任意

ポリシーセットに含まれるポリシーのリストです。policyDefaults.policySets または policies[].policySets も指定されている場合、リストはマージされます。

policySets[].placement

任意

ポリシーセットの配置設定。このデフォルトは、すべてのクラスターに一致する配置設定になります。配置のドキュメントについては、policyDefaults.placement を参照してください。ただし、policyDefaults.placement の設定はポリシーセットには適用されません。

2.9.3. Operator をインストールするためのポリシーの生成

Red Hat Advanced Cluster Management ポリシーの一般的な用途は、Operator を 1 つ以上の Red Hat OpenShift Container Platform マネージドクラスターにインストールすることです。ポリシージェネレーターを使用してポリシーを生成する方法、および生成されたポリシーを使用して OpenShift GitOps Operator をインストールする方法については、引き続きお読みください。

2.9.3.1. OpenShift GitOps をインストールするポリシーの生成

ポリシージェネレーターを使用して、OpenShift GitOps をインストールするポリシーを生成できます。OpenShift GitOps Operator は次の例で使用されている all namespaces インストールモードを提供します。次の例のように、openshift-gitops-subscription.yaml という Subscription マニフェストファイルを作成します。

apiVersion: operators.coreos.com/v1alpha1
kind: Subscription
metadata:
  name: openshift-gitops-operator
  namespace: openshift-operators
spec:
  channel: stable
  name: openshift-gitops-operator
  source: redhat-operators
  sourceNamespace: openshift-marketplace

Operator の特定のバージョンに固定するには、パラメーターと値 spec.startingCSV: openshift-gitops-operator.v<version> を追加します。<version> を希望のバージョンに置き換えます。

PolicyGenerator 設定ファイルが必要です。policy-generator-config.yaml という名前の設定ファイルを使用してポリシーを生成し、すべての OpenShift Container Platform マネージドクラスターに OpenShift GitOps をインストールします。以下の例を参照してください。

apiVersion: policy.open-cluster-management.io/v1
kind: PolicyGenerator
metadata:
  name: install-openshift-gitops
policyDefaults:
  namespace: policies
  placement:
    clusterSelectors:
      vendor: "OpenShift"
  remediationAction: enforce
policies:
  - name: install-openshift-gitops
    manifests:
      - path: openshift-gitops-subscription.yaml

最後に必要なファイルは kustomization.yaml で、次の設定が必要です。

generators:
  - policy-generator-config.yaml

生成されたポリシーは、以下のファイルのようになります。

apiVersion: apps.open-cluster-management.io/v1
kind: PlacementRule
metadata:
  name: placement-install-openshift-gitops
  namespace: policies
spec:
  clusterConditions:
    - status: "True"
      type: ManagedClusterConditionAvailable
  clusterSelector:
    matchExpressions:
      - key: vendor
        operator: In
        values:
          - OpenShift
---
apiVersion: policy.open-cluster-management.io/v1
kind: PlacementBinding
metadata:
  name: binding-install-openshift-gitops
  namespace: policies
placementRef:
  apiGroup: apps.open-cluster-management.io
  kind: PlacementRule
  name: placement-install-openshift-gitops
subjects:
  - apiGroup: policy.open-cluster-management.io
    kind: Policy
    name: install-openshift-gitops
---
apiVersion: policy.open-cluster-management.io/v1
kind: Policy
metadata:
  annotations:
    policy.open-cluster-management.io/categories: CM Configuration Management
    policy.open-cluster-management.io/controls: CM-2 Baseline Configuration
    policy.open-cluster-management.io/standards: NIST SP 800-53
  name: install-openshift-gitops
  namespace: policies
spec:
  disabled: false
  policy-templates:
    - objectDefinition:
        apiVersion: policy.open-cluster-management.io/v1
        kind: ConfigurationPolicy
        metadata:
          name: install-openshift-gitops
        spec:
          object-templates:
            - complianceType: musthave
              objectDefinition:
                apiVersion: operators.coreos.com/v1alpha1
                kind: Subscription
                metadata:
                  name: openshift-gitops-operator
                  namespace: openshift-operators
                spec:
                  channel: stable
                  name: openshift-gitops-operator
                  source: redhat-operators
                  sourceNamespace: openshift-marketplace
          remediationAction: enforce
          severity: low

OpenShift Container Platform ドキュメントのマニフェストから生成されたポリシーがサポートされています。ポリシージェネレーターを使用して、OpenShift Container Platform ドキュメントの設定ガイダンスを適用できます。

2.9.3.2. Compliance Operator をインストールするポリシーの生成

Compliance Operator などの namespaced インストールモードを使用する Operator の場合、OperatorGroup マニフェストも必要になります。

NamespaceSubscription、および compliance-operator.yaml という OperatorGroup マニフェストを含む YAML ファイルを作成します。以下の例では、これらのマニフェストを compliance-operator namespace にインストールします。

apiVersion: v1
kind: Namespace
metadata:
  name: openshift-compliance
---
apiVersion: operators.coreos.com/v1
kind: OperatorGroup
metadata:
  name: compliance-operator
  namespace: openshift-compliance
spec:
  targetNamespaces:
    - compliance-operator
---
apiVersion: operators.coreos.com/v1alpha1
kind: Subscription
metadata:
  name: compliance-operator
  namespace: openshift-compliance
spec:
  channel: release-0.1
  name: compliance-operator
  source: redhat-operators
  sourceNamespace: openshift-marketplace

PolicyGenerator 設定ファイルが必要です。すべての OpenShift Container Platform マネージドクラスターに Compliance Operator をインストールする以下の PolicyGenerator ポリシーの例を表示します。

apiVersion: policy.open-cluster-management.io/v1
kind: PolicyGenerator
metadata:
  name: install-compliance-operator
policyDefaults:
  namespace: policies
  placement:
    clusterSelectors:
      vendor: "OpenShift"
  remediationAction: enforce
policies:
  - name: install-compliance-operator
    manifests:
      - path: compliance-operator.yaml

最後に必要なファイルは kustomization.yaml で、次の設定が必要です。

generators:
  - policy-generator-config.yaml

その結果、生成されたポリシーは次のファイルのようになります。

apiVersion: apps.open-cluster-management.io/v1
kind: PlacementRule
metadata:
  name: placement-install-compliance-operator
  namespace: policies
spec:
  clusterConditions:
    - status: "True"
      type: ManagedClusterConditionAvailable
  clusterSelector:
    matchExpressions:
      - key: vendor
        operator: In
        values:
          - OpenShift
---
apiVersion: policy.open-cluster-management.io/v1
kind: PlacementBinding
metadata:
  name: binding-install-compliance-operator
  namespace: policies
placementRef:
  apiGroup: apps.open-cluster-management.io
  kind: PlacementRule
  name: placement-install-compliance-operator
subjects:
  - apiGroup: policy.open-cluster-management.io
    kind: Policy
    name: install-compliance-operator
---
apiVersion: policy.open-cluster-management.io/v1
kind: Policy
metadata:
  annotations:
    policy.open-cluster-management.io/categories: CM Configuration Management
    policy.open-cluster-management.io/controls: CM-2 Baseline Configuration
    policy.open-cluster-management.io/standards: NIST SP 800-53
  name: install-compliance-operator
  namespace: policies
spec:
  disabled: false
  policy-templates:
    - objectDefinition:
        apiVersion: policy.open-cluster-management.io/v1
        kind: ConfigurationPolicy
        metadata:
          name: install-compliance-operator
        spec:
          object-templates:
            - complianceType: musthave
              objectDefinition:
                apiVersion: v1
                kind: Namespace
                metadata:
                  name: openshift-compliance
            - complianceType: musthave
              objectDefinition:
                apiVersion: operators.coreos.com/v1alpha1
                kind: Subscription
                metadata:
                  name: compliance-operator
                  namespace: openshift-compliance
                spec:
                  channel: release-0.1
                  name: compliance-operator
                  source: redhat-operators
                  sourceNamespace: openshift-marketplace
            - complianceType: musthave
              objectDefinition:
                apiVersion: operators.coreos.com/v1
                kind: OperatorGroup
                metadata:
                  name: compliance-operator
                  namespace: openshift-compliance
                spec:
                  targetNamespaces:
                    - compliance-operator
          remediationAction: enforce
          severity: low

2.9.3.3. OperatorGroups でのポリシー依存関係の使用

OperatorGroup マニフェストを使用して Operator をインストールする場合、Subscription が作成される前に、クラスターに OperatorGroup が存在している必要があります。ポリシージェネレーターとともにポリシー依存関係機能を使用して、Subscription ポリシーを実施する前に OperatorGroup ポリシーが準拠していることを確認します。

必要な順序でマニフェストを一覧表示して、ポリシーの依存関係を設定します。たとえば、namespace ポリシーを最初に作成し、次に OperatorGroup を作成し、最後に Subscription を作成することができます。

ポリシージェネレーター設定マニフェストで policyDefaults.orderManifests パラメーターを有効にし、policyDefaults.consolidateManifests を無効にして、マニフェスト間の依存関係を自動的に設定します。

2.9.4. OpenShift GitOps (ArgoCD) を使用したポリシー定義の管理

ArgoCD に基づく OpenShift GitOps を使用して、ポリシー定義を管理することもできます。このワークフローを許可するには、Red Hat Advanced Cluster Management ハブクラスターでポリシーを作成するためのアクセス権を OpenShift GitOps に付与する必要があります。ポリシーと配置を作成、読み取り、更新、および削除するためのアクセス権を持つ、openshift-gitops-policy-admin と呼ばれる以下の ClusterRole リソースを作成します。ClusterRole は次の例のようになります。

kind: ClusterRole
apiVersion: rbac.authorization.k8s.io/v1
metadata:
  name: openshift-gitops-policy-admin
rules:
  - verbs:
      - get
      - list
      - watch
      - create
      - update
      - patch
      - delete
    apiGroups:
      - policy.open-cluster-management.io
    resources:
      - policies
      - placementbindings
  - verbs:
      - get
      - list
      - watch
      - create
      - update
      - patch
      - delete
    apiGroups:
      - apps.open-cluster-management.io
    resources:
      - placementrules
  - verbs:
      - get
      - list
      - watch
      - create
      - update
      - patch
      - delete
    apiGroups:
      - cluster.open-cluster-management.io
    resources:
      - placements
      - placements/status
      - placementdecisions
      - placementdecisions/status

ClusterRoleBinding オブジェクトを作成して、OpenShift GitOps サービスアカウントに openshift-gitops-policy-admin ClusterRole オブジェクトへのアクセスを許可します。ClusterRoleBinding は次の例のようになります。

kind: ClusterRoleBinding
apiVersion: rbac.authorization.k8s.io/v1
metadata:
  name: openshift-gitops-policy-admin
subjects:
  - kind: ServiceAccount
    name: openshift-gitops-argocd-application-controller
    namespace: openshift-gitops
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: ClusterRole
  name: openshift-gitops-policy-admin

Red Hat Advanced Cluster Management ポリシー定義が OpenShift GitOps でデプロイされると、ポリシーのコピーが各マネージドクラスター名前空間に作成されます。これらのコピーは、複製されたポリシーと呼ばれます。OpenShift GitOps がこの複製されたポリシーを繰り返し削除したり、ArgoCD Application が同期していないことを示したりするのを防ぐために、argocd.argoproj.io/compare-options: IgnoreExtraneous アノテーションは、Red Hat Advanced Cluster Management ポリシーフレームワークによって、それぞれのレプリケーションされたポリシーに自動的に設定されます。

ArgoCD がオブジェクトを追跡するために使用するラベルとアノテーションがあります。複製されたポリシーが ArgoCD にまったく表示されないようにするには、Red Hat Advanced Cluster Management ポリシー定義で spec.copyPolicyMetadatafalse に設定して、これらの ArgoCD 追跡ラベルとアノテーションが複製されたポリシーにコピーされないようにすることができます。

2.9.4.1. ポリシージェネレーターと OpenShift GitOps (ArgoCD) の統合

ArgoCD に基づく OpenShift GitOps を使用して、GitOps を介してポリシージェネレーターを使用してポリシーを生成することもできます。ポリシージェネレーターは OpenShift GitOps コンテナーイメージにプリインストールされていないため、カスタマイズを行う必要があります。続行するには、OpenShift GitOps Operator を Red Hat Advanced Cluster Management ハブクラスターにインストールし、ハブクラスターにログインする必要があります。

Kustomize の実行時、OpenShift GitOps がポリシージェネレーターにアクセスできるようにするには、Red Hat Advanced Cluster Management Application Subscription コンテナーイメージから OpenShift GitOps コンテナーに Policy Generator バイナリーをコピーするための Init コンテナーが必要です。さらに、Kustomize の実行時、--enable-alpha-plugins フラグを提供するように、OpenShift GitOps を設定する必要があります。以下のコマンドを使用して、OpenShift GitOps argocd オブジェクトの編集を開始します。

oc -n openshift-gitops edit argocd openshift-gitops

次に、OpenShift GitOps argocd オブジェクトを変更して、以下の追加の YAML コンテンツを含めます。Red Hat Advanced Cluster Management の新しいメジャーバージョンがリリースされ、ポリシージェネレーターを新しいバージョンに更新したい場合は、Init コンテナーで使用される registry.redhat.io/rhacm2/multicluster-operators-subscription-rhel8 イメージをより新しいタグに更新する必要があります。以下の例を見て、<version> を 2.7 または目的の Red Hat Advanced Cluster Management バージョンに置き換えます。

apiVersion: argoproj.io/v1alpha1
kind: ArgoCD
metadata:
  name: openshift-gitops
  namespace: openshift-gitops
spec:
  kustomizeBuildOptions: --enable-alpha-plugins
  repo:
    env:
    - name: KUSTOMIZE_PLUGIN_HOME
      value: /etc/kustomize/plugin
    initContainers:
    - args:
      - -c
      - cp /etc/kustomize/plugin/policy.open-cluster-management.io/v1/policygenerator/PolicyGenerator
        /policy-generator/PolicyGenerator
      command:
      - /bin/bash
      image: registry.redhat.io/rhacm2/multicluster-operators-subscription-rhel8:v<version>
      name: policy-generator-install
      volumeMounts:
      - mountPath: /policy-generator
        name: policy-generator
    volumeMounts:
    - mountPath: /etc/kustomize/plugin/policy.open-cluster-management.io/v1/policygenerator
      name: policy-generator
    volumes:
    - emptyDir: {}
      name: policy-generator

OpenShift GitOps がポリシージェネレーターを使用できるようになったので、Red Hat Advanced Cluster Management ハブクラスターでポリシーを作成するためのアクセス権を OpenShift GitOps に付与する必要があります。ポリシーとプレースメントを作成、読み取り、更新、および削除するためのアクセス権を持つ、openshift-gitops-policy-admin という名前の ClusterRole リソースを作成します。前の ClusterRole の例を参照してください。

さらに、ClusterRoleBinding オブジェクトを作成して、OpenShift GitOps サービスアカウントに openshift-gitops-policy-admin ClusterRole へのアクセスを許可します。ClusterRoleBinding は、次のようなリソースになる場合があります。

kind: ClusterRoleBinding
apiVersion: rbac.authorization.k8s.io/v1
metadata:
  name: openshift-gitops-policy-admin
subjects:
  - kind: ServiceAccount
    name: openshift-gitops-argocd-application-controller
    namespace: openshift-gitops
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: ClusterRole
  name: openshift-gitops-policy-admin
Red Hat logoGithubRedditYoutubeTwitter

詳細情報

試用、購入および販売

コミュニティー

Red Hat ドキュメントについて

Red Hat をお使いのお客様が、信頼できるコンテンツが含まれている製品やサービスを活用することで、イノベーションを行い、目標を達成できるようにします。

多様性を受け入れるオープンソースの強化

Red Hat では、コード、ドキュメント、Web プロパティーにおける配慮に欠ける用語の置き換えに取り組んでいます。このような変更は、段階的に実施される予定です。詳細情報: Red Hat ブログ.

会社概要

Red Hat は、企業がコアとなるデータセンターからネットワークエッジに至るまで、各種プラットフォームや環境全体で作業を簡素化できるように、強化されたソリューションを提供しています。

© 2024 Red Hat, Inc.