2.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 レジストリーとインフラストラクチャー間のイメージの整合性を確認するには、署名の検証を有効にします。
2.4.1. Red Hat Container Registry の署名の検証の有効化 リンクのコピーリンクがクリップボードにコピーされました!
Red Hat Container レジストリーのコンテナー署名の検証を有効にするには、これらのレジストリーからのイメージを検証するキーを指定する署名検証ポリシーファイルを作成する必要があります。RHEL8 ノードの場合、レジストリーはデフォルトで /etc/containers/registries.d
にすでに定義されています。
手順
ワーカーノードに必要な設定を含む Butane 設定ファイル
51-worker-rh-registry-trust.bu
を作成します。注記設定ファイルで指定する Butane のバージョン は、OpenShift Container Platform のバージョンと同じである必要があり、末尾は常に
0
です。たとえば、4.15.0
です。Butane の詳細は、「Butane を使用したマシン設定の作成」を参照してください。Copy to Clipboard Copied! Toggle word wrap Toggle overflow Butane を使用して、ワーカーノードのディスクに書き込まれるファイルが含まれるように、マシン設定 YAML ファイル
51-worker-rh-registry-trust.yaml
を生成します。butane 51-worker-rh-registry-trust.bu -o 51-worker-rh-registry-trust.yaml
$ butane 51-worker-rh-registry-trust.bu -o 51-worker-rh-registry-trust.yaml
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 作成されたマシン設定を適用します。
oc apply -f 51-worker-rh-registry-trust.yaml
$ oc apply -f 51-worker-rh-registry-trust.yaml
Copy to Clipboard Copied! Toggle word wrap Toggle overflow ワーカーマシン設定プールが新しいマシン設定でロールアウトされていることを確認します。
新しいマシン設定が作成されたことを確認します。
oc get mc
$ oc get mc
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 出力例
Copy to Clipboard Copied! Toggle word wrap Toggle overflow ワーカーマシン設定プールが新しいマシン設定で更新されていることを確認します。
oc get mcp
$ oc get mcp
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 出力例
NAME CONFIG UPDATED UPDATING DEGRADED MACHINECOUNT READYMACHINECOUNT UPDATEDMACHINECOUNT DEGRADEDMACHINECOUNT AGE master rendered-master-af1e7ff78da0a9c851bab4be2777773b True False False 3 3 3 0 30m worker rendered-worker-be3b3bce4f4aa52a62902304bac9da3c False True False 3 0 0 0 30m
NAME CONFIG UPDATED UPDATING DEGRADED MACHINECOUNT READYMACHINECOUNT UPDATEDMACHINECOUNT DEGRADEDMACHINECOUNT AGE master rendered-master-af1e7ff78da0a9c851bab4be2777773b True False False 3 3 3 0 30m worker rendered-worker-be3b3bce4f4aa52a62902304bac9da3c False True False 3 0 0 0 30m
1 Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 1
UPDATING
フィールドがTrue
の場合、マシン設定プールは新しいマシン設定で更新されます。フィールドがFalse
になると、ワーカーマシン設定プールが新しいマシン設定にロールアウトされます。
クラスターが RHEL7 ワーカーノードを使用している場合、ワーカーマシンの設定プールが更新されたら、それらのノードに YAML ファイルを
/etc/containers/registries.d
ディレクトリーに作成します。これにより、特定のレジストリーサーバーの切り離された署名の場所が指定されます。次の例は、registry.access.redhat.com
およびregistry.redhat.io
でホストされているイメージに対してのみ機能します。各 RHEL7 ワーカーノードへのデバッグセッションを開始します。
oc debug node/<node_name>
$ oc debug node/<node_name>
Copy to Clipboard Copied! Toggle word wrap Toggle overflow ルートディレクトリーを
/host
に変更します。chroot /host
sh-4.2# chroot /host
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 以下を含む
/etc/containers/registries.d/registry.redhat.io.yaml
ファイルを作成します。docker: registry.redhat.io: sigstore: https://registry.redhat.io/containers/sigstore
docker: registry.redhat.io: sigstore: https://registry.redhat.io/containers/sigstore
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 以下を含む
/etc/containers/registries.d/registry.access.redhat.com.yaml
ファイルを作成します。docker: registry.access.redhat.com: sigstore: https://access.redhat.com/webassets/docker/content/sigstore
docker: registry.access.redhat.com: sigstore: https://access.redhat.com/webassets/docker/content/sigstore
Copy to Clipboard Copied! Toggle word wrap Toggle overflow - デバッグセッションを終了します。
2.4.2. 署名の検証設定の確認 リンクのコピーリンクがクリップボードにコピーされました!
マシン設定をクラスターに適用すると、Machine Config Controller は新規の MachineConfig
オブジェクトを検出し、新規の rendered-worker-<hash>
バージョンを生成します。
前提条件
- マシン設定ファイルを使用して署名の検証を有効にしている。
手順
コマンドラインで以下のコマンドを実行し、必要なワーカーの情報を表示します。
oc describe machineconfigpool/worker
$ oc describe machineconfigpool/worker
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 初期ワーカーモニタリングの出力例
Copy to Clipboard Copied! Toggle word wrap Toggle overflow oc describe
コマンドを再度実行します。oc describe machineconfigpool/worker
$ oc describe machineconfigpool/worker
Copy to Clipboard Copied! Toggle word wrap Toggle overflow ワーカーの更新後の出力例
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 注記Observed Generation
パラメーターは、コントローラーで作成される設定の生成に基づいて増加するカウントを表示します。このコントローラーは、仕様の処理とリビジョンの生成に失敗する場合でも、この値を更新します。Configuration Source
値は51-worker-rh-registry-trust
設定を参照します。以下のコマンドを使用して、
policy.json
ファイルが存在することを確認します。oc debug node/<node> -- chroot /host cat /etc/containers/policy.json
$ oc debug node/<node> -- chroot /host cat /etc/containers/policy.json
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 出力例
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 以下のコマンドを使用して、
registry.redhat.io.yaml
ファイルが存在することを確認します。oc debug node/<node> -- chroot /host cat /etc/containers/registries.d/registry.redhat.io.yaml
$ oc debug node/<node> -- chroot /host cat /etc/containers/registries.d/registry.redhat.io.yaml
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 出力例
Starting pod/<node>-debug ... To use host binaries, run `chroot /host` docker: registry.redhat.io: sigstore: https://registry.redhat.io/containers/sigstore
Starting pod/<node>-debug ... To use host binaries, run `chroot /host` docker: registry.redhat.io: sigstore: https://registry.redhat.io/containers/sigstore
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 以下のコマンドを使用して、
registry.access.redhat.com.yaml
ファイルが存在することを確認します。oc debug node/<node> -- chroot /host cat /etc/containers/registries.d/registry.access.redhat.com.yaml
$ oc debug node/<node> -- chroot /host cat /etc/containers/registries.d/registry.access.redhat.com.yaml
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 出力例
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
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
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
2.4.3. 検証可能な署名がないコンテナーイメージの検証について リンクのコピーリンクがクリップボードにコピーされました!
各 OpenShift Container Platform リリースイメージはイミュータブルであり、Red Hat プロダクションキーで署名されています。OpenShift Container Platform の更新またはインストール中に、検証可能な署名がないコンテナーイメージをリリースイメージがデプロイする可能性があります。各署名付きリリースイメージダイジェストはイミュータブルです。リリースイメージ内の各参照は、別のイメージのイミュータブルダイジェストに対するものであるため、コンテンツは推移的に信頼できます。言い換えれば、リリースイメージ上の署名は、すべてのリリース内容を検証します。
たとえば、検証可能な署名がないイメージ参照は、署名付き OpenShift Container Platform リリースイメージに含まれています。
リリース情報の出力例
oc adm release info quay.io/openshift-release-dev/ocp-release@sha256:2309578b68c5666dad62aed696f1f9d778ae1a089ee461060ba7b9514b7ca417 -o pullspec
$ oc adm release info quay.io/openshift-release-dev/ocp-release@sha256:2309578b68c5666dad62aed696f1f9d778ae1a089ee461060ba7b9514b7ca417 -o pullspec
quay.io/openshift-release-dev/ocp-v4.0-art-dev@sha256:9aafb914d5d7d0dec4edd800d02f811d7383a7d49e500af548eab5d00c1bffdb
2.4.3.1. 更新時の自動検証 リンクのコピーリンクがクリップボードにコピーされました!
署名の検証は自動的に行われます。OpenShift Cluster Version Operator (CVO) は、OpenShift Container Platform の更新中にリリースイメージの署名を検証します。これは内部プロセスです。自動検証が失敗すると、OpenShift Container Platform のインストールまたは更新は失敗します。
署名の検証は、skopeo
コマンドラインユーティリティーを使用して手動で行うこともできます。
2.4.3.2. skopeo を使用して Red Hat コンテナーイメージの署名を検証する リンクのコピーリンクがクリップボードにコピーされました!
OpenShift Container Platform リリースイメージに含まれるコンテナーイメージの署名は、OCP リリースミラーサイト から署名を取得して検証できます。ミラーサイトの署名は Podman や CRI-O が理解できる形式ではないため、skopeo standalone-verify
コマンドを使用して、リリースイメージが Red Hat によって署名されていることを確認します。
前提条件
-
skopeo
コマンドラインユーティリティーがインストールされている。
手順
次のコマンドを実行して、リリースの完全な SHA を取得します。
oc adm release info <release_version> \
$ oc adm release info <release_version> \
1 Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 1
- <release_version> をリリース番号に置き換えます (例:
4.14.3
)。
出力の抜粋例
--- Pull From: quay.io/openshift-release-dev/ocp-release@sha256:e73ab4b33a9c3ff00c9f800a38d69853ca0c4dfa5a88e3df331f66df8f18ec55 ---
--- Pull From: quay.io/openshift-release-dev/ocp-release@sha256:e73ab4b33a9c3ff00c9f800a38d69853ca0c4dfa5a88e3df331f66df8f18ec55 ---
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 次のコマンドを実行して、Red Hat リリースキーをプルダウンします。
curl -o pub.key https://access.redhat.com/security/data/fd431d51.txt
$ curl -o pub.key https://access.redhat.com/security/data/fd431d51.txt
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 次のコマンドを実行して、検証する特定のリリースの署名ファイルを取得します。
curl -o signature-1 https://mirror.openshift.com/pub/openshift-v4/signatures/openshift-release-dev/ocp-release/sha256%<sha_from_version>/signature-1 \
$ curl -o signature-1 https://mirror.openshift.com/pub/openshift-v4/signatures/openshift-release-dev/ocp-release/sha256%<sha_from_version>/signature-1 \
1 Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 1
<sha_from_version>
を、リリースの SHA に一致するミラーサイトへの完全なリンクの SHA 値に置き換えます。たとえば、4.12.23 リリースの署名へのリンクはhttps://mirror.openshift.com/pub/openshift-v4/signatures/openshift-release-dev/ocp-release/sha256%e73ab4b33a9c3ff00c9f800a38d69853ca0c4dfa5a88e3df331f66df8f18ec55/signature-1
、SHA 値はe73ab4b33a9c3ff00c9f800a38d69853ca0c4dfa5a88e3df331f66df8f18ec55
です。
次のコマンドを実行して、リリースイメージのマニフェストを取得します。
skopeo inspect --raw docker://<quay_link_to_release> > manifest.json \
$ skopeo inspect --raw docker://<quay_link_to_release> > manifest.json \
1 Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 1
<quay_link_to_release>
を、oc adm release info
コマンドの出力に置き換えます。たとえば、quay.io/openshift-release-dev/ocp-release@sha256:e73ab4b33a9c3ff00c9f800a38d69853ca0c4dfa5a88e3df331f66df8f18ec55
です。
skopeo を使用して署名を検証します。
skopeo standalone-verify manifest.json quay.io/openshift-release-dev/ocp-release:<release_number>-<arch> any signature-1 --public-key-file pub.key
$ skopeo standalone-verify manifest.json quay.io/openshift-release-dev/ocp-release:<release_number>-<arch> any signature-1 --public-key-file pub.key
Copy to Clipboard Copied! Toggle word wrap Toggle overflow ここでは、以下のようになります。
<release_number>
-
リリース番号を指定します (例:
4.14.3
)。 <arch>
アーキテクチャーを指定します (例:
x86_64
)。出力例
Signature verified using fingerprint 567E347AD0044ADE55BA8A5F199E2F91FD431D51, digest sha256:e73ab4b33a9c3ff00c9f800a38d69853ca0c4dfa5a88e3df331f66df8f18ec55
Signature verified using fingerprint 567E347AD0044ADE55BA8A5F199E2F91FD431D51, digest sha256:e73ab4b33a9c3ff00c9f800a38d69853ca0c4dfa5a88e3df331f66df8f18ec55
Copy to Clipboard Copied! Toggle word wrap Toggle overflow