5.5. Compliance Operator のスキャンの管理

5.5.1. サポートされているコンプライアンスプロファイル

Compliance Operator (CO) のインストールの一部として利用可能なプロファイルは複数あります。次のプロファイルを使用すると、クラスター内のギャップを評価できます。ただし、使用するだけでは特定のプロファイルへの準拠を推測または保証できません。また、プロファイルは監査人はありません。

このようなさまざまな標準に対する準拠または認定を実現するには、Qualified Security Assessor (QSA)、Joint Authorization Board (JAB)、または業界で認められたその他の規制当局など、認定監査機関と協力して、環境を評価する必要があります。標準への準拠を実現するには、認定監査人と協力する必要があります。

重要

Compliance Operator は、OpenShift Dedicated や Azure Red Hat OpenShift などの一部のマネージドプラットフォームで誤った結果を報告する可能性があります。詳細は、Red Hat ナレッジベースソリューション Red Hat Knowledgebase Solution #6983418 を参照してください。

5.5.1.1. コンプライアンスプロファイル

Compliance Operator は、次のコンプライアンスプロファイルを提供します。

表5.1 サポートされているコンプライアンスプロファイル

プロファイルプロファイルタイトルアプリケーションCompliance Operator バージョン業界コンプライアンスベンチマークサポート対象のアーキテクチャーサポート対象のプラットフォーム

rhcos4-stig

Defense Information Systems Agency Security Technical Implementation Guide (DISA STIG) for Red Hat Openshift

ノード

1.3.0+

DISA-STIG [1]

x86_64

Hosted Control Plane を備えた Red Hat OpenShift Service on AWS (ROSA HCP) - 1.5.0 以上が必要

ocp4-stig-node

Defense Information Systems Agency Security Technical Implementation Guide (DISA STIG) for Red Hat Openshift

ノード

1.3.0+

DISA-STIG [1]

x86_64

Hosted Control Plane を備えた Red Hat OpenShift Service on AWS (ROSA HCP) - 1.5.0 以上が必要

ocp4-stig

Defense Information Systems Agency Security Technical Implementation Guide (DISA STIG) for Red Hat Openshift

プラットフォーム

1.3.0+

DISA-STIG [1]

x86_64

 

ocp4-cis-1-4

CIS Red Hat OpenShift Container Platform 4 Benchmark v1.4.0

プラットフォーム

1.2.0+

CIS Benchmarks ™ [1]

x86_64 ppc64le s390x

 

ocp4-cis-node-1-4

CIS Red Hat OpenShift Container Platform 4 Benchmark v1.4.0

ノード [2]

1.2.0+

CIS Benchmarks ™ [1]

x86_64 ppc64le s390x

Hosted Control Plane を備えた Red Hat OpenShift Service on AWS (ROSA HCP) - 1.5.0 以上が必要

ocp4-cis

CIS Red Hat OpenShift Container Platform 4 Benchmark v1.5.0

プラットフォーム

1.4.1+

CIS Benchmarks ™ [1]

x86_64 ppc64le s390x

 

ocp4-cis-node

CIS Red Hat OpenShift Container Platform 4 Benchmark v1.5.0

ノード [2]

1.4.1+

CIS Benchmarks ™ [1]

x86_64 ppc64le s390x

Hosted Control Plane を備えた Red Hat OpenShift Service on AWS (ROSA HCP) - 1.5.0 以上が必要

ocp4-e8

Australian Cyber Security Centre (ACSC) Essential Eight

プラットフォーム

0.1.39+

ACSC Hardening Linux ワークステーションおよびサーバー

x86_64

 

ocp4-moderate

NIST 800-53 Moderate-Impact Baseline for Red Hat OpenShift - Platform level

プラットフォーム

0.1.39+

NIST SP-800-53 Release Search

x86_64 ppc64le s390x

 

rhcos4-e8

Australian Cyber Security Centre (ACSC) Essential Eight

ノード

0.1.39+

ACSC Hardening Linux ワークステーションおよびサーバー

x86_64

Hosted Control Plane を備えた Red Hat OpenShift Service on AWS (ROSA HCP) - 1.5.0 以上が必要

rhcos4-moderate

NIST 800-53 Moderate-Impact Baseline for Red Hat Enterprise Linux CoreOS

ノード

0.1.39+

NIST SP-800-53 Release Search

x86_64

Hosted Control Plane を備えた Red Hat OpenShift Service on AWS (ROSA HCP) - 1.5.0 以上が必要

ocp4-moderate-node

NIST 800-53 Moderate-Impact Baseline for Red Hat OpenShift - Node level

ノード [2]

0.1.44+

NIST SP-800-53 Release Search

x86_64 ppc64le s390x

Hosted Control Plane を備えた Red Hat OpenShift Service on AWS (ROSA HCP) - 1.5.0 以上が必要

ocp4-nerc-cip

North American Electric Reliability Corporation (NERC) Critical Infrastructure Protection (CIP) cybersecurity standards profile for the Red Hat OpenShift Container Platform - Platform レベル

プラットフォーム

0.1.44+

NERC CIP 標準

x86_64

 

ocp4-nerc-cip-node

North American Electric Reliability Corporation (NERC) Critical Infrastructure Protection (CIP) cybersecurity standards profile for the Red Hat OpenShift Container Platform - Node レベル

ノード [2]

0.1.44+

NERC CIP 標準

x86_64

Hosted Control Plane を備えた Red Hat OpenShift Service on AWS (ROSA HCP) - 1.5.0 以上が必要

rhcos4-nerc-cip

North American Electric Reliability Corporation (NERC) Critical Infrastructure Protection (CIP) cybersecurity standards profile for Red Hat Enterprise Linux CoreOS

ノード

0.1.44+

NERC CIP 標準

x86_64

Hosted Control Plane を備えた Red Hat OpenShift Service on AWS (ROSA HCP) - 1.5.0 以上が必要

ocp4-pci-dss

PCI-DSS v3.2.1 Control Baseline for Red Hat OpenShift Container Platform 4

プラットフォーム

0.1.47+

PCI Security Standards ® Council Document Library

x86_64 ppc64le

 

ocp4-pci-dss-node

PCI-DSS v3.2.1 Control Baseline for Red Hat OpenShift Container Platform 4

ノード [2]

0.1.47+

PCI Security Standards ® Council Document Library

x86_64 ppc64le

Hosted Control Plane を備えた Red Hat OpenShift Service on AWS (ROSA HCP) - 1.5.0 以上が必要

ocp4-high

NIST 800-53 Moderate-Impact Baseline for Red Hat OpenShift - プラットフォームレベル

プラットフォーム

0.1.52+

NIST SP-800-53 Release Search

x86_64

 

ocp4-high-node

NIST 800-53 High-Impact Baseline for Red Hat OpenShift - ノードレベル

ノード [2]

0.1.52+

NIST SP-800-53 Release Search

x86_64

Hosted Control Plane を備えた Red Hat OpenShift Service on AWS (ROSA HCP) - 1.5.0 以上が必要

rhcos4-high

NIST 800-53 High-Impact Baseline for Red Hat Enterprise Linux CoreOS

ノード

0.1.52+

NIST SP-800-53 Release Search

x86_64

Hosted Control Plane を備えた Red Hat OpenShift Service on AWS (ROSA HCP) - 1.5.0 以上が必要

  1. CIS OpenShift Container Platform v4 ベンチマークを見つけるには、CIS ベンチマーク に移動し、最新の CIS ベンチマークをダウンロード をクリックします。ここでベンチマークをダウンロードするために登録できます。
  2. ノードプロファイルは、関連するプラットフォームプロファイルとともに使用する必要があります。詳細は、Compliance Operator のプロファイルタイプ を参照してください。
5.5.1.1.1. 拡張コンプライアンスプロファイルについて

一部のコンプライアンスプロファイルには、業界のベストプラクティスに従う必要がある制御が含まれており、その結果、一部のプロファイルが他のプロファイルを拡張します。Center for Internet Security (CIS) のベストプラクティスと National Institute of Standards and Technology (NIST) のセキュリティーフレームワークを組み合わせることで、セキュアな準拠環境を実現するパスが確立されます。

たとえば NIST の High-Impact プロファイルおよび Moderate-Impact プロファイルは、コンプライアンスを達成するために CIS プロファイルを拡張します。その結果、拡張されたコンプライアンスプロファイルを使用することで、1 つのクラスターで両方のプロファイルを実行する必要がなくなります。

表5.2 プロファイルの拡張

プロファイル拡張対象

ocp4-pci-dss

ocp4-cis

ocp4-pci-dss-node

ocp4-cis-node

ocp4-high

ocp4-cis

ocp4-high-node

ocp4-cis-node

ocp4-moderate

ocp4-cis

ocp4-moderate-node

ocp4-cis-node

ocp4-nerc-cip

ocp4-moderate

ocp4-nerc-cip-node

ocp4-moderate-node

5.5.1.2. 関連情報

5.5.2. Compliance Operator のスキャン

ScanSetting および ScanSettingBinding API は、Compliance Operator でコンプライアンススキャンを実行するために使用することが推奨されます。これらの API オブジェクトの詳細については、以下を実行します。

$ oc explain scansettings

または

$ oc explain scansettingbindings

5.5.2.1. コンプライアンススキャンの実行

Center for Internet Security (CIS) プロファイルを使用してスキャンを実行できます。便宜上、Compliance Operator は起動時に適切なデフォルト値を持つ ScanSetting オブジェクトを作成します。この ScanSetting オブジェクトの名前は default です。

注記

オールインワンのコントロールプレーンノードとワーカーノードの場合、コンプライアンススキャンはワーカーノードとコントロールプレーンノードで 2 回実行されます。コンプライアンススキャンは、一貫性のないスキャン結果を生成する可能性があります。ScanSetting オブジェクトで単一のロールのみを定義することにより、一貫性のない結果を回避できます。

手順

  1. 以下を実行して ScanSetting オブジェクトを検査します。

    $ oc describe scansettings default -n openshift-compliance

    出力例

    Name:         default
    Namespace:    openshift-compliance
    Labels:       <none>
    Annotations:  <none>
    API Version:  compliance.openshift.io/v1alpha1
    Kind:         ScanSetting
    Metadata:
      Creation Timestamp:  2022-10-10T14:07:29Z
      Generation:          1
      Managed Fields:
        API Version:  compliance.openshift.io/v1alpha1
        Fields Type:  FieldsV1
        fieldsV1:
          f:rawResultStorage:
            .:
            f:nodeSelector:
              .:
              f:node-role.kubernetes.io/master:
            f:pvAccessModes:
            f:rotation:
            f:size:
            f:tolerations:
          f:roles:
          f:scanTolerations:
          f:schedule:
          f:showNotApplicable:
          f:strictNodeScan:
        Manager:         compliance-operator
        Operation:       Update
        Time:            2022-10-10T14:07:29Z
      Resource Version:  56111
      UID:               c21d1d14-3472-47d7-a450-b924287aec90
    Raw Result Storage:
      Node Selector:
        node-role.kubernetes.io/master:
      Pv Access Modes:
        ReadWriteOnce 1
      Rotation:  3 2
      Size:      1Gi 3
      Tolerations:
        Effect:              NoSchedule
        Key:                 node-role.kubernetes.io/master
        Operator:            Exists
        Effect:              NoExecute
        Key:                 node.kubernetes.io/not-ready
        Operator:            Exists
        Toleration Seconds:  300
        Effect:              NoExecute
        Key:                 node.kubernetes.io/unreachable
        Operator:            Exists
        Toleration Seconds:  300
        Effect:              NoSchedule
        Key:                 node.kubernetes.io/memory-pressure
        Operator:            Exists
    Roles:
      master 4
      worker 5
    Scan Tolerations: 6
      Operator:           Exists
    Schedule:             0 1 * * * 7
    Show Not Applicable:  false
    Strict Node Scan:     true
    Events:               <none>

    1
    Compliance Operator は、スキャンの結果が含まれる永続ボリューム (PV) を作成します。デフォルトで、Compliance Operator はクラスターに設定されるストレージクラスについて何らかの仮定をすることができないため、PV はアクセスモード ReadWriteOnce を使用します。さらに、ReadWriteOnce アクセスモードはほとんどのクラスターで利用できます。スキャン結果を取得する必要がある場合は、ボリュームもバインドするヘルパー Pod を使用して実行できます。ReadWriteOnce アクセスモードを使用するボリュームは、一度に 1 つの Pod のみがマウントできるため、必ずヘルパー Pod を削除してください。そうでない場合は、Compliance Operator は後続のスキャンのためにボリュームを再利用できません。
    2
    Compliance Operator は、後続の 3 つのスキャンの結果をボリュームに保持し、古いスキャンはローテーションされます。
    3
    Compliance Operator はスキャンの結果用に 1 GB のストレージを割り当てます。
    4 5
    スキャン設定がクラスターノードをスキャンするプロファイルを使用する場合は、これらのノードロールをスキャンします。
    6
    デフォルトのスキャン設定オブジェクトは、すべてのノードをスキャンします。
    7
    デフォルトのスキャン設定オブジェクトは、毎日 01:00 にスキャンを実行します。

    デフォルトのスキャン設定の代わりに、以下の設定を含む default-auto-apply を使用できます。

    Name:                      default-auto-apply
    Namespace:                 openshift-compliance
    Labels:                    <none>
    Annotations:               <none>
    API Version:               compliance.openshift.io/v1alpha1
    Auto Apply Remediations:   true 1
    Auto Update Remediations:  true 2
    Kind:                      ScanSetting
    Metadata:
      Creation Timestamp:  2022-10-18T20:21:00Z
      Generation:          1
      Managed Fields:
        API Version:  compliance.openshift.io/v1alpha1
        Fields Type:  FieldsV1
        fieldsV1:
          f:autoApplyRemediations:
          f:autoUpdateRemediations:
          f:rawResultStorage:
            .:
            f:nodeSelector:
              .:
              f:node-role.kubernetes.io/master:
            f:pvAccessModes:
            f:rotation:
            f:size:
            f:tolerations:
          f:roles:
          f:scanTolerations:
          f:schedule:
          f:showNotApplicable:
          f:strictNodeScan:
        Manager:         compliance-operator
        Operation:       Update
        Time:            2022-10-18T20:21:00Z
      Resource Version:  38840
      UID:               8cb0967d-05e0-4d7a-ac1c-08a7f7e89e84
    Raw Result Storage:
      Node Selector:
        node-role.kubernetes.io/master:
      Pv Access Modes:
        ReadWriteOnce
      Rotation:  3
      Size:      1Gi
      Tolerations:
        Effect:              NoSchedule
        Key:                 node-role.kubernetes.io/master
        Operator:            Exists
        Effect:              NoExecute
        Key:                 node.kubernetes.io/not-ready
        Operator:            Exists
        Toleration Seconds:  300
        Effect:              NoExecute
        Key:                 node.kubernetes.io/unreachable
        Operator:            Exists
        Toleration Seconds:  300
        Effect:              NoSchedule
        Key:                 node.kubernetes.io/memory-pressure
        Operator:            Exists
    Roles:
      master
      worker
    Scan Tolerations:
      Operator:           Exists
    Schedule:             0 1 * * *
    Show Not Applicable:  false
    Strict Node Scan:     true
    Events:               <none>
    1 2
    autoUpdateRemediations および autoApplyRemediations フラグを true に設定すると、追加の手順なしに自動修復する ScanSetting オブジェクトを簡単に作成できます。
  2. デフォルトの ScanSetting オブジェクトにバインドし、cis および cis-node プロファイルを使用してクラスターをスキャンする ScanSettingBinding オブジェクトを作成します。以下に例を示します。

    apiVersion: compliance.openshift.io/v1alpha1
    kind: ScanSettingBinding
    metadata:
      name: cis-compliance
      namespace: openshift-compliance
    profiles:
      - name: ocp4-cis-node
        kind: Profile
        apiGroup: compliance.openshift.io/v1alpha1
      - name: ocp4-cis
        kind: Profile
        apiGroup: compliance.openshift.io/v1alpha1
    settingsRef:
      name: default
      kind: ScanSetting
      apiGroup: compliance.openshift.io/v1alpha1
  3. 以下を実行して ScanSettingBinding オブジェクトを作成します。

    $ oc create -f <file-name>.yaml -n openshift-compliance

    プロセスのこの時点で、ScanSettingBinding オブジェクトは調整され、Binding および Bound 設定に基づいて調整されます。Compliance Operator は ComplianceSuite オブジェクトおよび関連付けられる ComplianceScan オブジェクトを作成します。

  4. 以下を実行してコンプライアンススキャンの進捗を確認します。

    $ oc get compliancescan -w -n openshift-compliance

    スキャンはスキャンフェーズに進み、完了すると最終的に DONE フェーズに移行します。ほとんどの場合、スキャンの結果は NON-COMPLIANT になります。スキャン結果を確認し、クラスターがコンプライアンスに基づくように修復の適用を開始することができます。詳細は、Compliance Operator 修復の管理 を参照してください。

5.5.2.2. ワーカーノードでの結果サーバー Pod のスケジューリング

結果サーバー Pod は、生の Asset Reporting Format (ARF) スキャン結果を格納する永続ボリューム (PV) をマウントします。nodeSelector 属性および tolerations 属性を使用すると、結果サーバー Pod の場所を設定できます。

これは、コントロールプレーンノードが永続ボリュームをマウントすることを許可されていない環境で役立ちます。

手順

  • Compliance Operator 用の ScanSetting カスタムリソース (CR) を作成します。

    1. ScanSetting CR を定義し、YAML ファイルを保存します (例: rs-workers.yaml)。

      apiVersion: compliance.openshift.io/v1alpha1
      kind: ScanSetting
      metadata:
        name: rs-on-workers
        namespace: openshift-compliance
      rawResultStorage:
        nodeSelector:
          node-role.kubernetes.io/worker: "" 1
        pvAccessModes:
        - ReadWriteOnce
        rotation: 3
        size: 1Gi
        tolerations:
        - operator: Exists 2
      roles:
      - worker
      - master
      scanTolerations:
        - operator: Exists
      schedule: 0 1 * * *
      1
      Compliance Operator は、このノードを使用してスキャン結果を ARF 形式で保存します。
      2
      結果のサーバー Pod は、すべてのテイントを許容します。
    2. ScanSetting CR を作成するには、次のコマンドを実行します。

      $ oc create -f rs-workers.yaml

検証

  • ScanSetting オブジェクトが作成されたことを確認するには、次のコマンドを実行します。

    $ oc get scansettings rs-on-workers -n openshift-compliance -o yaml

    出力例

    apiVersion: compliance.openshift.io/v1alpha1
    kind: ScanSetting
    metadata:
      creationTimestamp: "2021-11-19T19:36:36Z"
      generation: 1
      name: rs-on-workers
      namespace: openshift-compliance
      resourceVersion: "48305"
      uid: 43fdfc5f-15a7-445a-8bbc-0e4a160cd46e
    rawResultStorage:
      nodeSelector:
        node-role.kubernetes.io/worker: ""
      pvAccessModes:
      - ReadWriteOnce
      rotation: 3
      size: 1Gi
      tolerations:
      - operator: Exists
    roles:
    - worker
    - master
    scanTolerations:
    - operator: Exists
    schedule: 0 1 * * *
    strictNodeScan: true

5.5.2.3. ScanSetting カスタムリソース

ScanSetting カスタムリソースでは、scan limits 属性を使用して、スキャナー Pod のデフォルトの CPU およびメモリー制限をオーバーライドできるようになりました。Compliance Operator は、スキャナーコンテナーに 500Mi メモリー、100m CPU のデフォルトを使用し、api-resource-collector コンテナーに 100m CPU の 200Mi メモリーを使用します。Operator のメモリー制限を設定するには、OLM または Operator デプロイメント自体を介してインストールされている場合は Subscription オブジェクトを変更します。

Compliance Operator のデフォルトの CPU およびメモリーの制限を増やすには、Compliance Operator リソース制限の増加 を参照してください。

重要

デフォルトの制限が十分ではなく、Operator またはスキャナー Pod が Out Of Memory (OOM) プロセスによって終了した場合は、Compliance Operator または Scanner Pod のメモリー制限を増やす必要があります。

5.5.2.4. Hosted Control Plane の管理クラスターの設定

独自のホストされたコントロールプレーンまたは Hypershift 環境をホストしており、管理クラスターからホストされたクラスターをスキャンする場合は、ターゲットであるホストされたクラスターの名前とプレフィックス namespace を設定する必要があります。これは、TailoredProfile を作成することで行なえます。

重要

この手順は、独自の Hosted Control Plane 環境を管理するユーザーにのみ適用されます。

注記

Hosted Control Plane の管理クラスターでは、ocp4-cis および ocp4-pci-dss プロファイルのみサポートされます。

前提条件

  • Compliance Operator が管理クラスターにインストールされている。

手順

  1. 次のコマンドを実行して、スキャン対象のホストされたクラスターの namenamespace を取得します。

    $ oc get hostedcluster -A

    出力例

    NAMESPACE       NAME                   VERSION   KUBECONFIG                              PROGRESS    AVAILABLE   PROGRESSING   MESSAGE
    local-cluster   79136a1bdb84b3c13217   4.13.5    79136a1bdb84b3c13217-admin-kubeconfig   Completed   True        False         The hosted control plane is available

  2. 管理クラスターで、スキャンプロファイルを拡張する TailoredProfile を作成し、スキャンするホストされたクラスターの名前と namespace を定義します。

    例: management-tailoredprofile.yaml

    apiVersion: compliance.openshift.io/v1alpha1
    kind: TailoredProfile
    metadata:
      name: hypershift-cisk57aw88gry
      namespace: openshift-compliance
    spec:
      description: This profile test required rules
      extends: ocp4-cis 1
      title: Management namespace profile
      setValues:
      - name: ocp4-hypershift-cluster
        rationale: This value is used for HyperShift version detection
        value: 79136a1bdb84b3c13217 2
      - name: ocp4-hypershift-namespace-prefix
        rationale: This value is used for HyperShift control plane namespace detection
        value: local-cluster 3

    1
    変数。Hosted Control Plane の管理クラスターでは、ocp4-cis および ocp4-pci-dss プロファイルのみサポートされます。
    2
    value は、前の手順の出力の NAME です。
    3
    value は、直前のステップの出力の NAMESPACE です。
  3. TailoredProfile を作成します。

    $ oc create -n openshift-compliance -f mgmt-tp.yaml

5.5.2.5. リソース要求および制限の適用

kubelet が Pod の一部としてコンテナーを起動すると、kubelet はそのコンテナーの要求および制限をメモリーおよび CPU の要求および制限をコンテナーランタイムに渡します。Linux では、コンテナーランタイムは、定義した制限を適用して有効にするカーネル cgroup を設定します。

CPU 制限は、コンテナーが使用できる CPU 時間を定義します。各スケジューリング期間中、Linux カーネルはこの制限を超えるかどうかを確認します。その場合、カーネルは、cgroup の実行を再開できるようにするまで待機します。

複数の異なるコンテナー (cgroup) を競合するシステムで実行する場合、CPU 要求が大きいワークロードには、要求が小さいワークロードよりも多くの CPU 時間が割り当てられます。メモリー要求は Pod のスケジューリング時に使用されます。cgroups v2 を使用するノードでは、コンテナーランタイムがメモリーリクエストをヒントとして使用して、memory.min および memory.low の 値を設定する場合があります。

コンテナーがこの制限を超えるメモリーを割り当てようとすると、Linux カーネルのメモリー不足サブシステムがアクティブになり、メモリーを割り当てようとしたコンテナー内のプロセスの 1 つを停止して介入します。Pod またはコンテナーのメモリー制限は、emptyDir などのメモリーベースのボリュームのページにも適用できます。

kubelet は、ローカルの一時ストレージとしてではなく、コンテナーメモリーが使用されているときに tmpfs emptyDir ボリュームを追跡します。コンテナーがメモリー要求を超え、それが実行されているノードが全体的にメモリー不足になった場合、Pod のコンテナーが削除される可能性があります。

重要

コンテナーは、長期間にわたって CPU 制限を超えることはできません。コンテナーのランタイムは、CPU 使用率が過剰に使用されている場合も Pod またはコンテナーを停止しません。リソース制限のためにコンテナーをスケジュールできないか、強制終了されているかを判断するには、Compliance Operator のトラブルシューティング を参照してください。

5.5.2.6. コンテナーリソース要求を使用した Pod のスケジューリング

Pod が作成されると、スケジューラーは Pod を実行するノードを選択します。各ノードには、リソースタイプごとに、Pod に提供できる CPU とメモリーの最大容量があります。スケジューラーは、スケジュールされたコンテナーのリソース要求の合計が、各リソースタイプの容量ノードよりも少なくなるようにします。

ノードのメモリーまたは CPU リソースの使用率が非常に低い場合でも、容量チェックでノードのリソース不足を防ぐことができない場合、スケジューラーはノードへの Pod の配置を拒否することがあります。

コンテナーごとに、以下のリソース制限および要求を指定できます。

spec.containers[].resources.limits.cpu
spec.containers[].resources.limits.memory
spec.containers[].resources.limits.hugepages-<size>
spec.containers[].resources.requests.cpu
spec.containers[].resources.requests.memory
spec.containers[].resources.requests.hugepages-<size>

個々のコンテナーに対してのみ要求と制限を指定できますが、Pod の全体的なリソース要求と制限を考慮することも役立ちます。特定のリソースの場合には、コンテナーリソースの要求または制限は、Pod 内にあるコンテナーごとに割り当てられた、対象タイプのリソース要求または制限を合計したものです。

コンテナーリソース要求および制限の例

apiVersion: v1
kind: Pod
metadata:
  name: frontend
spec:
  securityContext:
    runAsNonRoot: true
    seccompProfile:
      type: RuntimeDefault
  containers:
  - name: app
    image: images.my-company.example/app:v4
    resources:
      requests: 1
        memory: "64Mi"
        cpu: "250m"
      limits: 2
        memory: "128Mi"
        cpu: "500m"
    securityContext:
      allowPrivilegeEscalation: false
      capabilities:
        drop: [ALL]
  - name: log-aggregator
    image: images.my-company.example/log-aggregator:v6
    resources:
      requests:
        memory: "64Mi"
        cpu: "250m"
      limits:
        memory: "128Mi"
        cpu: "500m"
    securityContext:
      allowPrivilegeEscalation: false
      capabilities:
        drop: [ALL]

1
コンテナーは 64 Mi のメモリーと 250 m CPU を要求しています。
2
コンテナーの制限は 128 Mi のメモリーと 500 m CPU です。

5.5.3. Compliance Operator の調整

Compliance Operator には、追加の設定なしで使用できるプロファイルが同梱されますが、それらは組織のニーズおよび要件を満たすために変更される必要があります。プロファイルを変更するプロセスは、テーラリング と呼ばれます。

Compliance Operator は、TailoredProfile オブジェクトを提供し、プロファイルを調整します。

5.5.3.1. 調整されたプロファイルの新規作成

TailoredProfile オブジェクトを使用して、調整されたプロファイルをゼロから作成できます。適切な titletitle を設定し、extends フィールドを空のままにします。このカスタムプロファイルが生成するスキャンのタイプを Compliance Operator に指定します。

  • ノードのスキャン: オペレーティングシステムをスキャンします。
  • プラットフォームスキャン: OpenShift Container Platform の設定をスキャンします。

手順

  • TailoredProfile オブジェクトに以下のアノテーションを設定します。

例: new-profile.yaml

apiVersion: compliance.openshift.io/v1alpha1
kind: TailoredProfile
metadata:
  name: new-profile
  annotations:
    compliance.openshift.io/product-type: Node 1
spec:
  extends: ocp4-cis-node 2
  description: My custom profile 3
  title: Custom profile 4
  enableRules:
    - name: ocp4-etcd-unique-ca
      rationale: We really need to enable this
  disableRules:
    - name: ocp4-file-groupowner-cni-conf
      rationale: This does not apply to the cluster

1
それに応じて Node または Platform を設定します。
2
extends フィールドはオプションです。
3
description フィールドを使用して、新しい TailoredProfile オブジェクトの機能を記述します。
4
title フィールドで、TailoredProfile オブジェクトにタイトルを付けます。
注記

TailoredProfile オブジェクトの 名前 フィールドに -node 接尾辞を追加することは、Node 製品タイプのアノテーションを追加することと同様であり、オペレーティングシステムスキャンを生成します。

5.5.3.2. 調整されたプロファイルを使用した既存の ProfileBundles の拡張

TailoredProfile CR は最も一般的なテーラリング操作を有効にする一方で、XCCDF 標準は OpenSCAP プロファイルの調整におけるより多くの柔軟性を提供します。さらに、組織が以前に OpenScap を使用していた場合、既存の XCCDF テーラリングファイルが存在し、これを再利用できる可能性があります。

ComplianceSuite オブジェクトには、カスタムのテーラリングファイルにポイントできるオプションの TailoringConfigMap 属性が含まれます。TailoringConfigMap 属性の値は設定マップの名前です。これには、tailoring.xml というキーが含まれる必要があり、このキーの値はテーラリングのコンテンツです。

手順

  1. Red Hat Enterprise Linux CoreOS (RHCOS) ProfileBundle の利用可能なルールを参照します。

    $ oc get rules.compliance -n openshift-compliance -l compliance.openshift.io/profile-bundle=rhcos4
  2. 同じ ProfileBundle で利用可能な変数を参照します。

    $ oc get variables.compliance -n openshift-compliance -l compliance.openshift.io/profile-bundle=rhcos4
  3. nist-moderate-modified という名前の調整されたプロファイルを作成します。

    1. 調整されたプロファイル nist-moderate-modified に追加するルールを選択します。この例では、2 つのルールを無効にし、1 つの値を変更することにより、rhcos4-moderate プロファイルを拡張します。rationale 値を使用して、これらの変更が加えられた理由を記述します。

      new-profile-node.yaml の例

      apiVersion: compliance.openshift.io/v1alpha1
      kind: TailoredProfile
      metadata:
        name: nist-moderate-modified
      spec:
        extends: rhcos4-moderate
        description: NIST moderate profile
        title: My modified NIST moderate profile
        disableRules:
        - name: rhcos4-file-permissions-var-log-messages
          rationale: The file contains logs of error messages in the system
        - name: rhcos4-account-disable-post-pw-expiration
          rationale: No need to check this as it comes from the IdP
        setValues:
        - name: rhcos4-var-selinux-state
          rationale: Organizational requirements
          value: permissive

      表5.3 スペック変数の属性

      属性説明

      extends

      この TailoredProfile がビルドされる Profile オブジェクトの名前。

      title

      人間が判読できる TailoredProfile のタイトル。

      disableRules

      名前および理論的根拠のペアのリスト。名前ごとに、無効にするルールオブジェクトの名前を参照します。理論的根拠の値は、人間が判読できるテキストで、ルールが無効になっている理由を記述します。

      manualRules

      名前および理論的根拠のペアのリスト。手動ルールを追加すると、チェック結果のステータスは常に manual になり、修復は生成されません。この属性は自動であり、手動ルールとして設定されている場合、デフォルトでは値がありません。

      enableRules

      名前および理論的根拠のペアのリスト。名前ごとに、有効にするルールオブジェクトの名前を参照します。理論的根拠の値は、人間が判読できるテキストで、ルールが有効になっている理由を記述します。

      description

      TailoredProfile を記述する人間が判読できるテキスト。

      setValues

      名前、理論的根拠、および値のグループ化のリスト。各名前は値セットの名前を参照します。この理論的根拠は、値セットを記述する、人間が判読できるテキストです。この値は実際の設定です。

    2. tailoredProfile.spec.manualRules 属性を追加します。

      tailoredProfile.spec.manualRules.yaml

      apiVersion: compliance.openshift.io/v1alpha1
      kind: TailoredProfile
      metadata:
        name: ocp4-manual-scc-check
      spec:
        extends: ocp4-cis
        description: This profile extends ocp4-cis by forcing the SCC check to always return MANUAL
        title: OCP4 CIS profile with manual SCC check
        manualRules:
          - name: ocp4-scc-limit-container-allowed-capabilities
            rationale: We use third party software that installs its own SCC with extra privileges

    3. TailoredProfile オブジェクトを作成します。

      $ oc create -n openshift-compliance -f new-profile-node.yaml 1
      1
      TailoredProfile オブジェクトは、デフォルトの openshift-compliance namespace で作成されます。

      出力例

      tailoredprofile.compliance.openshift.io/nist-moderate-modified created

  4. ScanSettingBinding オブジェクトを定義して、新しい調整されたプロファイル nist-moderate-modified をデフォルトの ScanSetting オブジェクトにバインドします。

    new-scansettingbinding.yaml の例

    apiVersion: compliance.openshift.io/v1alpha1
    kind: ScanSettingBinding
    metadata:
      name: nist-moderate-modified
    profiles:
      - apiGroup: compliance.openshift.io/v1alpha1
        kind: Profile
        name: ocp4-moderate
      - apiGroup: compliance.openshift.io/v1alpha1
        kind: TailoredProfile
        name: nist-moderate-modified
    settingsRef:
      apiGroup: compliance.openshift.io/v1alpha1
      kind: ScanSetting
      name: default

  5. ScanSettingBinding オブジェクトを作成します。

    $ oc create -n openshift-compliance -f new-scansettingbinding.yaml

    出力例

    scansettingbinding.compliance.openshift.io/nist-moderate-modified created

5.5.4. Compliance Operator の未加工の結果の取得

OpenShift Container Platform クラスターのコンプライアンスを証明する際に、監査目的でスキャンの結果を提供する必要がある場合があります。

5.5.4.1. 永続ボリュームからのCompliance Operator の未加工の結果の取得

手順

Compliance Operator は、未加工の結果を生成し、これを永続ボリュームに保存します。これらの結果は Asset Reporting Format (ARF) で生成されます。

  1. ComplianceSuite オブジェクトを確認します。

    $ oc get compliancesuites nist-moderate-modified \
    -o json -n openshift-compliance | jq '.status.scanStatuses[].resultsStorage'

    出力例

    {
         "name": "ocp4-moderate",
         "namespace": "openshift-compliance"
    }
    {
         "name": "nist-moderate-modified-master",
         "namespace": "openshift-compliance"
    }
    {
         "name": "nist-moderate-modified-worker",
         "namespace": "openshift-compliance"
    }

    これは、未加工の結果にアクセスできる永続ボリューム要求 (PVC) を表示します。

  2. 結果のいずれかの名前と namespace を使用して、未加工データの場所を確認します。

    $ oc get pvc -n openshift-compliance rhcos4-moderate-worker

    出力例

    NAME                 	STATUS   VOLUME                                 	CAPACITY   ACCESS MODES   STORAGECLASS   AGE
    rhcos4-moderate-worker   Bound	pvc-548f6cfe-164b-42fe-ba13-a07cfbc77f3a   1Gi    	RWO        	gp2        	92m

  3. ボリュームをマウントする Pod を起動し、結果をコピーして、未加工の結果をフェッチします。

    $ oc create -n openshift-compliance -f pod.yaml

    pod.yaml の例

    apiVersion: "v1"
    kind: Pod
    metadata:
      name: pv-extract
    spec:
      securityContext:
        runAsNonRoot: true
        seccompProfile:
          type: RuntimeDefault
      containers:
        - name: pv-extract-pod
          image: registry.access.redhat.com/ubi9/ubi
          command: ["sleep", "3000"]
          volumeMounts:
          - mountPath: "/workers-scan-results"
            name: workers-scan-vol
          securityContext:
            allowPrivilegeEscalation: false
            capabilities:
              drop: [ALL]
      volumes:
        - name: workers-scan-vol
          persistentVolumeClaim:
            claimName: rhcos4-moderate-worker

  4. Pod の実行後に、結果をダウンロードします。

    $ oc cp pv-extract:/workers-scan-results -n openshift-compliance .
    重要

    永続ボリュームをマウントする Pod を起動すると、要求は Bound として保持されます。使用中のボリュームのストレージクラスのパーミッションが ReadWriteOnce に設定されている場合、ボリュームは一度に 1 つの Pod によってのみマウント可能です。完了したら Pod を削除する必要があります。そうしないと、Operator は Pod をスケジュールし、継続して結果をこの場所に保存し続けることができなくなります。

  5. 展開が完了した後に、Pod を削除できます。

    $ oc delete pod pv-extract -n openshift-compliance

5.5.5. Compliance Operator の結果と修復の管理

それぞれの ComplianceCheckResult は、1 つのコンプライアンスルールチェックの結果を表します。ルールを自動的に修復できる場合、ComplianceCheckResult によって所有される、同じ名前を持つ ComplianceRemediation オブジェクトが作成されます。修復が要求されない限り、修復は自動的に適用されません。これにより、OpenShift Container Platform の管理者は修復内容を確認し、検証後にのみ修復を適用することができます。

重要

Federal Information Processing Standards (FIPS) コンプライアンスを完全に修復するには、クラスターの FIPS モードを有効にする必要があります。FIPS モードを有効にするには、FIPS モードで動作するように設定された Red Hat Enterprise Linux (RHEL) コンピューターからインストールプログラムを実行する必要があります。RHEL での FIPS モードの設定の詳細は、FIPS モードでのシステムのインストール を参照してください。

FIPS モードは、次のアーキテクチャーでサポートされています。

  • x86_64
  • ppc64le
  • s390x

5.5.5.1. コンプライアンスチェック結果のフィルター

デフォルトで、ComplianceCheckResult オブジェクトには、チェックのクエリーおよび結果の生成後に次のステップを決定することを可能にする便利なラベルが複数付けられます。

特定のスイートに属するチェックをリスト表示します。

$ oc get -n openshift-compliance compliancecheckresults \
  -l compliance.openshift.io/suite=workers-compliancesuite

特定のスキャンに属するチェックをリスト表示します。

$ oc get -n openshift-compliance compliancecheckresults \
-l compliance.openshift.io/scan=workers-scan

すべての ComplianceCheckResult オブジェクトが ComplianceRemediation オブジェクトを作成する訳ではありません。自動的に修復できる ComplianceCheckResult オブジェクトのみになります。ComplianceCheckResult オブジェクトには、compliance.openshift.io/automated-remediation ラベルでラベル付けされる場合に関連する修復が含まれます。修復の名前はチェックの名前と同じです。

自動的に修復できる障害のあるチェックをすべてリスト表示します。

$ oc get -n openshift-compliance compliancecheckresults \
-l 'compliance.openshift.io/check-status=FAIL,compliance.openshift.io/automated-remediation'

失敗したすべてのチェックを重大度順に一覧表示します。

$ oc get compliancecheckresults -n openshift-compliance \
-l 'compliance.openshift.io/check-status=FAIL,compliance.openshift.io/check-severity=high'

出力例

NAME                                                           STATUS   SEVERITY
nist-moderate-modified-master-configure-crypto-policy          FAIL     high
nist-moderate-modified-master-coreos-pti-kernel-argument       FAIL     high
nist-moderate-modified-master-disable-ctrlaltdel-burstaction   FAIL     high
nist-moderate-modified-master-disable-ctrlaltdel-reboot        FAIL     high
nist-moderate-modified-master-enable-fips-mode                 FAIL     high
nist-moderate-modified-master-no-empty-passwords               FAIL     high
nist-moderate-modified-master-selinux-state                    FAIL     high
nist-moderate-modified-worker-configure-crypto-policy          FAIL     high
nist-moderate-modified-worker-coreos-pti-kernel-argument       FAIL     high
nist-moderate-modified-worker-disable-ctrlaltdel-burstaction   FAIL     high
nist-moderate-modified-worker-disable-ctrlaltdel-reboot        FAIL     high
nist-moderate-modified-worker-enable-fips-mode                 FAIL     high
nist-moderate-modified-worker-no-empty-passwords               FAIL     high
nist-moderate-modified-worker-selinux-state                    FAIL     high
ocp4-moderate-configure-network-policies-namespaces            FAIL     high
ocp4-moderate-fips-mode-enabled-on-all-nodes                   FAIL     high

手動で修復する必要のある障害のあるチェックをすべてリスト表示します。

$ oc get -n openshift-compliance compliancecheckresults \
-l 'compliance.openshift.io/check-status=FAIL,!compliance.openshift.io/automated-remediation'

手動による修復の手順は、通常 ComplianceCheckResult オブジェクトの description 属性に保存されます。

表5.4 ComplianceCheckResult Status

ComplianceCheckResult Status説明

PASS

コンプライアンスチェックが完了し、パスしました。

FAIL

コンプライアンスチェックが完了するまで実行され、失敗しました。

INFO

コンプライアンスチェックが完了するまで実行され、エラーと見なされるほど深刻ではないものが見つかりました。

MANUAL

コンプライアンスチェックには、成功または失敗を自動的に評価する方法がないため、手動でチェックする必要があります。

INCONSISTENT

コンプライアンスチェックは、さまざまなソース (通常はクラスターノード) からのさまざまな結果を報告します。

ERROR

コンプライアンスチェックは実行されましたが、正しく完了できませんでした。

NOT-APPLICABLE

該当しない、または選択されていないため、コンプライアンスチェックは実行されませんでした。

5.5.5.2. 修復の確認

ComplianceRemediation オブジェクト、および修復を所有する ComplianceCheckResult オブジェクトの両方を確認します。ComplianceCheckResult オブジェクトには、チェック内容やサーバーの強化措置などの人間が判読できる記述、および重大度や関連するセキュリティーコントロールなどの他の metadata が含まれます。ComplianceRemediation オブジェクトは、ComplianceCheckResult に説明されている問題を修正する方法を表します。最初のスキャン後、MissingDependencies 状態の修復を確認します。

以下は、sysctl-net-ipv4-conf-all-accept-redirects というチェックおよび修復の例です。この例では、spec および status のみを表示し、metadata は省略するように編集されています。

spec:
  apply: false
  current:
  object:
    apiVersion: machineconfiguration.openshift.io/v1
    kind: MachineConfig
    spec:
      config:
        ignition:
          version: 3.2.0
        storage:
          files:
            - path: /etc/sysctl.d/75-sysctl_net_ipv4_conf_all_accept_redirects.conf
              mode: 0644
              contents:
                source: data:,net.ipv4.conf.all.accept_redirects%3D0
  outdated: {}
status:
  applicationState: NotApplied

修復ペイロードは spec.current 属性に保存されます。ペイロードには Kubernetes オブジェクトを使用することができますが、この修復はノードスキャンによって生成されたため、上記の例の修復ペイロードは MachineConfig オブジェクトになります。Platform スキャンでは、修復ペイロードは多くの場合 (ConfigMapSecret オブジェクトなど) 異なる種類のオブジェクトになりますが、通常は修復を適用については管理者が判断します。そうでない場合には、Compliance Operator には汎用の Kubernetes オブジェクトを操作するために非常に幅広いパーミッションのセットが必要になるためです。Platform チェックの修復例は、後ほど提供されます。

修復が適用される際に修復内容を正確に確認できるようにするために、MachineConfig オブジェクトの内容は設定の Ignition オブジェクトを使用します。形式についての詳細は、Ignition 仕様 を参照してください。この例では、spec.config.storage.files[0].path 属性は、この修復によって作成されるファイル (/etc/sysctl.d/75-sysctl_net_ipv4_conf_all_accept_redirects.conf) を指定し、spec.config.storage.files[0].contents.source 属性はそのファイルの内容を指定します。

注記

ファイルの内容は URL でエンコードされます。

以下の Python スクリプトを使用して、コンテンツを表示します。

$ echo "net.ipv4.conf.all.accept_redirects%3D0" | python3 -c "import sys, urllib.parse; print(urllib.parse.unquote(''.join(sys.stdin.readlines())))"

出力例

net.ipv4.conf.all.accept_redirects=0

重要

Compliance Operator は、修復の間に発生する可能性のある依存関係の問題を自動的に解決しません。正確な結果を確実に得るためには、修復が適用された後に再度スキャンする必要があります。

5.5.5.3. カスタマイズされたマシン設定プールを使用するときに修復を適用する

カスタム MachineConfigPool を作成するときは、MachineConfigPool にラベルを追加して、KubeletConfig に存在する machineConfigPoolSelector がそのラベルを MachineConfigPool と一致させることができるようにします。

重要

Compliance Operator が修復の適用を終了した後に、MachineConfigPool オブジェクトが予期せず一時停止を解除できない可能性があるため、KubeletConfig ファイルでは、protectKernelDefaults:false を設定しないでください。

手順

  1. ノードを一覧表示します。

    $ oc get nodes -n openshift-compliance

    出力例

    NAME                                       STATUS  ROLES  AGE    VERSION
    ip-10-0-128-92.us-east-2.compute.internal  Ready   master 5h21m  v1.28.5
    ip-10-0-158-32.us-east-2.compute.internal  Ready   worker 5h17m  v1.28.5
    ip-10-0-166-81.us-east-2.compute.internal  Ready   worker 5h17m  v1.28.5
    ip-10-0-171-170.us-east-2.compute.internal Ready   master 5h21m  v1.28.5
    ip-10-0-197-35.us-east-2.compute.internal  Ready   master 5h22m  v1.28.5

  2. ノードにラベルを追加します。

    $ oc -n openshift-compliance \
    label node ip-10-0-166-81.us-east-2.compute.internal \
    node-role.kubernetes.io/<machine_config_pool_name>=

    出力例

    node/ip-10-0-166-81.us-east-2.compute.internal labeled

  3. カスタム MachineConfigPool CR を作成します。

    apiVersion: machineconfiguration.openshift.io/v1
    kind: MachineConfigPool
    metadata:
      name: <machine_config_pool_name>
      labels:
        pools.operator.machineconfiguration.openshift.io/<machine_config_pool_name>: '' 1
    spec:
      machineConfigSelector:
      matchExpressions:
      - {key: machineconfiguration.openshift.io/role, operator: In, values: [worker,<machine_config_pool_name>]}
      nodeSelector:
      matchLabels:
        node-role.kubernetes.io/<machine_config_pool_name>: ""
    1
    labels フィールドは、マシン設定プール (MCP) に追加するラベル名を定義します。
  4. MCP が正常に作成されたことを確認します。

    $ oc get mcp -w

5.5.5.4. デフォルトの設定値をもとにした KubeletConfig ルールの評価

OpenShift Container Platform インフラストラクチャーには、実行時に不完全な設定ファイルが含まれる場合があり、ノードは、設定オプションが欠落している場合には、設定値がデフォルトであることを想定します。一部の設定オプションは、コマンドライン引数として渡すことができます。その結果、Compliance Operator はノード上の設定ファイルが完全かどうかを確認できません。これは、ルールチェックで使用されるオプションが欠落している可能性があるためです。

デフォルトの設定値がチェックに合格するといったフォールスネガティブの結果に陥らないように、Compliance Operator はノード/プロキシー API を使用してノードのプール内にあるノードごとに設定をフェッチし、次にノードプール内のノード全体で整合性が取れた設定オプションすべてをファイルに保存することで、このファイルが対象ノードプール内の全ノードの設定を表します。これにより、スキャン結果の精度が向上します。

デフォルトの マスター および ワーカー ノードプール設定でこの機能を使用するために、追加の設定変更は必要ありません。

5.5.5.5. カスタムノードプールのスキャン

Compliance Operator は、各ノードプール設定のコピーを維持しません。Compliance Operator は、単一ノードプール内のすべてのノードについて一貫性のある設定オプションを設定ファイルの 1 つのコピーに集約します。次に、Compliance Operator は、特定のノードプールの設定ファイルを使用して、そのプール内のノードに対してルールを評価します。

手順

  1. ScanSettingBinding CR に保存される ScanSetting オブジェクトに example ロールを追加します。

    apiVersion: compliance.openshift.io/v1alpha1
    kind: ScanSetting
    metadata:
      name: default
      namespace: openshift-compliance
    rawResultStorage:
      rotation: 3
      size: 1Gi
    roles:
    - worker
    - master
    - example
    scanTolerations:
    - effect: NoSchedule
      key: node-role.kubernetes.io/master
      operator: Exists
    schedule: '0 1 * * *'
  2. ScanSettingBinding CR を使用するスキャンを作成します。

    apiVersion: compliance.openshift.io/v1alpha1
    kind: ScanSettingBinding
    metadata:
      name: cis
      namespace: openshift-compliance
    profiles:
    - apiGroup: compliance.openshift.io/v1alpha1
      kind: Profile
      name: ocp4-cis
    - apiGroup: compliance.openshift.io/v1alpha1
      kind: Profile
      name: ocp4-cis-node
    settingsRef:
      apiGroup: compliance.openshift.io/v1alpha1
      kind: ScanSetting
      name: default

検証

  • Platform KubeletConfig ルールは、Node/Proxy オブジェクトを介してチェックされます。これらのルールは、以下のコマンドを実行して検索できます。

    $ oc get rules -o json | jq '.items[] | select(.checkType == "Platform") | select(.metadata.name | contains("ocp4-kubelet-")) | .metadata.name'

5.5.5.6. KubeletConfig サブプールの修復

KubeletConfig 修復ラベルは MachineConfigPool サブプールに適用できます。

手順

  • ラベルをサブプール MachineConfigPool CR に追加します。

    $ oc label mcp <sub-pool-name> pools.operator.machineconfiguration.openshift.io/<sub-pool-name>=

5.5.5.7. 修復の適用

ブール値の属性 spec.apply は、Compliance Operator で修復を適用するかどうかを制御します。属性を true に設定すると、修復を適用することができます。

$ oc -n openshift-compliance \
patch complianceremediations/<scan-name>-sysctl-net-ipv4-conf-all-accept-redirects \
--patch '{"spec":{"apply":true}}' --type=merge

Compliance Operator が適用された修復を処理した後に、status.ApplicationState 属性は Applied に、または正しくない場合には Error に切り替わります。マシン設定の修復が適用されると、その修復と他のすべての適用済みの修復が 75-$scan-name-$suite-name という名前の MachineConfig オブジェクトにレンダリングされます。MachineConfig オブジェクトはその後 Machine Config Operator によってレンダリングされ、最終的に各ノードで実行されるマシン制御デーモンのインスタンスによってマシン設定プールのすべてのノードに適用されます。

Machine Config Operator が新規 MachineConfig オブジェクトをプール内のノードに適用すると、そのプールに属するすべてのノードが再起動されることに注意してください。これは、それぞれが複合の 75-$scan-name-$suite-name MachineConfig オブジェクトを再度レンダリングする、複数の修復を適用する際に不都合が生じる可能性があります。修復をすぐに適用しないようにするには、MachineConfigPool オブジェクトの .spec.paused 属性を true に設定してマシン設定プールを一時停止できます。

Compliance Operator は修復を自動的に適用できます。ScanSetting の最上位のオブジェクトに autoApplyRemediations: true を設定します。

警告

修復の自動敵に適用するかどうかについては、慎重に考慮する必要があります。

重要

Compliance Operator は、修復の間に発生する可能性のある依存関係の問題を自動的に解決しません。正確な結果を確実に得るためには、修復が適用された後に再度スキャンする必要があります。

5.5.5.8. プラットフォームチェックの手動による修復

通常、プラットフォームスキャンをチェックする場合、以下の 2 つの理由のために管理者が手動で修復する必要があります。

  • 設定する必要のある値は、常に自動的に判別できる訳ではありません。チェックのいずれかで許可されたレジストリーのリストが指定されることが必要になりますが、スキャナー側が組織が許可する必要のあるレジストリーを認識する方法はありません。
  • 異なるチェックで異なる API オブジェクトが変更されるため、クラスター内のオブジェクトを変更するために自動化された修復で root またはスーパーユーザーアクセスを所有することが要求されますが、これは推奨されていません。

手順

  1. 以下の例では、ocp4-ocp-allowed-registries-for-import ルールを使用します。これはデフォルトの OpenShift Container Platform のインストール時に失敗します。ルール oc get rule.compliance/ocp4-ocp-allowed-registries-for-import -oyaml を検査します。このルールは、allowedRegistriesForImport 属性を設定して、ユーザーのイメージのインポートを許可するレジストリーを制限します。さらに、ルールの warning 属性はチェックされた API オブジェクトを表示するため、これを変更し、問題を修復できます。

    $ oc edit image.config.openshift.io/cluster

    出力例

    apiVersion: config.openshift.io/v1
    kind: Image
    metadata:
      annotations:
        release.openshift.io/create-only: "true"
      creationTimestamp: "2020-09-10T10:12:54Z"
      generation: 2
      name: cluster
      resourceVersion: "363096"
      selfLink: /apis/config.openshift.io/v1/images/cluster
      uid: 2dcb614e-2f8a-4a23-ba9a-8e33cd0ff77e
    spec:
      allowedRegistriesForImport:
      - domainName: registry.redhat.io
    status:
      externalRegistryHostnames:
      - default-route-openshift-image-registry.apps.user-cluster-09-10-12-07.devcluster.openshift.com
      internalRegistryHostname: image-registry.openshift-image-registry.svc:5000

  2. スキャンを再実行します。

    $ oc -n openshift-compliance \
    annotate compliancescans/rhcos4-e8-worker compliance.openshift.io/rescan=

5.5.5.9. 修復の更新

新しいバージョンのコンプライアンスコンテンツが使用されると、以前のバージョンとは異なる新しいバージョンの修復が提供される可能性があります。Compliance Operator は、適用される修復の以前のバージョンを保持します。OpenShift Container Platform の管理者は、確認し、適用する新規バージョンについても通知されます。以前に適用されたものの、更新された ComplianceRemediation オブジェクトはそのステータスを Outdated に変更します。古いオブジェクトには簡単に検索できるようにラベルが付けられます。

以前に適用された修復内容は ComplianceRemediation オブジェクトの spec.outdated 属性に保存され、新規に更新された内容は spec.current 属性に保存されます。コンテンツを新しいバージョンに更新した後に、管理者は修復を確認する必要があります。spec.outdated 属性が存在する限り、これは結果として作成される MachineConfig オブジェクトをレンダリングするために使用されます。spec.outdated 属性が削除された後に、Compliance Operator は結果として生成される MachineConfig オブジェクトを再度レンダリングし、これにより Operator は設定をノードにプッシュします。

手順

  1. 古い修復について検索します。

    $ oc -n openshift-compliance get complianceremediations \
    -l complianceoperator.openshift.io/outdated-remediation=

    出力例

    NAME                              STATE
    workers-scan-no-empty-passwords   Outdated

    現在適用されている修復は Outdated 属性に保存され、新規の、適用されていない修復は Current 属性に保存されます。新規バージョンに問題がなれば、Outdated フィールドを削除します。更新された内容を保持する必要がある場合には、 Current および Outdated 属性を削除します。

  2. 修復の新しいバージョンを適用します。

    $ oc -n openshift-compliance patch complianceremediations workers-scan-no-empty-passwords \
    --type json -p '[{"op":"remove", "path":/spec/outdated}]'
  3. 修復の状態は、Outdated から Applied に切り替わります。

    $ oc get -n openshift-compliance complianceremediations workers-scan-no-empty-passwords

    出力例

    NAME                              STATE
    workers-scan-no-empty-passwords   Applied

  4. ノードは新規の修復バージョンを適用し、再起動します。
重要

Compliance Operator は、修復の間に発生する可能性のある依存関係の問題を自動的に解決しません。正確な結果を確実に得るためには、修復が適用された後に再度スキャンする必要があります。

5.5.5.10. 修復の適用解除

以前に適用された修復を適用解除することが必要になる場合があります。

手順

  1. apply フラグを false に設定します。

    $ oc -n openshift-compliance \
    patch complianceremediations/rhcos4-moderate-worker-sysctl-net-ipv4-conf-all-accept-redirects \
    --patch '{"spec":{"apply":false}}' --type=merge
  2. 修復ステータスは NotApplied に変更され、複合の MachineConfig オブジェクトは修復を含まないように再度レンダリングされます。

    重要

    修復を含む影響を受けるすべてのノードが再起動されます。

重要

Compliance Operator は、修復の間に発生する可能性のある依存関係の問題を自動的に解決しません。正確な結果を確実に得るためには、修復が適用された後に再度スキャンする必要があります。

5.5.5.11. KubeletConfig 修復の削除

KubeletConfig の修正は、ノードレベルのプロファイルに含まれています。KubeletConfig 修復を削除するには、KubeletConfig オブジェクトから手動で削除する必要があります。この例は、one-rule-tp-node-master-kubelet-eviction-thresholds-set-hard-imagefs-available 修正のコンプライアンスチェックを削除する方法を示しています。

手順

  1. one-rule-tp-node-master-kubelet-eviction-thresholds-set-hard-imagefs-available 修復の scan-name およびコンプライアンスチェックを見つけます。

    $ oc -n openshift-compliance get remediation \ one-rule-tp-node-master-kubelet-eviction-thresholds-set-hard-imagefs-available -o yaml

    出力例

    apiVersion: compliance.openshift.io/v1alpha1
    kind: ComplianceRemediation
    metadata:
      annotations:
        compliance.openshift.io/xccdf-value-used: var-kubelet-evictionhard-imagefs-available
      creationTimestamp: "2022-01-05T19:52:27Z"
      generation: 1
      labels:
        compliance.openshift.io/scan-name: one-rule-tp-node-master 1
        compliance.openshift.io/suite: one-rule-ssb-node
      name: one-rule-tp-node-master-kubelet-eviction-thresholds-set-hard-imagefs-available
      namespace: openshift-compliance
      ownerReferences:
      - apiVersion: compliance.openshift.io/v1alpha1
        blockOwnerDeletion: true
        controller: true
        kind: ComplianceCheckResult
        name: one-rule-tp-node-master-kubelet-eviction-thresholds-set-hard-imagefs-available
        uid: fe8e1577-9060-4c59-95b2-3e2c51709adc
      resourceVersion: "84820"
      uid: 5339d21a-24d7-40cb-84d2-7a2ebb015355
    spec:
      apply: true
      current:
        object:
          apiVersion: machineconfiguration.openshift.io/v1
          kind: KubeletConfig
          spec:
            kubeletConfig:
              evictionHard:
                imagefs.available: 10% 2
      outdated: {}
      type: Configuration
    status:
      applicationState: Applied

    1
    修復のスキャン名。
    2
    KubeletConfig オブジェクトに追加された修復。
    注記

    修復によって evictionHard kubelet 設定が呼び出される場合は、すべての evictionHard パラメーター (memory.availablenodefs.availablenodefs.inodesFreeimagefs.available、および imagefs.inodesFree) を指定する必要があります。すべてのパラメーターを指定しないと、指定したパラメーターのみが適用され、修正が正しく機能しません。

  2. 修復を削除します。

    1. 修復オブジェクトの apply を false に設定します。

      $ oc -n openshift-compliance patch \
      complianceremediations/one-rule-tp-node-master-kubelet-eviction-thresholds-set-hard-imagefs-available \
      -p '{"spec":{"apply":false}}' --type=merge
    2. scan-name を使用して、修復が適用された KubeletConfig オブジェクトを見つけます。

      $ oc -n openshift-compliance get kubeletconfig \
      --selector compliance.openshift.io/scan-name=one-rule-tp-node-master

      出力例

      NAME                                 AGE
      compliance-operator-kubelet-master   2m34s

    3. KubeletConfig オブジェクトから修復 imagefs.available: 10% を手動で削除します。

      $ oc edit -n openshift-compliance KubeletConfig compliance-operator-kubelet-master
      重要

      修復を含む影響を受けるすべてのノードが再起動されます。

注記

また、修正を自動適用する調整済みプロファイルのスケジュールされたスキャンからルールを除外する必要があります。除外しない場合、修正は次のスケジュールされたスキャン中に再適用されます。

5.5.5.12. 一貫性のない ComplianceScan

ScanSetting オブジェクトは、ScanSetting または ScanSettingBinding オブジェクトから生成されるコンプライアンススキャンがスキャンするノードロールを一覧表示します。通常、各ノードのロールはマシン設定プールにマップされます。

重要

マシン設定プールのすべてのマシンが同一であり、プールのノードからのすべてのスキャン結果が同一であることが予想されます。

一部の結果が他とは異なる場合、Compliance Operator は一部のノードが INCONSISTENT として報告される ComplianceCheckResult オブジェクトにフラグを付けます。すべての ComplianceCheckResult オブジェクトには、compliance.openshift.io/inconsistent-check のラベルも付けられます。

プール内のマシン数は非常に大きくなる可能性があるため、Compliance Operator は最も一般的な状態を検索し、一般的な状態とは異なるノードを一覧表示しようとします。最も一般的な状態は compliance.openshift.io/most-common-status アノテーションに保存され、アノテーション compliance.openshift.io/inconsistent-source には、最も一般的なステータスとは異なるチェックステータスの hostname:status のペアが含まれます。共通状態が見つからない場合、すべての hostname:status ペアが compliance.openshift.io/inconsistent-source アノテーションにリスト表示されます。

可能な場合は、修復が依然として作成され、クラスターが準拠したステータスに収束できるようにします。ただし、これが常に実行可能な訳ではなく、ノード間の差異の修正は手作業で行う必要があります。スキャンに compliance.openshift.io/rescan= オプションのアノテーションを付けて一貫性のある結果を取得するために、コンプライアンススキャンを再実行する必要があります。

$ oc -n openshift-compliance \
annotate compliancescans/rhcos4-e8-worker compliance.openshift.io/rescan=

5.5.5.13. 関連情報

5.5.6. 高度なCompliance Operator タスクの実行

Compliance Operator には、デバッグや既存のツールとの統合を目的とする上級ユーザー向けのオプションが含まれます。

5.5.6.1. ComplianceSuite オブジェクトおよび ComplianceScan オブジェクトの直接使用

ユーザーは ScanSetting および ScanSettingBinding オブジェクトを利用してスイートおよびスキャンを定義することが推奨されますが、 ComplianceSuite オブジェクトを直接定義する有効なユースケースもあります。

  • スキャンする単一ルールのみを指定する。これは、デバッグモードが非常に詳細な情報を取得する可能性があるため、debug: true 属性を使用してデバッグする際に役立ちます。これにより、OpenSCAP スキャナーの詳細度が上がります。テストを 1 つのルールに制限すると、デバッグ情報の量を減らすことができます。
  • カスタム nodeSelector を指定する。修復を適用可能にするには、nodeSelector はプールと一致する必要があります。
  • テーラリングファイルでスキャンをカスタム設定マップをポイントする。
  • テストまたは開発目的の場合で、バンドルからのプロファイルの解析に伴うオーバーヘッドが不要な場合。

以下の例は、単一のルールのみでワーカーマシンをスキャンする ComplianceSuite を示しています。

apiVersion: compliance.openshift.io/v1alpha1
kind: ComplianceSuite
metadata:
  name: workers-compliancesuite
spec:
  scans:
    - name: workers-scan
      profile: xccdf_org.ssgproject.content_profile_moderate
      content: ssg-rhcos4-ds.xml
      contentImage: registry.redhat.io/compliance/openshift-compliance-content-rhel8@sha256:45dc...
      debug: true
      rule: xccdf_org.ssgproject.content_rule_no_direct_root_logins
      nodeSelector:
      node-role.kubernetes.io/worker: ""

上記の ComplianceSuite オブジェクトおよび ComplianceScan オブジェクトは、OpenSCAP が想定する形式で複数の属性を指定します。

プロファイル、コンテンツ、またはルールの値を見つけるには、最初に ScanSetting および ScanSettingBinding から同様の Suite を作成して開始するか、ルールやプロファイルなどの ProfileBundle オブジェクトから解析されたオブジェクトを検査することができます。これらのオブジェクトには、ComplianceSuite から参照するために使用できる xccdf_org 識別子が含まれます。

5.5.6.2. ScanSetting スキャンの PriorityClass の設定

大規模な環境では、デフォルトの PriorityClass オブジェクトの優先順位が低すぎて、Pod が時間どおりにスキャンを実行することを保証できない場合があります。コンプライアンスを維持するか、自動スキャンを保証する必要のあるクラスターの場合、PriorityClass 変数を設定して、Compliance Operator がリソースの制約の状況で常に優先順位が指定されるようにします。

手順

  • PriorityClass 変数を設定します。

    apiVersion: compliance.openshift.io/v1alpha1
    strictNodeScan: true
    metadata:
      name: default
      namespace: openshift-compliance
    priorityClass: compliance-high-priority 1
    kind: ScanSetting
    showNotApplicable: false
    rawResultStorage:
      nodeSelector:
        node-role.kubernetes.io/master: ''
      pvAccessModes:
        - ReadWriteOnce
      rotation: 3
      size: 1Gi
      tolerations:
        - effect: NoSchedule
          key: node-role.kubernetes.io/master
          operator: Exists
        - effect: NoExecute
          key: node.kubernetes.io/not-ready
          operator: Exists
          tolerationSeconds: 300
        - effect: NoExecute
          key: node.kubernetes.io/unreachable
          operator: Exists
          tolerationSeconds: 300
        - effect: NoSchedule
          key: node.kubernetes.io/memory-pressure
          operator: Exists
    schedule: 0 1 * * *
    roles:
      - master
      - worker
    scanTolerations:
      - operator: Exists
    1
    ScanSetting で参照される PriorityClass が見つからない場合、Operator は PriorityClass を空のままで警告を発行し、PriorityClass なしでスキャンのスケジュールを続行します。

5.5.6.3. 未加工の調整済みプロファイルの使用

TailoredProfile CR は最も一般的なテーラリング操作を有効にする一方で、XCCDF 標準は OpenSCAP プロファイルの調整におけるより多くの柔軟性を提供します。さらに、組織が以前に OpenScap を使用していた場合、既存の XCCDF テーラリングファイルが存在し、これを再利用できる可能性があります。

ComplianceSuite オブジェクトには、カスタムのテーラリングファイルにポイントできるオプションの TailoringConfigMap 属性が含まれます。TailoringConfigMap 属性の値は設定マップの名前です。これには、tailoring.xml というキーが含まれる必要があり、このキーの値はテーラリングのコンテンツです。

手順

  1. ファイルから ConfigMap オブジェクトを作成します。

    $ oc -n openshift-compliance \
    create configmap nist-moderate-modified \
    --from-file=tailoring.xml=/path/to/the/tailoringFile.xml
  2. スイートに属するスキャンでテーラリングファイルを参照します。

    apiVersion: compliance.openshift.io/v1alpha1
    kind: ComplianceSuite
    metadata:
      name: workers-compliancesuite
    spec:
      debug: true
      scans:
        - name: workers-scan
          profile: xccdf_org.ssgproject.content_profile_moderate
          content: ssg-rhcos4-ds.xml
          contentImage: registry.redhat.io/compliance/openshift-compliance-content-rhel8@sha256:45dc...
          debug: true
      tailoringConfigMap:
          name: nist-moderate-modified
      nodeSelector:
        node-role.kubernetes.io/worker: ""

5.5.6.4. 再スキャンの実行

通常、毎週月曜日または日次など、定義されたスケジュールでスキャンを再実行する必要がある場合があります。また、ノードの問題を修正した後にスキャンを 1 回再実行することは役に立ちます。単一スキャンを実行するには、スキャンに compliance.openshift.io/rescan= オプションでアノテーションを付けます。

$ oc -n openshift-compliance \
annotate compliancescans/rhcos4-e8-worker compliance.openshift.io/rescan=

再スキャンにより、rhcos-moderate プロファイルの 4 つの追加 mc が生成されます。

$ oc get mc

出力例

75-worker-scan-chronyd-or-ntpd-specify-remote-server
75-worker-scan-configure-usbguard-auditbackend
75-worker-scan-service-usbguard-enabled
75-worker-scan-usbguard-allow-hid-and-hub

重要

スキャン設定の default-auto-apply ラベルが適用されると、修復は自動的に適用され、古い修復が自動的に更新されます。依存関係により適用されなかった修復や、古くなった修復がある場合には、再スキャンにより修復が適用され、再起動がトリガーされる可能性があります。MachineConfig オブジェクトを使用する修復のみが再起動をトリガーします。適用する更新または依存関係がない場合は、再起動は発生しません。

5.5.6.5. 結果についてのカスタムストレージサイズの設定

ComplianceCheckResult などのカスタムリソースは、スキャンされたすべてのノード間での単一チェックの集計された結果を表しますが、スキャナーによって生成される未加工の結果を確認することが役に立つ場合もあります。未加工の結果は ARF 形式で生成され、サイズが大きくなる可能性がありますが (ノードあたり数十メガバイト)、それらを etcd のキーと値のストアでサポートされる Kubernetes リソースに保存することは実際的ではありません。すべてのスキャンは、1GB のサイズにデフォルト設定される永続ボリューム (PV) を作成します。環境によっては、PV サイズを適宜増やす必要がある場合があります。これは、ScanSetting および ComplianceScan リソースの両方に公開される rawResultStorage.size 属性を使用して実行されます。

関連するパラメーターは rawResultStorage.rotation であり、これは古いスキャンのローテーションが行われる前に保持されるスキャンの数を制御します。デフォルト値は 3 です。ローテーションポリシーを 0 に設定するとローテーションは無効になります。デフォルトのローテーションポリシーと、未加工の ARF スキャンレポートにつき 100 MB を見積もり、お使いの環境に適した PV サイズを計算できます。

5.5.6.5.1. カスタム結果ストレージ値の使用

OpenShift Container Platform は各種のパブリッククラウドまたはベアメタルにデプロイできるので、Compliance Operator は利用可能なストレージ設定を判別できません。デフォルトで、Compliance Operator はクラスターのデフォルトのストレージクラスを使用して結果を保存するために PV の作成を試行しますが、カスタムストレージクラスは rawResultStorage.StorageClassName 属性を使用して設定できます。

重要

クラスターがデフォルトのストレージクラスを指定しない場合、この属性を設定する必要があります。

標準ストレージクラスを使用するように ScanSetting カスタムリソースを設定し、サイズが 10GB の永続ボリュームを作成し、最後の 10 件の結果を保持します。

ScanSetting CR の例

apiVersion: compliance.openshift.io/v1alpha1
kind: ScanSetting
metadata:
  name: default
  namespace: openshift-compliance
rawResultStorage:
  storageClassName: standard
  rotation: 10
  size: 10Gi
roles:
- worker
- master
scanTolerations:
- effect: NoSchedule
  key: node-role.kubernetes.io/master
  operator: Exists
schedule: '0 1 * * *'

5.5.6.6. スイートスキャンによって生成される修復の適用

ComplianceSuite オブジェクトで autoApplyRemediations ブール値パラメーターを使用することもできますが、オブジェクトに compliance.openshift.io/apply-remediations のアノテーションを付けることもできます。これにより、Operator は作成されるすべての修復を適用できます。

手順

  • 以下を実行して、compliance.openshift.io/apply-remediations アノテーションを適用します。
$ oc -n openshift-compliance \
annotate compliancesuites/workers-compliancesuite compliance.openshift.io/apply-remediations=

5.5.6.7. 修復の自動更新

新しいコンテンツを含むスキャンは、修復に OUTDATED というマークを付ける可能性があります。管理者は、compliance.openshift.io/remove-outdated アノテーションを適用して新規の修復を適用し、古い修復を削除できます。

手順

  • compliance.openshift.io/remove-outdated アノテーションを適用します。
$ oc -n openshift-compliance \
annotate compliancesuites/workers-compliancesuite compliance.openshift.io/remove-outdated=

または、ScanSetting または ComplianceSuite オブジェクトに autoUpdateRemediations フラグを設定し、修復を自動的に更新します。

5.5.6.8. コンプライアンスオペレーター向けのカスタム SCC の作成

一部の環境では、カスタムのセキュリティーコンテキスト制約 (SCC) ファイルを作成して、コンプライアンスオペレーターの api-resource-collector が正しいアクセス許可を利用できるようにする必要があります。

前提条件

  • admin 権限がある。

手順

  1. restricted-adjusted-compliance.yaml という名前の YAML ファイルで SCC を定義します。

    SecurityContextConstraints オブジェクト定義

      allowHostDirVolumePlugin: false
      allowHostIPC: false
      allowHostNetwork: false
      allowHostPID: false
      allowHostPorts: false
      allowPrivilegeEscalation: true
      allowPrivilegedContainer: false
      allowedCapabilities: null
      apiVersion: security.openshift.io/v1
      defaultAddCapabilities: null
      fsGroup:
        type: MustRunAs
      kind: SecurityContextConstraints
      metadata:
        name: restricted-adjusted-compliance
      priority: 30 1
      readOnlyRootFilesystem: false
      requiredDropCapabilities:
      - KILL
      - SETUID
      - SETGID
      - MKNOD
      runAsUser:
        type: MustRunAsRange
      seLinuxContext:
        type: MustRunAs
      supplementalGroups:
        type: RunAsAny
      users:
      - system:serviceaccount:openshift-compliance:api-resource-collector 2
      volumes:
      - configMap
      - downwardAPI
      - emptyDir
      - persistentVolumeClaim
      - projected
      - secret

    1
    この SCC の優先度は、system:authenticated グループに適用される他のどの SCC よりも高くなければなりません。
    2
    コンプライアンスオペレータースキャナー Pod で使用されるサービスアカウント。
  2. SCC を作成します。

    $ oc create -n openshift-compliance  -f restricted-adjusted-compliance.yaml

    出力例

    securitycontextconstraints.security.openshift.io/restricted-adjusted-compliance created

検証

  1. SCC が作成されたことを確認します。

    $ oc get -n openshift-compliance scc restricted-adjusted-compliance

    出力例

    NAME                             PRIV    CAPS         SELINUX     RUNASUSER        FSGROUP     SUPGROUP   PRIORITY   READONLYROOTFS   VOLUMES
    restricted-adjusted-compliance   false   <no value>   MustRunAs   MustRunAsRange   MustRunAs   RunAsAny   30         false            ["configMap","downwardAPI","emptyDir","persistentVolumeClaim","projected","secret"]

5.5.6.9. 関連情報

5.5.7. Compliance Operator のトラブルシューティング

このセクションでは、Compliance Operator のトラブルシューティングの方法について説明します。この情報は、問題を診断したり、バグレポートに情報を提供したりする際に役立ちます。一般的なヒントには、以下が含まれます。

  • Compliance Operator は、重要なことが発生すると Kubernetes イベントを生成します。コマンドを使用して、クラスター内のすべてのイベントを表示できます。

     $ oc get events -n openshift-compliance

    または、コマンドを使用してスキャンなどのオブジェクトのイベントを表示します。

    $ oc describe -n openshift-compliance compliancescan/cis-compliance
  • Compliance Operator は複数のコントローラーで設定されており、API オブジェクトごとに約 1 つのコントローラーで設定されます。問題のある API オブジェクトに対応するコントローラーのみをフィルターすることが役に立つ場合があります。ComplianceRemediation を適用できない場合、remediationctrl コントローラーのメッセージを表示します。jq で解析することにより、単一のコントローラーからのメッセージをフィルターできます。

    $ oc -n openshift-compliance logs compliance-operator-775d7bddbd-gj58f \
        | jq -c 'select(.logger == "profilebundlectrl")'
  • タイムスタンプについては、UTC の UNIX エポックからの経過時間で秒単位でログに記録されます。人間が判読可能な日付に変換するには、date -d @timestamp --utc を使用します。以下は例になります。

    $ date -d @1596184628.955853 --utc
  • 数多くのカスタムリソースで、最も重要な ComplianceSuite および ScanSettingdebug オプションを設定できます。このオプションを有効にすると、OpenSCAP スキャナー Pod や他のヘルパー Pod の詳細度が上がります。
  • 単一ルールの合否が予期せずに出される場合、そのルールのみを使用して単一スキャンまたはスイートを実行し、対応する ComplianceCheckResult オブジェクトからルール ID を見つけ、それを Scan CR の rule 属性として使用することが役に立つ場合があります。次に、debug オプションが有効になると、スキャナー Pod の scanner コンテナーログに未加工の OpenSCAP ログが表示されます。

5.5.7.1. スキャンの仕組み

以下のセクションでは、Compliance Operator スキャンのコンポーネントおよびステージについて説明します。

5.5.7.1.1. コンプライアンスのソース

コンプライアンスコンテンツは、ProfileBundle オブジェクトから生成される Profile オブジェクトに保存されます。Compliance Operator は、ProfileBundle をクラスター用とクラスターノード用に作成します。

$ oc get -n openshift-compliance profilebundle.compliance
$ oc get -n openshift-compliance profile.compliance

ProfileBundle オブジェクトは、 Bundle の名前でラベルが付けられたデプロイメントで処理されます。Bundle で問題のトラブルシューティングを行うには、デプロイメントを見つけ、デプロイメントで Pod のログを表示できます。

$ oc logs -n openshift-compliance -lprofile-bundle=ocp4 -c profileparser
$ oc get -n openshift-compliance deployments,pods -lprofile-bundle=ocp4
$ oc logs -n openshift-compliance pods/<pod-name>
$ oc describe -n openshift-compliance pod/<pod-name> -c profileparser
5.5.7.1.2. ScanSetting および ScanSettingBinding のライフサイクルおよびデバッグ

有効なコンプライアンスコンテンツソースを使用して、高レベルの ScanSetting および ScanSettingBinding オブジェクトを、ComplianceSuite および ComplianceScan オブジェクトを生成するために使用できます。

apiVersion: compliance.openshift.io/v1alpha1
kind: ScanSetting
metadata:
  name: my-companys-constraints
debug: true
# For each role, a separate scan will be created pointing
# to a node-role specified in roles
roles:
  - worker
---
apiVersion: compliance.openshift.io/v1alpha1
kind: ScanSettingBinding
metadata:
  name: my-companys-compliance-requirements
profiles:
  # Node checks
  - name: rhcos4-e8
    kind: Profile
    apiGroup: compliance.openshift.io/v1alpha1
  # Cluster checks
  - name: ocp4-e8
    kind: Profile
    apiGroup: compliance.openshift.io/v1alpha1
settingsRef:
  name: my-companys-constraints
  kind: ScanSetting
  apiGroup: compliance.openshift.io/v1alpha1

ScanSetting および ScanSettingBinding オブジェクトはどちらも、 logger=scansettingbindingctrl のタグの付けられた同じコントローラーで処理されます。これらのオブジェクトにはステータスがありません。問題はイベントの形式で通信されます。

Events:
  Type     Reason        Age    From                    Message
  ----     ------        ----   ----                    -------
  Normal   SuiteCreated  9m52s  scansettingbindingctrl  ComplianceSuite openshift-compliance/my-companys-compliance-requirements created

今回のリリースにより、ComplianceSuite オブジェクトが作成されました。フローは新規に作成された ComplianceSuite を継続して調整します。

5.5.7.1.3. ComplianceSuite カスタムリソースのライフサイクルおよびデバッグ

ComplianceSuite CR は ComplianceScan CR に関連したラッパーです。ComplianceSuite CR は、 logger=suitectrl のタグが付けられたコントローラーによって処理されます。このコントローラーは、スイートからのスキャンの作成を処理し、個別のスキャンのステータスを調整し、これを単一の Suite ステータスに集約します。スイートが定期的に実行するよう設定されている場合、suitectrl は、初回の実行後にスキャンをスイートで再実行する CronJob CR の作成にも対応します。

$ oc get cronjobs

出力例

NAME                                           SCHEDULE    SUSPEND   ACTIVE   LAST SCHEDULE   AGE
<cron_name>                                    0 1 * * *   False     0        <none>          151m

最も重要な問題について、イベントが生成されます。oc describe compliancesuites/<name> を使用してそれらを表示します。Suite オブジェクトには、 Status サブリソースも含まれており、これはこのスイートに属する Scan オブジェクトが Status サブリソースを更新すると更新されます。予想されるすべてのスキャンが作成されると、コントローラーがスキャンコントローラーに渡されます。

5.5.7.1.4. ComplianceScan カスタムリソースのライフサイクルおよびデバッグ

ComplianceScan CR は scanctrl コントローラーによって処理されます。これは、実際のスキャンとスキャン結果が作成される場所でもあります。それぞれのスキャンは複数のフェーズを経由します。

5.5.7.1.4.1. Pending (保留) フェーズ

このフェーズでは、スキャンがその正確性について検証されます。ストレージサイズなどの一部のパラメーターが無効な場合、スキャンは ERROR 結果と共に DONE に移行します。それ以外の場合は、Launching (起動) フェーズに進みます。

5.5.7.1.4.2. Launching (起動) フェーズ

このフェーズでは、いくつかの設定マップにスキャナー Pod の環境またはスキャナー Pod が評価するスクリプトが直接含まれます。設定マップをリスト表示します。

$ oc -n openshift-compliance get cm \
-l compliance.openshift.io/scan-name=rhcos4-e8-worker,complianceoperator.openshift.io/scan-script=

これらの設定マップはスキャナー Pod によって使用されます。スキャナーの動作を変更したり、スキャナーのデバッグレベルを変更したり、未加工の結果を出力したりする必要がある場合は、1 つの方法として設定マップを変更することができます。その後、未加工の ARF の結果を保存するために永続ボリューム要求 (PVC) がスキャンごとに作成されます。

$ oc get pvc -n openshift-compliance -lcompliance.openshift.io/scan-name=rhcos4-e8-worker

PVC はスキャンごとの ResultServer デプロイメントでマウントされます。ResultServer は、個別のスキャナー Pod が完全な ARF 結果をアップロードする単純な HTTP サーバーです。各サーバーは、異なるノードで実行できます。完全な ARF の結果のサイズは非常に大きくなる可能性があり、複数のノードから同時にマウントできるボリュームを作成することができると想定することはできません。スキャンが終了した後に、ResultServer デプロイメントはスケールダウンされます。未加工の結果のある PVC は別のカスタム Pod からマウントでき、結果はフェッチしたり、検査したりできます。スキャナー Pod と ResultServer 間のトラフィックは相互 TLS プロトコルで保護されます。

最後に、スキャナー Pod はこのフェーズで起動します。Platform スキャンインスタンスの 1 つのスキャナー Pod と、node スキャンインスタンスの一致するノードごとに 1 つのスキャナー Pod です。ノードごとの Pod にはノード名のラベルが付けられます。それぞれの Pod には、常に ComplianceScan という名前のラベルが付けられます。

$ oc get pods -lcompliance.openshift.io/scan-name=rhcos4-e8-worker,workload=scanner --show-labels

出力例

NAME                                                              READY   STATUS      RESTARTS   AGE   LABELS
rhcos4-e8-worker-ip-10-0-169-90.eu-north-1.compute.internal-pod   0/2     Completed   0          39m   compliance.openshift.io/scan-name=rhcos4-e8-worker,targetNode=ip-10-0-169-90.eu-north-1.compute.internal,workload=scanner

+ スキャンは Running (実行) フェーズに進みます。

5.5.7.1.4.3. Running (実行) フェーズ

実行フェーズは、スキャナー Pod の完了後に開始します。以下の用語およびプロセスは実行フェーズで使用されます。

  • init container: content-container という 1 つの init コンテナーがあります。これは、contentImage コンテナーを実行し、contentFile を、この Pod の他のコンテナーで共有される /content ディレクトリーにコピーします。
  • scanner: このコンテナーはスキャンを実行します。ノードのスキャンの場合には、コンテナーはノードファイルシステムを /host としてマウントし、init コンテナーによって配信されるコンテンツをマウントします。また、コンテナーは Launching (起動) フェーズで作成される entrypoint ConfigMap をマウントし、これを実行します。エントリーポイント ConfigMap のデフォルトスクリプトは OpenSCAP を実行し、結果ファイルを Pod のコンテナー間で共有される /results ディレクトリーに保存します。この Pod のログを表示して、OpenSCAP スキャナーがチェックした内容を判別できます。より詳細な出力は、debug フラグを使用して表示できます。
  • logcollector: logcollector コンテナーは、スキャナーコンテナーが終了するまで待機します。その後、これは ConfigMap として完全な ARF 結果を ResultServer にアップロードし、スキャン結果および OpenSCAP 結果コードと共に XCCDF 結果を個別にアップロードします。これらの結果の Config Map には、スキャン名 (compliance.openshift.io/scan-name=rhcos4-e8-worker) のラベルが付けられます。

    $ oc describe cm/rhcos4-e8-worker-ip-10-0-169-90.eu-north-1.compute.internal-pod

    出力例

          Name:         rhcos4-e8-worker-ip-10-0-169-90.eu-north-1.compute.internal-pod
          Namespace:    openshift-compliance
          Labels:       compliance.openshift.io/scan-name-scan=rhcos4-e8-worker
                        complianceoperator.openshift.io/scan-result=
          Annotations:  compliance-remediations/processed:
                        compliance.openshift.io/scan-error-msg:
                        compliance.openshift.io/scan-result: NON-COMPLIANT
                        OpenSCAP-scan-result/node: ip-10-0-169-90.eu-north-1.compute.internal
    
          Data
          ====
          exit-code:
          ----
          2
          results:
          ----
          <?xml version="1.0" encoding="UTF-8"?>
          ...

Platform スキャンのスキャナー Pod も同様ですが、以下の点で異なります。

  • api-resource-collector という追加の init コンテナーがあります。これは content-container init、コンテナーで提供される OpenSCAP コンテンツを読み取り、コンテンツで確認する必要のある API リソースを判別し、それらの API リソースを scanner コンテナーが読み取りを行う共有ディレクトリーに保存します。
  • scanner コンテナーは、ホストファイルシステムをマウントする必要はありません。

スキャナー Pod が実行されると、スキャンは Aggregating (集計) フェーズに移行します。

5.5.7.1.4.4. Aggregating (集計) フェーズ

Aggregating (集計) フェーズでは、スキャンコントローラーがアグリゲーター Pod と呼ばれる別の Pod を起動します。その目的は、結果の ConfigMap オブジェクトを取り、結果を読み取り、それぞれのチェックの結果について対応する Kubernetes オブジェクトを作成することにあります。チェックの失敗を自動的に修復できる場合は、 ComplianceRemediation オブジェクトが作成されます。チェックと修復についての人間が判読できるメタデータを提供するために、アグリゲーター Pod は init コンテナーを使用して OpenSCAP コンテンツもマウントします。

設定マップがアグリゲーター Pod によって処理される場合、これには compliance-remediations/processed ラベルでラベルが付けられます。このフェーズの結果は ComplianceCheckResult オブジェクトになります。

$ oc get compliancecheckresults -lcompliance.openshift.io/scan-name=rhcos4-e8-worker

出力例

NAME                                                       STATUS   SEVERITY
rhcos4-e8-worker-accounts-no-uid-except-zero               PASS     high
rhcos4-e8-worker-audit-rules-dac-modification-chmod        FAIL     medium

ComplianceRemediation オブジェクト:

$ oc get complianceremediations -lcompliance.openshift.io/scan-name=rhcos4-e8-worker

出力例

NAME                                                       STATE
rhcos4-e8-worker-audit-rules-dac-modification-chmod        NotApplied
rhcos4-e8-worker-audit-rules-dac-modification-chown        NotApplied
rhcos4-e8-worker-audit-rules-execution-chcon               NotApplied
rhcos4-e8-worker-audit-rules-execution-restorecon          NotApplied
rhcos4-e8-worker-audit-rules-execution-semanage            NotApplied
rhcos4-e8-worker-audit-rules-execution-setfiles            NotApplied

これらの CR が作成されると、アグリゲーター Pod は終了し、スキャンは Done (終了) フェーズに移行します。

5.5.7.1.4.5. Done (終了) フェーズ

最終のスキャンフェーズでは、必要な場合にスキャンリソースがクリーンアップされ、ResultServer デプロイメントは (スキャンが 1 回限りの場合) スケールダウンされるか、(スキャンが継続される場合) 削除されます。次回のスキャンインスタンスではデプロイメントを再作成します。

また、Done (終了) フェーズでは、スキャンにアノテーションを付けてスキャンの再実行をトリガーすることもできます。

$ oc -n openshift-compliance \
annotate compliancescans/rhcos4-e8-worker compliance.openshift.io/rescan=

スキャンが Done (終了) フェーズに到達した後に、修復が autoApplyRemediations: true を指定して自動的に適用されるように設定されていない限り、自動的に実行されることは何もありません。OpenShift Container Platform 管理者は、修復を確認し、必要に応じてそれらを適用できるようになりました。修復が自動的に適用されるように設定されている場合、ComplianceSuite コントローラーが Done (終了) フェーズで引き継ぎ、マシン設定プールをスキャンがマップされるポイントで一時停止し、すべての修復を 1 回で適用します。修復が適用されると、ComplianceRemediation コントローラーが引き継ぎます。

5.5.7.1.5. ComplianceRemediation コントローラーのライフサイクルおよびデバッグ

サンプルスキャンは特定の結果を報告します。修復の 1 つを有効にするには、apply 属性を true に切り替えます。

$ oc patch complianceremediations/rhcos4-e8-worker-audit-rules-dac-modification-chmod --patch '{"spec":{"apply":true}}' --type=merge

ComplianceRemediation コントローラー (logger=remediationctrl) は変更されたオブジェクトを調整します。調整の結果として、調整される修復オブジェクトのステータスが変更されますが、適用されたすべての修復が含まれる、レンダリングされるスイートごとの MachineConfig オブジェクトも変更されます。

MachineConfig オブジェトは常に 75- で開始し、スキャンとスィートに基づいて名前が付けられます。

$ oc get mc | grep 75-

出力例

75-rhcos4-e8-worker-my-companys-compliance-requirements                                                3.2.0             2m46s

mc を現在設定している修復はマシン設定のアノテーションにリスト表示されます。

$ oc describe mc/75-rhcos4-e8-worker-my-companys-compliance-requirements

出力例

Name:         75-rhcos4-e8-worker-my-companys-compliance-requirements
Labels:       machineconfiguration.openshift.io/role=worker
Annotations:  remediation/rhcos4-e8-worker-audit-rules-dac-modification-chmod:

ComplianceRemediation コントローラーのアルゴリズムは以下のようになります。

  • 現在適用されているすべての修復は初期の修復セットに読み込まれます。
  • 調整された修復が適用されることが予想される場合、それはセットに追加されます。
  • MachineConfig オブジェクトはセットからレンダリングされ、セット内の修復の名前でアノテーションが付けられます。セットが空の場合 (最後の修復は適用されない)、レンダリングされる MachineConfig オブジェクトは削除されます。
  • レンダリングされたマシン設定がクラスターにすでに適用されているものとは異なる場合にのみ、適用される MC は更新されます (または作成されるか、削除されます)。
  • MachineConfig オブジェクトの作成または変更により、machineconfiguration.openshift.io/role ラベルに一致するノードの再起動がトリガーされます。詳細は、Machine Config Operator のドキュメントを参照してください。

修復ループは、レンダリングされたマシン設定が更新され (必要な場合)、調整された修復オブジェクトのステータスが更新されると終了します。この場合、修復を適用すると再起動がトリガーされます。再起動後、スキャンにアノテーションを付け、再度実行します。

$ oc -n openshift-compliance \
annotate compliancescans/rhcos4-e8-worker compliance.openshift.io/rescan=

スキャンが実行され、終了します。渡される修復の有無を確認します。

$ oc -n openshift-compliance \
get compliancecheckresults/rhcos4-e8-worker-audit-rules-dac-modification-chmod

出力例

NAME                                                  STATUS   SEVERITY
rhcos4-e8-worker-audit-rules-dac-modification-chmod   PASS     medium

5.5.7.1.6. 役に立つラベル

Compliance Operator によって起動する各 Pod には、それが属するスキャンおよびその機能にとくに関連するラベルが付けられます。スキャン ID には compliance.openshift.io/scan-name ラベルが付けられます。ワークロード ID には、workload ラベルでラベルが付けられます。

Compliance Operator は以下のワークロードをスケジュールします。

  • scanner: コンプライアンススキャンを実行します。
  • resultserver: コンプライアンススキャンの未加工の結果を保存します。
  • aggregator: 結果を集計し、不整合を検出し、結果オブジェクト (チェックの結果と修復) を出力します。
  • suitererunner: 再実行するスイートにタグを付けます (スケジュールが設定されている場合)。
  • profileparser: データストリームを解析し、適切なプロファイル、ルールおよび変数を作成します。

デバッグおよびログが特定のワークロードに必要な場合は、以下を実行します。

$ oc logs -l workload=<workload_name> -c <container_name>

5.5.7.2. Compliance Operator のリソース制限の増加

Compliance Operator は、デフォルトの制限よりもメモリーを多く必要とする場合があります。この問題を軽減する最善の方法は、カスタムリソースの制限を設定することです。

スキャナー Pod のデフォルトのメモリーおよび CPU 制限を増やすには、ScanSetting カスタムリソース を参照してください。

手順

  1. Operator のメモリー制限を 500 Mi に増やすには、co-memlimit-patch.yaml という名前の以下のパッチファイルを作成します。

    spec:
      config:
        resources:
          limits:
            memory: 500Mi
  2. パッチファイルを適用します。

    $ oc patch sub compliance-operator -nopenshift-compliance --patch-file co-memlimit-patch.yaml --type=merge

5.5.7.3. Operator リソース制約の設定

resources フィールドは、Operator Lifecycle Manager (OLM) によって作成される Pod 内のすべてのコンテナーの Resource Constraints を定義します。

注記

このプロセスで適用されるリソース制約は、既存のリソース制約を上書きします。

手順

  • Subscription オブジェクトを編集して、各コンテナーに 0.25 cpu と 64 Mi のメモリーの要求と、0.5 cpu と 128 Mi のメモリーの制限を挿入します。

    kind: Subscription
    metadata:
      name: custom-operator
    spec:
      package: etcd
      channel: alpha
      config:
        resources:
          requests:
            memory: "64Mi"
            cpu: "250m"
          limits:
            memory: "128Mi"
            cpu: "500m"

5.5.7.4. ScanSetting タイムアウトの設定

ScanSetting オブジェクトには、ComplianceScanSetting オブジェクトで 1h30m などの期間文字列として指定できるタイムアウトオプションがあります。指定されたタイムアウト内にスキャンが終了しない場合、スキャンは maxRetryOnTimeout 制限に達するまで再試行されます。

手順

  • ScanSetting で timeoutmaxRetryOnTimeout を設定するには、既存の ScanSetting オブジェクトを変更します。

    apiVersion: compliance.openshift.io/v1alpha1
    kind: ScanSetting
    metadata:
      name: default
      namespace: openshift-compliance
    rawResultStorage:
      rotation: 3
      size: 1Gi
    roles:
    - worker
    - master
    scanTolerations:
    - effect: NoSchedule
      key: node-role.kubernetes.io/master
      operator: Exists
    schedule: '0 1 * * *'
    timeout: '10m0s' 1
    maxRetryOnTimeout: 3 2
    1
    timeout 変数は、1h30m などの期間文字列として定義されます。デフォルト値は 30m です。タイムアウトを無効にするには、値を 0s に設定します。
    2
    maxRetryOnTimeout 変数は、再試行を試行する回数を定義します。デフォルト値は 3 です。

5.5.7.5. サポート

本書で説明されている手順、または OpenShift Container Platform で問題が発生した場合は、Red Hat カスタマーポータル にアクセスしてください。

カスタマーポータルでは、次のことができます。

  • Red Hat 製品に関するアーティクルおよびソリューションを対象とした Red Hat ナレッジベースの検索またはブラウズ。
  • Red Hat サポートに対するサポートケースの送信。
  • その他の製品ドキュメントへのアクセス。

クラスターの問題を特定するには、OpenShift Cluster Manager で Insights を使用できます。Insights により、問題の詳細と、利用可能な場合は問題の解決方法に関する情報が提供されます。

本書の改善への提案がある場合、またはエラーを見つけた場合は、最も関連性の高いドキュメントコンポーネントの Jira Issue を送信してください。セクション名や OpenShift Container Platform バージョンなどの具体的な情報を提供してください。

5.5.8. oc-compliance プラグインの使用

Compliance Operator はクラスターのチェックおよび修復の多くを自動化しますが、クラスターを準拠させる完全なプロセスでは、管理者が Compliance Operator API や他のコンポーネントと対話する必要があります。oc-compliance プラグインはプロセスを容易にします。

5.5.8.1. oc-compliance プラグインのインストール

手順

  1. oc-compliance イメージをデプロイメントして、oc-compliance バイナリーを取得します。

    $ podman run --rm -v ~/.local/bin:/mnt/out:Z registry.redhat.io/compliance/oc-compliance-rhel8:stable /bin/cp /usr/bin/oc-compliance /mnt/out/

    出力例

    W0611 20:35:46.486903   11354 manifest.go:440] Chose linux/amd64 manifest from the manifest list.

    oc-compliance を実行できるようになりました。

5.5.8.2. 未加工の結果の取得

コンプライアンススキャンが完了すると、個別のチェックの結果は生成される ComplianceCheckResult カスタムリソース (CR) にリスト表示されます。ただし、管理者または監査担当者にはスキャンの詳細情報が必要になる場合があります。OpenSCAP ツールは、詳細な結果で Advanced Recording Format (ARF) 形式のファイルを作成します。この ARF ファイルは設定マップまたは他の標準の Kubernetes リソースに保存するには大き過ぎるため、永続ボリューム (PV) がこれを組み込むように作成されます。

手順

  • Compliance Operator を使用した PV からの結果の取得は 4 つの手順で実行されます。ただし、oc-compliance プラグインでは、単一のコマンドを使用できます。

    $ oc compliance fetch-raw <object-type> <object-name> -o <output-path>
  • <object-type> は、スキャンの機能に使用されたオブジェクトによって、scansettingbindingcompliancescan または compliancesuite のいずれかにすることができます。
  • <object-name> は、ARF ファイルを収集に使用するバインディング、スイート、またはスキャンオブジェクトの名前です。<output-path> は、結果を配置するローカルディレクトリーです。

    以下に例を示します。

    $ oc compliance fetch-raw scansettingbindings my-binding -o /tmp/

    出力例

    Fetching results for my-binding scans: ocp4-cis, ocp4-cis-node-worker, ocp4-cis-node-master
    Fetching raw compliance results for scan 'ocp4-cis'.......
    The raw compliance results are available in the following directory: /tmp/ocp4-cis
    Fetching raw compliance results for scan 'ocp4-cis-node-worker'...........
    The raw compliance results are available in the following directory: /tmp/ocp4-cis-node-worker
    Fetching raw compliance results for scan 'ocp4-cis-node-master'......
    The raw compliance results are available in the following directory: /tmp/ocp4-cis-node-master

ディレクトリー内のファイルの一覧を表示します。

$ ls /tmp/ocp4-cis-node-master/

出力例

ocp4-cis-node-master-ip-10-0-128-89.ec2.internal-pod.xml.bzip2  ocp4-cis-node-master-ip-10-0-150-5.ec2.internal-pod.xml.bzip2  ocp4-cis-node-master-ip-10-0-163-32.ec2.internal-pod.xml.bzip2

結果を抽出します。

$ bunzip2 -c resultsdir/worker-scan/worker-scan-stage-459-tqkg7-compute-0-pod.xml.bzip2 > resultsdir/worker-scan/worker-scan-ip-10-0-170-231.us-east-2.compute.internal-pod.xml

結果を表示します。

$ ls resultsdir/worker-scan/

出力例

worker-scan-ip-10-0-170-231.us-east-2.compute.internal-pod.xml
worker-scan-stage-459-tqkg7-compute-0-pod.xml.bzip2
worker-scan-stage-459-tqkg7-compute-1-pod.xml.bzip2

5.5.8.3. スキャンの再実行

スキャンをスケジュールされたジョブとして実行することは可能ですが、多くの場合、修復の適用後、またはクラスターへの他の変更が加えられるなどの場合にとくにスキャンをオンデマンドで再実行する必要があります。

手順

  • Compliance Operator でスキャンを再実行するには、スキャンオブジェクトでアノテーションを使用する必要があります。ただし、oc-compliance プラグインを使用すると、1 つのコマンドでスキャンを再実行できます。以下のコマンドを入力して、my-binding という名前の ScanSettingBinding オブジェクトのスキャンを再実行します。

    $ oc compliance rerun-now scansettingbindings my-binding

    出力例

    Rerunning scans from 'my-binding': ocp4-cis
    Re-running scan 'openshift-compliance/ocp4-cis'

5.5.8.4. ScanSettingBinding カスタムリソースの使用

Compliance Operator が提供する ScanSetting および ScanSettingBinding カスタムリソース (CR) を使用する場合、schedulemachine rolestolerations などのスキャンオプションのセットを使用している間に、複数のプロファイルに対してスキャンを実行できます。複数の ComplianceSuite オブジェクトまたは ComplianceScan オブジェクトを使用することがより容易になりますが、新規ユーザーが混乱を生じさせる可能性があります。

oc compliance bind サブコマンドは、ScanSettingBinding CR の作成に役立ちます。

手順

  1. 以下を実行します。

    $ oc compliance bind [--dry-run] -N <binding name> [-S <scansetting name>] <objtype/objname> [..<objtype/objname>]
    • -S フラグを省略する場合、Compliance Operator によって提供される default のスキャン設定が使用されます。
    • オブジェクトタイプは、Kubernetes オブジェクトタイプです。profile または tailoredprofile にすることができます。複数のオブジェクトを指定できます。
    • オブジェクト名は、.metadata.name などの Kubernetes リソースの名前です。
    • --dry-run オプションを追加して、作成されるオブジェクトの YAML ファイルを表示します。

      たとえば、以下のプロファイルとスキャン設定を指定します。

      $ oc get profile.compliance -n openshift-compliance

      出力例

      NAME              AGE
      ocp4-cis          9m54s
      ocp4-cis-node     9m54s
      ocp4-e8           9m54s
      ocp4-moderate     9m54s
      ocp4-ncp          9m54s
      rhcos4-e8         9m54s
      rhcos4-moderate   9m54s
      rhcos4-ncp        9m54s
      rhcos4-ospp       9m54s
      rhcos4-stig       9m54s

      $ oc get scansettings -n openshift-compliance

      出力例

      NAME                 AGE
      default              10m
      default-auto-apply   10m

  2. default 設定を ocp4-cis および ocp4-cis-node プロファイルに適用するには、以下を実行します。

    $ oc compliance bind -N my-binding profile/ocp4-cis profile/ocp4-cis-node

    出力例

    Creating ScanSettingBinding my-binding

    ScanSettingBinding CR が作成されると、バインドされたプロファイルは、関連する設定で両方のプロファイルのスキャンを開始します。全体的に、これはCompliance Operator でスキャンを開始するための最も高速な方法です。

5.5.8.5. コントロールの表示

コンプライアンス標準は通常、以下のように階層に編成されます。

  • ベンチマークは、特定の標準についての一連のコントロールの最上位の定義です。例: FedRAMP Moderate または Center for Internet Security (CIS) v.1.6.0。
  • コントロールは、ベンチマークへの準拠を確保するために満たさなければならない要件のファミリーを説明します。例: FedRAMP AC-01(アクセス制御ポリシーおよび手順)。
  • ルールは、コンプライアンスを取るシステムに固有の単一のチェックでありで、これらの 1 つ以上のルールがコントロールにマップされます。
  • Compliance Operator は、単一のベンチマークについてのプロファイルへのルールのグループ化に対応します。プロファイルの一連のルールの条件を満たすコントロールを判別することが容易ではない場合があります。

手順

  • oc compliance controls サブコマンドは、指定されたプロファイルが満たす標準およびコントロールのレポートを提供します。

    $ oc compliance controls profile ocp4-cis-node

    出力例

    +-----------+----------+
    | FRAMEWORK | CONTROLS |
    +-----------+----------+
    | CIS-OCP   | 1.1.1    |
    +           +----------+
    |           | 1.1.10   |
    +           +----------+
    |           | 1.1.11   |
    +           +----------+
    ...

5.5.8.6. コンプライアンス修復の詳細情報の取得

Compliance Operator は、クラスターが準拠できるようにする必要な変更を自動化するために使用される修復オブジェクトを提供します。fetch-fixes サブコマンドは、使用する設定の修復を正確に理解するのに役立ちます。fetch-fixes サブコマンドを使用して、検査するディレクトリーにプロファイル、ルール、または ComplianceRemediation オブジェクトから修復オブジェクトをデプロイメントします。

手順

  1. プロファイルの修復を表示します。

    $ oc compliance fetch-fixes profile ocp4-cis -o /tmp

    出力例

    No fixes to persist for rule 'ocp4-api-server-api-priority-flowschema-catch-all' 1
    No fixes to persist for rule 'ocp4-api-server-api-priority-gate-enabled'
    No fixes to persist for rule 'ocp4-api-server-audit-log-maxbackup'
    Persisted rule fix to /tmp/ocp4-api-server-audit-log-maxsize.yaml
    No fixes to persist for rule 'ocp4-api-server-audit-log-path'
    No fixes to persist for rule 'ocp4-api-server-auth-mode-no-aa'
    No fixes to persist for rule 'ocp4-api-server-auth-mode-node'
    No fixes to persist for rule 'ocp4-api-server-auth-mode-rbac'
    No fixes to persist for rule 'ocp4-api-server-basic-auth'
    No fixes to persist for rule 'ocp4-api-server-bind-address'
    No fixes to persist for rule 'ocp4-api-server-client-ca'
    Persisted rule fix to /tmp/ocp4-api-server-encryption-provider-cipher.yaml
    Persisted rule fix to /tmp/ocp4-api-server-encryption-provider-config.yaml

    1
    ルールが自動的に修復されないか、修復が行われないために対応する修復のないルールがプロファイルにある場合は常に、No fixes to persist の警告が出されることが予想されます。
  2. YAML ファイルのサンプルを表示できます。head コマンドは、最初の 10 行を表示します。

    $ head /tmp/ocp4-api-server-audit-log-maxsize.yaml

    出力例

    apiVersion: config.openshift.io/v1
    kind: APIServer
    metadata:
      name: cluster
    spec:
      maximumFileSizeMegabytes: 100

  3. スキャン後に作成される ComplianceRemediation オブジェクトから修復を表示します。

    $ oc get complianceremediations -n openshift-compliance

    出力例

    NAME                                             STATE
    ocp4-cis-api-server-encryption-provider-cipher   NotApplied
    ocp4-cis-api-server-encryption-provider-config   NotApplied

    $ oc compliance fetch-fixes complianceremediations ocp4-cis-api-server-encryption-provider-cipher -o /tmp

    出力例

    Persisted compliance remediation fix to /tmp/ocp4-cis-api-server-encryption-provider-cipher.yaml

  4. YAML ファイルのサンプルを表示できます。head コマンドは、最初の 10 行を表示します。

    $ head /tmp/ocp4-cis-api-server-encryption-provider-cipher.yaml

    出力例

    apiVersion: config.openshift.io/v1
    kind: APIServer
    metadata:
      name: cluster
    spec:
      encryption:
        type: aescbc

警告

修復を直接適用するには注意が必要です。一部の修復は、適度なプロファイルの usbguard ルールなどのように一括して適用できない場合があります。このような場合、Compliance Operator は依存関係に対応し、クラスターは正常な状態のままになるため、ルールを適用できます。

5.5.8.7. ComplianceCheckResult オブジェクトの詳細の表示

スキャンの実行が終了すると、ComplianceCheckResult オブジェクトが個別のスキャンルールについて作成されます。view-result サブコマンドは、ComplianceCheckResult オブジェクトの詳細の人間が判読できる出力を提供します。

手順

  • 以下を実行します。

    $ oc compliance view-result ocp4-cis-scheduler-no-bind-address