セキュリティーおよびコンプライアンス

OpenShift Container Platform 4.6

OpenShift Container Platform のセキュリティーについての理解および管理

概要

本書では、クラスターのセキュリティー保護に役立つコンテナーのセキュリティー、証明書の設定、および暗号の有効化について説明します。

第1章 コンプライアンス Operator

1.1. コンプライアンス Operator のインストール

コンプライアンス Operator を使用する前に、これがクラスターにデプロイされていることを確認する必要があります。

1.1.1. Web コンソールを使用したコンプライアンス Operator のインストール

前提条件

  • admin 権限がある。

手順

  1. OpenShift Container Platform Web コンソールで、OperatorsOperatorHub ページに移動します。
  2. コンプライアンス Operator を検索し、Install をクリックします。
  3. Installation mode および namespace のデフォルトの選択を維持し、Operator が openshift-compliance namespace にインストールされていることを確認します。
  4. Install をクリックします。

検証

インストールが正常に行われたことを確認するには、以下を実行します。

  1. OperatorsInstalled Operators ページに移動します。
  2. コンプライアンス Operator が openshift-compliance namespace にインストールされ、そのステータスが Succeeded であることを確認します。

Operator が正常にインストールされていない場合、以下を実行します。

  1. OperatorsInstalled Operators ページに移動し、Status 列でエラーまたは失敗の有無を確認します。
  2. WorkloadsPods ページに移動し、 openshift-compliance プロジェクトの Pod で問題を報告しているログの有無を確認します。

1.1.2. CLI を使用したコンプライアンス Operator のインストール

前提条件

  • admin 権限がある。

手順

  1. 以下を実行して Namespace オブジェクト YAML ファイルを作成します。

    $ oc create -f <file-name>.yaml

    出力例

    apiVersion: v1
    kind: Namespace
    metadata:
      name: openshift-compliance

  2. 以下を実行して OperatorGroup オブジェクト YAML ファイルを作成します。

    $ oc create -f <file-name>.yaml

    出力例

    apiVersion: operators.coreos.com/v1
    kind: OperatorGroup
    metadata:
      name: compliance-operator
      namespace: openshift-compliance
    spec:
      targetNamespaces:
      - openshift-compliance

  3. 以下を実行して Subscription オブジェクト YAML ファイルを作成します。

    $ oc create -f <file-name>.yaml

    出力例

    apiVersion: operators.coreos.com/v1alpha1
    kind: Subscription
    metadata:
      name: compliance-operator-sub
      namespace: openshift-compliance
    spec:
      channel: "release-0.1"
      installPlanApproval: Automatic
      name: compliance-operator
      source: redhat-operators
      sourceNamespace: openshift-marketplace

注記

グローバルスケジューラー機能を設定する際に、defaultNodeSelector を有効にする場合、namespace を手動で作成し、openshift-compliance のアノテーションを更新するか、または openshift.io/node-selector: “” を使用してコンプライアンス Operator がインストールされている namespace のアノテーションを更新する必要があります。これにより、デフォルトのノードセレクターが削除され、デプロイメントの失敗を防ぐことができます。

検証

  1. CSV ファイルを確認して、インストールが正常に完了したことを確認します。

    $ oc get csv -n openshift-compliance
  2. コンプライアンス Operator が稼働していることを確認します。

    $ oc get deploy -n openshift-compliance

1.1.3. 追加リソース

1.2. コンプライアンス Operator のスキャン

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

$ oc explain scansettings

または、以下を実行します。

$ oc explain scansettingbindings

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

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

手順

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

    $ oc describe scansettings default -n openshift-compliance

    出力例

    apiVersion: compliance.openshift.io/v1alpha1
    kind: ScanSetting
    metadata:
      name: default
      namespace: openshift-compliance
    rawResultStorage:
      pvAccessModes:
      - ReadWriteOnce 1
      rotation: 3 2
      size: 1Gi 3
    roles:
    - worker 4
    - master 5
    scanTolerations: 6
    - effect: NoSchedule
      key: node-role.kubernetes.io/master
      operator: Exists
    schedule: 0 1 * * * 7

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

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

    apiVersion: compliance.openshift.io/v1alpha1
    kind: ScanSetting
    metadata:
      name: default-auto-apply
      namespace: openshift-compliance
    autoUpdateRemediations: true 1
    autoApplyRemediations: true 2
    rawResultStorage:
      pvAccessModes:
        - ReadWriteOnce
      rotation: 3
      size: 1Gi
    schedule: 0 1 * * *
    roles:
      - worker
      - master
    scanTolerations:
      - effect: NoSchedule
        key: node-role.kubernetes.io/master
        operator: Exists
    1 2
    autoUpdateRemediations および autoApplyRemediations フラグを true に設定すると、追加の手順なしに自動修復する ScanSetting オブジェクトを簡単に作成できます。
  2. デフォルトの ScanSetting オブジェクトにバインドし、cis および cis-node プロファイルを使用してクラスターをスキャンする ScanSettingBinding オブジェクトを作成します。以下は例になります。

    apiVersion: compliance.openshift.io/v1alpha1
    kind: ScanSettingBinding
    metadata:
      name: cis-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 設定に基づいて調整されます。コンプライアンス Operator は ComplianceSuite オブジェクトおよび関連付けられる ComplianceScan オブジェクトを作成します。

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

    $ oc get compliancescan -w -n openshift-compliance

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

1.3. コンプライアンス Operator について

コンプライアンス Operator を使用すると、OpenShift Container Platform 管理者はクラスターの必要なコンプライアンス状態を記述し、存在するギャップやそれらを修復する方法についての概要を提供します。コンプライアンス Operator は、OpenShift Container Platform の Kubernetes API リソースと、クラスターを実行するノードの両方のコンプライアンスを評価します。コンプライアンス Operator は、NIST 認定ツールである OpenSCAP を使用して、コンテンツが提供するセキュリティーポリシーをスキャンし、これを適用します。

重要

コンプライアンス Operator は Red Hat Enterprise Linux CoreOS (RHCOS) デプロイメントでのみ利用できます。

1.3.1. コンプライアンス Operator のプロファイル

コンプライアンス Operator のインストールの一部として利用可能なプロファイルは複数あります。

利用可能なプロファイルを表示します。

$ oc get -n <namespace> profiles.compliance

出力例

NAME              AGE
ocp4-cis          4h52m
ocp4-cis-node     4h52m
ocp4-e8           4h52m
ocp4-moderate     4h52m
rhcos4-e8         4h52m
rhcos4-moderate   4h52m

これらのプロファイルは、複数の異なるコンプライアンスベンチマークを表します。

プロファイルの詳細を表示します。

$ oc get -n <namespace> -oyaml profiles.compliance <profile name>

出力例

apiVersion: compliance.openshift.io/v1alpha1
description: |-
  This profile contains configuration checks for Red Hat
  Enterprise Linux CoreOS that align to the Australian
  Cyber Security Centre (ACSC) Essential Eight.
  A copy of the Essential Eight in Linux Environments guide can
  be found at the ACSC website: ...
id: xccdf_org.ssgproject.content_profile_e8
kind: Profile
metadata:
  annotations:
    compliance.openshift.io/product: redhat_enterprise_linux_coreos_4
    compliance.openshift.io/product-type: Node
    creationTimestamp: "2020-09-07T11:42:51Z"
    generation: 1
  labels:
    compliance.openshift.io/profile-bundle: rhcos4
    name: rhcos4-e8
  namespace: openshift-compliance
rules:
- rhcos4-accounts-no-uid-except-zero
- rhcos4-audit-rules-dac-modification-chmod
- rhcos4-audit-rules-dac-modification-chown
- rhcos4-audit-rules-execution-chcon
- rhcos4-audit-rules-execution-restorecon
- rhcos4-audit-rules-execution-semanage
- rhcos4-audit-rules-execution-setfiles
- rhcos4-audit-rules-execution-setsebool
- rhcos4-audit-rules-execution-seunshare
- rhcos4-audit-rules-kernel-module-loading
- rhcos4-audit-rules-login-events
- rhcos4-audit-rules-login-events-faillock
- rhcos4-audit-rules-login-events-lastlog
- rhcos4-audit-rules-login-events-tallylog
- rhcos4-audit-rules-networkconfig-modification
- rhcos4-audit-rules-sysadmin-actions
- rhcos4-audit-rules-time-adjtimex
- rhcos4-audit-rules-time-clock-settime
- rhcos4-audit-rules-time-settimeofday
- rhcos4-audit-rules-time-stime
- rhcos4-audit-rules-time-watch-localtime
- rhcos4-audit-rules-usergroup-modification
- rhcos4-auditd-data-retention-flush
- rhcos4-auditd-freq
- rhcos4-auditd-local-events
- rhcos4-auditd-log-format
- rhcos4-auditd-name-format
- rhcos4-auditd-write-logs
- rhcos4-configure-crypto-policy
- rhcos4-configure-ssh-crypto-policy
- rhcos4-no-empty-passwords
- rhcos4-selinux-policytype
- rhcos4-selinux-state
- rhcos4-service-auditd-enabled
- rhcos4-sshd-disable-empty-passwords
- rhcos4-sshd-disable-gssapi-auth
- rhcos4-sshd-disable-rhosts
- rhcos4-sshd-disable-root-login
- rhcos4-sshd-disable-user-known-hosts
- rhcos4-sshd-do-not-permit-user-env
- rhcos4-sshd-enable-strictmodes
- rhcos4-sshd-print-last-log
- rhcos4-sshd-set-loglevel-info
- rhcos4-sshd-use-priv-separation
- rhcos4-sysctl-kernel-dmesg-restrict
- rhcos4-sysctl-kernel-kexec-load-disabled
- rhcos4-sysctl-kernel-kptr-restrict
- rhcos4-sysctl-kernel-randomize-va-space
- rhcos4-sysctl-kernel-unprivileged-bpf-disabled
- rhcos4-sysctl-kernel-yama-ptrace-scope
- rhcos4-sysctl-net-core-bpf-jit-harden
title: Australian Cyber Security Centre (ACSC) Essential Eight

必要なプロファイル内のルールを表示します。

$ oc get -n <namespace> -oyaml rules.compliance <rule_name>

出力例

apiVersion: compliance.openshift.io/v1alpha1
description: '<code>auditd</code><code>augenrules</code><code>.rules</code><code>/etc/audit/rules.d</code><pre>-w /var/log/tallylog -p wa -k logins -w /var/run/faillock -p wa -k logins -w /var/log/lastlog -p wa -k logins</pre><code>auditd</code><code>auditctl</code><code>/etc/audit/audit.rules</code><pre>-w /var/log/tallylog -p wa -k logins -w /var/run/faillock -p wa -k logins -w /var/log/lastlog -p wa -k logins</pre>file in order to watch for unattempted manual edits of files involved in storing logon events:'
id: xccdf_org.ssgproject.content_rule_audit_rules_login_events
kind: Rule
metadata:
  annotations:
    compliance.openshift.io/rule: audit-rules-login-events
    control.compliance.openshift.io/NIST-800-53: AU-2(d);AU-12(c);AC-6(9);CM-6(a)
    policies.open-cluster-management.io/controls: AU-2(d),AU-12(c),AC-6(9),CM-6(a)
    policies.open-cluster-management.io/standards: NIST-800-53
    creationTimestamp: "2020-09-07T11:43:03Z"
    generation: 1
  labels:
    compliance.openshift.io/profile-bundle: rhcos4
  name: rhcos4-audit-rules-login-events
  namespace: openshift-compliance
  rationale: |-
    Manual editing of these files may indicate nefarious activity,
    such as an attacker attempting to remove evidence of an
    intrusion.
  severity: medium
  title: Record Attempts to Alter Logon and Logout Events
  warning: |-
    <ul><li><code>audit_rules_login_events_tallylog</code></li>
    <li><code>audit_rules_login_events_faillock</code></li>
    <li><code>audit_rules_login_events_lastlog</code></li></ul>
    This rule checks for multiple syscalls related to login
    events and was written with DISA STIG in mind.
    Other policies should use separate rule for
    each syscall that needs to be checked.

各プロファイルには、適用先の製品名がプロファイル名のプレフィックスとして追加されます。ocp4-e8 は Essential 8 ベンチマークを OpenShift Container Platform 製品に適用し、rhcos4-e8 は Essential 8 ベンチマークを Red Hat CoreOS 製品に適用します。

1.4. コンプライアンス Operator の管理

本セクションでは、コンプライアンスコンテンツの更新されたバージョンを使用する方法や、カスタム ProfileBundle オブジェクトを作成する方法など、セキュリティーコンテンツのライフサイクルについて説明します。

1.4.1. セキュリティーコンテンツの更新

セキュリティーコンテンツは、ProfileBundle オブジェクトが参照するコンテナーイメージとして提供されます。ProfileBundles や、ルールまたはプロファイルなどのバンドルから解析されたカスタムリソースへの更新を正確に追跡するには、タグの代わりにダイジェストを使用してコンプライアンスコンテンツを持つコンテナーイメージを識別します。

出力例

  apiVersion: compliance.openshift.io/v1alpha1
  kind: ProfileBundle
  metadata:
    name: rhcos4
  spec:
    contentImage: quay.io/user/ocp4-openscap-content@sha256:a1749f5150b19a9560a5732fe48a89f07bffc79c0832aa8c49ee5504590ae687 1
    contentFile: ssg-rhcos4-ds.xml

1
セキュリティーコンテナーイメージ。

それぞれの ProfileBundle はデプロイメントでサポートされます。コンプライアンス Operator がコンテナーイメージダイジェストが変更されたことを検知すると、デプロイメントは変更を反映し、コンテンツを再び解析するように更新されます。タグの代わりにダイジェストを使用すると、安定した予測可能なプロファイルセットを使用できます。

1.4.2. イメージストリームの使用

contentImage 参照は有効な ImageStreamTag を参照し、コンプライアンス Operator はコンテンツを自動的に最新の状態に維持します。

注記

さらに、ProfileBundle オブジェクトは ImageStream 参照を受け入れます。

イメージストリームのサンプル

$ oc get is -n openshift-compliance

出力例

NAME           	   IMAGE REPOSITORY                                                                       	TAGS     UPDATED
openscap-ocp4-ds   image-registry.openshift-image-registry.svc:5000/openshift-compliance/openscap-ocp4-ds   latest   32 seconds ago

手順

  1. ルックアップポリシーが local に設定されていることを確認します。

    $ oc patch is openscap-ocp4-ds \
        -p '{"spec":{"lookupPolicy":{"local":true}}}' \
        --type=merge
        imagestream.image.openshift.io/openscap-ocp4-ds patched
        -n openshift-compliance
  2. istag 名を取得して、ProfileBundleImageStreamTag の名前を使用します。

    $ oc get istag -n openshift-compliance

    出力例

    NAME                  	IMAGE REFERENCE                                                                                                                                              	UPDATED
    openscap-ocp4-ds:latest   image-registry.openshift-image-registry.svc:5000/openshift-compliance/openscap-ocp4-ds@sha256:46d7ca9b7055fe56ade818ec3e62882cfcc2d27b9bf0d1cbae9f4b6df2710c96   3 minutes ago

  3. ProfileBundle を作成します。

    $ cat << EOF | oc create -f -
    apiVersion: compliance.openshift.io/v1alpha1
    kind: ProfileBundle
    metadata:
      name: mybundle
       spec:
         contentImage: openscap-ocp4-ds:latest
         contentFile: ssg-rhcos4-ds.xml
    EOF

この ProfileBundle はイメージを追跡し、これに適用される変更 (異なるハッシュを参照するようにタグを更新するなど) は ProfileBundle にただちに反映されます。

1.4.3. ProfileBundle CR の例

バンドルオブジェクトには、contentImage が含まれるコンテナーイメージの URL とコンプライアンスコンテンツが含まれるファイルの 2 つの情報が必要です。contentFile パラメーターはファイルシステムのルートに相対します。ビルトインの rhcos4 ProfileBundle オブジェクトは以下の例で定義できます。

  apiVersion: compliance.openshift.io/v1alpha1
  kind: ProfileBundle
  metadata:
    name: rhcos4
  spec:
    contentImage: quay.io/complianceascode/ocp4:latest 1
    contentFile: ssg-rhcos4-ds.xml 2
1
コンテンツイメージの場所。
2
コンプライアンスコンテンツが含まれるファイルの場所。
重要

コンテンツイメージに使用されるベースイメージには、coreutils が含まれる必要があります。

1.4.4. 追加リソース

1.5. コンプライアンス Operator の調整

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

コンプライアンス Operator は、TailoredProfile というプロファイルを簡単に調整できるオブジェクトを提供します。これは、既存のプロファイルを拡張していることを前提とし、ProfileBundle からのルールおよび値を有効/無効を可能にします。

注記

拡張する必要のあるプロファイルが属する ProfileBundle の一部として利用できるルールおよび変数のみを使用できます。

1.5.1. 調整されたプロファイルの使用

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

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

手順

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

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

    $ oc get variables.compliance -l compliance.openshift.io/profile-bundle=rhcos4
  3. TailoredProfile に追加するルールを選択します。この TailoredProfile 例は、2 つのルールを無効にし、1 つの値を変更します。rationale 値を使用して、これらの変更が加えられた理由を記述します。

    出力例

    apiVersion: compliance.openshift.io/v1alpha1
    kind: TailoredProfile
    metadata:
      name: nist-moderate-modified
    spec:
      extends: rhcos4-moderate
      title: My modified NIST moderate profile
      disableRules:
      - name: rhcos4-file-permissions-node-config
        rationale: This breaks X application.
      - 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

  4. プロファイルを ScanSettingsBinding オブジェクトに追加します。

    $ cat nist-moderate-modified.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. TailoredProfile を作成します。

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

    出力例

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

1.6. コンプライアンス Operator の未加工の結果の取得

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

1.6.1. 永続ボリュームからのコンプライアンス Operator の未加工の結果の取得

手順

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

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

    $ oc get compliancesuites nist-moderate-modified -o json \
        | jq '.status.scanStatuses[].resultsStorage'
        {
          "name": "rhcos4-moderate-worker",
          "namespace": "openshift-compliance"
        }
        {
          "name": "rhcos4-moderate-master",
          "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 を起動し、結果をコピーして、未加工の結果をフェッチします。

    サンプル Pod

    apiVersion: "v1"
    kind: Pod
    metadata:
      name: pv-extract
    spec:
      containers:
        - name: pv-extract-pod
          image: registry.access.redhat.com/ubi8/ubi
          command: ["sleep", "3000"]
          volumeMounts:
          - mountPath: "/workers-scan-results"
            name: workers-scan-vol
      volumes:
        - name: workers-scan-vol
          persistentVolumeClaim:
            claimName: rhcos4-moderate-worker

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

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

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

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

    $ oc delete pod pv-extract

1.7. コンプライアンス Operator 修復の管理

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

1.7.1. 修復の確認

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

以下は、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.1.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 オブジェクトなど) 異なる種類のオブジェクトになりますが、通常は修復を適用については管理者が判断します。そうでない場合には、コンプライアンス 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

1.7.2. 修復の適用

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

$ oc patch complianceremediations/<scan_name>-sysctl-net-ipv4-conf-all-accept-redirects --patch '{"spec":{"apply":true}}' --type=merge

コンプライアンス 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 に設定してマシン設定プールを一時停止できます。

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

警告

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

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

通常、プラットフォームスキャンをチェックする場合、以下の 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 annotate compliancescans/<scan_name> compliance.openshift.io/rescan=

1.7.4. 修復の更新

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

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

手順

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

    $ oc get complianceremediations -lcomplianceoperator.openshift.io/outdated-remediation=

    出力例

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

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

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

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

    $ oc get complianceremediations workers-scan-no-empty-passwords

    出力例

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

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

1.7.5. 修復の適用解除

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

手順

  1. フラグを false に切り替えます。

    $ oc patch complianceremediations/<scan_name>-sysctl-net-ipv4-conf-all-accept-redirects
  2. 修復ステータスは NotApplied に変更され、複合の MachineConfig オブジェクトは修復を含まないように再度レンダリングされます。

    重要

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

1.7.6. 一貫性のない修復

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

重要

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

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

プール内のマシン数は非常に大きくなる可能性があるため、コンプライアンス 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 annotate compliancescans/<scan_name> compliance.openshift.io/rescan=

1.7.7. 失敗したコンプライアンスチェックの結果のフィルター

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

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

$ oc get compliancecheckresults -l compliance.openshift.io/suite=example-compliancesuite

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

$ oc get compliancecheckresults -l compliance.openshift.io/scan=example-compliancescan

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

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

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

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

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

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

1.8. 高度なコンプライアンス Operator タスクの実行

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

1.8.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: quay.io/complianceascode/ocp4:latest
      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 識別子が含まれます。

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

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

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

手順

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

    $ oc create configmap <scan_name> --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: quay.io/complianceascode/ocp4:latest
          debug: true
      tailoringConfigMap:
          name: <scan_name>
      nodeSelector:
        node-role.kubernetes.io/worker: ""

1.8.3. 再スキャンの実行

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

$ oc annotate compliancescans/<scan_name> compliance.openshift.io/rescan=
重要

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

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

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

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

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

OpenShift Container Platform は各種のパブリッククラウドまたはベアメタルにデプロイできるので、コンプライアンス Operator は利用可能なストレージ設定を判別できません。デフォルトで、コンプライアンス 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 * * *'

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

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

手順

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

1.8.6. 修復の自動更新

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

手順

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

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

1.9. コンプライアンス Operator のトラブルシューティング

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

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

     $ oc get events -n openshift-compliance

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

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

    $ oc 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 ログが表示されます。

1.9.1. スキャンの仕組み

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

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

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

$ oc get profilebundle.compliance
$ oc get profile.compliance

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

$ oc logs -lprofile-bundle=ocp4 -c profileparser
$ oc get deployments,pods -lprofile-bundle=ocp4
$ oc logs pods/<pod-name>
$ oc describe pod/<pod-name> -c profileparser

1.9.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 を継続して調整します。

1.9.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 サブリソースを更新すると更新されます。予想されるすべてのスキャンが作成されると、コントローラーがスキャンコントローラーに渡されます。

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

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

1.9.1.4.1. Pending (保留) フェーズ

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

1.9.1.4.2. Launching (起動) フェーズ

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

$ oc get cm -lcompliance.openshift.io/scan-name=rhcos4-e8-worker,complianceoperator.openshift.io/scan-script=

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

$ oc get pvc -lcompliance.openshift.io/scan-name=<scan_name>

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
At this point, the scan proceeds to the Running phase.

1.9.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 結果を個別にアップロードします。これらの結果の設定マップには、スキャン名 (compliance.openshift.io/scan-name=<scan_name>) のラベルが付けられます。

    $ 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 (集計) フェーズに移行します。

1.9.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 (終了) フェーズに移行します。

1.9.1.4.5. Done (終了) フェーズ

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

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

$ oc annotate compliancescans/<scan_name> compliance.openshift.io/rescan=

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

1.9.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                                                2.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 annotate compliancescans/<scan_name> compliance.openshift.io/rescan=

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

$ oc get compliancecheckresults/rhcos4-e8-worker-audit-rules-dac-modification-chmod

出力例

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

1.9.1.6. 役に立つラベル

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

コンプライアンス Operator は以下のワークロードをスケジュールします。

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

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

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

1.9.2. サポート

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

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

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

本書の改善が提案される場合や、エラーが見つかった場合は、Documentation コンポーネントの OpenShift Container Platform 製品に対して、Bugzilla レポートを送信してください。セクション名や OpenShift Container Platform バージョンなどの具体的な情報を提供してください。

第2章 File Integrity Operator

2.1. File Integrity Operator のインストール

2.1.1. Web コンソールでの File Integrity Operator のインストール

前提条件

  • admin 権限がある。

手順

  1. OpenShift Container Platform Web コンソールで、OperatorsOperatorHub ページに移動します。
  2. File Integrity Operator を検索し、Install をクリックします。
  3. Installation mode および namespace のデフォルトの選択を維持し、Operator が openshift-file-integrity namespace にインストールされていることを確認します。
  4. Install をクリックします。

検証

インストールが正常に行われたことを確認するには、以下を実行します。

  1. OperatorsInstalled Operators ページに移動します。
  2. Operator が openshift-file-integrity namespace にインストールされており、そのステータスが Succeeded であることを確認します。

Operator が正常にインストールされていない場合、以下を実行します。

  1. OperatorsInstalled Operators ページに移動し、Status 列でエラーまたは失敗の有無を確認します。
  2. WorkloadsPods ページに移動し、openshift-file-integrity プロジェクトの Pod で問題を報告しているログの有無を確認します。

2.1.2. CLI を使用した File Integrity Operator のインストール

前提条件

  • admin 権限がある。

手順

  1. 以下を実行して Namespace オブジェクト YAML ファイルを作成します。

    $ oc create -f <file-name>.yaml

    出力例

    apiVersion: v1
    kind: Namespace
    metadata:
      name: openshift-file-integrity

  2. OperatorGroup オブジェクト YAML ファイルを作成します。

    $ oc create -f <file-name>.yaml

    出力例

    apiVersion: operators.coreos.com/v1
    kind: OperatorGroup
    metadata:
      name: file-integrity-operator
      namespace: openshift-file-integrity
    spec:
      targetNamespaces:
      - openshift-file-integrity

  3. Subscription オブジェクト YAML ファイルを作成します。

    $ oc create -f <file-name>.yaml

    出力例

    apiVersion: operators.coreos.com/v1alpha1
    kind: Subscription
    metadata:
      name: file-integrity-operator
      namespace: openshift-file-integrity
    spec:
      channel: "release-0.1"
      installPlanApproval: Automatic
      name: file-integrity-operator
      source: redhat-operators
      sourceNamespace: openshift-marketplace

検証

  1. CSV ファイルを確認して、インストールが正常に完了したことを確認します。

    $ oc get csv -n openshift-file-integrity
  2. File Integrity Operator が稼働していることを確認します。

    $ oc get deploy -n openshift-file-integrity

2.1.3. 追加リソース

2.2. File Integrity Operator について

File Integrity Operator は OpenShift Container Platform Operator であり、クラスターノード上でファイルの整合性チェックを継続的に実行します。これは、各ノードで特権付きの AIDE (advanced intrusion detection environment; 高度な侵入検知環境) コンテナーを各ノードで初期化し、実行するデーモンセットをデプロイし、ステータスオブジェクトをデーモンセット Pod の初回実行時に変更されるファイルのログと共に提供します。

重要

現時点では、Red Hat Enterprise Linux CoreOS (RHCOS) ノードのみがサポートされます。

2.2.1. FileIntegrity カスタムリソースについて

FileIntegrity カスタムリソース (CR) のインスタンスは、1 つ以上のノードの継続的なファイル整合性スキャンのセットを表します。

それぞれの FileIntegrity CR は、 FileIntegrity CR 仕様に一致するノード上で AIDE を実行するデーモンセットによってサポートされます。

以下のサンプル FileIntegrity CR は、ワーカーノードでのみスキャンを有効にしますが、それ以外ではデフォルトを使用します。

サンプル FileIntegrity CR

apiVersion: fileintegrity.openshift.io/v1alpha1
kind: FileIntegrity
metadata:
  name: worker-fileintegrity
  namespace: openshift-file-integrity
spec:
  nodeSelector:
      node-role.kubernetes.io/worker: ""
  config: {}

2.2.2. FileIntegrity カスタムリソースのステータスの確認

FileIntegrity カスタムリソース (CR) は、.status.phase サブリソースでそのステータスを報告します。

手順

  • FileIntegrity CR ステータスをクエリーするには、以下を実行します。

    $ oc get fileintegrities/worker-fileintegrity  -o jsonpath="{ .status.phase }"

    出力例

    Active

2.2.3. FileIntegrity カスタムリソースの各種フェーズ

  • Pending: カスタムリソース (CR) の作成後のフェーズ。
  • Active: バッキングデーモンセットが実行するフェーズ。
  • Initializing: AIDE データベースが再初期化されるフェーズ。

2.2.4. FileIntegrityNodeStatuses オブジェクトについて

FileIntegrity CR のスキャン結果は、FileIntegrityNodeStatuses という別のオブジェクトで報告されます。

$ oc get fileintegritynodestatuses

出力例

NAME                                                AGE
worker-fileintegrity-ip-10-0-130-192.ec2.internal   101s
worker-fileintegrity-ip-10-0-147-133.ec2.internal   109s
worker-fileintegrity-ip-10-0-165-160.ec2.internal   102s

注記

FileIntegrityNodeStatus オブジェクトは、2 回目のスキャナーの実行が終了するまで作成されない可能性があります。この期間は設定可能です。

ノードごとに 1 つの結果オブジェクトがあります。それぞれの FileIntegrityNodeStatus オブジェクトの nodeName 属性は、スキャンされるノードに対応します。ファイル整合性スキャンのステータスは、スキャン条件を保持する results 配列で表示されます。

$ oc get fileintegritynodestatuses.fileintegrity.openshift.io -ojsonpath='{.items[*].results}' | jq

fileintegritynodestatus オブジェクトは AIDE 実行の最新のステータスを報告し、status フィールドに FailedSucceeded、または Errored などのステータスを公開します。

$ oc get fileintegritynodestatuses -w

出力例

NAME                                                               NODE                                         STATUS
example-fileintegrity-ip-10-0-134-186.us-east-2.compute.internal   ip-10-0-134-186.us-east-2.compute.internal   Succeeded
example-fileintegrity-ip-10-0-150-230.us-east-2.compute.internal   ip-10-0-150-230.us-east-2.compute.internal   Succeeded
example-fileintegrity-ip-10-0-169-137.us-east-2.compute.internal   ip-10-0-169-137.us-east-2.compute.internal   Succeeded
example-fileintegrity-ip-10-0-180-200.us-east-2.compute.internal   ip-10-0-180-200.us-east-2.compute.internal   Succeeded
example-fileintegrity-ip-10-0-194-66.us-east-2.compute.internal    ip-10-0-194-66.us-east-2.compute.internal    Failed
example-fileintegrity-ip-10-0-222-188.us-east-2.compute.internal   ip-10-0-222-188.us-east-2.compute.internal   Succeeded
example-fileintegrity-ip-10-0-134-186.us-east-2.compute.internal   ip-10-0-134-186.us-east-2.compute.internal   Succeeded
example-fileintegrity-ip-10-0-222-188.us-east-2.compute.internal   ip-10-0-222-188.us-east-2.compute.internal   Succeeded
example-fileintegrity-ip-10-0-194-66.us-east-2.compute.internal    ip-10-0-194-66.us-east-2.compute.internal    Failed
example-fileintegrity-ip-10-0-150-230.us-east-2.compute.internal   ip-10-0-150-230.us-east-2.compute.internal   Succeeded
example-fileintegrity-ip-10-0-180-200.us-east-2.compute.internal   ip-10-0-180-200.us-east-2.compute.internal   Succeeded

2.2.5. FileIntegrityNodeStatus CR ステータスタイプ

これらの条件は、対応する FileIntegrityNodeStatus CR ステータスの results 配列で報告されます。

  • Succeeded: 整合性チェックにパスしました。データベースが最後に初期化されてから、AIDE チェックの対象となるファイルおよびディレクトリーは変更されていません。
  • Failed: 整合性チェックにパスしません。データベースが最後に初期化されてから、AIDE チェックの対象となるファイルまたはディレクトリーが変更されています。
  • Errored: AIDE スキャナーで内部エラーが発生しました。

2.2.5.1. FileIntegrityNodeStatus CR の成功例

成功ステータスのある状態の出力例

[
  {
    "condition": "Succeeded",
    "lastProbeTime": "2020-09-15T12:45:57Z"
  }
]
[
  {
    "condition": "Succeeded",
    "lastProbeTime": "2020-09-15T12:46:03Z"
  }
]
[
  {
    "condition": "Succeeded",
    "lastProbeTime": "2020-09-15T12:45:48Z"
  }
]

この場合、3 つのスキャンがすべて正常に実行され、現時点ではその他の状態は存在しません。

2.2.5.2. FileIntegrityNodeStatus CR の失敗ステータスの例

障害のある状態をシミュレートするには、AIDE が追跡するファイルの 1 つを変更します。たとえば、ワーカーノードのいずれかで /etc/resolv.conf を変更します。

$ oc debug node/ip-10-0-130-192.ec2.internal

出力例

Creating debug namespace/openshift-debug-node-ldfbj ...
Starting pod/ip-10-0-130-192ec2internal-debug ...
To use host binaries, run `chroot /host`
Pod IP: 10.0.130.192
If you don't see a command prompt, try pressing enter.
sh-4.2# echo "# integrity test" >> /host/etc/resolv.conf
sh-4.2# exit

Removing debug pod ...
Removing debug namespace/openshift-debug-node-ldfbj ...

しばらくすると、Failed 状態が対応する FileIntegrityNodeStatus オブジェクトの results 配列で報告されます。前回の Succeeded 状態は保持されるため、チェックが失敗した時間を特定することができます。

$ oc get fileintegritynodestatuses.fileintegrity.openshift.io/worker-fileintegrity-ip-10-0-130-192.ec2.internal -ojsonpath='{.results}' | jq -r

または、オブジェクト名に言及していない場合は、以下を実行します。

$ oc get fileintegritynodestatuses.fileintegrity.openshift.io -ojsonpath='{.items[*].results}' | jq

出力例

[
  {
    "condition": "Succeeded",
    "lastProbeTime": "2020-09-15T12:54:14Z"
  },
  {
    "condition": "Failed",
    "filesChanged": 1,
    "lastProbeTime": "2020-09-15T12:57:20Z",
    "resultConfigMapName": "aide-ds-worker-fileintegrity-ip-10-0-130-192.ec2.internal-failed",
    "resultConfigMapNamespace": "openshift-file-integrity"
  }
]

Failed 状態は、失敗した内容と理由に関する詳細を示す設定マップを参照します。

$ oc describe cm aide-ds-worker-fileintegrity-ip-10-0-130-192.ec2.internal-failed

出力例

Name:         aide-ds-worker-fileintegrity-ip-10-0-130-192.ec2.internal-failed
Namespace:    openshift-file-integrity
Labels:       file-integrity.openshift.io/node=ip-10-0-130-192.ec2.internal
              file-integrity.openshift.io/owner=worker-fileintegrity
              file-integrity.openshift.io/result-log=
Annotations:  file-integrity.openshift.io/files-added: 0
              file-integrity.openshift.io/files-changed: 1
              file-integrity.openshift.io/files-removed: 0

Data

integritylog:
------
AIDE 0.15.1 found differences between database and filesystem!!
Start timestamp: 2020-09-15 12:58:15

Summary:
  Total number of files:  31553
  Added files:                0
  Removed files:            0
  Changed files:            1


---------------------------------------------------
Changed files:
---------------------------------------------------

changed: /hostroot/etc/resolv.conf

---------------------------------------------------
Detailed information about changes:
---------------------------------------------------


File: /hostroot/etc/resolv.conf
 SHA512   : sTQYpB/AL7FeoGtu/1g7opv6C+KT1CBJ , qAeM+a8yTgHPnIHMaRlS+so61EN8VOpg

Events:  <none>

設定マップのデータサイズの制限により、1 MB を超える AIDE ログが base64 でエンコードされた gzip アーカイブとして障害用の設定マップに追加されます。この場合は、上記のコマンドの出力を base64 --decode | gunzip にパイプ処理する必要があります。圧縮されたログの有無は、設定マップにある file-integrity.openshift.io/compressed アノテーションキーで示唆されます。

2.2.6. イベントについて

FileIntegrity および FileIntegrityNodeStatus オブジェクトのステータスの移行は イベント でログに記録されます。イベントの作成時間は、Initializing から Active など、最新の移行を反映し、必ずしも最新のスキャン結果ではありません。ただし、最新のイベントは常に最新のステータスを反映しています。

$ oc get events --field-selector reason=FileIntegrityStatus

出力例

LAST SEEN   TYPE     REASON                OBJECT                                MESSAGE
97s         Normal   FileIntegrityStatus   fileintegrity/example-fileintegrity   Pending
67s         Normal   FileIntegrityStatus   fileintegrity/example-fileintegrity   Initializing
37s         Normal   FileIntegrityStatus   fileintegrity/example-fileintegrity   Active

ノードのスキャンに失敗すると、イベントは add/changed/removed および設定マップ情報と共に作成されます。

$ oc get events --field-selector reason=NodeIntegrityStatus

出力例

LAST SEEN   TYPE      REASON                OBJECT                                MESSAGE
114m        Normal    NodeIntegrityStatus   fileintegrity/example-fileintegrity   no changes to node ip-10-0-134-173.ec2.internal
114m        Normal    NodeIntegrityStatus   fileintegrity/example-fileintegrity   no changes to node ip-10-0-168-238.ec2.internal
114m        Normal    NodeIntegrityStatus   fileintegrity/example-fileintegrity   no changes to node ip-10-0-169-175.ec2.internal
114m        Normal    NodeIntegrityStatus   fileintegrity/example-fileintegrity   no changes to node ip-10-0-152-92.ec2.internal
114m        Normal    NodeIntegrityStatus   fileintegrity/example-fileintegrity   no changes to node ip-10-0-158-144.ec2.internal
114m        Normal    NodeIntegrityStatus   fileintegrity/example-fileintegrity   no changes to node ip-10-0-131-30.ec2.internal
87m         Warning   NodeIntegrityStatus   fileintegrity/example-fileintegrity   node ip-10-0-152-92.ec2.internal has changed! a:1,c:1,r:0 \ log:openshift-file-integrity/aide-ds-example-fileintegrity-ip-10-0-152-92.ec2.internal-failed

ノードのステータスが移行されなかった場合でも、追加、変更、または削除されたファイルの数を変更すると、新しいイベントが生成されます。

$ oc get events --field-selector reason=NodeIntegrityStatus

出力例

LAST SEEN   TYPE      REASON                OBJECT                                MESSAGE
114m        Normal    NodeIntegrityStatus   fileintegrity/example-fileintegrity   no changes to node ip-10-0-134-173.ec2.internal
114m        Normal    NodeIntegrityStatus   fileintegrity/example-fileintegrity   no changes to node ip-10-0-168-238.ec2.internal
114m        Normal    NodeIntegrityStatus   fileintegrity/example-fileintegrity   no changes to node ip-10-0-169-175.ec2.internal
114m        Normal    NodeIntegrityStatus   fileintegrity/example-fileintegrity   no changes to node ip-10-0-152-92.ec2.internal
114m        Normal    NodeIntegrityStatus   fileintegrity/example-fileintegrity   no changes to node ip-10-0-158-144.ec2.internal
114m        Normal    NodeIntegrityStatus   fileintegrity/example-fileintegrity   no changes to node ip-10-0-131-30.ec2.internal
87m         Warning   NodeIntegrityStatus   fileintegrity/example-fileintegrity   node ip-10-0-152-92.ec2.internal has changed! a:1,c:1,r:0 \ log:openshift-file-integrity/aide-ds-example-fileintegrity-ip-10-0-152-92.ec2.internal-failed
40m         Warning   NodeIntegrityStatus   fileintegrity/example-fileintegrity   node ip-10-0-152-92.ec2.internal has changed! a:3,c:1,r:0 \ log:openshift-file-integrity/aide-ds-example-fileintegrity-ip-10-0-152-92.ec2.internal-failed

2.3. カスタム File Integrity Operator の設定

2.3.1. FileIntegrity オブジェクト属性の表示

Kubernetes カスタムリソース (CR) の場合と同様に、oc explain fileintegrity を実行してから、以下を使用して個別の属性を参照できます。

$ oc explain fileintegrity.spec
$ oc explain fileintegrity.spec.config

2.3.2. 重要な属性

表2.1 重要な spec および spec.config 属性

属性説明

spec.nodeSelector

AIDE Pod が該当ノードでスケジュール対象にするために使用する、ノードのラベルと一致する必要があるキーと値のペアのマップ。通常は、node-role.kubernetes.io/worker: "" がすべてのワーカーノードで AIDE をスケジュールし、node.openshift.io/os_id: "rhcos" がすべての Red Hat Enterprise Linux CoreOS (RHCOS) ノードでスケジュールする単一のキーと値のペアのみを設定します。

spec.debug

ブール値の属性。true に設定すると、AIDE デーモンセットの Pod で実行されるデーモンは追加の情報を出力します。

spec.tolerations

カスタムテイントを持つノードにスケジュールする容認を指定します。指定されない場合は、デフォルトの容認 (Toleration) が適用され、これにより容認はコントロールプレーンノード (別名マスターノード) で実行できます。

spec.config.gracePeriod

AIDE 整合性チェックの間に一時停止する秒数。ノード上で AIDE チェックを頻繁に実行すると、多くのリソースが消費する可能性があるため、間隔をより長く指定することができます。デフォルトは 900 (15 分) です。

spec.config.namespec.config.namespacespec.config.key

この 3 つの属性を使用すると、カスタム AIDE 設定を設定することができます。名前または namespace が設定されていない場合、File Integrity Operator は RHCOS システムに適した設定を生成します。name および namespace 属性は、設定マップを参照します。キーは、設定マップ内のキーを参照します。key 属性を使用して、実際の設定が含まれ、デフォルトで aide.conf に設定されるカスタムキーを指定します。

2.3.3. デフォルト設定の確認

デフォルトの File Integrity Operator 設定は、 FileIntegrity CR と同じ名前で設定マップに保存されます。

手順

  • デフォルトの設定を確認するには、以下を実行します。

    $ oc describe cm/worker-fileintegrity

2.3.4. デフォルトの File Integrity Operator 設定について

以下は、設定マップの aide.conf キーの抜粋です。

@@define DBDIR /hostroot/etc/kubernetes
@@define LOGDIR /hostroot/etc/kubernetes
database=file:@@{DBDIR}/aide.db.gz
database_out=file:@@{DBDIR}/aide.db.gz
gzip_dbout=yes
verbose=5
report_url=file:@@{LOGDIR}/aide.log
report_url=stdout
PERMS = p+u+g+acl+selinux+xattrs
CONTENT_EX = sha512+ftype+p+u+g+n+acl+selinux+xattrs

/hostroot/boot/    	CONTENT_EX
/hostroot/root/\..* PERMS
/hostroot/root/   CONTENT_EX

FileIntegrity インスタンスのデフォルト設定は、以下のディレクトリー下にあるファイルの範囲を指定します。

  • /root
  • /boot
  • /usr
  • /etc

以下のディレクトリーは対象外です。

  • /var
  • /opt
  • /etc/ 下の一部の OpenShift 固有の除外対象

2.3.5. カスタム AIDE 設定の指定

DBDIRLOGDIRdatabase、および database_out などの AIDE 内部動作を設定するエントリーは Operator によって上書きされます。Operator は、整合性に関する変更の有無についてすべてのパスを監視できるようプレフィックスを /hostroot/ に追加します。これにより、コンテナー化された環境用にカスタマイズされない既存の AIDE 設定を再使用や、ルートディレクトリーからの開始がより容易になります。

注記

/hostroot は、AIDE を実行する Pod がホストのファイルシステムをマウントするディレクトリーです。設定を変更すると、データベースの再初期化がトリガーされます。

2.3.6. カスタム File Integrity Operator 設定の定義

この例では、worker-fileintegrity CR に提供されるデフォルト設定に基づいてコントロールプレーンノード (別名マスターノード) で実行されるスキャナーのカスタム設定を定義することに重点を置いています。このワークフローは、デーモンセットとして実行されているカスタムソフトウェアをデプロイし、そのデータをコントロールプレーンノードの /opt/mydaemon の下に保存する場合に役立ちます。

手順

  1. デフォルト設定のコピーを作成します。
  2. デフォルト設定を、監視するか、除外する必要があるファイルで編集します。
  3. 編集したコンテンツを新たな設定マップに保存します。
  4. spec.config の属性を使用して、FileIntegrity オブジェクトを新規の設定マップにポイントします。
  5. デフォルト設定を抽出します。

    $ oc extract cm/worker-fileintegrity --keys=aide.conf

    これにより、編集可能な aide.conf という名前のファイルが作成されます。この例では、Operator のパスの後処理方法を説明するために、プレフィックスなしで除外ディレクトリーを追加します。

    $ vim aide.conf

    出力例

    /hostroot/etc/kubernetes/static-pod-resources
    !/hostroot/etc/kubernetes/aide.*
    !/hostroot/etc/kubernetes/manifests
    !/hostroot/etc/docker/certs.d
    !/hostroot/etc/selinux/targeted
    !/hostroot/etc/openvswitch/conf.db

    コントロールプレーンノードに固有のパスを除外します。

    !/opt/mydaemon/

    その他のコンテンツを /etc に保存します。

    /hostroot/etc/	CONTENT_EX
  6. このファイルに基づいて設定マップを作成します。

    $ oc create cm master-aide-conf --from-file=aide.conf
  7. 設定マップを参照する FileIntegrity CR マニフェストを定義します。

    apiVersion: fileintegrity.openshift.io/v1alpha1
    kind: FileIntegrity
    metadata:
      name: master-fileintegrity
      namespace: openshift-file-integrity
    spec:
      nodeSelector:
          node-role.kubernetes.io/master: ""
      config:
          name: master-aide-conf
          namespace: openshift-file-integrity

    Operator は指定された設定マップファイルを処理し、結果を FileIntegrity オブジェクトと同じ名前の設定マップに保存します。

    $ oc describe cm/master-fileintegrity | grep /opt/mydaemon

    出力例

    !/hostroot/opt/mydaemon

2.3.7. カスタムのファイル整合性設定の変更

ファイル整合性の設定を変更するには、生成される設定マップを変更しないでください。その代わりに、spec.namenamespace、および key 属性を使用して FileIntegrity オブジェクトにリンクされる設定マップを変更します。

2.4. 高度なカスタム File Integrity Operator タスクの実行

2.4.1. データベースの再初期化

File Integrity Operator が予定される変更を検知する場合、データベースの再初期化が必要になることがあります。

手順

  • FileIntegrity カスタムリソース (CR) に file-integrity.openshift.io/re-init のアノテーションを付けます。

    $ oc annotate fileintegrities/worker-fileintegrity file-integrity.openshift.io/re-init=

    古いデータベースとログファイルがバックアップされ、新しいデータベースが初期化されます。oc debug を使用して起動する Pod の以下の出力に示されるように、古いデータベースおよびログは /etc/kubernetes の下にあるノードに保持されます。

    出力例

     ls -lR /host/etc/kubernetes/aide.*
    -rw-------. 1 root root 1839782 Sep 17 15:08 /host/etc/kubernetes/aide.db.gz
    -rw-------. 1 root root 1839783 Sep 17 14:30 /host/etc/kubernetes/aide.db.gz.backup-20200917T15_07_38
    -rw-------. 1 root root   73728 Sep 17 15:07 /host/etc/kubernetes/aide.db.gz.backup-20200917T15_07_55
    -rw-r--r--. 1 root root       0 Sep 17 15:08 /host/etc/kubernetes/aide.log
    -rw-------. 1 root root     613 Sep 17 15:07 /host/etc/kubernetes/aide.log.backup-20200917T15_07_38
    -rw-r--r--. 1 root root       0 Sep 17 15:07 /host/etc/kubernetes/aide.log.backup-20200917T15_07_55

    レコードの永続性を確保するために、生成される設定マップは FileIntegrity オブジェクトによって所有されません。そのため、手動のクリーンアップが必要になります。結果として、以前の整合性の失敗が依然として FileIntegrityNodeStatus オブジェクトに表示されます。

2.4.2. マシン設定の統合

OpenShift Container Platform 4 では、クラスターノード設定は MachineConfig オブジェクトで提供されます。MachineConfig オブジェクトによって生じるファイルへの変更が予想されますが、ファイルの整合性スキャンは失敗しないことを前提にすることができます。MachineConfig オブジェクトの更新によって生じるファイルの変更を抑制するために、File Integrity Operator はノードオブジェクトを監視します。ノードが更新されると、AIDE スキャンは更新の期間一時停止します。更新が完了すると、データベースが再初期化され、スキャンが再開されます。

この一時停止および再開ロジックは、ノードオブジェクトのアノテーションに反映されるため、MachineConfig API での更新にのみ適用されます。

2.4.3. デーモンセットの参照

それぞれの FileIntegrity オブジェクトはノード数についてのスキャンを表します。スキャン自体は、デーモンセットによって管理される Pod で実行されます。

FileIntegrity オブジェクトを表すデーモンセットを見つけるには、以下を実行します。

$ oc get ds/aide-ds-$file-integrity-object-name

そのデーモンセットの Pod を一覧表示するには、以下を実行します。

$ oc get pods -lapp=$ds-name

単一の AIDE Pod のログを表示するには、Pod のいずれかで oc logs を呼び出します。

出力例

debug: aide files locked by aideLoop
running aide check
aide check returned status 0
debug: aide files unlocked by aideLoop
debug: Getting FileIntegrity openshift-file-integrity/worker-fileintegrity
Created OK configMap 'aide-ds-worker-fileintegrity-ip-10-0-128-73.eu-north-1.compute.internal'

AIDE デーモンによって作成された設定マップは保持されず、File Integrity Operator がこれらを処理した後に削除されます。ただし、障害およびエラーの発生時に、これらの設定マップの内容は FileIntegrityNodeStatus オブジェクトが参照する設定マップにコピーされます。

2.5. File Integrity Operator のトラブルシューティング

2.5.1. 一般的なトラブルシューティング

問題
File Integrity Operator の問題をトラブルシューティングする必要がある場合があります。
解決策
FileIntegrity オブジェクトでデフォルトフラグを有効にします。debug フラグは、DaemonSet Pod で実行されるデーモンの詳細度を上げ、AIDE チェックを実行します。

2.5.2. AIDE 設定の確認

問題
AIDE 設定を確認する必要がある場合があります。
解決策
AIDE 設定は、FileIntegrity オブジェクトと同じ名前で設定マップに保存されます。すべての AIDE 設定の設定マップには、file-integrity.openshift.io/aide-conf のラベルが付けられます。

2.5.3. FileIntegrity オブジェクトのフェーズの判別

問題
FileIntegrity オブジェクトが存在するかどうかを判別し、その現在のステータスを確認する必要がある場合があります。
解決策

FileIntegrity オブジェクトの現在のステータスを確認するには、以下を実行します。

$ oc get fileintegrities/worker-fileintegrity  -o jsonpath="{ .status }"

FileIntegrity オブジェクトおよびサポートするデーモンセットが作成されると、ステータスは Active に切り替わります。切り替わらない場合は、Operator Pod ログを確認してください。

2.5.4. デーモンセットの Pod が予想されるノードで実行されていることの判別

問題
デーモンセットが存在し、その Pod が実行されることが予想されるノードで実行されていることを確認する必要がある場合があります。
解決策

以下を実行します。

$ oc get pods -lapp=aide-ds-$(<FIO_NAME>)
  • FIO_NAME は、Pod の一覧を取得するための FileIntegrity オブジェクトの名前です。
  • -owide を追加すると、Pod が実行されているノードの IP アドレスが追加されます。

デーモン Pod のログを確認するには、oc logs を実行します。

AIDE コマンドの戻り値をチェックして、チェックが合否を確認します。

第3章 コンテナーのセキュリティー

3.1. コンテナーのセキュリティーについて

コンテナー化されたアプリケーションのセキュリティー保護においては、複数のセキュリティーレベルが関係します。

  • コンテナーのセキュリティーは、信頼できるベースコンテナーイメージから始まり、CI/CD パイプラインを通過するためにコンテナーのビルドプロセスまで適用されます。

    重要

    デフォルトでは、イメージストリームは自動的に更新されません。このデフォルトの動作では、イメージストリームによって参照されるイメージに対するセキュリティー更新は自動的に行われないため、セキュリティーの問題が発生する可能性があります。このデフォルト動作を上書きする方法の詳細は、イメージストリームタグの定期的なインポートの設定について参照してください。

  • コンテナーがデプロイされると、そのセキュリティーはセキュアなオペレーティングシステムやネットワーク上で実行されているかどうかに依存し、コンテナー自体とこれと対話するユーザーやホスト間に明確な境界を確立することが必要です。
  • セキュリティーを継続して保護できるかどうかは、コンテナーイメージをスキャンして脆弱性の有無を確認でき、脆弱なイメージを効率的に修正し、置き換える効率的な方法があるかどうかに依存します。

OpenShift Container Platform などのプラットフォームが追加設定なしで提供する内容のほかに、各組織には独自のセキュリティー需要がある可能性があります。OpenShift Container Platform をデータセンターにデプロイする前にも、一定レベルのコンプライアンス検証が必要になる場合があります。

同様に、独自のエージェント、特殊ハードウェアドライバーまたは暗号化機能を OpenShift Container Platform に追加して組織のセキュリティー基準を満たす必要がある場合があります。

本書では、OpenShift Container Platform で有効なコンテナーのセキュリティー対策についての概要を説明します。これには、ホスト層、コンテナーとオーケストレーション層、およびビルドとアプリケーション層の各種ソリューションが含まれます。次に、これらのセキュリティー対策を実行するのに役立つ特定の OpenShift Container Platform ドキュメントを参照します。

本書には、以下の情報が記載されています。

  • コンテナーのセキュリティーが重要である理由、および既存のセキュリティー標準との違い。
  • ホスト (RHCOS および RHEL) 層で提供されるコンテナーのセキュリティー対策と OpenShift Container Platform で提供されるコンテナーのセキュリティー対策。
  • 脆弱性についてコンテナーのコンテンツとソースを評価する方法。
  • コンテナーのコンテンツをプロアクティブに検査できるようにビルドおよびデプロイメントプロセスを設計する方法。
  • 認証および認可によってコンテナーへのアクセスを制御する方法。
  • OpenShift Container Platform でネットワークと割り当て済みストレージのセキュリティーを保護する方法。
  • API 管理および SSO のコンテナー化ソリューション。

本書の目的は、コンテナー化されたワークロードに OpenShift Container Platform を使用するセキュリティー上の重要な利点と、Red Hat エコシステム全体がコンテナーのセキュリティーを確保し、維持する際にどのような役割を果たしているかについて理解を促すことにあります。また、OpenShift Container Platform の使用により組織のセキュリティー関連の目標を達成する方法について理解するのに役立ちます。

3.1.1. コンテナーについて

コンテナーは、アプリケーションとそのすべての依存関係を 1 つのイメージにパッケージ化します。このイメージは、変更なしに開発環境からテスト環境、実稼働環境へとプロモートすることができます。コンテナーは、他のコンテナーと密接に動作する大規模なアプリケーションの一部である可能性があります。

コンテナーは、複数の環境、および物理サーバー、仮想マシン (VM)、およびプライベートまたはパブリッククラウドなどの複数のデプロイメントターゲット間に一貫性をもたらします。

コンテナーを使用するメリットには以下が含まれます。

インフラストラクチャーアプリケーション

共有される Linux オペレーティングシステムのカーネル上でのアプリケーションプロセスのサンドボックス化

アプリケーションとそのすべての依存関係のパッケージ化

仮想マシンを上回る単純化、軽量化、高密度化の実現

すべての環境に数秒でデプロイが可能。 CI/CD の実現

複数の異なる環境間での移植性

コンテナー化されたコンポーネントへのアクセスと共有が容易になる

Linux コンテナーについての詳細は、Red Hat カスタマーポータル上にある「Understanding Linux containers」を参照してください。RHEL コンテナーについての詳細は、RHEL 製品ドキュメントの「Building, running, and managing containers」を参照してください。

3.1.2. OpenShift Container Platform について

コンテナー化されたアプリケーションがデプロイされ、実行され、管理される方法を自動化することは、OpenShift Container Platform をはじめとするプラットフォームのジョブです。OpenShift Container Platform は、コアとして Kubernetes プロジェクトに依存し、スケーラブルなデータセンターの多数のノード間でコンテナーをオーケストレーションするエンジンを提供します。

Kubernetes は、複数の異なるオペレーティングシステムおよびアドオンのコンポーネントを使用して実行できるプロジェクトです。これらのオペレーティングシステムおよびアドオンコンポーネントは、プロジェクトでのサポート容易性を保証していません。そのため、Kubernetes プラットフォームによって、セキュリティーの内容が異なる可能性があります。

OpenShift Container Platform は、Kubernetes セキュリティーをロックダウンし、プラットフォームを各種の拡張コンポーネントと統合するように設計されています。このため、OpenShift Container Platform は、オペレーティングシステム、認証、ストレージ、ネットワーク、開発ツール、ベースコンテナーイメージ、その他の多くのコンポーネントを含む、各種オープンソース技術の大規模な Red Hat エコシステムを利用します。

OpenShift Container Platform には、プラットフォーム自体およびプラットフォーム上で実行されるコンテナー化されたアプリケーションの脆弱性の発見、およびその脆弱性に対する修正の迅速なデプロイにおける Red Hat の豊富な経験が最大限に活用されます。また、Red Hat は、新規コンポーネントが利用可能になる時点でそれらのコンポーネントを OpenShift Container Platform に効率的に統合し、各種テクノロジーをお客様の個々のニーズに適応させる点においても多くの経験があります。

3.2. ホストおよび仮想マシンのセキュリティーについて

コンテナーと仮想マシンはいずれも、ホストで実行されているアプリケーションをオペレーティングシステム自体から分離する方法を提供します。RHCOS (OpenShift Container Platform で使用されるオペレーティングシステム) についての理解は、ホストシステムがコンテナーおよびホストを相互から保護する方法を確認する際に役立ちます。

3.2.1. Red Hat Enterprise Linux CoreOS (RHCOS) でのコンテナーのセキュリティー保護

コンテナーは、それぞれのコンテナーを起動するために同じカーネルおよびコンテナーランタイムを使用して、同じホストで実行される多数のアプリケーションのデプロイメントを単純化します。アプリケーションは多くのユーザーが所有できます。これらのアプリケーションを分離した状態に維持し、これらのアプリケーションの別々のバージョン、また互換性のないバージョンも問題なく同時に実行できるためです。

Linux では、コンテナーは特殊なタイプのプロセスに過ぎないため、コンテナーのセキュリティーを保護することは、他の実行中のプロセスのセキュリティーを保護することと同じです。コンテナーを実行する環境は、オペレーティングシステムで起動します。このオペレーティングシステムでは、ホストで実行しているコンテナーや他のプロセスからホストカーネルのセキュリティーを保護するだけでなく、複数のコンテナーのセキュリティーを相互から保護できる必要があります。

OpenShift Container Platform 4.6 は RHCOS ホストで実行され、Red Hat Enterprise Linux (RHEL) をワーカーノードとして使用するオプションが指定されるため、デフォルトで以下の概念がデプロイされた OpenShift Container Platform クラスターに適用されます。これらの RHEL セキュリティー機能は、OpenShift で実行中のコンテナーのセキュリティーを強化するためのコアとなる機能です。

  • Linux namespace は特定のグローバルシステムリソースを抽象化し、これを namespace 内の複数のプロセスに対して分離したインスタンスとして表示できます。これにより、複数のコンテナーが競合せずに同じコンピューティングリソースを同時に使用することができます。デフォルトでホストから分離されているコンテナーの namespace には、マウントテーブル、プロセステーブル、ネットワークインターフェース、ユーザー、コントロールグループ、UTS、および IPC namespace が含まれます。ホスト namespace に直接アクセスする必要のあるコンテナーには、そのアクセスを要求するために特権昇格が必要です。namespace のタイプについての詳細は、RHEL 7 コンテナーのドキュメントの「Overview of Containers in Red Hat Systems」を参照してください。
  • SELinux はセキュリティーの層を追加し、コンテナーを相互に、またホストから分離させます。SELinux により、管理者は、それぞれのユーザー、アプリケーション、プロセスおよびファイルに対して強制アクセス制御 (MAC) を実施できます。
  • CGroup (コントロールグループ) はプロセスのコレクションについてのリソースの使用 (CPU、メモリー、ディスク I/O、ネットワークなど) を制限し、構成し、分離します。CGroup は、同じホスト上のコンテナーが相互に影響を与えないようにするために使用されます。
  • Secure computing mode (seccomp) プロファイルは、利用可能なシステム呼び出しを制限するためにコンテナーに関連付けることができます。seccomp についての詳細は、『OpenShift Security Guide』の 94 ページを参照してください。
  • RHCOS を使用したコンテナーのデプロイは、ホスト環境を最小化してコンテナー向けに調整することで、攻撃される対象の規模を縮小します。CRI-O コンテナーエンジンは、デスクトップ指向のスタンドアロン機能を実装する他のコンテナーエンジンとは対照的に、Kubernetes および OpenShift が必要とする機能のみを実装してコンテナーを実行し、管理することで、その攻撃対象領域をさらに削減します。

RHCOS は、OpenShift Container Platform クラスターでコントロールプレーン(マスター)およびワーカーノードとして機能するように特別に設定された Red Hat Enterprise Linux (RHEL) のバージョンです。そのため、RHCOS は、Kubernetes および OpenShift サービスと共にコンテナーのワークロードを効率的に実行するように調整されます。

OpenShift Container Platform クラスターの RHCOS システムをさらに保護するには、ホストシステム自体の管理またはモニタリングを行うコンテナーを除き、ほとんどのコンテナーを root 以外のユーザーとして実行する必要があります。権限レベルを下げたり、付与する権限を可能な限り低くしてコンテナーを作成することが、独自の OpenShift Container Platform クラスターを保護する方法として推奨されます。

3.2.2. 仮想化とコンテナーの比較

従来の仮想化は、アプリケーション環境を同じ物理ホスト上で分離させた状態にするためのもう 1 つの方法です。ただし、仮想マシンはコンテナーとは異なる方法で動作します。仮想化は、ゲスト仮想マシン (VM) を起動するハイパーバイザーを使用します。 仮想マシンにはそれぞれ、実行中のカーネルで代表される独自のオペレーティングシステム (OS) のほか、実行されるアプリケーションとその依存関係があります。

仮想マシンの場合、ハイパーバイザーはゲスト同士を分離させ、ゲストをホストカーネルから分離します。ハイパーバイザーにアクセスする個々のユーザーおよびプロセスの数は少ないため、物理サーバーで攻撃される対象の規模が縮小します。ただし、この場合もセキュリティーの監視が依然として必要になります。あるゲスト仮想マシンがハイパーバイザーのバグを利用して、別の仮想マシンまたはホストカーネルにアクセスできる可能性があります。また、OS にパッチを当てる必要がある場合は、その OS を使用するすべてのゲスト仮想マシンにパッチを当てる必要があります。

コンテナーはゲスト仮想マシン内で実行可能であり、これが必要になる場合のユースケースもあるでしょう。たとえば、リフトアンドシフト方式でアプリケーションをクラウドに移行するなど、コンテナーに従来型のアプリケーションをデプロイする場合などです。

しかし、単一ホストでのコンテナーの分離は、柔軟性があり、スケーリングしやすいデプロイメントソリューションを提供します。このデプロイメントモデルは、クラウドネイティブなアプリケーションにとくに適しています。コンテナーは通常、仮想マシンよりもはるかに小さいため、メモリーと CPU の消費量が少なくなります。

コンテナーと仮想マシンの違いについては、RHEL 7 コンテナードキュメントの「Linux Containers Compared to KVM Virtualization」を参照してください。

3.2.3. OpenShift Container Platform のセキュリティー保護

OpenShift Container Platform をデプロイする際に、インストーラーでプロビジョニングされるインフラストラクチャー (利用可能ないくつかのプラットフォーム)またはユーザーによってプロビジョニングされるインフラストラクチャーを選択できます。FIPS コンプライアンスの有効化や初回の起動時に必要なカーネルモジュールの追加など、低レベルのセキュリティー関連の設定は、ユーザーによってプロビジョニングされるインフラストラクチャーの場合に役立つ場合があります。同様に、ユーザーによってプロビジョニングされるインフラストラクチャーは、非接続の OpenShift Container Platform デプロイメントに適しています。

セキュリティーが強化され、OpenShift Container Platform に他の設定変更が行われる場合、以下を含む目標を明確にするようにしてください。

  • 基礎となるノードを可能な限り汎用的な状態で維持する。同様のノードをすぐ、かつ指定した方法で破棄したり起動したりできるようにする必要があります。
  • ノードに対して直接的に 1 回限りの変更を行うのではなく、OpenShift Container Platform でのノードへの変更をできる限り管理する。

上記を目標とすると、ほとんどのノードの変更はインストール時に Ignition で行うか、または Machine Config Operator によってノードのセットに適用される MachineConfig を使用して後で行う必要があります。この方法で実行できるセキュリティー関連の設定変更の例を以下に示します。

  • カーネル引数の追加
  • カーネルモジュールの追加
  • FIPS 暗号のサポートの有効化
  • ディスク暗号化の設定
  • chrony タイムサービスの設定

Machine Config Operator のほかにも、Cluster Version Operator (CVO) によって管理される OpenShift Container Platform インフラストラクチャーの設定に使用できる他の Operator が複数あります。CVO は、OpenShift Container Platform クラスター更新の多くの部分を自動化できます。

3.3. RHCOS のハードニング

RHCOS は、OpenShift Container Platform にデプロイするように作成され、調整されました。RHCOS ノードへの変更はほとんど不要です。OpenShift Container Platform を採用するすべての組織には、システムハードニングに関する独自の要件があります。OpenShift 固有の変更および機能(Ignition、ostree、読み取り専用 /usr など)が追加された RHEL システムとして、RHCOS を RHEL システムと同様に強化できます。ハードニングの管理方法には違いがあります。

OpenShift Container Platform およびその Kubernetes エンジンの主要機能は、必要に応じてアプリケーションおよびインフラストラクチャーを迅速にスケールアップおよびダウンできることです。避けられない状況でない限り、ホストにログインしてソフトウェアを追加したり設定を変更したりして RHCOS に直接変更を加える必要はありません。OpenShift Container Platform インストーラーおよびコントロールプレーンで RHCOS への変更を管理し、手動による介入なしに新規ノードを起動できるようにする必要があります。

そのため、独自のセキュリティー上のニーズに対応するために OpenShift Container Platform で RHCOS ノードをハードニングする場合、ハードニングする内容とハードニング方法の両方を考慮する必要があります。

3.3.1. RHCOS でのハードニングの内容の選択

RHEL 8 セキュリティー強化』ガイドでは、RHEL システムのセキュリティーのアプローチについて説明しています。

本書では、暗号化のアプローチ、脆弱性の評価方法、および各種サービスへの脅威の評価方法について説明します。また、コンプライアンス基準についてのスキャン、ファイルの整合性の確認、監査の実行、およびストレージデバイスの暗号化の方法を確認することができます。

ハードニングする機能についての理解に基づいて、RHCOS でそれらをハードニングする方法を決定することができます。

3.3.2. RHCOS のハードニング方法の選択

OpenShift Container Platform での RHCOS システムの直接的な変更は推奨されません。代わりに、ワーカーノードやコントロールプレーンノード (別名マスターノード) などのノードのプールにあるシステムを変更することについて考慮する必要があります。新規ノードが必要な場合、ベアメタル以外のインストールでは、必要なタイプの新規ノードを要求でき、ノードは RHCOS イメージおよび先に行った変更に基づいて作成されます。

インストール前や、インストール時、およびクラスターの稼働後に RHCOS を変更することができます。

3.3.2.1. インストール前のハードニング

ベアメタルのインストールでは、OpenShift Container Platform のインストールを開始する前にハードニング機能を RHCOS に追加できます。たとえば、RHCOS インストーラーの起動時に、SELinux や対称マルチスレッドなどの各種の低レベル設定などのセキュリティー機能をオンまたはオフにするためにカーネルオプションを追加できます。

ベアメタル RHCOS のインストールの場合は難易度が上がりますが、この場合、OpenShift Container Platform インストールを開始する前にオペレーティングシステムの変更を取得することができます。これは、ディスクの暗号化や特別なネットワーク設定など、特定の機能を可能な限り早期に設定する必要がある場合に重要になります。

3.3.2.2. インストール時のハードニング

OpenShift インストールプロセスを中断し、Ignition 設定を変更できます。Ignition 設定を使用して、独自のファイルおよび systemd サービスを RHCOS ノードに追加できます。また、インストールに使用する install-config.yaml ファイルに基本的なセキュリティー関連の変更を加えることもできます。この方法で追加した内容は、各ノードの初回起動時に利用できます。

3.3.2.3. クラスターの実行後のハードニング

OpenShift Container Platform クラスターの起動後にハードニング機能を RHCOS に適用する方法は複数あります。

  • デーモンセット: すべてのノードでサービスを実行する必要がある場合は、そのサービスを Kubernetes DaemonSet オブジェクトで追加できます。
  • マシン設定: MachineConfig オブジェクトには、同じ形式の Ignition 設定のサブセットが含まれます。マシン設定をすべてのワーカーノードまたはコントロールプレーンノードに適用することで、クラスターに追加される同じタイプの次のノードで同じ変更が適用されるようにできます。

ここで説明しているすべての機能は、OpenShift Container Platform の製品ドキュメントに記載されています。

3.4. コンテナーイメージの署名

Red Hat は、Red Hat Container Registry でイメージの署名を提供します。これらの署名は、Machine Config Operator (MCO) を使用して OpenShift Container Platform 4 クラスターにプルされる際に自動的に検証されます。

Quay.io は OpenShift Container Platform を構成するほとんどのイメージを提供し、リリースイメージのみが署名されます。リリースイメージは承認済みの OpenShift Container Platform イメージを参照するため、サプライチェーン攻撃からの一定レベルの保護が得られます。ただし、ロギング、モニタリング、サービスメッシュなどの OpenShift Container Platform への拡張機能の一部は、Operator Lifecycle Manager (OLM) から Operator として提供されます。それらのイメージは、Red Hat Ecosystem Catalog Container イメージレジストリーから提供されます。

Red Hat レジストリーとインフラストラクチャー間のイメージの整合性を確認するには、署名の検証を有効にします。

3.4.1. Red Hat Container Registry の署名の検証の有効化

コンテナーの署名の検証を有効にするには、レジストリー URL を sigstore にリンクし、次にイメージを検証するキーを指定するためのファイルが必要です。

手順

  1. レジストリー URL を sigstore にリンクし、イメージの検証に使用するキーを指定するためのファイルを作成します。

    • policy.json ファイルを作成します。

      $ cat > policy.json <<EOF
      {
        "default": [
          {
            "type": "insecureAcceptAnything"
          }
        ],
        "transports": {
          "docker": {
            "registry.access.redhat.com": [
              {
                "type": "signedBy",
                "keyType": "GPGKeys",
                "keyPath": "/etc/pki/rpm-gpg/RPM-GPG-KEY-redhat-release"
              }
            ],
            "registry.redhat.io": [
              {
                "type": "signedBy",
                "keyType": "GPGKeys",
                "keyPath": "/etc/pki/rpm-gpg/RPM-GPG-KEY-redhat-release"
              }
            ]
          },
          "docker-daemon": {
            "": [
              {
                "type": "insecureAcceptAnything"
              }
            ]
          }
        }
      }
      EOF
    • registry.access.redhat.com.yaml ファイルを作成します。

      $ cat <<EOF > registry.access.redhat.com.yaml
      docker:
           registry.access.redhat.com:
               sigstore: https://access.redhat.com/webassets/docker/content/sigstore
      EOF
    • registry.redhat.io.yaml ファイルを作成します。

      $ cat <<EOF > registry.redhat.io.yaml
      docker:
           registry.redhat.io:
               sigstore: https://registry.redhat.io/containers/sigstore
      EOF
  2. マシン設定テンプレートに使用される base64 でエンコードされた形式でファイルを設定します。

    $ export ARC_REG=$( cat registry.access.redhat.com.yaml | base64 -w0 )
    $ export RIO_REG=$( cat registry.redhat.io.yaml | base64 -w0 )
    $ export POLICY_CONFIG=$( cat policy.json | base64 -w0 )
  3. エクスポートされたファイルをワーカーノードのディスクに書き込むマシン設定を作成します。

    $ cat > 51-worker-rh-registry-trust.yaml <<EOF
    apiVersion: machineconfiguration.openshift.io/v1
    kind: MachineConfig
    metadata:
      labels:
        machineconfiguration.openshift.io/role: worker
      name: 51-worker-rh-registry-trust
    spec:
      config:
        ignition:
          config: {}
          security:
            tls: {}
          timeouts: {}
          version: 2.2.0
        networkd: {}
        passwd: {}
        storage:
          files:
          - contents:
              source: data:text/plain;charset=utf-8;base64,${ARC_REG}
              verification: {}
            filesystem: root
            mode: 420
            path: /etc/containers/registries.d/registry.access.redhat.com.yaml
          - contents:
              source: data:text/plain;charset=utf-8;base64,${RIO_REG}
              verification: {}
            filesystem: root
            mode: 420
            path: /etc/containers/registries.d/registry.redhat.io.yaml
          - contents:
              source: data:text/plain;charset=utf-8;base64,${POLICY_CONFIG}
              verification: {}
            filesystem: root
            mode: 420
            path: /etc/containers/policy.json
      osImageURL: ""
    EOF
  4. 作成されたマシン設定を適用します。

    $ oc apply -f 51-worker-rh-registry-trust.yaml
  5. エクスポートしたファイルをマスターノードのディスクに書き込むマシン設定を作成します。

    $ cat > 51-master-rh-registry-trust.yaml <<EOF
    apiVersion: machineconfiguration.openshift.io/v1
    kind: MachineConfig
    metadata:
      labels:
        machineconfiguration.openshift.io/role: master
      name: 51-master-rh-registry-trust
    spec:
      config:
        ignition:
          config: {}
          security:
            tls: {}
          timeouts: {}
          version: 2.2.0
        networkd: {}
        passwd: {}
        storage:
          files:
          - contents:
              source: data:text/plain;charset=utf-8;base64,${ARC_REG}
              verification: {}
            filesystem: root
            mode: 420
            path: /etc/containers/registries.d/registry.access.redhat.com.yaml
          - contents:
              source: data:text/plain;charset=utf-8;base64,${RIO_REG}
              verification: {}
            filesystem: root
            mode: 420
            path: /etc/containers/registries.d/registry.redhat.io.yaml
          - contents:
              source: data:text/plain;charset=utf-8;base64,${POLICY_CONFIG}
              verification: {}
            filesystem: root
            mode: 420
            path: /etc/containers/policy.json
      osImageURL: ""
    EOF
  6. マスターマシン設定の変更をクラスターに適用します。

    $ oc apply -f 51-master-rh-registry-trust.yaml

3.4.2. 署名の検証設定の確認

マシン設定をクラスターに適用すると、Machine Config Controller は新規の MachineConfig オブジェクトを検出し、新規の rendered-worker-<hash> バージョンを生成します。

前提条件

  • マシン設定ファイルを使用して署名の検証を有効にしている。

手順

  1. コマンドラインで以下のコマンドを実行し、必要なワーカーの情報を表示します。

    $ oc describe machineconfigpool/worker

    初期ワーカー監視の出力例

    Name:         worker
    Namespace:
    Labels:       machineconfiguration.openshift.io/mco-built-in=
    Annotations:  <none>
    API Version:  machineconfiguration.openshift.io/v1
    Kind:         MachineConfigPool
    Metadata:
      Creation Timestamp:  2019-12-19T02:02:12Z
      Generation:          3
      Resource Version:    16229
      Self Link:           /apis/machineconfiguration.openshift.io/v1/machineconfigpools/worker
      UID:                 92697796-2203-11ea-b48c-fa163e3940e5
    Spec:
      Configuration:
        Name:  rendered-worker-f6819366eb455a401c42f8d96ab25c02
        Source:
          API Version:  machineconfiguration.openshift.io/v1
          Kind:         MachineConfig
          Name:         00-worker
          API Version:  machineconfiguration.openshift.io/v1
          Kind:         MachineConfig
          Name:         01-worker-container-runtime
          API Version:  machineconfiguration.openshift.io/v1
          Kind:         MachineConfig
          Name:         01-worker-kubelet
          API Version:  machineconfiguration.openshift.io/v1
          Kind:         MachineConfig
          Name:         51-worker-rh-registry-trust
          API Version:  machineconfiguration.openshift.io/v1
          Kind:         MachineConfig
          Name:         99-worker-92697796-2203-11ea-b48c-fa163e3940e5-registries
          API Version:  machineconfiguration.openshift.io/v1
          Kind:         MachineConfig
          Name:         99-worker-ssh
      Machine Config Selector:
        Match Labels:
          machineconfiguration.openshift.io/role:  worker
      Node Selector:
        Match Labels:
          node-role.kubernetes.io/worker:
      Paused:                              false
    Status:
      Conditions:
        Last Transition Time:  2019-12-19T02:03:27Z
        Message:
        Reason:
        Status:                False
        Type:                  RenderDegraded
        Last Transition Time:  2019-12-19T02:03:43Z
        Message:
        Reason:
        Status:                False
        Type:                  NodeDegraded
        Last Transition Time:  2019-12-19T02:03:43Z
        Message:
        Reason:
        Status:                False
        Type:                  Degraded
        Last Transition Time:  2019-12-19T02:28:23Z
        Message:
        Reason:
        Status:                False
        Type:                  Updated
        Last Transition Time:  2019-12-19T02:28:23Z
        Message:               All nodes are updating to rendered-worker-f6819366eb455a401c42f8d96ab25c02
        Reason:
        Status:                True
        Type:                  Updating
      Configuration:
        Name:  rendered-worker-d9b3f4ffcfd65c30dcf591a0e8cf9b2e
        Source:
          API Version:            machineconfiguration.openshift.io/v1
          Kind:                   MachineConfig
          Name:                   00-worker
          API Version:            machineconfiguration.openshift.io/v1
          Kind:                   MachineConfig
          Name:                   01-worker-container-runtime
          API Version:            machineconfiguration.openshift.io/v1
          Kind:                   MachineConfig
          Name:                   01-worker-kubelet
          API Version:            machineconfiguration.openshift.io/v1
          Kind:                   MachineConfig
          Name:                   99-worker-92697796-2203-11ea-b48c-fa163e3940e5-registries
          API Version:            machineconfiguration.openshift.io/v1
          Kind:                   MachineConfig
          Name:                   99-worker-ssh
      Degraded Machine Count:     0
      Machine Count:              1
      Observed Generation:        3
      Ready Machine Count:        0
      Unavailable Machine Count:  1
      Updated Machine Count:      0
    Events:                       <none>

  2. oc describe コマンドを再度実行します。

    $ oc describe machineconfigpool/worker

    ワーカーの更新後の出力例

    ...
        Last Transition Time:  2019-12-19T04:53:09Z
        Message:               All nodes are updated with rendered-worker-f6819366eb455a401c42f8d96ab25c02
        Reason:
        Status:                True
        Type:                  Updated
        Last Transition Time:  2019-12-19T04:53:09Z
        Message:
        Reason:
        Status:                False
        Type:                  Updating
      Configuration:
        Name:  rendered-worker-f6819366eb455a401c42f8d96ab25c02
        Source:
          API Version:            machineconfiguration.openshift.io/v1
          Kind:                   MachineConfig
          Name:                   00-worker
          API Version:            machineconfiguration.openshift.io/v1
          Kind:                   MachineConfig
          Name:                   01-worker-container-runtime
          API Version:            machineconfiguration.openshift.io/v1
          Kind:                   MachineConfig
          Name:                   01-worker-kubelet
          API Version:            machineconfiguration.openshift.io/v1
          Kind:                   MachineConfig
          Name:                   51-worker-rh-registry-trust
          API Version:            machineconfiguration.openshift.io/v1
          Kind:                   MachineConfig
          Name:                   99-worker-92697796-2203-11ea-b48c-fa163e3940e5-registries
          API Version:            machineconfiguration.openshift.io/v1
          Kind:                   MachineConfig
          Name:                   99-worker-ssh
      Degraded Machine Count:     0
      Machine Count:              3
      Observed Generation:        4
      Ready Machine Count:        3
      Unavailable Machine Count:  0
      Updated Machine Count:      3
    ...

    注記

    Observed Generation パラメーターは、コントローラーで作成される設定の生成に基づいて増加するカウントを表示します。このコントローラーは、仕様の処理とリビジョンの生成に失敗する場合でも、この値を更新します。Configuration Source 値は 51-worker-rh-registry-trust 設定を参照します。

  3. 以下のコマンドを使用して、policy.json ファイルが存在することを確認します。

    $ oc debug node/<node> -- chroot /host cat /etc/containers/policy.json

    出力例

    Starting pod/<node>-debug ...
    To use host binaries, run `chroot /host`
    {
      "default": [
        {
          "type": "insecureAcceptAnything"
        }
      ],
      "transports": {
        "docker": {
          "registry.access.redhat.com": [
            {
              "type": "signedBy",
              "keyType": "GPGKeys",
              "keyPath": "/etc/pki/rpm-gpg/RPM-GPG-KEY-redhat-release"
            }
          ],
          "registry.redhat.io": [
            {
              "type": "signedBy",
              "keyType": "GPGKeys",
              "keyPath": "/etc/pki/rpm-gpg/RPM-GPG-KEY-redhat-release"
            }
          ]
        },
        "docker-daemon": {
          "": [
            {
              "type": "insecureAcceptAnything"
            }
          ]
        }
      }
    }

  4. 以下のコマンドを使用して、registry.redhat.io.yaml ファイルが存在することを確認します。

    $ oc debug node/<node> -- chroot /host cat /etc/containers/registries.d/registry.redhat.io.yaml

    出力例

    Starting pod/<node>-debug ...
    To use host binaries, run `chroot /host`
    docker:
         registry.redhat.io:
             sigstore: https://registry.redhat.io/containers/sigstore

  5. 以下のコマンドを使用して、registry.access.redhat.com.yaml ファイルが存在することを確認します。

    $ oc debug node/<node> -- chroot /host cat /etc/containers/registries.d/registry.access.redhat.com.yaml

    出力例

    Starting pod/<node>-debug ...
    To use host binaries, run `chroot /host`
    docker:
         registry.access.redhat.com:
             sigstore: https://access.redhat.com/webassets/docker/content/sigstore

3.4.3. 関連情報

3.5. コンプライアンスについて

多くの OpenShift Container Platform のお客様においては、システムが実稼働環境で使用される前に、一定レベルでの規制への対応またはコンプライアンスが必要になります。この規制対応は、国家標準、業界標準または組織の企業ガバナンスフレームワークによって課せられます。

3.5.1. コンプライアンスおよびリスク管理について

FIPS コンプライアンスは、安全な環境で必要とされる最も重要なコンポーネントの 1 つであり、サポートされている暗号化技術のみがノード上で許可されるようにします。

重要

FIPS 検証済み/進行中のモジュール (Modules in Process) 暗号ライブラリーの使用は、x86_64 アーキテクチャーの OpenShift Container Platform デプロイメントでのみサポートされています。

OpenShift Container Platform コンプライアンスフレームワークについての Red Hat のアプローチについては、『OpenShift セキュリティーガイド』の「リスク管理および規制対応」の章を参照してください。

3.6. コンテナーのコンテンツのセキュリティー保護

コンテナー内のコンテンツのセキュリティーを確保するには、まず信頼できるベースイメージ(Red Hat Universal Base Images など)を使用し、信頼できるソフトウェアを追加する必要があります。コンテナーイメージのセキュリティーを継続的に確認するには、Red Hat およびサードパーティーのツールの両方を使用してイメージをスキャンできます。

3.6.1. コンテナー内のセキュリティー

アプリケーションとインフラストラクチャーは、すぐに利用できるコンポーネントで構成されています。その多くは、Linux オペレーティングシステム、JBoss Web Server、PostgreSQL、および Node.js などのオープンソースパッケージです。

これらのパッケージのコンテナー化されたバージョンも利用できます。ただし、パッケージの出所や、ビルドした人、パッケージの中に悪質なコードが含まれているかどうかを確認する必要があります。

確認するべき点には以下が含まれます。

  • コンテナーの内容がインフラストラクチャーを危険にさらす可能性はあるか?
  • アプリケーション層に既知の脆弱性が存在するか?
  • ランタイムおよびオペレーティングシステム層は最新の状態にあるか?

Red Hat Universal Base Images (UBI) でコンテナーをビルドすることにより、コンテナーイメージのベースが Red Hat Enterprise Linux に含まれる同じ RPM パッケージのソフトウェアで構成されるものであることを確認できます。UBI イメージの使用または再配布にサブスクリプションは必要ありません。

コンテナー自体のセキュリティーが継続的に保護されるようにするには、RHEL から直接使用されるか、または OpenShift Container Platform に追加されているセキュリティースキャン機能は、使用しているイメージに脆弱性がある場合に警告を出します。OpenSCAP イメージスキャンは RHEL で利用でき、Container Security Operator は、OpenShift Container Platform で使用されるコンテナーイメージをチェックするために追加できます。

3.6.2. UBI を使用した再配布可能なイメージの作成

コンテナー化されたアプリケーションを作成するには、通常オペレーティングシステムによって提供されるコンポーネントを提供する信頼されたベースイメージの使用から開始します。これらには、ライブラリー、ユーティリティー、およびその他の機能が含まれます。これらは、アプリケーションがオペレーティングシステムのファイルシステムで認識することが予想されます。

Red Hat Universal Base Images (UBI) は、独自のコンテナーのビルドを試行される方に、まず Red Hat Enterprise Linux rpm パッケージやその他のコンテンツで作成されたコンテナーを使用するよう奨励するために作成されています。このような UBI イメージは、セキュリティーパッチを適用し、独自のソフトウェアを組み込むためにビルドされたコンテナーイメージと共に自由に使用し、再配布するために定期的に更新されます。

Red Hat Ecosystem Catalog を検索して、異なる UBI イメージを見つけ、そのイメージの正常性を確認します。セキュアなコンテナーイメージを作成する場合は、以下の 2 つの一般的な UBI イメージのタイプを使用することを検討できるかもしれません。

  • UBI: RHEL 7 および 8 の標準 UBI イメージ (ubi7/ubi および ubi8/ubi)、およびそれらのシステムをベースとする最小イメージ (ubi7/ubi-minimal および ubi8/ubi-mimimal) があります。これらのイメージはすべて、標準の yum コマンドおよび dnf コマンドを使用して、ビルドするコンテナーイメージに追加できる RHEL ソフトウェアの空きのリポジトリーを参照するように事前に設定されています。Red Hat は、Fedora や Ubuntu などの他のディストリビューションでこのイメージを使用することを推奨しています。
  • Red Hat Software Collections: Red Hat Ecosystem Catalog で rhscl/ を検索し、特定タイプのアプリケーションのベースイメージとして使用するために作成されたイメージを見つけます。たとえば、Apache httpd (rhscl/httpd-*)、 Python (rhscl/python-*)、Ruby (rhscl/ruby-*)、Node.js (rhscl/nodejs-*) および Perl (rhscl/perl-*) rhscl イメージがあります。

UBI イメージは自由に利用でき、再配布可能ですが、このイメージに対する Red Hat のサポートは、Red Hat 製品サブスクリプションでのみ利用できることに注意してください。

標準、最小および init UBI イメージを使用し、これを使用してビルドする方法については、Red Hat Enterprise Linux ドキュメントの「Red Hat Universal Base イメージの使用」を参照してください。

3.6.3. RHEL におけるセキュリティースキャン

Red Hat Enterprise Linux (RHEL) システムでは、openscap-utils パッケージで OpenSCAP スキャンを利用できます。RHEL では、openscap-podman コマンドを使用して、イメージで脆弱性の有無をスキャンできます。Red Hat Enterprise Linux ドキュメントの「Scanning containers and container images for vulnerabilities」を参照してください。

OpenShift Container Platform では、RHEL スキャナーを CI/CD プロセスで利用することができます。たとえば、ソースコードのセキュリティー上の欠陥をテストする静的コード解析ツールや、既知の脆弱性などのメタデータを提供するために使用するオープンソースライブラリーを特定するソフトウェアコンポジション解析ツールを統合することができます。

3.6.3.1. OpenShift イメージのスキャン

OpenShift Container Platform で実行され、Red Hat Quay レジストリーからプルされるコンテナーイメージの場合、Operator を使用してそれらのイメージの脆弱性を一覧表示できます。Container Security Operator を OpenShift Container Platform に追加して、選択した namespace に追加されたイメージの脆弱性レポートを提供することができます。

Red Hat Quay のコンテナーイメージスキャンは、Clair セキュリティースキャナーによって実行されます。Red Hat Quay では、Clair は RHEL、CentOS、Oracle、Alpine、Debian、および Ubuntu のオペレーティングシステムソフトウェアでビルドされたイメージの脆弱性を検索し、報告することができます。

3.6.4. 外部サービスの統合

OpenShift Container Platform は、オブジェクトのアノテーション (object annotations) を利用して機能を拡張します。脆弱性スキャナーなどの外部ツールはイメージオブジェクトにメタデータのアノテーションを付けることで、結果の要約を表示したり、Pod の実行を制御したりできます。本セクションでは、このアノテーションの認識される形式について説明します。 この形式を使用することで、アノテーションをコンソールで安全に使用し、ユーザーに役立つデータを表示することができます。

3.6.4.1. イメージのメタデータ

イメージの品質データには、パッケージの脆弱性およびオープンソースソフトウェア (OSS) ライセンスのコンプライアンスなどの様々なタイプがあります。さらに、複数のプロバイダーがこのメタデータを提供する場合があります。このため、以下のアノテーションの形式が保持されます。

quality.images.openshift.io/<qualityType>.<providerId>: {}

表3.1 アノテーションキーの形式

コンポーネント説明許可される値

qualityType

メタデータのタイプ

vulnerability
license
operations
policy

providerId

プロバイダー ID の文字列

openscap
redhatcatalog
redhatinsights
blackduck
jfrog

3.6.4.1.1. アノテーションキーの例
quality.images.openshift.io/vulnerability.blackduck: {}
quality.images.openshift.io/vulnerability.jfrog: {}
quality.images.openshift.io/license.blackduck: {}
quality.images.openshift.io/vulnerability.openscap: {}

イメージの品質アノテーションの値は、以下の形式に従った構造化データになります。

表3.2 アノテーション値の形式

フィールド必須?説明タイプ

name

Yes

プロバイダーの表示名

文字列

timestamp

Yes

スキャンのタイムスタンプ

文字列

description

No

簡単な説明

文字列

reference

Yes

情報ソースの URL または詳細情報。ユーザーのデータ検証に必要。

文字列

scannerVersion

No

スキャナーバージョン

文字列

compliant

No

コンプライアンスの合否

ブール値

summary

No

検出された問題の要約

一覧 (以下の表を参照)

summary フィールドは、以下の形式に従う必要があります。

表3.3 要約フィールド値の形式

フィールド説明タイプ

label

コンポーネントの表示ラベル (例: 「critical」、「important」、「moderate」、「low」または「health」)

文字列

data

このコンポーネントのデータ (例: 検出された脆弱性の数またはスコア)

文字列

severityIndex

順序付けおよびグラフィック表示の割り当てを可能にするコンポーネントのインデックス。値は 0..3 の範囲内にあり、0 = low になります。

整数

reference

情報ソースの URL または詳細情報。オプション。

文字列

3.6.4.1.2. アノテーション値の例

以下の例は、脆弱性の要約データおよびコンプライアンスのブール値を含むイメージの OpenSCAP アノテーションを示しています。

OpenSCAP アノテーション

{
  "name": "OpenSCAP",
  "description": "OpenSCAP vulnerability score",
  "timestamp": "2016-09-08T05:04:46Z",
  "reference": "https://www.open-scap.org/930492",
  "compliant": true,
  "scannerVersion": "1.2",
  "summary": [
    { "label": "critical", "data": "4", "severityIndex": 3, "reference": null },
    { "label": "important", "data": "12", "severityIndex": 2, "reference": null },
    { "label": "moderate", "data": "8", "severityIndex": 1, "reference": null },
    { "label": "low", "data": "26", "severityIndex": 0, "reference": null }
  ]
}

以下の例は、詳細情報として外部 URL と正常性のインデックスデータを含むイメージの Red Hat Ecosystem Catalog のコンテナーイメージのセクションのアノテーションを示しています。

Red Hat Container Catalog アノテーション

{
  "name": "Red Hat Ecosystem Catalog",
  "description": "Container health index",
  "timestamp": "2016-09-08T05:04:46Z",
  "reference": "https://access.redhat.com/errata/RHBA-2016:1566",
  "compliant": null,
  "scannerVersion": "1.2",
  "summary": [
    { "label": "Health index", "data": "B", "severityIndex": 1, "reference": null }
  ]
}

3.6.4.2. イメージオブジェクトのアノテーション

OpenShift Container Platform のエンドユーザーはイメージストリームオブジェクトに対して操作を行いますが、セキュリティーメタデータでアノテーションが付けられるのはイメージオブジェクトです。イメージオブジェクトはクラスター全体でそのスコープが設定され、多くのイメージストリームおよびタグで参照される可能性のある単一イメージをポイントします。

3.6.4.2.1. アノテーションが使用されている CLI コマンドの例

<image> をイメージダイジェストに置き換えます (例: sha256:401e359e0f45bfdcf004e258b72e253fd07fba8cc5c6f2ed4f4608fb119ecc2)。

$ oc annotate image <image> \
    quality.images.openshift.io/vulnerability.redhatcatalog='{ \
    "name": "Red Hat Ecosystem Catalog", \
    "description": "Container health index", \
    "timestamp": "2020-06-01T05:04:46Z", \
    "compliant": null, \
    "scannerVersion": "1.2", \
    "reference": "https://access.redhat.com/errata/RHBA-2020:2347", \
    "summary": "[ \
      { "label": "Health index", "data": "B", "severityIndex": 1, "reference": null } ]" }'

3.6.4.3. Pod 実行の制御

images.openshift.io/deny-execution イメージポリシーを使用して、イメージを実行するかどうかをプログラムで制御します。

3.6.4.3.1. アノテーションの例
annotations:
  images.openshift.io/deny-execution: true

3.6.4.4. 統合リファレンス

ほとんどの場合、脆弱性スキャナーなどの外部ツールはイメージの更新を監視し、スキャンを実施し、関連するイメージオブジェクトに結果のアノテーションを付けるスクリプトまたはプラグインを開発します。この自動化では通常、OpenShift Container Platform 4.6 REST API を呼び出してアノテーションを作成します。REST API の一般的な情報については、「OpenShift Container Platform REST API」を参照してください。

3.6.4.4.1. REST API 呼び出しの例

curl を使用する以下の呼び出しの例では、アノテーションの値を上書きします。<token><openshift_server><image_id>、および <image_annotation> の値を置き換えてください。

パッチ API 呼び出し

$ curl -X PATCH \
  -H "Authorization: Bearer <token>" \
  -H "Content-Type: application/merge-patch+json" \
  https://<openshift_server>:8443/oapi/v1/images/<image_id> \
  --data '{ <image_annotation> }'

以下は、PATCH ペイロードデータの例です。

パッチ呼び出しデータ

{
"metadata": {
  "annotations": {
    "quality.images.openshift.io/vulnerability.redhatcatalog":
       "{ 'name': 'Red Hat Ecosystem Catalog', 'description': 'Container health index', 'timestamp': '2020-06-01T05:04:46Z', 'compliant': null, 'reference': 'https://access.redhat.com/errata/RHBA-2020:2347', 'summary': [{'label': 'Health index', 'data': '4', 'severityIndex': 1, 'reference': null}] }"
    }
  }
}

3.7. コンテナーレジストリーのセキュアな使用

コンテナーレジストリーは、以下を実行するためにコンテナーイメージを保存します。

  • イメージに他からアクセスできるようにする
  • イメージをイメージの複数バージョンを含むことができるリポジトリーに整理する
  • オプションで、異なる認証方法に基づいてイメージへのアクセスを制限するか、またはイメージを一般に利用できるようにする。

Quay.io や Docker Hub などのパブリックコンテナーレジストリーがあり、ここでは多くの人や組織がイメージを共有します。Red Hat レジストリーは、サポート対象の Red Hat およびパートナーのイメージを提供しますが、Red Hat Ecosystem Catalog ではこれらのイメージに関する詳細な説明およびヘルスチェックが提供されます。独自のレジストリーを管理するには、Red Hat Quay などのコンテナーレジストリーを購入することができます。

セキュリティーの観点では、一部のレジストリーは、コンテナーの正常性を確認し、強化するために特別な機能を提供します。たとえば、Red Hat Quay は、Clair セキュリティースキャナーを使用したコンテナー脆弱性のスキャン、GitHub およびその他の場所でソースコードが変更された場合にイメージを自動的に再ビルドするためのビルドのトリガー、およびイメージへのアクセスをセキュア化するためのロールベースのアクセス制御 (RBAC) を使用できる機能を提供します。

3.7.1. コンテナーのソースの確認

ダウンロード済みかつデプロイ済みのコンテナーイメージのコンテンツをスキャンし、追跡するには各種のツールを使用できます。ただし、コンテナーイメージの公開ソースは数多くあります。公開されているコンテナーレジストリーを使用する場合は、信頼されるソースを使用して保護用の層を追加することができます。

3.7.2. イミュータブルで認定済みのコンテナー

イミュータブルなコンテナー を管理する際に、セキュリティー更新を使用することはとくに重要になります。イミュータブルなコンテナーは、実行中には変更されることのないコンテナーです。イミュータブルなコンテナーをデプロイする場合には、実行中のコンテナーにステップインして 1 つ以上のバイナリーを置き換えることはできません。運用上の観点では、更新されたコンテナーイメージを再ビルド、再デプロイし、コンテナーを変更するのではなく、コンテナーの置き換えを行います。

以下は、Red Hat 認定イメージの特徴になります。

  • プラットフォームの各種コンポーネントまたは層に既知の脆弱性がない。
  • ベアメタルからクラウドまで、RHEL プラットフォーム全体で互換性がある。
  • Red Hat によってサポートされる。

既知の脆弱性の一覧は常に更新されるので、デプロイ済みのコンテナーイメージのコンテンツのほか、新規にダウンロードしたイメージを継続的に追跡する必要があります。Red Hat セキュリティーアドバイザリー (RHSA) を利用して、Red Hat 認定コンテナーイメージで新たに発見される問題についての警告を受け、更新されたイメージを確認することができます。または、Red Hat Ecosystem Catalog にアクセスして、その問題および各 Red Hat イメージの他のセキュリティー関連の問題について検索することもできます。

3.7.3. Red Hat レジストリーおよび Ecosystem Catalog からのコンテナーの取得

Red Hat では、Red Hat Ecosystem Catalog の Container Images セクションから、Red Hat 製品およびパートナーオファリングの認定コンテナーイメージを一覧表示しています。このカタログから、CVE、ソフトウェアパッケージの一覧、ヘルススコアなどの各イメージの詳細を確認できます。

Red Hat イメージは、パブリックコンテナーレジストリー (registry.access.redhat.com) および認証されたレジストリー (registry.redhat.io) によって代表される、Red Hat レジストリー というレジストリーに実際に保存されます。どちらにも基本的に Red Hat サブスクリプション認証情報での認証を必要とするいくつかの追加イメージを含む registry.redhat.io と同様に、同じコンテナーイメージのセットが含まれます。

Red Hat ではコンテナーのコンテンツの脆弱性を監視し、コンテンツを定期的に更新しています。glibcDROWN、または Dirty Cow の修正など、Red Hat がセキュリティー更新をリリースする際に、影響を受けるすべてのコンテナーイメージも再ビルドされ、Red Hat Registry にプッシュされます。

Red Hat では health index を使用して、 Red Hat Ecosystem Catalog 経由で提供される各コンテナーのセキュリティー上のリスクを考慮します。コンテナーは Red Hat およびエラータプロセスで提供されるソフトウェアを使用するため、セキュリティーのレベルは、コンテナーが古いと低くなり、新規のコンテナーの場合はセキュリティーのレベルが上がります。

コンテナーの年数について、Red Hat Ecosystem Catalog では格付けシステムを使用します。最新度についての評価は、イメージに利用できる最も古く、最も重大度の高いセキュリティーエラータに基づいて行われます。格付けは「A」から「F」まであり、「A」が最新となります。この格付けシステムの詳細については、「Container Health Index grades as used inside the Red Hat Ecosystem Catalog」を参照してください。

Red Hat ソフトウェアに関連するセキュリティー更新および脆弱性についての詳細は、Red Hat Product Security Center を参照してください。Red Hat セキュリティーアドバイザリーを参照して、特定のアドバイザリーおよび CVE を検索できます。

3.7.4. OpenShift Container レジストリー

OpenShift Container Platform には、コンテナーイメージを管理するために使用できるプラットフォームの統合されたコンポーネントとして実行される、プライベートレジストリーの OpenShift Container レジストリー が含まれます。OpenShift Container レジストリーは、ロールベースのアクセス制御を提供します。 これにより、どのコンテナーイメージを誰がプル/プッシュするのかを管理できるようになります。

また、OpenShift Container Platform は Red Hat Quay などのすでに使用している可能性のある他のプライベートレジストリーとの統合もサポートしています。

3.7.5. Red Hat Quay を使用したコンテナーの保存

Red Hat Quay は、Red Hat のエンタープライズレベルの品質の高いコンテナーレジストリー製品です。Red Hat Quay の開発は、アップストリームの Project Quay で行われます。Red Hat Quay は、オンプレミスまたは Quay.io のホスト型バージョンの Red Hat Quay でデプロイできます。

Red Hat Quay のセキュリティー関連機能には、以下が含まれます。

  • Time Machine (マシンの時間設定): 設定した期間またはユーザーが選択した有効期限に基づいて、古いタグを持つイメージの有効期限が切れるようにします。
  • Repository mirroring (リポジトリーのミラーリング): セキュリティー上の理由から他のレジストリーをミラーリングします。たとえば、会社のファイアウォールの背後の Red Hat Quay でパブリックリポジトリーをホストしたり、パフォーマンス上の理由からレジストリーを使用される場所の近くに配置したりします。
  • Action log storage (アクションログの保存): Red Hat Quay のロギング出力を Elasticsearch ストレージ に保存し、後に検索および分析に使用できるようにします。
  • Clair security scanning (Clair セキュリティースキャン): 各コンテナーイメージの起点に基づいて、さまざまな Linux 脆弱性データベースに対してイメージをスキャンします。各コンテナーイメージの起点に基づいて、さまざまな Linux 脆弱性データベースに対してイメージをスキャンします。
  • Internal authentication (内部認証): Red Hat Quay への RBAC 認証を処理するデフォルトのローカルデータベースを使用するか、LDAP、Keystone (OpenStack)、JWT Custom Authentication、または External Application Token 認証から選択します。
  • External authorization (OAuth) (外部認証 (OAuth): GitHub、GitHub Enterprise、または Google 認証からの Red Hat Quay への認証を許可します。
  • Access settings (アクセス設定): docker、rkt、匿名アクセス、ユーザー作成のアカウント、暗号化されたクライアントパスワード、またはプレフィックス、ユーザー名の自動補完での Red Hat Quay へのアクセスを可能にするトークンを生成します。

Red Hat Quay と OpenShift Container Platform の統合が継続されており、とくに関連する OpenShift Container Platform Operator との統合が継続されています。Quay Bridge Operator を使用すると、内部 OpenShift Container Platform レジストリーを Red Hat Quay に置き換えることができます。Quay Container Security Operator を使用すると、Red Hat Quay レジストリーからプルされた OpenShift Container Platform で実行されているイメージの脆弱性を確認できます。

3.8. ビルドプロセスのセキュリティー保護

コンテナー環境では、ソフトウェアのビルドプロセスはライフサイクルのステージであり、ここでは、アプリケーションコードが必要なランタイムライブラリーと統合されます。このビルドプロセスの管理は、ソフトウェアのスタックのセキュリティーを保護する上で鍵となります。

3.8.1. 1 回のビルドでどこにでもデプロイが可能

OpenShift Container Platform をコンテナービルドの標準プラットフォームとして使用することで、ビルド環境のセキュリティーを確保できます。「1 回のビルドでどこにでもデプロイが可能」という理念を背景に、ビルドプロセスの製品がそのままの状態で実稼働にデプロイされるようにすることができます。

コンテナーのイミュータブルな状態を維持することも重要です。実行中のコンテナーにパッチを当てることはできません。 その代わりに再ビルドおよび再デプロイを実行します。

ソフトウェアがビルド、テスト、および実稼働環境の複数ステージを通過する際に、ソフトウェアのサプライチェーンを構成するツールが信頼できるかどうかは重要です。以下の図は、コンテナー化されたソフトウェアの信頼できるソフトウェアサプライチェーンに組み込むことができるプロセスおよびツールを示しています。

OpenShift Container Platform は、セキュアなコードを作成し、管理できるように、信頼できるコードリポジトリー(GitHub など) および開発プラットフォーム (Che など) と統合できます。単体テストは、Cucumber および JUnit に依存する必要がある場合があります。コンテナーの脆弱性の有無や、Anchore または Twistlock などのコンプライアンス関連の問題の有無を検査し、AtomicScan または Clair などのイメージスキャンツールを使用できます。Sysdig などのツールは、コンテナー化されたアプリケーションの継続的なモニタリングを提供できます。

3.8.2. ビルドの管理

Source-to-Image (S2I) を使用して、ソースコードとベースイメージを組み合わせることができます。ビルダーイメージ は S2I を利用し、開発および運用チームの再現可能なビルド環境での協業を可能にします。Red Hat S2I イメージが Universal Base Image (UBI) イメージとして利用可能な場合、実際の RHEL RPM パッケージからビルドされたベースイメージでソフトウェアを自由に再配布できます。Red Hat は、これを可能にするためにサブスクリプションの制限を削除しました。

開発者がビルドイメージを使用して、アプリケーション用に Git でコードをコミットする場合、OpenShift Container Platform は以下の機能を実行できます。

  • コードリポジトリーの Webhook または他の自動化された継続的インテグレーション (CI) プロセスのいずれかで、利用可能なアーティファクト、S2I ビルダーイメージ、および新たにコミットされたコードを使用して新規イメージの自動アセンブルをトリガーします。
  • 新規にビルドしたイメージを自動的にデプロイし、テストします。
  • テスト済みのイメージを実稼働にプロモートします。 ここでは CI プロセスを使用して自動的にデプロイされます。
Source-to-Image Builds

統合された OpenShift Container レジストリーを使用して、最終イメージへのアクセスを管理できます。S2I イメージおよびネイティブビルドイメージの両方は OpenShift Container レジストリーに自動的にプッシュされます。

CI の組み込まれた Jenkins のほかに、独自のビルドおよび CI 環境を RESTful API および API 準拠のイメージレジストリーを使用して OpenShift Container Platform に統合することもできます。

3.8.3. ビルド時の入力のセキュリティー保護

シナリオによっては、ビルド操作において、依存するリソースにアクセスするために認証情報が必要になる場合がありますが、この認証情報をビルドで生成される最終的なアプリケーションイメージで利用可能にすることは適切ではありません。このため、入力シークレットを定義することができます。

たとえば、Node.js アプリケーションのビルド時に、Node.js モジュールのプライベートミラーを設定できます。プライベートミラーからモジュールをダウンロードするには、URL、ユーザー名、パスワードを含む、ビルド用のカスタム .npmrc ファイルを指定する必要があります。セキュリティー上の理由により、認証情報はアプリケーションイメージで公開しないでください。

この例で示したシナリオを使用して、入力シークレットを新規の BuildConfig オブジェクトに追加できます。

  1. シークレットがない場合は作成します。

    $ oc create secret generic secret-npmrc --from-file=.npmrc=~/.npmrc

    これにより、secret-npmrc という名前の新規シークレットが作成されます。 これには、~/.npmrc ファイルの base64 でエンコードされたコンテンツが含まれます。

  2. シークレットを既存の BuildConfig オブジェクトの source セクションに追加します。

    source:
      git:
        uri: https://github.com/sclorg/nodejs-ex.git
      secrets:
      - destinationDir: .
        secret:
          name: secret-npmrc
  3. シークレットを新規の BuildConfig オブジェクトに追加するには、以下のコマンドを実行します。

    $ oc new-build \
        openshift/nodejs-010-centos7~https://github.com/sclorg/nodejs-ex.git \
        --build-secret secret-npmrc

3.8.4. ビルドプロセスの設計

コンテナーの層を使用できるようにコンテナーイメージ管理およびビルドプロセスを設計して、制御を分離可能にすることができます。

Designing Your Build Process

たとえば、運用チームはベースイメージを管理します。一方で、アーキテクトはミドルウェア、ランタイム、データベース、その他のソリューションを管理します。これにより、開発者はアプリケーション層のみを使用し、コードの作成に集中することができます。

新しい脆弱性情報は常に更新されるので、コンテナーのコンテンツを継続的かつプロアクティブに確認する必要があります。これを実行するには、自動化されたセキュリティーテストをビルドまたは CI プロセスに統合する必要があります。以下は例になります。

  • SAST / DAST – 静的および動的なセキュリティーテストツール
  • 既知の脆弱性をリアルタイムにチェックするためのスキャナー。このようなツールは、コンテナー内のオープンソースパッケージをカタログ化し、既知の脆弱性について通知し、スキャン済みのパッケージに新たな脆弱性が検出されるとその更新情報を送信します。

CI プロセスには、セキュリティースキャンで発見される問題について担当チームが適切に対処できるように、これらの問題のフラグをビルドに付けるポリシーを含める必要があります。カスタマイズしたコンテナーに署名することで、ビルドとデプロイメント間に改ざんが発生しないようにします。

GitOps の方法を使用すると、同じ CI/CD メカニズムを使用してアプリケーションの設定だけでなく、OpenShift Container Platform インフラストラクチャーも管理できます。

3.8.5. Knative サーバーレスアプリケーションのビルド

Kubernetes および Kourier を使用すると、OpenShift Container Platform で Knative を使用してサーバーレスアプリケーションをビルドし、デプロイし、管理できます。他のビルドと同様に、S2I イメージを使用してコンテナーをビルドしてから、Knative サービスを使用してそれらを提供できます。OpenShift Container Platform Web コンソールの Topology ビューを使用して Knative アプリケーションのビルドを表示します。

3.9. コンテナーのデプロイ

各種の手法を使用して、デプロイするコンテナーが最新の実稼働に適した品質のコンテンツを保持し、改ざんされていないことを確認することができます。これらの手法には、最新のコードを組み込むためのビルドトリガーのセットアップやコンテナーが信頼できるソースから取得され、変更されないようにするための署名の使用が含まれます。

3.9.1. トリガーによるコンテナーデプロイメントの制御

ビルドプロセスで何らかの問題が生じる場合や、イメージのデプロイ後に脆弱性が発見される場合に、自動化されるポリシーベースのデプロイのためのツールを使用して修復できます。イメージの再ビルドおよび置き換えはトリガーを使用して実行し、イミュータブルなコンテナーのプロセスを確認できます。 実行中のコンテナーにパッチを当てる方法は推奨されていません。

Secure Deployments

たとえば、3 つのコンテナーイメージ層 (コア、ミドルウェア、アプリケーション) を使用してアプリケーションをビルドするとします。コアイメージに問題が見つかり、そのイメージは再ビルドされました。ビルドが完了すると、イメージは OpenShift Container レジストリーにプッシュされます。OpenShift Container Platform はイメージが変更されたことを検知し、定義されたトリガーに基づいてアプリケーションイメージを自動的に再ビルドし、デプロイします。この変更には修正されたライブラリーが組み込まれ、実稼働コードが最新のイメージと同じ状態になります。

oc set triggers コマンドを使用してデプロイメントトリガーを設定できます。たとえば、deployment-example という名前のデプロイメントのトリガーを設定するには、以下を実行します。

$ oc set triggers deploy/deployment-example \
    --from-image=example:latest \
    --containers=web

3.9.2. イメージソースのデプロイの制御

重要な点として、対象とするイメージが実際にデプロイされていることや、組み込まれているコンテンツを持つイメージが信頼されるソースからのものであること、またそれらが変更されていないことを確認できる必要があります。これは、暗号による署名を使用して実行できます。OpenShift Container Platform では、クラスター管理者がデプロイメント環境とセキュリティー要件を反映した広義のセキュリティーポリシーを適用できます。このポリシーは、以下の 2 つのパラメーターで定義されます。

  • 1 つ以上のレジストリー (オプションのプロジェクト namespace を使用)
  • 信頼タイプ (accept、reject、または require public key(s))

これらのポリシーパラメーターを使用して、レジストリー全体、レジストリーの一部、または個別のイメージに対して信頼関係を許可、拒否、または要求することができます。信頼されたパブリックキーを使用して、ソースが暗号で検証されていることを確認できます。このポリシールールはノードに適用されます。ポリシーは、すべてのノード全体に均一に適用されるか、または異なるノードのワークロード (例: ビルド、ゾーン、または環境) ごとにターゲットが設定される場合があります。

イメージ署名ポリシーファイルの例

{
    "default": [{"type": "reject"}],
    "transports": {
        "docker": {
            "access.redhat.com": [
                {
                    "type": "signedBy",
                    "keyType": "GPGKeys",
                    "keyPath": "/etc/pki/rpm-gpg/RPM-GPG-KEY-redhat-release"
                }
            ]
        },
        "atomic": {
            "172.30.1.1:5000/openshift": [
                {
                    "type": "signedBy",
                    "keyType": "GPGKeys",
                    "keyPath": "/etc/pki/rpm-gpg/RPM-GPG-KEY-redhat-release"
                }
            ],
            "172.30.1.1:5000/production": [
                {
                    "type": "signedBy",
                    "keyType": "GPGKeys",
                    "keyPath": "/etc/pki/example.com/pubkey"
                }
            ],
            "172.30.1.1:5000": [{"type": "reject"}]
        }
    }
}

ポリシーは /etc/containers/policy.json としてノードに保存できます。このファイルのノードへの保存は、新規の MachineConfig オブジェクトを使用して実行するのが最適な方法です。この例では、以下のルールを実施しています。

  • Red Hat レジストリー (registry.access.redhat.com) からのイメージは Red Hat パブリックキーで署名される必要がある。
  • openshift namespace 内の OpenShift Container レジストリーからのイメージは Red Hat パブリックキーで署名される必要がある。
  • production namespace 内の OpenShift Container レジストリーからのイメージは example.com のパブリックキーで署名される必要がある。
  • グローバルの default 定義で指定されていないその他すべてのレジストリーは拒否される。

3.9.3. 署名トランスポートの使用

署名トランスポートは、バイナリーの署名 Blob を保存および取得する方法です。署名トランスポートには、2 つのタイプあります。

  • atomic: OpenShift Container Platform API で管理される。
  • docker: ローカルファイルとして提供されるか、または Web サーバーによって提供される。

OpenShift Container Platform API は、atomic トランスポートタイプを使用する署名を管理します。このタイプの署名を使用するイメージは OpenShift Container レジストリーに保存する必要があります。docker/distribution extensions API はイメージ署名のエンドポイントを自動検出するため、追加の設定は不要になります。

docker トランスポートタイプを使用する署名は、ローカルファイルまたは Web サーバーによって提供されます。これらの署名には柔軟性があります。任意のコンテナーレジストリーからイメージを提供でき、バイナリー署名の送信に個別のサーバーを使用することができます。

ただし、docker トランスポートタイプの場合には追加の設定が必要です。任意に名前が付けられた YAML ファイルをホストシステムのディレクトリー (/etc/containers/registries.d) にデフォルトとして配置し、ノードを署名サーバーの URI で設定する必要があります。YAML 設定ファイルには、レジストリー URI および署名サーバー URI が含まれます。 署名サーバー URI は、sigstore とも呼ばれます。

registries.d ファイルの例

docker:
    access.redhat.com:
        sigstore: https://access.redhat.com/webassets/docker/content/sigstore

この例では、Red Hat レジストリー (access.redhat.com) は、docker タイプのトランスポートの署名を提供する署名サーバーです。Red Hat レジストリーの URI は、sigstore パラメーターで定義されます。このファイルに /etc/containers/registries.d/redhat.com.yaml という名前を付け、Machine Config Operator を使用してこのファイルをクラスター内の各ノード上に自動的に配置することができます。ポリシーと registries.d ファイルはコンテナーのランタイムで動的に読み込まれるため、サービスを再起動する必要はありません。

3.9.4. シークレットおよび設定マップの作成

Secret オブジェクトタイプはパスワード、OpenShift Container Platform クライアント設定ファイル、dockercfg ファイル、プライベートソースリポジトリーの認証情報などの機密情報を保持するメカニズムを提供します。シークレットは機密内容を Pod から切り離します。シークレットはボリュームプラグインを使用してコンテナーにマウントすることも、システムが Pod の代わりにシークレットを使用して各種アクションを実行することもできます。

たとえば、プライベートイメージリポジトリーにアクセスできるように、シークレットをデプロイメント設定に追加するには、以下を実行します。

手順

  1. OpenShift Container Platform Web コンソールにログインします。
  2. 新規プロジェクトを作成します。
  3. ResourcesSecrets に移動し、新規シークレットを作成します。Secret TypeImage Secret に、Authentication TypeImage Registry Credentials に設定し、プライベートイメージリポジトリーにアクセスするために必要な認証情報を入力します。
  4. デプロイメント設定を作成する場合 (例: Add to ProjectDeploy Image ページに移動する)、 Pull Secret を新規シークレットに設定します。

設定マップはシークレットに似ていますが、機密情報を含まない文字列の使用をサポートするように設計されています。ConfigMap オブジェクトは、Pod で使用したり、コントローラーなどのシステムコンポーネントの設定データを保存するために使用できる設定データのキーと値のペアを保持します。

3.9.5. 継続的デプロイメントの自動化

独自の継続的デプロイメント (CD) のツールを OpenShift Container Platform に統合することができます。

CI/CD および OpenShift Container Platform を利用することで、アプリケーションの再ビルドプロセスを自動化し、最新の修正の組み込み、テスト、および環境内の至るところでのデプロイを可能にします。

3.10. コンテナープラットフォームのセキュリティー保護

OpenShift Container Platform および Kubernetes API は、スケーリング時にコンテナー管理を自動化する鍵となります。API は以下の目的で使用されます。

  • Pod、サービス、およびレプリケーションコントローラーのデータの検証および設定。
  • 受信要求におけるプロジェクト検証の実施と、他の主要なシステムコンポーネントでのトリガーの呼び出し。

Kubernetes をベースとする OpenShift Container Platform のセキュリティー関連機能には、以下が含まれます。

  • マルチテナンシー: ロールベースのアクセス制御とネットワークポリシーを統合し、複数のレベルでコンテナーを分離します。
  • API と API の要求側との間の境界を形成する受付プラグイン。

OpenShift Container Platform は Operator を使用して Kubernetes レベルのセキュリティー機能の管理を自動化し、単純化します。

3.10.1. マルチテナンシーによるコンテナーの分離

マルチテナンシーは、複数のユーザーによって所有され、複数のホストおよび namespace で実行される OpenShift Container Platform クラスターの複数アプリケーションが、相互に分離された状態のままにし、外部の攻撃から隔離された状態にすることができます。ロールベースアクセス制御 (RBAC) を Kubernetes namespace に適用して、マルチテナンシーを取得します。

Kubernetes では、namespace はアプリケーションを他のアプリケーションと分離した状態で実行できるエリアです。OpenShift Container Platform は、SELinux の MCS ラベルを含む追加のアノテーションを追加して namespace を使用し、これを拡張し、これらの拡張された namespace を プロジェクト として特定します。プロジェクトの範囲内で、ユーザーは、サービスアカウント、ポリシー、制約、およびその他のオブジェクトなど、独自のクラスターリソースを維持できます。

RBAC オブジェクトはプロジェクトに割り当てられ、選択されたユーザーのそれらのプロジェクトへのアクセスを認可します。この認可には、ルール、ロール、およびバインディングの形式が使用されます。

  • ルールは、ユーザーがプロジェクト内で作成またはアクセスできるものを定義します。
  • ロールは、選択されたユーザーまたはグループにバインドできるルールのコレクションです。
  • バインディングは、ユーザーまたはグループとロール間の関連付けを定義します。

ローカル RBAC ロールおよびバインディングは、ユーザーまたはグループを特定のプロジェクトに割り当てます。クラスター RBAC では、クラスター全体のロールおよびバインディングをクラスターのすべてのプロジェクトに割り当てることができます。adminbasic-usercluster-admin、および cluster-status アクセスを提供するために割り当てることのできるデフォルトのクラスターロールがあります。

3.10.2. 受付プラグインでのコントロールプレーンの保護

RBAC はユーザーおよびグループと利用可能なプロジェクト間のアクセスルールを制御しますが、受付プラグイン は OpenShift Container Platform マスター API へのアクセスを定義します。受付プラグインは、以下で構成されるルールのチェーンを形成します。

  • デフォルトの受付プラグイン: これは、OpenShift Container Platform コントロールプレーンのコンポーネントに適用されるポリシーおよびリソース制限のデフォルトセットを実装します。
  • 変更用の受付プラグイン: これらのプラグインは受付チェーンを動的に拡張します。これらは Webhook サーバーに対する呼び出しを実行し、要求の認証および選択されたリソースの変更の両方を実行します。
  • 検証用の受付プラグイン: 選択されたリソースの要求を検証し、要求を検証すると共にリソースが再度変更されないようにすることができます。

API 要求はチェーン内の受付プラグインを通過し、途中で失敗した場合には要求が拒否されます。それぞれの受付プラグインは特定のリソースに関連付けられ、それらのリソースの要求にのみ応答します。

3.10.2.1. SCC (Security Context Constraints)

Security Context Constraints (SCC) を使用して、Pod のシステムでの受け入れを可能にするために Pod の実行時に必要となる一連の条件を定義することができます。

以下は、SCC で管理できる分野の一部です。

  • 特権付きコンテナーの実行
  • コンテナーが要求できる機能の追加
  • ホストディレクトリーのボリュームとしての使用
  • コンテナーの SELinux コンテキスト
  • コンテナーのユーザー ID

必要なパーミッションがある場合は、必要に応じてデフォルトの SCC ポリシーの許容度を上げるように調整することができます。

3.10.2.2. ロールのサービスアカウントへの付与

ロールは、ユーザーにロールベースのアクセスを割り当てるのと同じ方法で、サービスアカウントに割り当てることができます。各プロジェクトに 3 つのデフォルトサービスアカウントが作成されます。サービスアカウント:

  • スコープが特定プロジェクトに制限される
  • その名前はそのプロジェクトから派生している。
  • OpenShift Container レジストリーにアクセスするために API トークンおよび認証情報が自動的に割り当てられる。

プラットフォームのコンポーネントに関連付けられたサービスアカウントでは、キーが自動的にローテーションされます。

3.10.3. 認証および認可

3.10.3.1. OAuth を使用したアクセスの制御

コンテナープラットフォームのセキュリティーを保護にするために、認証および承認で API アクセス制御を使用することができます。OpenShift Container Platform マスターには、組み込まれた OAuth サーバーが含まれます。ユーザーは、OAuth アクセストークンを取得して API に対して認証することができます。

管理者として、LDAP、GitHub、または Google などの アイデンティティープロバイダー を使用して認証できるように OAuth を設定できます。新規の OpenShift Container Platform デプロイメントには、デフォルトでアイデンティティープロバイダーが使用されますが、これを初期インストール時またはインストール後に設定できます。

3.10.3.2. API アクセス制御および管理

アプリケーションには、管理を必要とする各種のエンドポイントを持つ複数の独立した API サービスを設定できます。OpenShift Container Platform には 3scale API ゲートウェイのコンテナー化されたバージョンが含まれており、これにより API を管理し、アクセスを制御することができます。

3scale は、API の認証およびセキュリティーについての様々な標準オプションを提供します。 これらは、認証情報を発行し、アクセスを制御するために単独で使用することも、他と組み合わせて使用することもできます (例: 標準 API キー、アプリケーション ID とキーペア、OAuth 2.0 など)。

アクセスについては、特定のエンドポイント、メソッド、およびサービスに制限することができ、アクセスポリシーをユーザーグループに適用することができます。アプリケーションの計画に基づいて、API の使用にレート制限を設定したり、開発者グループのトラフィックフローを制御したりすることが可能です。

APIcast v2 (コンテナー化された 3scale API ゲートウェイ) の使用についてのチュートリアルは、3scale ドキュメントの「Running APIcast on Red Hat OpenShift」を参照してください。

3.10.3.3. Red Hat Single Sign-On

Red Hat Single Sign-On サーバーを使用すると、SAML 2.0、OpenID Connect、および OAuth 2.0 などの標準に基づく Web サインオン機能を提供し、アプリケーションのセキュリティーを保護することができます。このサーバーは、SAML または OpenID Connect ベースのアイデンティティープロバイダー (IdP) として機能します。つまり、標準ベースのトークンを使用して、アイデンティティー情報およびアプリケーションについてエンタープライズユーザーディレクトリーまたはサードパーティーのアイデンティティープロバイダーとの仲介を行います。Red Hat Single Sign-On を Microsoft Active Directory および Red Hat Enterprise Linux Identity Management を含む LDAP ベースのディレクトリーサービスと統合することが可能です。

3.10.3.4. セルフサービス Web コンソールのセキュリティー保護

OpenShift Container Platform はセルフサービスの Web コンソールを提供して、チームが認証なしに他の環境にアクセスできないようにします。OpenShift Container Platform は以下の条件に基づいてセキュアなマルチテナントマスターを提供します。

  • マスターへのアクセスは Transport Layer Security (TLS) を使用する。
  • API サーバーへのアクセスは X.509 証明書または OAuth アクセストークンを使用する。
  • プロジェクトのクォータは不正トークンによるダメージを制限する。
  • etcd サービスはクラスターに直接公開されない。

3.10.4. プラットフォームの証明書の管理

OpenShift Container Platform には、そのフレームワーク内に、TLS 証明書による暗号化を利用した REST ベースの HTTPS 通信を使用する複数のコンポーネントがあります。OpenShift Container Platform のインストーラーは、これらの認証をインストール時に設定します。以下は、このトラフィックを生成するいくつかの主要コンポーネントです。

  • マスター (API サーバーとコントローラー)
  • etcd
  • ノード
  • レジストリー
  • ルーター

3.10.4.1. カスタム証明書の設定

API サーバーおよび Web コンソールのパブリックホスト名のカスタム提供証明書は、初回のインストール時または証明書の再デプロイ時に設定できます。カスタム CA を使用することも可能です。

3.11. ネットワークのセキュリティー保護

ネットワークセキュリティーは、複数のレベルで管理できます。Pod レベルでは、ネットワーク namespace はネットワークアクセスを制限することで、コンテナーが他の Pod やホストシステムを認識できないようにすることができます。ネットワークポリシーにより、拒否している接続の許可について制御することができます。コンテナー化されたアプリケーションに対する ingress および egress トラフィックを管理することができます。

3.11.1. ネットワーク namespace の使用

OpenShift Container Platform はソフトウェア定義ネットワーク (SDN) を使用して、クラスター全体でのコンテナー間の通信を可能にする統一クラスターネットワークを提供します。

ネットワークポリシーモードは、デフォルトで他の Pod およびネットワークエンドポイントからプロジェクトのすべての Pod にアクセスできるようにします。プロジェクトで 1 つ以上の Pod を分離するには、そのプロジェクトで NetworkPolicy オブジェクトを作成し、許可する着信接続を指定します。マルチテナントモードを使用すると、Pod およびサービスのプロジェクトレベルの分離を実行できます。

3.11.2. ネットワークポリシーを使用した Pod の分離

ネットワークポリシー を使用して、同じプロジェクトの Pod を相互に分離することができます。ネットワークポリシーでは、Pod へのネットワークアクセスをすべて拒否し、Ingress コントローラーの接続のみを許可したり、他のプロジェクトの Pod からの接続を拒否したり、ネットワークの動作についての同様のルールを設定したりできます。

3.11.3. 複数の Pod ネットワークの使用

実行中の各コンテナーには、デフォルトでネットワークインターフェースが 1 つだけあります。Multus CNI プラグインを使用すると、複数の CNI ネットワークを作成し、それらのネットワークのいずれかを Pod に割り当てることができます。このようにして、プライベートデータをより制限されたネットワークに分離し、各ノードに複数のネットワークインターフェースを持たせることができます。

3.11.4. アプリケーションの分離

OpenShift Container Platform では、ユーザー、チーム、アプリケーション、および環境を非グローバルリソースから分離するマルチテナントのクラスターを作成するために、単一のクラスター上でネットワークのトラフィックをセグメント化することができます。

3.11.5. Ingress トラフィックのセキュリティー保護

OpenShift Container Platform クラスター外から Kubernetes サービスへのアクセスを設定する方法に関連し、セキュリティー上の影響についての多数の考慮点があります。Ingress ルーティングでは、HTTP および HTTPS ルートを公開するほか、NodePort または LoadBalancer Ingress タイプを設定できます。NodePort は、それぞれのクラスターワーカーからアプリケーションのサービス API オブジェクトを公開します。LoadBalancer を使用すると、外部ロードバランサーを OpenShift Container Platform クラスターの関連付けられたサービス API オブジェクトに割り当てることができます。

3.11.6. Egress トラフィックのセキュリティー保護

OpenShift Container Platform は、ルーターまたはファイアウォールのいずれかを使用して Egress トラフィックを制御する機能を提供します。たとえば、IP のホワイトリストを使用して、データベースのアクセスを制御できます。クラスター管理者は、1 つ以上の egress IP アドレスを OpenShift Container Platform SDN ネットワークプロバイダーのプロジェクトに割り当てることができます。同様に、クラスター管理者は egress ファイアウォールを使用して、egress トラフィックが OpenShift Container Platform クラスター外に送信されないようにできます。

固定 egress IP アドレスを割り当てることで、すべての送信トラフィックを特定プロジェクトのその IP アドレスに割り当てることができます。egress ファイアウォールを使用すると、Pod が外部ネットワークに接続されないようにしたり、Pod が内部ネットワークに接続されないようにするか、または Pod の特定の内部サブネットへのアクセスを制限したりできます。

3.12. 割り当てられたストレージのセキュリティー保護

OpenShift Container Platform は、オンプレミスおよびクラウドプロバイダーの両方で、複数のタイプのストレージをサポートします。とくに、OpenShift Container Platform は Container Storage Interface をサポートするストレージタイプを使用できます。

3.12.1. 永続ボリュームプラグイン

コンテナーは、ステートレスとステートフルの両方のアプリケーションに役立ちます。割り当て済みのストレージを保護することは、ステートフルサービスのセキュリティーを保護する上で重要な要素になります。Container Storage Interface (CSI) を使用すると、OpenShift Container Platform は CSI インターフェースをサポートするストレージバックエンドからのストレージを組み込むことができます。

OpenShift Container Platform は、以下を含む複数のタイプのストレージのプラグインを提供します。

  • Red Hat OpenShift Container Storage *
  • AWS Elastic Block Stores (EBS) *
  • AWS Elastic File System (EFS) *
  • Azure Disk
  • Azure File
  • OpenStack Cinder *
  • GCE Persistent Disks *
  • VMware vSphere *
  • ネットワークファイルシステム (NFS)
  • FlexVolume
  • ファイバーチャネル
  • iSCSI

動的プロビジョニングでのこれらのストレージタイプのプラグインには、アスタリスク (*) が付いています。送信中のデータは、相互に通信している OpenShift Container Platform のすべてのコンポーネントについて HTTPS 経由で暗号化されます。

永続ボリューム (PV) はストレージタイプでサポートされる方法でホスト上にマウントできます。異なるタイプのストレージにはそれぞれ異なる機能があり、各 PV のアクセスモードは、特定のボリュームによってサポートされる特定のモードに設定されます。

たとえば、NFS は複数の読み取り/書き込みクライアントをサポートしますが、特定の NFS PV は読み取り専用としてサーバー上でエクスポートされる可能性があります。各 PV には、ReadWriteOnceReadOnlyMany、および ReadWriteMany など、特定の PV 機能を説明したアクセスモードの独自のセットがあります。

3.12.2. 共有ストレージ

NFS のような共有ストレージプロバイダーの場合、PV はグループ ID (GID) を PV リソースのアノテーションとして登録します。次に、Pod が PV を要求する際に、アノテーションが付けられた GID が Pod の補助グループに追加され、この Pod に共有ストレージのコンテンツへのアクセスを付与します。

3.12.3. ブロックストレージ

AWS Elastic Block Store (EBS)、GCE Persistent Disks、および iSCSI などのブロックストレージプロバイダーの場合、OpenShift Container Platform は SELinux 機能を使用し、権限のない Pod のマウントされたボリュームについて、そのマウントされたボリュームが関連付けられたコンテナーにのみ所有され、このコンテナーにのみ表示されるようにしてそのルートを保護します。

3.13. クラスターイベントとログの監視

OpenShift Container Platform クラスターを監視および監査する機能は、不適切な利用に対してクラスターおよびそのユーザーを保護する上で重要な要素となります。

これに関連し、イベントとログという 2 つの主な情報源をクラスターレベルの情報として使用できます。

3.13.1. クラスターイベントの監視

クラスター管理者は、関連するイベントを判別できるように イベント のリソースタイプについて理解し、システムイベントの一覧を確認することをお勧めします。イベントは、関連するリソースの namespace または default namespace (クラスターイベントの場合) のいずれかの namespace に関連付けられます。デフォルト の namespace は、クラスターを監視または監査するための関連するイベントを保持します。 たとえば、これにはノードイベントおよびインフラストラクチャーコンポーネントに関連したリソースイベントが含まれます。

マスター API および oc コマンドは、イベントの一覧をノードに関連するものに制限するパラメーターを提供しません。これを実行する簡単な方法として grep を使用することができます。

$ oc get event -n default | grep Node

出力例

1h         20h         3         origin-node-1.example.local   Node      Normal    NodeHasDiskPressure   ...

より柔軟な方法として、他のツールで処理できる形式でイベントを出力することができます。たとえば、以下の例では NodeHasDiskPressure イベントのみを展開するために JSON 出力に対して jq ツールを使用しています。

$ oc get events -n default -o json \
  | jq '.items[] | select(.involvedObject.kind == "Node" and .reason == "NodeHasDiskPressure")'

出力例

{
  "apiVersion": "v1",
  "count": 3,
  "involvedObject": {
    "kind": "Node",
    "name": "origin-node-1.example.local",
    "uid": "origin-node-1.example.local"
  },
  "kind": "Event",
  "reason": "NodeHasDiskPressure",
  ...
}

リソースの作成や変更、または削除に関連するイベントも、クラスターの不正な使用を検出するために使用することができます。たとえば、以下のクエリーは、イメージの過剰なプルの有無を確認するために使用できます。

$ oc get events --all-namespaces -o json \
  | jq '[.items[] | select(.involvedObject.kind == "Pod" and .reason == "Pulling")] | length'

出力例

4

注記

namespace を削除すると、そのイベントも削除されます。イベントも期限切れになる可能性があり、etcd ストレージが一杯にならないように削除されます。イベントは永続するレコードとして保存されず、一定期間の統計データを取得するためにポーリングを頻繁に実行する必要があります。

3.13.2. ロギング

oc log コマンドを使用して、コンテナーログ、ビルド設定およびデプロイメントをリアルタイムで表示できます。ユーザーによって、ログへの異なるアクセスが必要になる場合があります。

  • プロジェクトにアクセスできるユーザーは、デフォルトでそのプロジェクトのログを確認することができます。
  • 管理ロールを持つユーザーは、すべてのコンテナーログにアクセスできます。

詳細な監査および分析のためにログを保存するには、cluster-logging アドオン機能を有効にして、システム、コンテナー、監査ログを収集し、管理し、表示できます。Elasticsearch Operator および Cluster Logging Operator を使用してクラスターロギングをデプロイし、管理し、アップグレードできます。

3.13.3. 監査ログ

監査ログ を使用すると、ユーザー、管理者、またはその他の OpenShift Container Platform コンポーネントの動作に関連する一連のアクティビティーをフォローできます。API 監査ロギングは各サーバーで行われます。

第4章 証明書の設定

4.1. デフォルトの Ingress 証明書の置き換え

4.1.1. デフォルトの Ingress 証明書について

デフォルトで、OpenShift Container Platform は Ingress Operator を使用して内部 CA を作成し、 .apps サブドメインの下にあるアプリケーションに有効なワイルドカード証明書を発行します。Web コンソールと CLI のどちらもこの証明書を使用します。

内部インフラストラクチャー CA 証明書は自己署名型です。一部のセキュリティーまたは PKI チームにとってこのプロセスは適切とみなされない可能性がありますが、ここで想定されるリスクは最小限度のものです。これらの証明書を暗黙的に信頼するクライアントがクラスター内の他のコンポーネントになります。デフォルトのワイルドカード証明書を、コンテナーユーザー空間で提供される CA バンドルにすでに含まれているパブリック CA に置き換えることで、外部クライアントは .apps サブドメインで実行されるアプリケーションに安全に接続できます。

4.1.2. デフォルトの Ingress 証明書の置き換え

.apps サブドメインにあるすべてのアプリケーションのデフォルトの Ingress 証明書を置き換えることができます。証明書を置き換えた後に、Web コンソールや CLI を含むすべてのアプリケーションには、指定された証明書で提供される暗号化が設定されます。

前提条件

  • 完全修飾 .apps サブドメインおよびその対応するプライベートキーのワイルドカード証明書が必要です。それぞれが個別の PEM 形式のファイルである必要があります。
  • プライベートキーの暗号化は解除されている必要があります。キーが暗号化されている場合は、これを OpenShift Container Platform にインポートする前に復号化します。
  • 証明書には、*.apps.<clustername>.<domain> を示す subjectAltName 拡張が含まれている必要があります。
  • 証明書ファイルでは、チェーンに 1 つ以上の証明書を含めることができます。ワイルドカード証明書は、ファイルの最初の証明書である必要があります。この後には中間証明書が続き、ファイルの最後はルート CA 証明書にすることができます。
  • ルート CA 証明書を追加の PEM 形式のファイルにコピーします。

手順

  1. ワイルドカード証明書の署名に使用されるルート CA 証明書のみが含まれる設定マップを作成します。

    $ oc create configmap custom-ca \
         --from-file=ca-bundle.crt=</path/to/example-ca.crt> \1
         -n openshift-config
    1
    </path/to/example-ca.crt> は、ローカルファイルシステム上のルート CA 証明書ファイルへのパスです。
  2. 新たに作成された設定マップでクラスター全体のプロキシー設定を更新します。

    $ oc patch proxy/cluster \
         --type=merge \
         --patch='{"spec":{"trustedCA":{"name":"custom-ca"}}}'
  3. ワイルドカード証明書チェーンおよびキーが含まれるシークレットを作成します。

    $ oc create secret tls <secret> \1
         --cert=</path/to/cert.crt> \2
         --key=</path/to/cert.key> \3
         -n openshift-ingress
    1
    <secret> は、証明書チェーンおよびプライベートキーが含まれるシークレットの名前です。
    2
    </path/to/cert.crt> は、ローカルファイルシステム上の証明書チェーンへのパスです。
    3
    </path/to/cert.key> は、この証明書に関連付けられるプライベートキーへのパスです。
  4. Ingress コントローラー設定を、新規に作成されたシークレットで更新します。

    $ oc patch ingresscontroller.operator default \
         --type=merge -p \
         '{"spec":{"defaultCertificate": {"name": "<secret>"}}}' \1
         -n openshift-ingress-operator
    1
    <certificate> を、直前の手順でシークレットに使用された名前に置き換えます。

4.2. API サーバー証明書の追加

デフォルトの API サーバー証明書は、内部 OpenShift Container Platform クラスター CA によって発行されます。クラスター外のクライアントは、デフォルトで API サーバーの証明書を検証できません。この証明書は、クライアントが信頼する CA によって発行される証明書に置き換えることができます。

4.2.1. API サーバーの名前付き証明書の追加

デフォルトの API サーバー証明書は、内部 OpenShift Container Platform クラスター CA によって発行されます。リバースプロキシーやロードバランサーが使用される場合など、クライアントが要求する完全修飾ドメイン名 (FQDN) に基づいて、API サーバーが返す代替証明書を 1 つ以上追加できます。

前提条件

  • FQDN とそれに対応するプライベートキーの証明書が必要です。それぞれが個別の PEM 形式のファイルである必要があります。
  • プライベートキーの暗号化は解除されている必要があります。キーが暗号化されている場合は、これを OpenShift Container Platform にインポートする前に復号化します。
  • 証明書には、FQDN を示す subjectAltName 拡張が含まれる必要があります。
  • 証明書ファイルでは、チェーンに 1 つ以上の証明書を含めることができます。API サーバー FQDN の証明書は、ファイルの最初の証明書である必要があります。この後には中間証明書が続き、ファイルの最後はルート CA 証明書にすることができます。
警告

内部ロードバランサーに名前付きの証明書を指定しないようにしてください (ホスト名 api-int.<cluster_name>.<base_domain>)。これを指定すると、クラスターの状態は動作の低下した状態になります。

手順

  1. openshift-config namespace に証明書およびプライベートキーが含まれるシークレットを作成します。

    $ oc create secret tls <secret> \1
         --cert=</path/to/cert.crt> \2
         --key=</path/to/cert.key> \3
         -n openshift-config
    1
    <secret> は、証明書チェーンおよびプライベートキーが含まれるシークレットの名前です。
    2
    </path/to/cert.crt> は、ローカルファイルシステム上の証明書チェーンへのパスです。
    3
    </path/to/cert.key> は、この証明書に関連付けられるプライベートキーへのパスです。
  2. API サーバーを作成されたシークレットを参照するように更新します。

    $ oc patch apiserver cluster \
         --type=merge -p \
         '{"spec":{"servingCerts": {"namedCertificates":
         [{"names": ["<FQDN>"], 1
         "servingCertificate": {"name": "<secret>"}}]}}}' 2
    1
    <FQDN> を、API サーバーが証明書を提供する FQDN に置き換えます。
    2
    <certificate> を、直前の手順でシークレットに使用された名前に置き換えます。
  3. apiserver/cluster オブジェクトを検査し、シークレットが参照されていることを確認します。

    $ oc get apiserver cluster -o yaml

    出力例

    ...
    spec:
      servingCerts:
        namedCertificates:
        - names:
          - <FQDN>
          servingCertificate:
            name: <secret>
    ...

4.3. サービス提供証明書のシークレットによるサービストラフィックのセキュリティー保護

4.3.1. サービス提供証明書について

サービス提供証明書は、暗号化を必要とする複雑なミドルウェアアプリケーションをサポートすることが意図されています。これらの証明書は、TLS Web サーバー証明書として発行されます。

service-ca コントローラーは、サービス証明書を生成するために x509.SHA256WithRSA 署名アルゴリズムを使用します。

生成される証明書およびキーは PEM 形式のもので、作成されたシークレット内の tls.crt および tls.key にそれぞれ保存されます。証明書およびキーは、有効期間に近づくと自動的に置き換えられます。

サービス証明書を発行するサービス CA 証明書は 26 ヵ月間有効であり、有効期間が 13 ヵ月未満になると自動的にローテーションされます。ローテーション後も、直前のサービス CA 設定は有効期限が切れるまで信頼されます。これにより、影響を受けるすべてのサービスについて、期限が切れる前にそれらのキーの情報を更新できるように猶予期間が許可されます。この猶予期間中にクラスターをアップグレード(サービスを再起動してそれらのキー情報を更新する)を実行しない場合、直前のサービス CA の期限が切れた後の失敗を防ぐためにサービスを手動で再起動する必要がある場合があります。

注記

以下のコマンドを使用して、クラスター内のすべての Pod を手動で再起動できます。このコマンドは、すべての namespace で実行されているすべての Pod を削除するため、このコマンドを実行するとサービスが中断します。これらの Pod は削除後に自動的に再起動します。

$ for I in $(oc get ns -o jsonpath='{range .items[*]} {.metadata.name}{"\n"} {end}'); \
      do oc delete pods --all -n $I; \
      sleep 1; \
      done

4.3.2. サービス証明書の追加

サービスとの通信のセキュリティーを保護するには、サービスと同じ namespace のシークレットに署名済みの提供証明書とキーのペアを生成します。

重要

生成される証明書は、内部サービス DNS 名 <service.name>.<service.namespace>.svc にのみ有効であり、内部通信用にのみ有効です。

前提条件

  • サービスが定義されていること。

手順

  1. サービスに service.beta.openshift.io/serving-cert-secret-name のアノテーションを付けます。

    $ oc annotate service <service_name> \1
         service.beta.openshift.io/serving-cert-secret-name=<secret_name> 2
    1
    <service_name> を、セキュリティー保護するサービスの名前に置き換えます。
    2
    <secret_name> は、証明書とキーのペアを含む生成されたシークレットの名前です。便宜上、これを <service_name> と同じにすることが推奨されます。

    たとえば、以下のコマンドを使用してサービス test1 にアノテーションを付けます。

    $ oc annotate service test1 service.beta.openshift.io/serving-cert-secret-name=test1
  2. アノテーションが存在することを確認するためにサービスを検査します。

    $ oc describe service <service_name>

    出力例

    ...
    Annotations:              service.beta.openshift.io/serving-cert-secret-name: <service_name>
                              service.beta.openshift.io/serving-cert-signed-by: openshift-service-serving-signer@1556850837
    ...

  3. クラスターがサービスのシークレットを生成した後に、Pod 仕様がこれをマウントでき、Pod はシークレットが利用可能になった後にこれを実行できます。

4.3.3. サービス CA バンドルの設定マップへの追加

Pod は、service.beta.openshift.io/inject-cabundle=true のアノテーションの付いた ConfigMap オブジェクトをマウントしてサービス CA 証明書にアクセスできます。アノテーションが付けられると、クラスターはサービス CA 証明書を設定マップの service-ca.crt キーに自動的に挿入します。この CA 証明書にアクセスできると、TLS クライアントはサービス提供証明書を使用してサービスへの接続を検証できます。

重要

このアノテーションが設定マップに追加されると、その中に含まれるすべての既存データが削除されます。service-ca.crt を組み込む設定マップとしては、Pod の設定の保存先と同じ設定マップではなく、別の設定マップを使用することが推奨されます。

手順

  1. 設定マップに service.beta.openshift.io/inject-cabundle=true のアノテーションを付けます。

    $ oc annotate configmap <config_map_name> \1
         service.beta.openshift.io/inject-cabundle=true
    1
    <config_map_name> を、アノテーションを付ける設定マップの名前に置き換えます。
    注記

    ボリュームマウントの service-ca.crt キーを明示的に参照することにより、設定マップが CA バンドルと共に挿入されるまで、Pod を起動できなくなります。この動作は、ボリュームの提供証明書の設定について optional フィールドを true に設定して上書きできます。

    たとえば、以下のコマンドを使用して設定マップtest1 にアノテーションを付けます。

    $ oc annotate configmap test1 service.beta.openshift.io/inject-cabundle=true
  2. 設定マップを表示して、サービス CA バンドルが挿入されていることを確認します。

    $ oc get configmap <config_map_name> -o yaml

    CA バンドルは、YAML 出力の service-ca.crt キーの値として表示されます。

    apiVersion: v1
    data:
      service-ca.crt: |
        -----BEGIN CERTIFICATE-----
    ...

4.3.4. サービス CA バンドルの API サービスへの追加

APIService オブジェクトに service.beta.openshift.io/inject-cabundle=true のアノテーションを付け、その spec.caBundle フィールドにサービス CA バンドルを設定できます。これにより、Kubernetes API サーバーはターゲットに設定されたエンドポイントのセキュリティーを保護するために使用されるサービス CA 証明書を検証することができます。

手順

  1. API サービスに service.beta.openshift.io/inject-cabundle=true のアノテーションを付けます。

    $ oc annotate apiservice <api_service_name> \1
         service.beta.openshift.io/inject-cabundle=true
    1
    <api_service_name> を、アノテーションを付ける API サービスの名前に置き換えます。

    たとえば、以下のコマンドを使用して API サービス test1 にアノテーションを付けます。

    $ oc annotate apiservice test1 service.beta.openshift.io/inject-cabundle=true
  2. API サービスを表示し、サービス CA バンドルが挿入されていることを確認します。

    $ oc get apiservice <api_service_name> -o yaml

    CA バンドルは YAML 出力の spec.caBundle フィールドに表示されます。

    apiVersion: apiregistration.k8s.io/v1
    kind: APIService
    metadata:
      annotations:
        service.beta.openshift.io/inject-cabundle: "true"
    ...
    spec:
      caBundle: <CA_BUNDLE>
    ...

4.3.5. サービス CA バンドルのカスタムリソース定義への追加

CustomResourceDefinition (CRD) オブジェクトに service.beta.openshift.io/inject-cabundle=true のアノテーションを付け、その spec.conversion.webhook.clientConfig.caBundle フィールドにサービス CA バンドルを設定できます。これにより、Kubernetes API サーバーはターゲットに設定されたエンドポイントのセキュリティーを保護するために使用されるサービス CA 証明書を検証することができます。

注記

サービス CA バンドルは、CRD が変換に Webhook を使用するように設定されている場合にのみ CRD にインジェクトされます。CRD の Webhook がサービス CA 証明書でセキュリティー保護されている場合にのみ、サービス CA バンドルを挿入することは役に立ちます。

手順

  1. CRD に service.beta.openshift.io/inject-cabundle=true のアノテーションを付けます。

    $ oc annotate crd <crd_name> \1
         service.beta.openshift.io/inject-cabundle=true
    1
    <crd_name> をアノテーションを付ける CRD の名前に置き換えます。

    たとえば、以下のコマンドを使用して CRD test1 にアノテーションを付けます。

    $ oc annotate crd test1 service.beta.openshift.io/inject-cabundle=true
  2. CRD を表示して、サービス CA バンドルが挿入されていることを確認します。

    $ oc get crd <crd_name> -o yaml

    CA バンドルは、YAML 出力の spec.conversion.webhook.clientConfig.caBundle フィールドに表示されます。

    apiVersion: apiextensions.k8s.io/v1
    kind: CustomResourceDefinition
    metadata:
      annotations:
        service.beta.openshift.io/inject-cabundle: "true"
    ...
    spec:
      conversion:
        strategy: Webhook
        webhook:
          clientConfig:
            caBundle: <CA_BUNDLE>
    ...

4.3.6. サービス CA バンドルの変更用 Webhook 設定への追加

MutatingWebhookConfiguration オブジェクトに service.beta.openshift.io/inject-cabundle=true のアノテーションを付け、各 Webhook の clientConfig.caBundle フィールドにサービス CA バンドルを設定できます。これにより、Kubernetes API サーバーはターゲットに設定されたエンドポイントのセキュリティーを保護するために使用されるサービス CA 証明書を検証することができます。

注記

異なる Webhook に異なる CA バンドルを指定する必要がある受付 Webhook 設定にはこのアノテーションを設定しないでください。これを実行する場合、サービス CA バンドルはすべての Webhook について挿入されます。

手順

  1. 変更用 Webhook 設定に service.beta.openshift.io/inject-cabundle=true のアノテーションを付けます。

    $ oc annotate mutatingwebhookconfigurations <mutating_webhook_name> \1
         service.beta.openshift.io/inject-cabundle=true
    1
    <mutatingwebhook-name> を、アノテーションを付ける変更用 webhook 設定の名前に置き換えます。

    たとえば、以下のコマンドを使用して変更用 webhook 設定 test1 にアノテーションを付けます。

    $ oc annotate mutatingwebhookconfigurations test1 service.beta.openshift.io/inject-cabundle=true
  2. 変更用 webhook 設定を表示して、サービス CA バンドルが挿入されていることを確認します。

    $ oc get mutatingwebhookconfigurations <mutating_webhook_name> -o yaml

    CA バンドルは、YAML 出力のすべての Webhook の clientConfig.caBundle フィールドに表示されます。

    apiVersion: admissionregistration.k8s.io/v1
    kind: MutatingWebhookConfiguration
    metadata:
      annotations:
        service.beta.openshift.io/inject-cabundle: "true"
    ...
    webhooks:
    - myWebhook:
      - v1beta1
      clientConfig:
        caBundle: <CA_BUNDLE>
    ...

4.3.7. サービス CA バンドルの変更用 webhook 設定への追加

ValidatingWebhookConfiguration オブジェクトに service.beta.openshift.io/inject-cabundle=true のアノテーションを付け、各 Webhook の clientConfig.caBundle フィールドにサービス CA バンドルを設定できます。これにより、Kubernetes API サーバーはターゲットに設定されたエンドポイントのセキュリティーを保護するために使用されるサービス CA 証明書を検証することができます。

注記

異なる Webhook に異なる CA バンドルを指定する必要がある受付 Webhook 設定にはこのアノテーションを設定しないでください。これを実行する場合、サービス CA バンドルはすべての Webhook について挿入されます。

手順

  1. 検証用 Webhook 設定に service.beta.openshift.io/inject-cabundle=true のアノテーションを付けます。

    $ oc annotate validatingwebhookconfigurations <validating_webhook_name> \1
         service.beta.openshift.io/inject-cabundle=true
    1
    <validating_webhook_name> をアノテーションを付ける検証用 webhook 設定の名前に置き換えます。

    たとえば、以下のコマンドを使用して検証用 webhook 設定 test1 にアノテーションを付けます。

    $ oc annotate validatingwebhookconfigurations test1 service.beta.openshift.io/inject-cabundle=true
  2. 検証用 webhook 設定を表示して、サービス CA バンドルが挿入されていることを確認します。

    $ oc get validatingwebhookconfigurations <validating_webhook_name> -o yaml

    CA バンドルは、YAML 出力のすべての Webhook の clientConfig.caBundle フィールドに表示されます。

    apiVersion: admissionregistration.k8s.io/v1
    kind: ValidatingWebhookConfiguration
    metadata:
      annotations:
        service.beta.openshift.io/inject-cabundle: "true"
    ...
    webhooks:
    - myWebhook:
      - v1beta1
      clientConfig:
        caBundle: <CA_BUNDLE>
    ...

4.3.8. 生成されたサービス証明書の手動によるローテーション

関連付けられたシークレットを削除することにより、サービス証明書をローテーションできます。シークレットを削除すると、新規のシークレットが自動的に作成され、新規証明書が作成されます。

前提条件

  • 証明書とキーのペアを含むシークレットがサービス用に生成されていること。

手順

  1. 証明書を含むシークレットを確認するためにサービスを検査します。これは、以下に示すように serving-cert-secret-name アノテーションにあります。

    $ oc describe service <service_name>

    出力例

    ...
    service.beta.openshift.io/serving-cert-secret-name: <secret>
    ...

  2. サービスの生成されたシークレットを削除します。このプロセスで、シークレットが自動的に再作成されます。

    $ oc delete secret <secret> 1
    1
    <secret> を、直前の手順のシークレットの名前に置き換えます。
  3. 新規シークレットを取得し、AGE を調べて、証明書が再作成されていることを確認します。

    $ oc get secret <service_name>

    出力例

    NAME              TYPE                DATA   AGE
    <service.name>    kubernetes.io/tls   2      1s

4.3.9. サービス CA 証明書の手動によるローテーション

サービス CA は 26 ヵ月間有効で、有効期間が 13 ヵ月未満になると自動的に更新されます。

必要に応じて、以下の手順でサービス CA を手動で更新することができます。

警告

手動でローテーションされるサービス CA は、直前のサービス CA で信頼を維持しません。クラスターの Pod が再起動するまでサービスが一時的に中断する可能性があります。これにより、Pod が新規サービス CA で発行されるサービス提供証明書を使用できるようになります。

前提条件

  • クラスター管理者としてログインしている必要があります。

手順

  1. 以下のコマンドを使用して、現在のサービス CA 証明書の有効期限を表示します。

    $ oc get secrets/signing-key -n openshift-service-ca \
         -o template='{{index .data "tls.crt"}}' \
         | base64 --decode \
         | openssl x509 -noout -enddate
  2. サービス CA を手動でローテーションします。このプロセスは、新規サービス証明書に署名するために使用される新規サービス CA を生成します。

    $ oc delete secret/signing-key -n openshift-service-ca
  3. 新規証明書をすべてのサービスに適用するには、クラスター内のすべての Pod を再起動します。このコマンドにより、すべてのサービスが更新された証明書を使用するようになります。

    $ for I in $(oc get ns -o jsonpath='{range .items[*]} {.metadata.name}{"\n"} {end}'); \
          do oc delete pods --all -n $I; \
          sleep 1; \
          done
    警告

    このコマンドは、すべての namespace で実行されているすべての Pod を調べ、これらを削除するため、サービスを中断させます。これらの Pod は削除後に自動的に再起動します。

第5章 証明書の種類および説明

5.1. API サーバーのユーザーによって提供される証明書

5.1.1. 目的

API サーバーは、api.<cluster_name>.<base_domain> のクラスター外にあるクライアントからアクセスできます。クライアントに別のホスト名で API サーバーにアクセスさせたり、クラスター管理の認証局 (CA) 証明書をクライアントに配布せずに API サーバーにアクセスさせたりする必要が生じる場合があります。管理者は、コンテンツを提供する際に API サーバーによって使用されるカスタムデフォルト証明書を設定する必要があります。

5.1.2. 場所

ユーザーによって提供される証明書は、openshift-config namespace の kubernetes.io/tls タイプの Secret で指定される必要があります。ユーザーによって提供される証明書を使用できるように、API サーバークラスター設定の apiserver/cluster リソースを更新します。

5.1.3. 管理

ユーザーによって提供される証明書はユーザーによって管理されます。

5.1.4. 有効期限

API サーバークライアント証明書の有効期限は 5 分未満です。

ユーザーによって提供される証明書はユーザーによって管理されます。

5.1.5. カスタマイズ

必要に応じて、ユーザーが管理する証明書を含むシークレットを更新します。

追加リソース

5.2. プロキシー証明書

5.2.1. 目的

プロキシー証明書により、ユーザーは egress 接続の実行時にプラットフォームコンポーネントによって使用される 1 つ以上のカスタム認証局 (CA) 証明書を指定できます。

プロキシーオブジェクトの trustedCA フィールドは、ユーザーによって提供される信頼される認証局 (CA) バンドルを含む設定マップの参照です。このバンドルは Red Hat Enterprise Linux CoreOS (RHCOS) 信頼バンドルにマージされ、egress HTTPS 呼び出しを行うプラットフォームコンポーネントの信頼ストアに挿入されます。たとえば、image-registry-operator は外部イメージレジストリーを呼び出してイメージをダウンロードします。trustedCA が指定されていない場合、 RHCOS 信頼バンドルのみがプロキシーされる HTTPS 接続に使用されます。独自の証明書インフラストラクチャーを使用する場合は、カスタム CA 証明書を RHCOS 信頼バンドルに指定します。

trustedCA フィールドは、プロキシーバリデーターによってのみ使用される必要があります。バリデーターは、必要なキー ca-bundle.crt から証明書バンドルを読み取り、これを openshift-config-managed namespace の trusted-ca-bundle という名前の設定マップにコピーします。trustedCA によって参照される設定マップの namespace は openshift-config です。

apiVersion: v1
kind: ConfigMap
metadata:
  name: user-ca-bundle
  namespace: openshift-config
data:
  ca-bundle.crt: |
    -----BEGIN CERTIFICATE-----
    Custom CA certificate bundle.
    -----END CERTIFICATE-----
追加リソース

5.2.2. インストール時のプロキシー証明書の管理

インストーラー設定の additionalTrustBundle 値は、インストール時にプロキシー信頼 CA 証明書を指定するために使用されます。以下は例になります。

$ cat install-config.yaml

出力例

...
proxy:
  httpProxy: http://<https://username:password@proxy.example.com:123/>
  httpsProxy: https://<https://username:password@proxy.example.com:123/>
	noProxy: <123.example.com,10.88.0.0/16>
additionalTrustBundle: |
    -----BEGIN CERTIFICATE-----
   <MY_HTTPS_PROXY_TRUSTED_CA_CERT>
    -----END CERTIFICATE-----
...

5.2.3. 場所

ユーザーによって提供される信頼バンドルは、設定マップとして表現されます。設定マップは、egress HTTPS 呼び出しを行うプラットフォームコンポーネントのファイルシステムにマウントされます。通常、Operator は設定マップを /etc/pki/ca-trust/extracted/pem/tls-ca-bundle.pem にマウントしますが、これはプロキシーでは必要ありません。プロキシーは HTTPS 接続を変更したり、検査したりできます。いずれの場合も、プロキシーは接続用の新規証明書を生成して、これに署名する必要があります。

完全なプロキシーサポートとは、指定されたプロキシーに接続し、生成した署名を信頼することを指します。そのため、信頼されたルートに接続しているいずれの証明書チェーンも信頼されるように、ユーザーがその信頼されたルートを指定する必要があります。

RHCOS 信頼バンドルを使用している場合、CA 証明書を /etc/pki/ca-trust/source/anchors に配置します。

詳細は、Red Hat Enterprise Linux ドキュメントの「共有システム証明書の使用」を参照してください。

5.2.4. 有効期限

ユーザーは、ユーザーによって提供される信頼バンドルの有効期限を設定します。

デフォルトの有効期限は CA 証明書自体で定義されます。この設定は、OpenShift Container Platform または RHCOS で使用する前に、CA 管理者が証明書に対して行います。

注記

Red Hat では、CA の有効期限が切れるタイミングを監視しません。ただし、CA の有効期間は長く設定されるため、通常問題は生じません。ただし、信頼バンドルを定期的に更新する必要がある場合があります。

5.2.5. サービス

デフォルトで、egress HTTPS 呼び出しを行うすべてのプラットフォームコンポーネントは RHCOS 信頼バンドルを使用します。trustedCA が定義される場合、これも使用されます。

RHCOS ノードで実行されているすべてのサービスは、ノードの信頼バンドルを使用できます。

5.2.6. 管理

これらの証明書は、ユーザーではなく、システムによって管理されます。

5.2.7. カスタマイズ

ユーザーによって提供される信頼バンドルを更新するには、以下のいずれかを実行します。

  • trustedCA で参照される設定マップの PEM でエンコードされた証明書の更新
  • 新しい信頼バンドルが含まれる namespace openshift-config での設定マップの作成、および新規設定マップの名前を参照できるようにするための trustedCA の更新

CA 証明書を RHCOS 信頼バンドルに書き込むメカニズムは、マシン設定を使用して行われるその他のファイルの RHCOS への書き込みと全く同じです。Machine Config Operator (MCO) が新規 CA 証明書が含まれる新規マシン設定を適用すると、ノードは再起動されます。次回の起動時に、サービス coreos-update-ca-trust.service は RHCOS ノードで実行されます。これにより、新規 CA 証明書で信頼バンドルが自動的に更新されます。以下は例になります。

apiVersion: machineconfiguration.openshift.io/v1
kind: MachineConfig
metadata:
  labels:
    machineconfiguration.openshift.io/role: worker
  name: 50-examplecorp-ca-cert
spec:
  config:
    ignition:
      version: 3.1.0
    storage:
      files:
      - contents:
          source: data:text/plain;charset=utf-8;base64,LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUVORENDQXh5Z0F3SUJBZ0lKQU51bkkwRDY2MmNuTUEwR0NTcUdTSWIzRFFFQkN3VUFNSUdsTVFzd0NRWUQKV1FRR0V3SlZVekVYTUJVR0ExVUVDQXdPVG05eWRHZ2dRMkZ5YjJ4cGJtRXhFREFPQmdOVkJBY01CMUpoYkdWcApBMmd4RmpBVUJnTlZCQW9NRFZKbFpDQklZWFFzSUVsdVl5NHhFekFSQmdOVkJBc01DbEpsWkNCSVlYUWdTVlF4Ckh6QVpCZ05WQkFNTUVsSmxaQ0JJWVhRZ1NWUWdVbTl2ZENCRFFURWhNQjhHQ1NxR1NJYjNEUUVKQVJZU2FXNW0KWGpDQnBURUxNQWtHQTFVRUJoTUNWVk14RnpBVkJnTlZCQWdNRGs1dmNuUm9JRU5oY205c2FXNWhNUkF3RGdZRApXUVFIREFkU1lXeGxhV2RvTVJZd0ZBWURWUVFLREExU1pXUWdTR0YwTENCSmJtTXVNUk13RVFZRFZRUUxEQXBTCkFXUWdTR0YwSUVsVU1Sc3dHUVlEVlFRRERCSlNaV1FnU0dGMElFbFVJRkp2YjNRZ1EwRXhJVEFmQmdrcWhraUcKMHcwQkNRRVdFbWx1Wm05elpXTkFjbVZrYUdGMExtTnZiVENDQVNJd0RRWUpLb1pJaHZjTkFRRUJCUUFEZ2dFUApCRENDQVFvQ2dnRUJBTFF0OU9KUWg2R0M1TFQxZzgwcU5oMHU1MEJRNHNaL3laOGFFVHh0KzVsblBWWDZNSEt6CmQvaTdsRHFUZlRjZkxMMm55VUJkMmZRRGsxQjBmeHJza2hHSUlaM2lmUDFQczRsdFRrdjhoUlNvYjNWdE5xU28KSHhrS2Z2RDJQS2pUUHhEUFdZeXJ1eTlpckxaaW9NZmZpM2kvZ0N1dDBaV3RBeU8zTVZINXFXRi9lbkt3Z1BFUwpZOXBvK1RkQ3ZSQi9SVU9iQmFNNzYxRWNyTFNNMUdxSE51ZVNmcW5obzNBakxRNmRCblBXbG82MzhabTFWZWJLCkNFTHloa0xXTVNGa0t3RG1uZTBqUTAyWTRnMDc1dkNLdkNzQ0F3RUFBYU5qTUdFd0hRWURWUjBPQkJZRUZIN1IKNXlDK1VlaElJUGV1TDhacXczUHpiZ2NaTUI4R0ExVWRJd1FZTUJhQUZIN1I0eUMrVWVoSUlQZXVMOFpxdzNQegpjZ2NaTUE4R0ExVWRFd0VCL3dRRk1BTUJBZjh3RGdZRFZSMFBBUUgvQkFRREFnR0dNQTBHQ1NxR1NJYjNEUUVCCkR3VUFBNElCQVFCRE52RDJWbTlzQTVBOUFsT0pSOCtlbjVYejloWGN4SkI1cGh4Y1pROGpGb0cwNFZzaHZkMGUKTUVuVXJNY2ZGZ0laNG5qTUtUUUNNNFpGVVBBaWV5THg0ZjUySHVEb3BwM2U1SnlJTWZXK0tGY05JcEt3Q3NhawpwU29LdElVT3NVSks3cUJWWnhjckl5ZVFWMnFjWU9lWmh0UzV3QnFJd09BaEZ3bENFVDdaZTU4UUhtUzQ4c2xqCjVlVGtSaml2QWxFeHJGektjbGpDNGF4S1Fsbk92VkF6eitHbTMyVTB4UEJGNEJ5ZVBWeENKVUh3MVRzeVRtZWwKU3hORXA3eUhvWGN3bitmWG5hK3Q1SldoMWd4VVp0eTMKLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQo=
        mode: 0644
        overwrite: true
        path: /etc/pki/ca-trust/source/anchors/examplecorp-ca.crt

マシンの信頼ストアは、ノードの信頼ストアの更新もサポートする必要があります。

5.2.8. 更新

RHCOS ノードで証明書を自動更新できる Operator はありません。

注記

Red Hat では、CA の有効期限が切れるタイミングを監視しません。ただし、CA の有効期間は長く設定されるため、通常問題は生じません。ただし、信頼バンドルを定期的に更新する必要がある場合があります。

5.3. サービス CA 証明書

5.3.1. 目的

service-ca は、OpenShift Container Platform クラスターのデプロイ時に自己署名の CA を作成する Operator です。

5.3.2. 有効期限

カスタムの有効期限はサポートされません。自己署名 CA は、フィールド tls.crt (証明書)、tls.key (プライベートキー)、および ca-bundle.crt (CA バンドル) の修飾名 service-ca/signing-key を持つシークレットに保存されます。

他のサービスは、サービスリソースに service.beta.openshift.io/serving-cert-secret-name: <secret name> のアノテーションを付けてサービス提供証明書を要求できます。応答として、Operator は、名前付きシークレットに対し、新規証明書を tls.crt として、プライベートキーを tls.key として生成します。証明書は 2 年間有効です。

他のサービスは、サービス CA から生成される証明書の検証をサポートするために、service.beta.openshift.io/inject-cabundle: true のアノテーションを付けてサービス CA の CA バンドルを API サービスまたは設定マップリソースに挿入するように要求します。応答として、Operator はその現在の CA バンドルを API サービスの CABundle フィールドに書き込むか、または service-ca.crt として設定マップに書き込みます。

OpenShift Container Platform 4.3.5 の時点で、自動ローテーションはサポートされ、一部の 4.2.z および 4.3.z リリースにバックポートされます。自動ローテーションをサポートするすべてのリリースについて、サービス CA は 26 ヵ月間有効であり、有効期間までの残りの期間が 13 ヵ月未満になると自動的に更新されます。必要に応じて、サービス CA を手動で更新することができます。

サービス CA 有効期限の 26 ヵ月は、サポートされる OpenShift Container Platform クラスターの予想されるアップグレード間隔よりも長くなります。そのため、サービス CA 証明書のコントロールプレーン以外のコンシューマーは CA のローテーション後に更新され、またローテーション前の CA の有効期限が切れる前に更新されます。

警告

手動でローテーションされるサービス CA は、直前のサービス CA で信頼を維持しません。クラスターの Pod が再起動するまでサービスが一時的に中断する可能性があります。これにより、Pod が新規サービス CA で発行されるサービス提供証明書を使用できるようになります。

5.3.3. 管理

これらの証明書は、ユーザーではなく、システムによって管理されます。

5.3.4. サービス

サービス CA 証明書を使用するサービスには以下が含まれます。

  • cluster-autoscaler-operator
  • cluster-monitoring-operator
  • cluster-authentication-operator
  • cluster-image-registry-operator
  • cluster-ingress-operator
  • cluster-kube-apiserver-operator
  • cluster-kube-controller-manager-operator
  • cluster-kube-scheduler-operator
  • cluster-networking-operator
  • cluster-openshift-apiserver-operator
  • cluster-openshift-controller-manager-operator
  • cluster-samples-operator
  • machine-config-operator
  • console-operator
  • insights-operator
  • machine-api-operator
  • operator-lifecycle-manager

これはすべてを網羅した一覧ではありません。

追加リソース

5.4. ノード証明書

5.4.1. 目的

ノード証明書はクラスターによって署名されます。それらは、ブートストラッププロセスで生成される認証局 (CA) からの証明書です。クラスターがインストールされると、ノード証明書は自動的にローテーションされます。

5.4.2. 管理

これらの証明書は、ユーザーではなく、システムによって管理されます。

追加リソース

5.5. ブートストラップ証明書

5.5.1. 目的

OpenShift Container Platform 4 以降では、kubelet は /etc/kubernetes/kubeconfig にあるブートストラップ証明書を使用して初回のブートストラップを実行します。その次に、ブートストラップの初期化プロセスおよび CSR を作成するための kubelet の認証に進みます。

このプロセスでは、kubelet はブートストラップチャネル上での通信中に CSR を生成します。コントローラーマネージャーは CSR に署名すると、kubelet が管理する証明書が作成されます。

5.5.2. 管理

これらの証明書は、ユーザーではなく、システムによって管理されます。

5.5.3. 有効期限

このブートストラップ CA は 10 年間有効です。

kubelet が管理する証明書は 1 年間有効であり、その 1 年の約 80 パーセントマークで自動的にローテーションします。

5.5.4. カスタマイズ

ブートストラップ証明書をカスタマイズすることはできません。

5.6. etcd 証明書

5.6.1. 目的

etcd 証明書は etcd-signer によって署名されます。それらの証明書はブートストラッププロセスで生成される認証局 (CA) から提供されます。

5.6.2. 有効期限

CA 証明書は 10 年間有効です。ピア、クライアント、およびサーバーの証明書は 3 年間有効です。

5.6.3. 管理

これらの証明書は、ユーザーではなく、システムによって管理されます。

5.6.4. サービス

etcd 証明書は、etcd メンバーのピア間の暗号化された通信と暗号化されたクライアントトラフィックに使用されます。以下の証明書は etcd および etcd と通信する他のプロセスによって生成され、使用されます。

  • ピア証明書: etcd メンバー間の通信に使用されます。
  • クライアント証明書: 暗号化されたサーバーとクライアント間の通信に使用されます。現時点で、クライアント証明書は API サーバーによってのみ使用され、プロキシーを除いてその他のサービスは etcd に直接接続されません。クライアントシークレット (etcd-clientetcd-metric-clientetcd-metric-signer、および etcd-signer) は openshift-configopenshift-monitoring、および openshift-kube-apiserver namespace に追加されます。
  • サーバー証明書: クライアント要求を認証するために etcd サーバーによって使用されます。
  • メトリクス証明書: メトリクスのすべてのコンシューマーは metric-client 証明書を使用してプロキシーに接続します。
追加リソース

5.7. OLM 証明書

5.7.1. 管理

OpenShift Lifecycle Manager (OLM) コンポーネント (olm-operatorcatalog-operatorpackageserver、および marketplace-operator) のすべての証明書はシステムによって管理されます。

Webhook または API サービスを含む Operator を ClusterServiceVersion (CSV) オブジェクトにインストールする場合、OLM はこれらのリソースの証明書を作成し、ローテーションします。openshift-operator-lifecycle-manager namespace のリソースの証明書は OLM によって管理されます。

OLM はプロキシー環境で管理する Operator の証明書を更新しません。これらの証明書は、ユーザーがサブスクリプション設定で管理する必要があります。

5.8. デフォルト ingress のユーザーによって提供される証明書

5.8.1. 目的

アプリケーションは通常 <route_name>.apps.<cluster_name>.<base_domain> で公開されます。<cluster_name> および <base_domain> はインストール設定ファイルから取得されます。<route_name> は、(指定されている場合)ルートのホストフィールド、またはルート名です。例: hello-openshift-default.apps.username.devcluster.openshift.com.hello-openshift はルートの名前で、ルートは default namespace に置かれます。クラスター管理の CA 証明書をクライアントに分散せずに、クライアントにアプリケーションにアクセスさせる必要がある場合があります。管理者は、アプリケーションコンテンツを提供する際にカスタムのデフォルト証明書を設定する必要があります。

警告

Ingress Operator は、カスタムのデフォルト証明書を設定するまで、プレースホルダーとして機能する Ingress コントローラーのデフォルト証明書を生成します。実稼働クラスターで Operator が生成するデフォルト証明書を使用しないでください。

5.8.2. 場所

ユーザーによって提供される証明書は、openshift-ingress namespace の tls タイプの Secret で指定される必要があります。ユーザーがユーザーによって提供される証明書を有効にできるようにするために、openshift-ingress-operator namespace で IngressController CR を更新します。このプロセスについての詳細は、「カスタムデフォルト証明書の設定」を参照してください。

5.8.3. 管理

ユーザーによって提供される証明書はユーザーによって管理されます。

5.8.4. 有効期限

ユーザーによって提供される証明書はユーザーによって管理されます。

5.8.5. サービス

クラスターにデプロイされるアプリケーションは、デフォルト Ingress にユーザーによって提供される証明書を使用します。

5.8.6. カスタマイズ

必要に応じて、ユーザーが管理する証明書を含むシークレットを更新します。

追加リソース

5.9. Ingress 証明書

5.9.1. 目的

Ingress Operator は以下の目的で証明書を使用します。

  • Prometheus のメトリクスへのアクセスのセキュリティーを保護する。
  • ルートへのアクセスのセキュリティーを保護する。

5.9.2. 場所

Ingress Operator および Ingress コントローラーメトリクスへのアクセスのセキュリティーを保護するために、Ingress Operator はサービス提供証明書を使用します。Operator は独自のメトリクスについて service-ca コントローラーから証明書を要求し、service-ca コントローラーは証明書を openshift-ingress-operator namespace の metrics-tls という名前のシークレットに配置します。さらに、Ingress Operator は各 Ingress コントローラーの証明書を要求し、service-ca コントローラーは証明書を router-metrics-certs-<name> という名前のシークレットに配置します。ここで、<name>openshift-ingress namespace の Ingress コントローラーの名前です。

各 Ingress コントローラーには、独自の証明書を指定しないセキュリティー保護されたルートに使用するデフォルト証明書があります。カスタム証明書を指定しない場合、Operator はデフォルトで自己署名証明書を使用します。Operator は独自の自己署名証明書を使用して、生成するデフォルト証明書に署名します。Operator はこの署名証明書を生成し、これを openshift-ingress-operator namespace の router-ca という名前のシークレットに配置します。Operator がデフォルトの証明書を生成する際に、デフォルト証明書を openshift-ingress namespace の router-certs-<name> という名前のシークレットに配置します(ここで、 <name> は Ingress コントローラーの名前です)。

警告

Ingress Operator は、カスタムのデフォルト証明書を設定するまで、プレースホルダーとして機能する Ingress コントローラーのデフォルト証明書を生成します。実稼働クラスターで Operator が生成するデフォルト証明書は使用しないでください。

5.9.3. ワークフロー

図5.1 カスタム証明書のワークフロー

図5.2 デフォルトの証明書ワークフロー

20 空の defaultCertificate フィールドにより、Ingress Operator はその自己署名 CA を使用して指定されたドメインの提供証明書を生成します。

20 Ingress Operator によって生成されるデフォルトの CA 証明書およびキー。Operator が生成するデフォルトの提供証明書に署名するために使用されます。

20 デフォルトのワークフローでは、Ingress Operator によって作成され、生成されるデフォルト CA 証明書を使用して署名されるワイルドカードのデフォルト提供証明書です。カスタムワークフローでは、これはユーザーによって提供される証明書です。

20 ルーターのデプロイメント。secrets/router-certs-default の証明書を、デフォルトのフロントエンドサーバー証明書として使用します。

20 デフォルトのワークフローでは、ワイルドカードのデフォルト提供証明書(パブリックおよびプライベートの部分)の内容がここにコピーされ、OAuth 統合が有効になります。カスタムワークフローでは、これはユーザーによって提供される証明書です。

20 デフォルト提供証明書のパブリック(証明書)の部分です。configmaps/router-ca リソースを置き換えます。

20 ユーザーは、ingresscontroller 提供証明書に署名した CA 証明書でクラスタープロキシー設定を更新します。これにより、authconsole などのコンポーネントや、提供証明書を信頼するために使用するレジストリーが有効になります。

20 ユーザーバンドルが指定されていない場合に、組み合わせた Red Hat Enterprise Linux CoreOS(RHCOS)およびユーザーによって提供される CA バンドルまたは RHCOS のみのバンドルを含むクラスター全体の信頼される CA バンドルです。

20 他のコンポーネント(auth および consoleなど)がカスタム証明書で設定された ingresscontroller を信頼するよう指示するカスタム CA 証明書バンドルです。

20 trustedCA フィールドは、ユーザーによって提供される CA バンドルを参照するように使用されます。

20 Cluster Network Operator は、信頼される CA バンドルを proxy-ca 設定マップに挿入します。

20 OpenShift Container Platform 4.6 以降では、default-ingress-cert を使用します。

5.9.4. 有効期限

Ingress Operator の証明書の有効期限は以下の通りです。

  • service-ca コントローラーが作成するメトリクス証明書の有効期限は、作成日から 2 年間です。
  • Operator の署名証明書の有効期限は、作成日から 2 年間です。
  • Operator が生成するデフォルト証明書の有効期限は、作成日から 2 年間です。

Ingress Operator または service-ca コントローラーが作成する証明書のカスタム有効期限を指定することはできません。

Ingress Operator または service-ca コントローラーが作成する証明書について OpenShift Container Platform をインストールする場合に、有効期限を指定することはできません。

5.9.5. サービス

Prometheus はメトリクスのセキュリティーを保護する証明書を使用します。

Ingress Operator はその署名証明書を使用して、カスタムのデフォルト証明書を設定しない Ingress コントローラー用に生成するデフォルト証明書に署名します。

セキュリティー保護されたルートを使用するクラスターコンポーネントは、デフォルトの Ingress コントローラーのデフォルト証明書を使用できます。

セキュリティー保護されたルート経由でのクラスターへの Ingress は、ルートが独自の証明書を指定しない限り、ルートがアクセスされる Ingress コントローラーのデフォルト証明書を使用します。

5.9.6. 管理

Ingress 証明書はユーザーによって管理されます。詳細は、「デフォルト ingress 証明書の置き換え」を参照してください。

5.9.7. 更新

service-ca コントローラーは、これが発行する証明書を自動的にローテーションします。ただし、oc delete secret <secret> を使用してサービス提供証明書を手動でローテーションすることができます。

Ingress Operator は、独自の署名証明書または生成するデフォルト証明書をローテーションしません。Operator が生成するデフォルト証明書は、設定するカスタムデフォルト証明書のプレースホルダーとして使用されます。

5.10. モニタリングおよびクラスターロギング Operator コンポーネント証明書

5.10.1. 有効期限

モニタリングコンポーネントは、サービス CA 証明書でトラフィックのセキュリティーを保護します。これらの証明書は 2 年間有効であり、13 ヵ月ごとに実行されるサービス CA のローテーションで自動的に置き換えられます。

証明書が openshift-monitoring または openshift-logging namespace にある場合、これはシステムで管理され、自動的にローテーションされます。

5.10.2. 管理

これらの証明書は、ユーザーではなく、システムによって管理されます。

5.11. コントロールプレーンの証明書

5.11.1. 場所

コントロールプレーンの証明書はこれらの namespace に含まれます。

  • openshift-config-managed
  • openshift-kube-apiserver
  • openshift-kube-apiserver-operator
  • openshift-kube-controller-manager
  • openshift-kube-controller-manager-operator
  • openshift-kube-scheduler

5.11.2. 管理

コントロールプレーンの証明書はシステムによって管理され、自動的にローテーションされます。

稀なケースとしてコントロールプレーンの証明書の有効期限が切れる場合は、「コントロールプレーン証明書の期限切れの状態からのリカバリー」を参照してください。

第6章 監査ログの表示

監査は、システムに影響を与えた一連のアクティビティーを個別のユーザー、管理者その他システムのコンポーネント別に記述したセキュリティー関連の時系列のレコードを提供します。

6.1. API の監査ログについて

監査は API サーバーレベルで実行され、サーバーに送られるすべての要求をログに記録します。それぞれの監査ログには、以下の情報が含まれます。

表6.1 監査ログフィールド

フィールド説明

level

イベントが生成された監査レベル。

auditID

要求ごとに生成される一意の監査 ID。

stage

このイベントインスタンスの生成時の要求処理のステージ。

requestURI

クライアントによってサーバーに送信される要求 URI。

verb

要求に関連付けられる Kubernetes の動詞。リソース以外の要求の場合、これは小文字の HTTP メソッドになります。

user

認証されたユーザーの情報。

impersonatedUser

オプション。偽装ユーザーの情報 (要求で別のユーザーを偽装する場合)。

sourceIPs

オプション。要求の送信元および中間プロキシーからのソース IP。

userAgent

オプション。クライアントが報告するユーザーエージェントの文字列。ユーザーエージェントはクライアントによって提供されており、信頼できないことに注意してください。

objectRef

オプション。この要求のターゲットとなっているオブジェクト参照。これは、List タイプの要求やリソース以外の要求には適用されません。

responseStatus

オプション。ResponseObjectStatus タイプでなくても設定される応答ステータス。正常な応答の場合、これにはコードのみが含まれます。ステータス以外のタイプのエラー応答の場合、これにはエラーメッセージが自動的に設定されます。

requestObject

オプション。JSON 形式の要求からの API オブジェクト。RequestObject は、バージョンの変換、デフォルト設定、受付またはマージの前に要求の場合のように記録されます (JSON として再エンコードされる可能性がある)。これは外部のバージョン付けされたオブジェクトタイプであり、それ自体では有効なオブジェクトではない可能性があります。これはリソース以外の要求の場合には省略され、要求レベル以上でのみログに記録されます。

responseObject

オプション。JSON 形式の応答で返される API オブジェクト。ResponseObject は外部タイプへの変換後に記録され、JSON としてシリアライズされます。これはリソース以外の要求の場合には省略され、応答レベルでのみログに記録されます。

requestReceivedTimestamp

要求が API サーバーに到達した時間。

stageTimestamp

要求が現在の監査ステージに達した時間。

annotations

オプション。監査イベントと共に保存される構造化されていないキーと値のマップ。これは、認証、認可、受付プラグインなど、要求提供チェーンで呼び出されるプラグインによって設定される可能性があります。これらのアノテーションは監査イベント用のもので、送信されたオブジェクトの metadata.annotations に対応しないことに注意してください。キーは、名前の競合が発生しないように通知コンポーネントを一意に識別する必要があります (例: podsecuritypolicy.admission.k8s.io/policy)。値は短くする必要があります。アノテーションはメタデータレベルに含まれます。

Kubernetes API サーバーの出力例:

{"kind":"Event","apiVersion":"audit.k8s.io/v1","level":"Metadata","auditID":"ad209ce1-fec7-4130-8192-c4cc63f1d8cd","stage":"ResponseComplete","requestURI":"/api/v1/namespaces/openshift-kube-controller-manager/configmaps/cert-recovery-controller-lock?timeout=35s","verb":"update","user":{"username":"system:serviceaccount:openshift-kube-controller-manager:localhost-recovery-client","uid":"dd4997e3-d565-4e37-80f8-7fc122ccd785","groups":["system:serviceaccounts","system:serviceaccounts:openshift-kube-controller-manager","system:authenticated"]},"sourceIPs":["::1"],"userAgent":"cluster-kube-controller-manager-operator/v0.0.0 (linux/amd64) kubernetes/$Format","objectRef":{"resource":"configmaps","namespace":"openshift-kube-controller-manager","name":"cert-recovery-controller-lock","uid":"5c57190b-6993-425d-8101-8337e48c7548","apiVersion":"v1","resourceVersion":"574307"},"responseStatus":{"metadata":{},"code":200},"requestReceivedTimestamp":"2020-04-02T08:27:20.200962Z","stageTimestamp":"2020-04-02T08:27:20.206710Z","annotations":{"authorization.k8s.io/decision":"allow","authorization.k8s.io/reason":"RBAC: allowed by ClusterRoleBinding \"system:openshift:operator:kube-controller-manager-recovery\" of ClusterRole \"cluster-admin\" to ServiceAccount \"localhost-recovery-client/openshift-kube-controller-manager\""}}

6.2. 監査ログの表示

それぞれのコントロールプレーンノード (別名マスターノード) の OpenShift API サーバー、Kubernetes API サーバー、および OpenShift OAuth API サーバーのログを表示することができます。

手順

監査ログを表示するには、以下を実行します。

  • OpenShift API サーバーログを表示します。

    1. 各コントロールプレーンノードで利用可能な OpenShift API サーバーログを一覧表示します。

      $ oc adm node-logs --role=master --path=openshift-apiserver/

      出力例

      ci-ln-m0wpfjb-f76d1-vnb5x-master-0 audit-2021-03-09T00-12-19.834.log
      ci-ln-m0wpfjb-f76d1-vnb5x-master-0 audit.log
      ci-ln-m0wpfjb-f76d1-vnb5x-master-1 audit-2021-03-09T00-11-49.835.log
      ci-ln-m0wpfjb-f76d1-vnb5x-master-1 audit.log
      ci-ln-m0wpfjb-f76d1-vnb5x-master-2 audit-2021-03-09T00-13-00.128.log
      ci-ln-m0wpfjb-f76d1-vnb5x-master-2 audit.log

    2. ノード名とログ名を指定して、特定の OpenShift API サーバーログを表示します。

      $ oc adm node-logs <node_name> --path=openshift-apiserver/<log_name>

      以下は例になります。

      $ oc adm node-logs ci-ln-m0wpfjb-f76d1-vnb5x-master-0 --path=openshift-apiserver/audit-2021-03-09T00-12-19.834.log

      出力例

      {"kind":"Event","apiVersion":"audit.k8s.io/v1","level":"Metadata","auditID":"381acf6d-5f30-4c7d-8175-c9c317ae5893","stage":"ResponseComplete","requestURI":"/metrics","verb":"get","user":{"username":"system:serviceaccount:openshift-monitoring:prometheus-k8s","uid":"825b60a0-3976-4861-a342-3b2b561e8f82","groups":["system:serviceaccounts","system:serviceaccounts:openshift-monitoring","system:authenticated"]},"sourceIPs":["10.129.2.6"],"userAgent":"Prometheus/2.23.0","responseStatus":{"metadata":{},"code":200},"requestReceivedTimestamp":"2021-03-08T18:02:04.086545Z","stageTimestamp":"2021-03-08T18:02:04.107102Z","annotations":{"authorization.k8s.io/decision":"allow","authorization.k8s.io/reason":"RBAC: allowed by ClusterRoleBinding \"prometheus-k8s\" of ClusterRole \"prometheus-k8s\" to ServiceAccount \"prometheus-k8s/openshift-monitoring\""}}

  • Kubernetes API サーバーログを表示します。

    1. 各コントロールプレーンノードで利用可能な Kubernetes API サーバーログを一覧表示します。

      $ oc adm node-logs --role=master --path=kube-apiserver/

      出力例

      ci-ln-m0wpfjb-f76d1-vnb5x-master-0 audit-2021-03-09T14-07-27.129.log
      ci-ln-m0wpfjb-f76d1-vnb5x-master-0 audit.log
      ci-ln-m0wpfjb-f76d1-vnb5x-master-1 audit-2021-03-09T19-24-22.620.log
      ci-ln-m0wpfjb-f76d1-vnb5x-master-1 audit.log
      ci-ln-m0wpfjb-f76d1-vnb5x-master-2 audit-2021-03-09T18-37-07.511.log
      ci-ln-m0wpfjb-f76d1-vnb5x-master-2 audit.log

    2. ノード名とログ名を指定して、特定の Kubernetes API サーバーログを表示します。

      $ oc adm node-logs <node_name> --path=kube-apiserver/<log_name>

      以下は例になります。

      $ oc adm node-logs ci-ln-m0wpfjb-f76d1-vnb5x-master-0 --path=kube-apiserver/audit-2021-03-09T14-07-27.129.log

      出力例

      {"kind":"Event","apiVersion":"audit.k8s.io/v1","level":"Metadata","auditID":"cfce8a0b-b5f5-4365-8c9f-79c1227d10f9","stage":"ResponseComplete","requestURI":"/api/v1/namespaces/openshift-kube-scheduler/serviceaccounts/openshift-kube-scheduler-sa","verb":"get","user":{"username":"system:serviceaccount:openshift-kube-scheduler-operator:openshift-kube-scheduler-operator","uid":"2574b041-f3c8-44e6-a057-baef7aa81516","groups":["system:serviceaccounts","system:serviceaccounts:openshift-kube-scheduler-operator","system:authenticated"]},"sourceIPs":["10.128.0.8"],"userAgent":"cluster-kube-scheduler-operator/v0.0.0 (linux/amd64) kubernetes/$Format","objectRef":{"resource":"serviceaccounts","namespace":"openshift-kube-scheduler","name":"openshift-kube-scheduler-sa","apiVersion":"v1"},"responseStatus":{"metadata":{},"code":200},"requestReceivedTimestamp":"2021-03-08T18:06:42.512619Z","stageTimestamp":"2021-03-08T18:06:42.516145Z","annotations":{"authentication.k8s.io/legacy-token":"system:serviceaccount:openshift-kube-scheduler-operator:openshift-kube-scheduler-operator","authorization.k8s.io/decision":"allow","authorization.k8s.io/reason":"RBAC: allowed by ClusterRoleBinding \"system:openshift:operator:cluster-kube-scheduler-operator\" of ClusterRole \"cluster-admin\" to ServiceAccount \"openshift-kube-scheduler-operator/openshift-kube-scheduler-operator\""}}

  • OpenShift OAuth API サーバーログを表示します。

    1. 各コントロールプレーンノードで利用可能な OpenShift OAuth API サーバーログを一覧表示します。

      $ oc adm node-logs --role=master --path=oauth-apiserver/

      出力例

      ci-ln-m0wpfjb-f76d1-vnb5x-master-0 audit-2021-03-09T13-06-26.128.log
      ci-ln-m0wpfjb-f76d1-vnb5x-master-0 audit.log
      ci-ln-m0wpfjb-f76d1-vnb5x-master-1 audit-2021-03-09T18-23-21.619.log
      ci-ln-m0wpfjb-f76d1-vnb5x-master-1 audit.log
      ci-ln-m0wpfjb-f76d1-vnb5x-master-2 audit-2021-03-09T17-36-06.510.log
      ci-ln-m0wpfjb-f76d1-vnb5x-master-2 audit.log

    2. ノード名とログ名を指定して、特定の OpenShift OAuth API サーバーログを表示します。

      $ oc adm node-logs <node_name> --path=oauth-apiserver/<log_name>

      以下は例になります。

      $ oc adm node-logs ci-ln-m0wpfjb-f76d1-vnb5x-master-0 --path=oauth-apiserver/audit-2021-03-09T13-06-26.128.log

      出力例

      {"kind":"Event","apiVersion":"audit.k8s.io/v1","level":"Metadata","auditID":"dd4c44e2-3ea1-4830-9ab7-c91a5f1388d6","stage":"ResponseComplete","requestURI":"/apis/user.openshift.io/v1/users/~","verb":"get","user":{"username":"system:serviceaccount:openshift-monitoring:prometheus-k8s","groups":["system:serviceaccounts","system:serviceaccounts:openshift-monitoring","system:authenticated"]},"sourceIPs":["10.0.32.4","10.128.0.1"],"userAgent":"dockerregistry/v0.0.0 (linux/amd64) kubernetes/$Format","objectRef":{"resource":"users","name":"~","apiGroup":"user.openshift.io","apiVersion":"v1"},"responseStatus":{"metadata":{},"code":200},"requestReceivedTimestamp":"2021-03-08T17:47:43.653187Z","stageTimestamp":"2021-03-08T17:47:43.660187Z","annotations":{"authorization.k8s.io/decision":"allow","authorization.k8s.io/reason":"RBAC: allowed by ClusterRoleBinding \"basic-users\" of ClusterRole \"basic-user\" to Group \"system:authenticated\""}}

6.3. 監査ログのフィルター

jq または別の JSON 解析ツールを使用して、API サーバー監査ログをフィルターできます。

注記

API サーバー監査ログに記録する情報量は、設定される監査ログポリシーで制御できます。

以下の手順では、jq を使用してコントロールプレーンノード node-1.example.com で監査ログをフィルターする例を示します。jq の使用についての詳細は、「jq Manual」を参照してください。

前提条件

  • cluster-admin ロールを持つユーザーとしてクラスターにアクセスできること。
  • jq がインストールされている。

手順

  • OpenShift API サーバー監査ログをユーザーでフィルターします。

    $ oc adm node-logs node-1.example.com  \
      --path=openshift-apiserver/audit.log \
      | jq 'select(.user.username == "myusername")'
  • OpenShift API サーバー監査ログをユーザーエージェントでフィルターします。

    $ oc adm node-logs node-1.example.com  \
      --path=openshift-apiserver/audit.log \
      | jq 'select(.userAgent == "cluster-version-operator/v0.0.0 (linux/amd64) kubernetes/$Format")'
  • Kubernetes API サーバー監査ログを特定の API バージョンでフィルターし、ユーザーエージェントのみを出力します。

    $ oc adm node-logs node-1.example.com  \
      --path=kube-apiserver/audit.log \
      | jq 'select(.requestURI | startswith("/apis/apiextensions.k8s.io/v1beta1")) | .userAgent'
  • 動詞を除外して OpenShift OAuth API サーバー監査ログをフィルターします。

    $ oc adm node-logs node-1.example.com  \
      --path=oauth-apiserver/audit.log \
      | jq 'select(.verb != "get")'

6.4. 追加リソース

第7章 監査ログポリシーの設定

使用する監査ログポリシープロファイルを選択して、API サーバー監査ログに記録する情報量を制御できます。

7.1. 監査ログポリシープロファイルについて

監査ログプロファイルは、OpenShift API サーバー、Kubernetes API サーバー、および OAuth API サーバーに送信される要求をログに記録する方法を定義します。

OpenShift Container Platform は、以下の事前定義された監査ポリシープロファイルを提供します。

プロファイル説明

Default

読み取りおよび書き込み要求のメタデータのみをログに記録します。OAuth アクセストークンの作成(ログイン) 要求を除く要求の本文はログに記録されません。これはデフォルトポリシーになります。

WriteRequestBodies

すべての要求のメタデータをロギングする以外にも、API サーバーへの書き込み要求ごとに要求の本文をログに記録します(createupdatepatch)。このプロファイルには、Default プロファイルよりも多くのリソースのオーバーヘッドがあります。[1]

AllRequestBodies

すべての要求のメタデータをロギングする以外にも、API サーバーへの読み取りおよび書き込み要求ごとに要求の本文をログに記録します (getlistcreateupdatepatch)。このプロファイルには最も多くのリソースのオーバーヘッドがあります。[1]

  1. SecretRouteOAuthClient オブジェクトなどの機密リソースは、メタデータレベルを超えるとログに記録されません。クラスターが OpenShift Container Platform 4.5 からアップグレードされた場合、OAuth トークンのオブジェクト名にシークレット情報が含まれる可能性があるため、OAuth トークンはいっさいログに記録されません。

デフォルトで、OpenShift Container Platform は Default 監査ログプロファイルを使用します。要求の本文もログに記録する別の監査ポリシープロファイルを使用できますが、リソース使用の増加について把握するようにしてください(CPU、メモリー、および I/O)。

7.2. 監査ログポリシーの設定

API サーバーに送信される要求をログに記録する際に使用する監査ログポリシーを設定できます。

前提条件

  • cluster-admin ロールを持つユーザーとしてクラスターにアクセスできる。

手順

  1. APIServer リソースを編集します。

    $ oc edit apiserver cluster
  2. spec.audit.profile フィールドを更新します。

      apiVersion: config.openshift.io/v1
      kind: APIServer
      metadata:
      ...
      spec:
        audit:
          profile: WriteRequestBodies 1
    1
    DefaultWriteRequestBodies、または AllRequestBodies に設定されます。デフォルトのプロファイルは Default です。
  3. 変更を適用するためにファイルを保存します。
  4. Kubernetes API サーバー Pod の新規リビジョンがロールアウトされていることを確認します。これには数分の時間がかかります。

    $ oc get kubeapiserver -o=jsonpath='{range .items[0].status.conditions[?(@.type=="NodeInstallerProgressing")]}{.reason}{"\n"}{.message}{"\n"}'

    Kubernetes API サーバーの NodeInstallerProgressing 状況条件を確認し、すべてのノードが最新のリビジョンであることを確認します。更新が正常に実行されると、この出力には AllNodesAtLatestRevision が表示されます。

    AllNodesAtLatestRevision
    3 nodes are at revision 12 1
    1
    この例では、最新のリビジョン番号は 12 です。

    出力に以下のようなメッセージが表示されると、これは更新が進行中であることを意味します。数分待機した後に再試行します。

    • 3 nodes are at revision 11; 0 nodes have achieved new revision 12
    • 2 nodes are at revision 11; 1 nodes are at revision 12

第8章 追加ホストから API サーバーへの JavaScript ベースのアクセスの許可

8.1. 追加ホストから API サーバーへの JavaScript ベースのアクセスの許可

デフォルトの OpenShift Container Platform 設定は、OpenShift Web コンソールが要求を API サーバーに送信することのみを許可します。

別の名前を使用して JavaScript アプリケーションから API サーバーまたは OAuth サーバーにアクセスする必要がある場合、許可する追加のホスト名を設定できます。

前提条件

  • cluster-admin ロールを持つユーザーとしてのクラスターへのアクセスがあること。

手順

  1. APIServer リソースを編集します。

    $ oc edit apiserver.config.openshift.io cluster
  2. additionalCORSAllowedOrigins フィールドを spec セクションの下に追加し、1 つ以上の追加のホスト名を指定します。

    apiVersion: config.openshift.io/v1
    kind: APIServer
    metadata:
      annotations:
        release.openshift.io/create-only: "true"
      creationTimestamp: "2019-07-11T17:35:37Z"
      generation: 1
      name: cluster
      resourceVersion: "907"
      selfLink: /apis/config.openshift.io/v1/apiservers/cluster
      uid: 4b45a8dd-a402-11e9-91ec-0219944e0696
    spec:
      additionalCORSAllowedOrigins:
      - (?i)//my\.subdomain\.domain\.com(:|\z) 1
    1
    ホスト名は Golang 正規表現として指定されます。これは、API サーバーおよび OAuth サーバーに対する HTTP 要求の CORS ヘッダーに対するマッチングを行うために使用されます。
    注記

    この例では、以下の構文を使用します。

    • (?i) は大文字/小文字を区別します。
    • // はドメインの開始にピニングし、http: または https:の後のダブルスラッシュに一致します。
    • \. はドメイン名のドットをエスケープします。
    • (:|\z) はドメイン名 (\z) またはポートセパレーター (:) の終了部に一致します。
  3. 変更を適用するためにファイルを保存します。

第9章 etcd データの暗号化

9.1. etcd 暗号化について

デフォルトで、etcd データは OpenShift Container Platform で暗号化されません。クラスターの etcd 暗号化を有効にして、データセキュリティーの層を追加で提供することができます。たとえば、etcd バックアップが正しくない公開先に公開される場合に機密データが失われないように保護することができます。

etcd の暗号化を有効にすると、以下の OpenShift API サーバーおよび Kubernetes API サーバーリソースが暗号化されます。

  • シークレット
  • 設定マップ
  • ルート
  • OAuth アクセストークン
  • OAuth 認証トークン

etcd 暗号を有効にすると、暗号化キーが作成されます。これらのキーは週ごとにローテーションされます。etcd バックアップから復元するには、これらのキーが必要です。

9.2. etcd 暗号化の有効化

etcd 暗号化を有効にして、クラスターで機密性の高いリソースを暗号化できます。

警告

初期の暗号化プロセスが完了するまでは、etcd のバックアップを取ることは推奨されません。暗号化プロセスが完了しない場合、バックアップは部分的にのみ暗号化される可能性があります。

前提条件

  • cluster-admin ロールを持つユーザーとしてのクラスターへのアクセスがあること。

手順

  1. APIServer オブジェクトを変更します。

    $ oc edit apiserver
  2. encryption フィールドタイプを aescbcに設定します。

    spec:
      encryption:
        type: aescbc 1
    1
    aescbc タイプは、暗号化を実行するために PKCS#7 パディングを実装している AES-CBC と 32 バイトのキーが使用されることを意味します。
  3. 変更を適用するためにファイルを保存します。

    暗号化プロセスが開始されます。クラスターのサイズによっては、このプロセスが完了するまで 20 分以上かかる場合があります。

  4. etcd 暗号化が正常に行われたことを確認します。

    1. OpenShift API サーバーの Encrypted ステータスを確認し、そのリソースが正常に暗号化されたことを確認します。

      $ oc get openshiftapiserver -o=jsonpath='{range .items[0].status.conditions[?(@.type=="Encrypted")]}{.reason}{"\n"}{.message}{"\n"}'

      この出力には、暗号化が正常に実行されると EncryptionCompleted が表示されます。

      EncryptionCompleted
      All resources encrypted: routes.route.openshift.io, oauthaccesstokens.oauth.openshift.io, oauthauthorizetokens.oauth.openshift.io

      出力に EncryptionInProgress が表示される場合、これは暗号化が進行中であることを意味します。数分待機した後に再試行します。

    2. Kubernetes API サーバーの Encrypted ステータス状態を確認し、そのリソースが正常に暗号化されたことを確認します。

      $ oc get kubeapiserver -o=jsonpath='{range .items[0].status.conditions[?(@.type=="Encrypted")]}{.reason}{"\n"}{.message}{"\n"}'

      この出力には、暗号化が正常に実行されると EncryptionCompleted が表示されます。

      EncryptionCompleted
      All resources encrypted: secrets, configmaps

      出力に EncryptionInProgress が表示される場合、これは暗号化が進行中であることを意味します。数分待機した後に再試行します。

9.3. etcd 暗号化の無効化

クラスターで etcd データの暗号化を無効にできます。

前提条件

  • cluster-admin ロールを持つユーザーとしてのクラスターへのアクセスがあること。

手順

  1. APIServer オブジェクトを変更します。

    $ oc edit apiserver
  2. encryption フィールドタイプを identityに設定します。

    spec:
      encryption:
        type: identity 1
    1
    identity タイプはデフォルト値であり、暗号化は実行されないことを意味します。
  3. 変更を適用するためにファイルを保存します。

    復号化プロセスが開始されます。クラスターのサイズによっては、このプロセスが完了するまで 20 分以上かかる場合があります。

  4. etcd の復号化が正常に行われたことを確認します。

    1. OpenShift API サーバーの Encrypted ステータス条件を確認し、そのリソースが正常に暗号化されたことを確認します。

      $ oc get openshiftapiserver -o=jsonpath='{range .items[0].status.conditions[?(@.type=="Encrypted")]}{.reason}{"\n"}{.message}{"\n"}'

      この出力には、復号化が正常に実行されると DecryptionCompleted が表示されます。

      DecryptionCompleted
      Encryption mode set to identity and everything is decrypted

      出力に DecryptionInProgress が表示される場合、これは復号化が進行中であることを意味します。数分待機した後に再試行します。

    2. Kubernetes API サーバーの Encrypted ステータス状態を確認し、そのリソースが正常に復号化されたことを確認します。

      $ oc get kubeapiserver -o=jsonpath='{range .items[0].status.conditions[?(@.type=="Encrypted")]}{.reason}{"\n"}{.message}{"\n"}'

      この出力には、復号化が正常に実行されると DecryptionCompleted が表示されます。

      DecryptionCompleted
      Encryption mode set to identity and everything is decrypted

      出力に DecryptionInProgress が表示される場合、これは復号化が進行中であることを意味します。数分待機した後に再試行します。

第10章 Pod の脆弱性のスキャン

Container Security Operator (CSO) を使用すると、OpenShift Container Platform Web コンソールから、クラスターのアクティブな Pod で使用されるコンテナーイメージについての脆弱性スキャンの結果にアクセスできます。CSV

  • すべての namespace または指定された namespace の Pod に関連付けられたコンテナーを監視します。
  • イメージのレジストリーがイメージスキャンを実行している場合(例: Quay.io、Clair スキャンを含む Red Hat Quay レジストリーなど)、脆弱性の情報についてコンテナーの出所となったコンテナーレジストリーをクエリーします。
  • Kubernetes API の ImageManifestVuln オブジェクトを使用して脆弱性を公開します。

この手順を使用すると、CSO は openshift-operators namespace にインストールされ、OpenShift クラスターのすべての namespace で利用可能になります。

10.1. Container Security Operator の実行

以下で説明されているように、Operator Hub から Operator を選択し、インストールして、OpenShift Container Platform Web コンソールから Container Security Operator を起動できます。

前提条件

  • OpenShift Container Platform クラスターへの管理者権限がある
  • クラスターで実行される Red Hat Quay または Quay.io レジストリーのコンテナーがある

手順

  1. OperatorsOperatorHub に移動し、Security を選択します。
  2. Container Security Operator を選択し、Install を選択して 「Create Operator Subscription」ページに移動します。
  3. 設定を確認します。すべての namespace および自動承認ストラテジーがデフォルトで選択されます。
  4. Install を選択します。Container Security Operator は、Installed Operators 画面に数分後に表示されます。
  5. オプションで、カスタム証明書を CSO に追加できます。以下の例では、現在のディレクトリーに quay.crt という名前の証明書を作成します。次に、以下のコマンドを実行して証明書を CSO に追加します。

    $ oc create secret generic container-security-operator-extra-certs --from-file=quay.crt -n openshift-operators
  6. カスタム証明書を追加した場合、新規証明書を有効にするために Operator Pod を再起動します。
  7. OpenShift Dashboard を開きます (HomeOverview)。Quay Image Security へのリンクが status セクションに表示され、これまでに見つかった脆弱性の数の一覧が表示されます。以下の図のように、リンクを選択して Quay Image Security breakdown を表示します。

    Access image scanning data from OpenShift Container Platform dashboard

  8. この時点で、検出された脆弱性をフォローするために以下の 2 つのいずれかの操作を実行できます。

    • 脆弱性へのリンクを選択します。コンテナーを取得したコンテナーレジストリーにアクセスし、脆弱性についての情報を確認できます。以下の図は、Quay.io レジストリーから検出された脆弱性の例を示しています。

      The CSO points you to a registry containing the vulnerable image

    • namespaces リンクを選択し、ImageManifestVuln 画面に移動します。ここでは、選択されたイメージの名前、およびイメージが実行されているすべての namespace を確認できます。以下の図は、特定の脆弱なイメージが quay-enterprise namespace で実行されていることを示しています。

      View namespaces a vulnerable image is running in

この時点では、脆弱性のあるイメージや、イメージの脆弱性を解決するために必要なこと、およびイメージが実行されたすべての namespace を確認できます。以下を実行することができます。

  • 脆弱性を修正する必要のあるイメージを実行しているユーザーに警告します。
  • イメージが置かれている Pod を起動したデプロイメントまたは他のオブジェクトを削除して、イメージの実行を停止します。

Pod を削除すると、Dashboard で脆弱性のある状態がリセットされるまで数分かかる場合があります。

10.2. CLI でのイメージ脆弱性のクエリー

oc コマンドを使用して、Container Security Operator によって検出される脆弱性についての情報を表示できます。

前提条件

  • OpenShift Container Platform インスタンスで Container Security Operator が実行されていること

手順

  • 検出されたコンテナーイメージの脆弱性についてクエリーするには、以下を入力します。

    $ oc get vuln --all-namespaces

    出力例

    NAMESPACE     NAME              AGE
    default       sha256.ca90...    6m56s
    skynet        sha256.ca90...    9m37s

  • 特定の脆弱性の詳細を表示するには、脆弱性の名前およびその namespace を oc describe コマンドに指定します。以下の例は、イメージに脆弱性のある RPM パッケージが含まれるアクティブなコンテナーを示しています。

    $ oc describe vuln --namespace mynamespace sha256.ac50e3752...

    出力例

    Name:         sha256.ac50e3752...
    Namespace:    quay-enterprise
    ...
    Spec:
      Features:
        Name:            nss-util
        Namespace Name:  centos:7
        Version:         3.44.0-3.el7
        Versionformat:   rpm
        Vulnerabilities:
          Description: Network Security Services (NSS) is a set of libraries...