2.3. ポリシーコントローラー
ポリシーコントローラーは、クラスターがポリシーに準拠しているかどうかを監視し、報告します。未設定のポリシーテンプレートを使用して事前定義のポリシーコントローラーおよびポリシーを適用し、Red Hat Advanced Cluster Management for Kubernetes ポリシーフレームワークを使用します。ポリシーコントローラーは Kubernetes のカスタムリソース定義 (CRD) インスタンスです。
CRD の詳細は、Extend the Kubernetes API with CustomResourceDefinitions を参照してください。ポリシーコントローラーは、ポリシー違反を修正し、クラスターのステータスを準拠させます。
製品ポリシーフレームワークを使用して、カスタムポリシーおよびポリシーコントローラーを作成できます。詳細は、カスタムポリシーコントローラーの作成 (非推奨) を参照してください。
Red Hat Advanced Cluster Management for Kubernetes の以下のポリシーコントローラーについては、次のトピックを参照してください。
重要: 設定ポリシーコントローラーポリシーのみが enforce 機能をサポートします。ポリシーコントローラーが enforce 機能をサポートしないポリシーを手動で修正する必要があります。
ポリシー管理の他のトピックについては、ガバナンス を参照してください。
2.3.1. Kubernetes 設定ポリシーコントローラー リンクのコピーリンクがクリップボードにコピーされました!
設定ポリシーコントローラーを使用して、Kubernetes リソースを設定し、クラスター全体にセキュリティーポリシーを適用できます。
設定ポリシーコントローラーは、ローカルの Kubernetes API サーバーと通信し、クラスターにある設定の一覧を取得します。CRD の詳細は、Extend the Kubernetes API with CustomResourceDefinitions を参照してください。
設定ポリシーコントローラーは、インストール時にハブクラスターに作成されます。設定ポリシーコントローラーは、enforce 機能をサポートし、以下のポリシーのコンプライアンスを監視します。
設定ポリシーの remediationAction が enforce に設定されている場合、コントローラーはターゲットのマネージドクラスターで複製ポリシーを作成します。設定ポリシーでテンプレートを使用することもできます。詳細は、設定ポリシーでのテンプレートのサポート を参照してください。
設定ポリシーコントローラーについては、以下を参照してください。
2.3.1.1. 設定ポリシーコントローラーの YAML 設定 リンクのコピーリンクがクリップボードにコピーされました!
Name: configuration-policy-example
Namespace:
Labels:
APIVersion: policy.open-cluster-management.io/v1
Kind: ConfigurationPolicy
Metadata:
Finalizers:
finalizer.policy.open-cluster-management.io
Spec:
Conditions:
Ownership:
NamespaceSelector:
Exclude:
Include:
RemediationAction:
Status:
CompliancyDetails:
Configuration-Policy-Example:
Default:
Kube - Public:
Compliant: Compliant
Events:
2.3.1.2. 設定ポリシーの例 リンクのコピーリンクがクリップボードにコピーされました!
apiVersion: policy.open-cluster-management.io/v1
kind: ConfigurationPolicy
metadata:
name: policy-config
spec:
namespaceSelector:
include: ["default"]
exclude: []
remediationAction: inform
severity: low
object-templates:
- complianceType: musthave
objectDefinition:
apiVersion: v1
kind: Pod
metadata:
name: pod
spec:
containers:
- image: 'pod-image'
name:
ports:
- containerPort: 80
evaluationInterval:
compliant:
noncompliant:
2.3.1.3. 設定ポリシーの YAML の表 リンクのコピーリンクがクリップボードにコピーされました!
| フィールド | 説明 |
|---|---|
| apiVersion |
必須。この値は |
| kind |
必須。ポリシーのタイプを指定するには、値を |
| metadata.name | 必須。ポリシーの名前。 |
| spec | 必須。監視する設定ポリシーと設定ポリシーの修正方法に関する仕様。 |
| spec.namespace |
namespace を使用したオブジェクトまたはリソースに必要です。ポリシーの適用先のハブクラスター内にある namespace。 |
| spec.remediationAction |
必須。ポリシーの修正を指定します。 |
| spec.remediationAction.severity |
必須。ポリシーがコンプライアンス違反の場合に重大度を指定します。パラメーター値 |
| spec.remediationAction.complianceType | 必須。マネージドクラスターに評価または適用する必要のあるロールおよび他の Kubernetes オブジェクトの予想される動作を一覧表示するのに使用されます。以下の動詞をパラメーター値として使用する必要があります。
|
| spec.evaluationInterval.compliant |
任意。ポリシーが準拠状態にあるときに評価される頻度を定義するために使用されます。値は期間の形式に指定する必要があります。これは、時間単位接尾辞が付いた数字のシーケンスになります。たとえば、 |
| spec.evaluationInterval.noncompliant |
任意。ポリシーがコンプライアンス違反の状態にあるときに評価される頻度を定義するために使用します。 |
NIST Special Publication 800-53 (Rev. 4) を使用するポリシーサンプルおよび、CM-Configuration-Management フォルダー の Red Hat Advanced Cluster Management がサポートするポリシーサンプルを参照してください。ポリシーがハブクラスターにどのように適用されるかについては、サポート対象のポリシー 参照してください。
ポリシーを作成してカスタマイズする方法は、セキュリティーポリシーの管理 を参照してください。コントローラーの詳細は、ポリシーコントローラー を参照してください。
2.3.2. 証明書ポリシーコントローラー リンクのコピーリンクがクリップボードにコピーされました!
証明書ポリシーコントローラーは、有効期限が近い証明書、期間 (時間) が長すぎる証明書や、指定のパターンに一致しない DNS 名が含まれている証明書の検出に使用できます。
証明書ポリシーコントローラーを設定してカスタマイズするには、コントローラーポリシーの以下のパラメーターを更新します。
-
minimumDuration -
minimumCADuration -
maximumDuration -
maximumCADuration -
allowedSANPattern -
disallowedSANPattern
以下のシナリオのいずれかの場合は、ポリシーがコンプライアンス違反になる可能性があります。
- 証明書が、最小期間で指定されている期間以内、または最大期間で指定されている期間を超えて失効する場合
- DNS 名が指定のパターンと一致しない場合
証明書ポリシーコントローラーは、マネージドクラスターに作成されます。このコントローラーは、ローカルの Kubernetes API サーバーと通信して、証明書が含まれるシークレット一覧を取得して、コンプライアンス違反の証明書をすべて判別します。CRD の詳細は、Extend the Kubernetes API with CustomResourceDefinitions を参照してください。
証明書ポリシーコントローラーには、enforce 機能のサポートがありません。
2.3.2.1. 証明書ポリシーコントローラーの YAML 設定 リンクのコピーリンクがクリップボードにコピーされました!
以下の証明書ポリシーの例を見て、YAML 表の要素を確認します。
apiVersion: policy.open-cluster-management.io/v1
kind: CertificatePolicy
metadata:
name: certificate-policy-example
namespace:
labels: category=system-and-information-integrity
spec:
namespaceSelector:
include: ["default"]
remediationAction:
severity:
minimumDuration:
minimumCADuration:
maximumDuration:
maximumCADuration:
allowedSANPattern:
disallowedSANPattern:
2.3.2.1.1. 証明書ポリシーコントローラーの YAML の表 リンクのコピーリンクがクリップボードにコピーされました!
| フィールド | 説明 |
|---|---|
| apiVersion |
必須。この値は |
| kind |
必須。この値を |
| metadata.name | 必須。ポリシーを識別するための名前。 |
| metadata.namespace | 必須。ポリシーが作成されるマネージドクラスター内の namespace。 |
| metadata.labels |
任意。証明書ポリシーでは、 |
| spec | 必須。監視および更新する証明書の仕様。 |
| spec.namespaceSelector |
必須。ポリシーを適用するマネージドクラスターの namespace。
複数の証明書ポリシーを作成してそのポリシーを同じマネージドクラスターに適用する場合、各ポリシーの
• 証明書ポリシーコントローラーの |
| spec.remediationAction |
必須。ポリシーの修正を指定します。このパラメーター値に |
| spec.severity |
任意。ポリシーがコンプライアンス違反の場合に重大度をユーザーに通知します。パラメーター値 |
| spec.minimumDuration |
必須。値の指定がない場合、デフォルト値は |
| spec.minimumCADuration |
任意。値を設定して、他の証明書とは異なる値で、まもなく有効期限が切れる可能性がある署名証明書を特定します。パラメーターの値が指定されていないと、CA 証明書の有効期限は |
| spec.maximumDuration | 任意。値を設定して、任意の制限期間を超えて作成された証明書を特定します。パラメーターは Golang の期間形式を使用します。詳細は Golang Parse Duration を参照してください。 |
| spec.maximumCADuration | 任意。値を設定して、定義した制限期間を超えて作成された署名証明書を特定します。パラメーターは Golang の期間形式を使用します。詳細は Golang Parse Duration を参照してください。 |
| spec.allowedSANPattern | 任意。証明書に定義した全 SAN エントリーと一致する必要がある正規表現。このパラメーターを使用して、パターンと DNS 名を照合します。詳細は Golang Regular Expression syntax を参照してください。 |
| spec.disallowedSANPattern |
任意。証明書で定義した SAN エントリーと一致してはいけない正規表現。このパラメーターは、パターンと DNS 名を確認します。 詳細は Golang Regular Expression syntax を参照してください。 |
2.3.2.2. 証明書ポリシーの例 リンクのコピーリンクがクリップボードにコピーされました!
証明書ポリシーコントローラーがハブクラスターに作成されると、複製ポリシーがマネージドクラスターに作成されます。証明書ポリシーのサンプルを確認するには、policy-certificate.yaml を参照してください。
証明書ポリシーの管理方法の詳細は、セキュリティーポリシーの管理 を参照してください。他のトピックについては、ポリシーコントローラー を参照してください。
2.3.3. IAM ポリシーコントローラー リンクのコピーリンクがクリップボードにコピーされました!
IAM (ID and Access Management) ポリシーコントローラーを使用して、コンプライアンス違反の IAM ポリシーに関する通知を受信できます。IAM ポリシーで設定したパラメーターを基に、コンプライアンスチェックが行われます。
IAM ポリシーコントローラーは、クラスター内で特定のクラスターロール (ClusterRole) を割り当てたユーザーの必要な最大数を監視します。監視するデフォルトのクラスターロールは cluster-admin です。IAM ポリシーコントローラーは、ローカルの Kubernetes API サーバーと通信します。詳細は、Extend the Kubernetes API with CustomResourceDefinitions を参照してください。
IAM ポリシーコントローラーはマネージドクラスターで実行されます。詳細は、以下のセクションを参照してください。
2.3.3.1. IAM ポリシー YAML の設定 リンクのコピーリンクがクリップボードにコピーされました!
以下の IAM ポリシーの例を見て、YAML 表のパラメーターを確認します。
apiVersion: policy.open-cluster-management.io/v1
kind: IamPolicy
metadata:
name:
spec:
clusterRole:
severity:
remediationAction:
maxClusterRoleBindingUsers:
ignoreClusterRoleBindings:
2.3.3.2. IAM ポリシー YAML の表 リンクのコピーリンクがクリップボードにコピーされました!
以下のパラメーター表で説明を確認してください。
| フィールド | 説明 |
|---|---|
| apiVersion |
必須。この値は |
| kind |
必須。ポリシーのタイプを指定するには、値を |
| metadata.name | 必須。ポリシーリソースを識別する名前。 |
| spec | 必須。ポリシーの設定詳細を追加します。 |
| spec.clusterRole |
任意。監視するクラスターロール ( |
| spec.severity |
任意。ポリシーがコンプライアンス違反の場合に重大度をユーザーに通知します。パラメーター値 |
| spec.remediationAction |
任意。ポリシーの修正を指定します。 |
| spec.ignoreClusterRoleBindings |
任意。無視するクラスターのロールバインディング名を指定する正規表現 (regex) 値の一覧。これらの正規表現の値は、Go regexp 構文 に従う必要があります。デフォルトでは、名前が |
| spec.maxClusterRoleBindingUsers | 必須。ポリシーが違反しているとみなされるまでに利用可能な IAM rolebinding の最大数。 |
2.3.3.3. IAM ポリシーの例 リンクのコピーリンクがクリップボードにコピーされました!
IAM ポリシーのサンプルを確認するには、policy-limitclusteradmin.yaml を参照してください。詳細は、セキュリティーポリシーの管理 を参照してください。
他のトピックについては、ポリシーコントローラー を参照してください。
2.3.4. ポリシーセットコントローラー リンクのコピーリンクがクリップボードにコピーされました!
ポリシーセットコントローラーは、同じ namespace で定義されるポリシーにスコープ指定されたポリシーのステータスを集約します。ポリシーセット (PolicySet) を作成して、同じ namespace にあるポリシーをグループ化します。PolicySet のすべてのポリシーは、PolicySet および Placement をバインドする PlacementBinding を作成して、選択したクラスターに配置されます。ポリシーセットがハブクラスターにデプロイされています。
また、ポリシーが複数のポリシーセットの一部である場合、既存および新規 Placement リソースはポリシーに残ります。ユーザーがポリシーセットからポリシーを削除すると、ポリシーはポリシーセットで選択したクラスターには適用されませんが、配置は残ります。ポリシーセットコントローラーは、ポリシーセット配置を含むクラスターの違反のみを確認します。
注意: Red Hat Advanced Cluster Management の強化サンプルポリシーセットは、クラスター配置を使用します。クラスター配置を使用する場合は、ポリシーを含む namespace をマネージドクラスターセットにバインドします。クラスター配置の使用の詳細については、クラスターへのポリシーのデプロイ を参照してください。
以下のセクションでは、ポリシーセットの設定について説明します。
2.3.4.1. ポリシーセット YAML の設定 リンクのコピーリンクがクリップボードにコピーされました!
ポリシーセットは、以下の YAML ファイルのようになります。
apiVersion: policy.open-cluster-management.io/v1beta1
kind: PolicySet
metadata:
name: demo-policyset
spec:
policies:
- policy-demo
---
apiVersion: policy.open-cluster-management.io/v1
kind: PlacementBinding
metadata:
name: demo-policyset-pb
placementRef:
apiGroup: apps.open-cluster-management.io
kind: PlacementRule
name: demo-policyset-pr
subjects:
- apiGroup: policy.open-cluster-management.io
kind: PolicySet
name: demo-policyset
---
apiVersion: apps.open-cluster-management.io
kind: PlacementRule
metadata:
name: demo-policyset-pr
spec:
clusterConditions:pagewidth:
- status: "True"
type: ManagedCLusterConditionAvailable
clusterSelectors:
matchExpressions:
- key: name
operator: In
values:
- local-cluster
2.3.4.2. ポリシーセットの表 リンクのコピーリンクがクリップボードにコピーされました!
以下のパラメーター表で説明を確認してください。
| フィールド | 説明 |
|---|---|
| apiVersion |
必須。この値は |
| kind |
必須。ポリシーのタイプを指定するには、値を |
| metadata.name | 必須。ポリシーリソースを識別する名前。 |
| spec | 必須。ポリシーの設定詳細を追加します。 |
| spec.policies | 任意。ポリシーセットでグループ化するポリシーの一覧。 |
2.3.4.3. ポリシーセットの例 リンクのコピーリンクがクリップボードにコピーされました!
apiVersion: policy.open-cluster-management.io/v1beta1
kind: PolicySet
metadata:
name: pci
namespace: default
spec:
description: Policies for PCI compliance
policies:
- policy-pod
- policy-namespace
status:
compliant: NonCompliant
placement:
- placementBinding: binding1
placementRule: placement1
policySet: policyset-ps
セキュリティーポリシーの管理 トピックの Creating policy sets セクションを参照してください。また、デプロイメント用のポリシージェネレーターである PolicySets-- Stable を必要とする安定したポリシー PolicySets も表示します。ポリシージェネレーター ドキュメントを参照してください。
2.3.5. カスタムポリシーコントローラーの作成 (非推奨) リンクのコピーリンクがクリップボードにコピーされました!
カスタムポリシーコントローラーの作成、適用、表示、および更新について説明します。ポリシーコントローラーがクラスターにデプロイする YAML ファイルを作成できます。以下のセクションを参照して、ポリシーコントローラーを作成します。
2.3.5.1. ポリシーコントローラーの作成 リンクのコピーリンクがクリップボードにコピーされました!
governance-policy-framework リポジトリーにあるポリシーコントローラーフレームワークを使用します。ポリシーコントローラーを作成するには、以下の手順を完了します。
以下のコマンドを実行して
governance-policy-frameworkリポジトリーのクローンを作成します。git clone git@github.com:stolostron/governance-policy-framework.gitポリシースキーマ定義を更新してコントローラーポリシーをカスタマイズします。ポリシーは次のような内容になります。
metadata: name: samplepolicies.policies.open-cluster-management.io spec: group: policy.open-cluster-management.io names: kind: SamplePolicy listKind: SamplePolicyList plural: samplepolicies singular: samplepolicySamplePolicyの種類を監視するようにポリシーコントローラーを更新します。以下のコマンドを実行します。for file in $(find . -name "*.go" -type f); do sed -i "" "s/SamplePolicy/g" $file; done for file in $(find . -name "*.go" -type f); do sed -i "" "s/samplepolicy-controller/samplepolicy-controller/g" $file; done以下の手順を実行してポリシーコントローラーを再コンパイルし、実行します。
- クラスターにログインします。
- ユーザーアイコンを選択し、クライアントの設定 をクリックします。
- 設定情報をコマンドラインにコピーアンドペーストし、Enter を押します。
以下のコマンドを実行してポリシー CRD を適用し、コントローラーを起動します。
export GO111MODULE=on kubectl apply -f deploy/crds/policy.open-cluster-management.io_samplepolicies_crd.yaml export WATCH_NAMESPACE=<cluster_namespace_on_hub> go run cmd/manager/main.goコントローラーが実行していることを示す以下の出力が表示される場合があります。
{“level”:”info”,”ts”:1578503280.511274,”logger”:”controller-runtime.manager”,”msg”:”starting metrics server”,”path”:”/metrics”} {“level”:”info”,”ts”:1578503281.215883,”logger”:”controller-runtime.controller”,”msg”:”Starting Controller”,”controller”:”samplepolicy-controller”} {“level”:”info”,”ts”:1578503281.3203468,”logger”:”controller-runtime.controller”,”msg”:”Starting workers”,”controller”:”samplepolicy-controller”,”worker count”:1} Waiting for policies to be available for processing…ポリシーを作成し、コントローラーがポリシーを取得し、そのポリシーをクラスターに適用していることを確認します。以下のコマンドを実行します。
kubectl apply -f deploy/crds/policy.open-cluster-management.io_samplepolicies_crd.yamlポリシーが適用されると、カスタムコントローラーによってポリシーが監視され、検出されることを示すメッセージが表示されます。メッセージは以下の内容のようになります。
{"level":"info","ts":1578503685.643426,"logger":"controller_samplepolicy","msg":"Reconciling SamplePolicy","Request.Namespace":"default","Request.Name":"example-samplepolicy"} {"level":"info","ts":1578503685.855259,"logger":"controller_samplepolicy","msg":"Reconciling SamplePolicy","Request.Namespace":"default","Request.Name":"example-samplepolicy"} Available policies in namespaces: namespace = kube-public; policy = example-samplepolicy namespace = default; policy = example-samplepolicy namespace = kube-node-lease; policy = example-samplepolicy以下のコマンドを実行して、
statusフィールドでコンプライアンスの詳細を確認します。kubectl describe SamplePolicy example-samplepolicy -n default出力は次のような内容になります。
status: compliancyDetails: example-samplepolicy: cluster-wide: - 5 violations detected in namespace `cluster-wide`, there are 0 users violations and 5 groups violations default: - 0 violations detected in namespace `default`, there are 0 users violations and 0 groups violations kube-node-lease: - 0 violations detected in namespace `kube-node-lease`, there are 0 users violations and 0 groups violations kube-public: - 1 violations detected in namespace `kube-public`, there are 0 users violations and 1 groups violations compliant: NonCompliantポリシールールおよびポリシーロジックを変更して、ポリシーコントローラーの新規ルールを作成します。以下の手順を実行します。
SamplePolicySpecを更新して、YAML ファイルに新規フィールドを追加します。仕様は次のような内容になります。spec: description: SamplePolicySpec defines the desired state of SamplePolicy properties: labelSelector: additionalProperties: type: string type: object maxClusterRoleBindingGroups: type: integer maxClusterRoleBindingUsers: type: integer maxRoleBindingGroupsPerNamespace: type: integer maxRoleBindingUsersPerNamespace: type: integer-
samplepolicy_controller.go の
SamplePolicySpec構造を新しいフィールドで更新します。 -
samplepolicy_controller.goファイルのPeriodicallyExecSamplePolicies関数を、ポリシーコントローラーを実行する新しいロジックで更新します。PeriodicallyExecSamplePoliciesフィールドの例については、stolostron/multicloud-operators-policy-controller を参照してください。 - ポリシーコントローラーを再コンパイルし、実行します。ポリシーコントローラーの作成 を参照してください。
ポリシーコントローラーが機能します。
2.3.5.2. コントローラーのクラスターへのデプロイ リンクのコピーリンクがクリップボードにコピーされました!
カスタムポリシーコントローラーをクラスターにデプロイし、ポリシーコントローラーと ガバナンス ダッシュボードを統合します。以下の手順を実行します。
次のコマンドを実行して、ポリシーコントローラーイメージをビルドします。
make build docker build . -f build/Dockerfile -t <username>/multicloud-operators-policy-controller:latest以下のコマンドを実行して、イメージを選択したリポジトリーにプッシュします。たとえば、以下のコマンドを実行してイメージを Docker Hub にプッシュします。
docker login docker push <username>/multicloud-operators-policy-controller-
kubectlを、Red Hat Advanced Cluster Management for Kubernetes が管理するクラスターを参照するように設定します。 Operator マニフェストを置き換えて、ビルトインイメージ名を使用し、ポリシーを監視するように namespace を更新します。namespace はクラスターの namespace である必要があります。マニフェストは次のような内容になります。
sed -i "" 's|stolostron/multicloud-operators-policy-controller|ycao/multicloud-operators-policy-controller|g' deploy/operator.yaml sed -i "" 's|value: default|value: <namespace>|g' deploy/operator.yaml以下のコマンドを実行して RBAC ロールを更新します。
sed -i "" 's|samplepolicies|testpolicies|g' deploy/cluster_role.yaml sed -i "" 's|namespace: default|namespace: <namespace>|g' deploy/cluster_role_binding.yamlポリシーコントローラーをクラスターにデプロイします。
以下のコマンドを実行して、クラスターのサービスアカウントを設定します。
kubectl apply -f deploy/service_account.yaml -n <namespace>次のコマンドを実行して、Operator の RBAC を設定します。
kubectl apply -f deploy/role.yaml -n <namespace> kubectl apply -f deploy/role_binding.yaml -n <namespace>ポリシーコントローラーの RBAC を設定します。以下のコマンドを実行します。
kubectl apply -f deploy/cluster_role.yaml kubectl apply -f deploy/cluster_role_binding.yaml以下のコマンドを実行してカスタムリソース定義 (CRD) を設定します。
kubectl apply -f deploy/crds/policies.open-cluster-management.io_samplepolicies_crd.yaml以下のコマンドを実行して
multicloud-operator-policy-controllerをデプロイします。kubectl apply -f deploy/operator.yaml -n <namespace>以下のコマンドを実行して、コントローラーが機能していることを確認します。
kubectl get pod -n <namespace>
-
コントローラーが監視する
policy-templateを作成してポリシーコントローラーを統合する必要があります。詳細は、コンソールからのクラスターセキュリティーポリシーの作成 を参照してください。
2.3.5.2.1. コントローラーデプロイメントのスケーリング リンクのコピーリンクがクリップボードにコピーされました!
ポリシーコントローラーデプロイメントでは削除がサポートされていません。デプロイメントをスケーリングして、デプロイメントが適用される Pod を更新することができます。以下の手順を実行します。
- ターゲットのマネージドクラスターにログインします。
- カスタムポリシーコントローラーのデプロイメントに移動します。
- デプロイメントでスケーリングします。デプロイメントをゼロ Pod にスケーリングすると、ポリシーコントロールのデプロイメントが無効になります。
デプロイメントの詳細は、OpenShift Container Platform デプロイメント を参照してください。
ポリシーコントローラーがクラスターにデプロイされ、クラスターに統合されています。製品のポリシーコントローラーを表示します。詳細は、ポリシーコントローラー を参照してください。