2.4. サードパーティーポリシーコントローラーの統合
サードパーティーポリシーを統合してポリシーテンプレート内にカスタムアノテーションを作成し、コンプライアンス標準、制御カテゴリー、制御を 1 つ以上指定します。
policy-collection/community からサードパーティーポリシーを使用することもできます。
以下のサードパーティーポリシーを統合する方法を説明します。
2.4.1. gatekeeper 制約および制約テンプレートの統合
gatekeeper は、Open Policy Agent (OPA) で実行されるカスタムリソース定義 (CRD) ベースのポリシーを適用する検証用の Webhook です。gatekeeper Operator ポリシーを使用して、クラスターに gatekeeper をインストールできます。gatekeeper ポリシーを使用して、Kubernetes リソースのコンプライアンスを評価できます。ポリシーエンジンとして OPA を活用し、ポリシー言語に Rego を使用できます。
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
を参照してください。
他のポリシーの管理に関する詳細は、設定ポリシーの管理 を参照してください。セキュリティーフレームワークに関する他のトピックについては、ガバナンス を参照してください。
2.4.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.9.0 です。
2.4.2.1. ポリシージェネレーター機能
ポリシージェネレーターと、Red Hat Advanced Cluster Management アプリケーションライフサイクル サブスクリプション GitOps ワークフローは、Red Hat Advanced Cluster Management ポリシーを使用した Kubernetes リソースオブジェクトの OpenShift マネージドクラスターおよび Kubernetes クラスターへの分散を単純化します。特に、ポリシージェネレーターを使用して以下のアクションを実行します。
- Kustomize ディレクトリーから作成されたマニフェストを含む、任意の Kubernetes マニフェストファイルを Red Hat Advanced Cluster Management 設定ポリシー に変換します。
- 生成された Red Hat Advanced Cluster Management ポリシーに挿入される前に、入力された Kubernetes マニフェストにパッチを適用します。
- Red Hat Advanced Cluster Management for Kubernetes で、Gatekeeper ポリシー違反について報告できるように追加の設定ポリシーを生成します。
- ハブクラスターでポリシーセットを生成します。詳細は、ポリシーセットコントローラー を参照してください。
詳細は、以下のトピックを参照してください。
2.4.2.2. ポリシージェネレーター設定の設定
ポリシージェネレーターは、PolicyGenerator
の種類および policy.open-cluster-management.io/v1
API バージョンのマニフェストで設定される Kustomize ジェネレータープラグインです。
プラグインを使用するには、まず、kustomization.yaml
ファイルに generators
セクションを追加します。以下の例を参照してください。
generators: - policy-generator-config.yaml
直前の例で参照される policy-generator-config.yaml
ファイルは、生成するポリシーの手順が含まれる YAML ファイルです。単純なポリシージェネレーター設定ファイルは以下の例のようになります。
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
生成された Policy
、PlacementRule
と PlacementBinding
は以下の例のようになります。
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
詳細については、policy-generator-plugin
リポジトリーを参照してください。
2.4.2.3. Operator をインストールするためのポリシーの生成
Red Hat Advanced Cluster Management ポリシーの一般的な用途は、1 つ以上のマネージドクラスターに Operator をインストール することです。以下の各種インストールモードの例と必須リソースを確認してください。
2.4.2.3.1. OpenShift GitOps をインストールするためのポリシー
以下の例は、ポリシージェネレーターを使用して OpenShift GitOps をインストールするポリシーを生成する方法を示しています。OpenShift GitOps Operator は すべての namespace インストールモード を提供します。まず、以下の例のように openshift-gitops-subscription.yaml
という名前の サブスクリプションマニフェスト
ファイルを作成する必要があります。
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
オペレーターの特定のバージョンに固定するには、パラメーターと値 spec.startingCSV: openshift-gitops-operator.v<version>
を追加できます。<version>
を希望のバージョンに置き換えます。
次に、policy-generator-config.yaml
というポリシージェネレーター設定ファイルが必要です。以下の例は、すべての OpenShift マネージドクラスターに 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
ファイルです。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 ドキュメントから取得され、ポリシージェネレーターによって生成されるすべてのポリシーが完全にサポートされます。以下の YAML 入力の例は、OpenShift Container Platform ドキュメントでサポートされます。
詳細は、Understanding OpenShift GitOps と Operator ドキュメントを参照してください。
2.4.2.3.2. コンプライアンス Operator をインストールするためのポリシー
コンプライアンス Operator などの namespaced を使用したインストールモード を使用する Operator の場合、OperatorGroup
マニフェストも必要になります。以下の例は、コンプライアンス Operator をインストールする生成されたポリシーを示しています。
まず、Namespace
、Subscription
、および OperatorGroup
マニフェストを含めて、compliance-operator.yaml
という名前の YAML ファイルを作成する必要があります。以下の例では、これらのマニフェストを compliance-operator
namespace にインストールします。
apiVersion: v1 kind: Namespace metadata: name: openshift-compliance --- 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 --- apiVersion: operators.coreos.com/v1 kind: OperatorGroup metadata: name: compliance-operator namespace: openshift-compliance spec: targetNamespaces: - compliance-operator
次に、policy-generator-config.yaml
というポリシージェネレーター設定ファイルが必要です。以下の例は、すべての OpenShift マネージドクラスターにコンプライアンス Operator をインストールする単一のポリシーを示しています。
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
ファイルです。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
詳細は、コンプライアンス Operator のドキュメント を参照してください。
2.4.2.4. 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 コンテナーイメージから Kustomize を実行する OpenShift GitOps コンテナーにコピーするための Init コンテナーが必要です。詳細は、Pod がデプロイされる前に 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.6 または必要な 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
は次の例のようになります。
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
2.4.2.5. ポリシージェネレーター設定の参照テーブル
namespace
以外の policyDefaults
セクションに含まれる全フィールドは、ポリシーごとに上書きされる可能性がある点に注意してください。
フィールド | 任意または必須 | 説明 |
---|---|---|
| 必須 |
この値は |
| 必須 |
ポリシーのタイプを指定するには、値を |
| 必須 | ポリシーリソースを識別する名前。 |
| 任意 |
複数のポリシーが同じ配置を使用する場合、この名前を使用した結果、 |
| 必須 |
|
| 必須 | すべてのポリシーの namespace。 |
| 任意 |
マニフェストとクラスターのオブジェクトを比較する場合のポリシーコントローラーの動作を決定します。使用できる値は、 |
| 任意 |
マニフェストメタデータセクションをクラスター上のオブジェクトと比較するときに、 |
| 任意 |
|
| 任意 |
|
| 任意 |
|
| 任意 |
ポリシーの |
| 任意 |
生成された設定ポリシーに設定するアノテーションのキーと値のペアです。たとえば、 |
| 任意 |
ポリシー違反の重大度。デフォルト値は |
| 任意 |
ポリシーが無効になっているかどうか、つまり、ポリシーが伝播されておらず、結果としてステータスがないことを意味します。ポリシーを有効にするデフォルト値は |
| 任意 |
ポリシーの修復メカニズム。パラメーターの値は |
| namespace が指定されていない namespace 付きオブジェクトに必要 |
オブジェクトが適用されるマネージドクラスター内の namespace を決定します。 |
| 任意 |
特定のコンプライアンス状態にある場合にポリシーが評価される頻度を指定するには、パラメーター |
| 任意 |
これは、ポリシーでラップされるすべてのマニフェストに対して設定ポリシーを 1 つ生成するかどうかを決定します。 |
| 任意 |
このポリシーが、違反した gatekeeper ポリシーマニフェストを参照すると、Red Hat Advanced Cluster Management でポリシー違反を受け取るために、設定ポリシーを追加で生成する必要があるかどうかが決定されます。デフォルト値は |
| 任意 |
ポリシーが参加するポリシーセットの配列。ポリシーセットの詳細は、 |
| 任意 |
ポリシーがポリシーセットの一部である場合、デフォルトでは、ポリシーセットの配置が生成されるため、ジェネレーターはこのポリシーの配置を生成しません。ポリシーの配置とポリシーセットの配置の両方でポリシーをデプロイするには、 |
| 任意 | ポリシーの配置設定。このデフォルトは、すべてのクラスターに一致する配置設定になります。 |
| 任意 | 同じクラスターセレクターが含まれる配置ルールを統合するための名前を指定します。 |
| 任意 |
クラスターにすでに存在する配置を使用するには、このパラメーターを定義します。 |
| 任意 |
既存の配置を再利用するには、 |
| 任意 |
クラスターセレクターを |
| 任意 |
クラスターにすでに存在する配置ルールを使用するには、ここでその名前を指定します。 |
| 任意 |
既存の配置ルールを再利用するには、 |
| 任意 |
クラスターセレクターを |
| 必須。 |
デフォルト値または |
| 必須 | 作成するポリシーの名前。 |
| 必須 | ポリシーに追加する Kubernetes オブジェクトマニフェストの一覧。 |
| 必須 |
単一のファイル、ファイルのフラットディレクトリー、または |
| 任意 |
マニフェストとクラスターのオブジェクトを比較する場合のポリシーコントローラーの動作を決定します。パラメーターの値は |
| 任意 |
パスのマニフェストに適用する Kustomize パッチ。複数のマニフェストがある場合は、Kustomize がパッチの適用先のマニフェストを特定できるように、パッチに |
| 任意 |
作成するポリシーセットのリストです。ポリシーセットにポリシーを含めるには、 |
| 必須 | 作成するポリシーセットの名前です。 |
| 任意 | 作成するポリシーセットの説明です。 |
| 任意 |
ポリシーセットに含まれるポリシーのリストです。 |
| 任意 |
ポリシーセットの配置設定。このデフォルトは、すべてのクラスターに一致する配置設定になります。配置のドキュメントについては、 |
サードパーティーポリシーコントローラーの統合 ドキュメントに戻るか、その他のトピックについては、ガバナンス ドキュメントを参照してください。