12.3. クラスターイメージポリシー CR の作成
クラスター管理者は、ClusterImagePolicy カスタムリソース (CR) を使用してクラスター全体の sigstore 署名検証ポリシーを設定できます。Machine Config Operator (MCO) を有効にすると、ClusterImagePolicy オブジェクトを監視し、クラスター内のすべてのノード上の /etc/containers/policy.json および /etc/containers/registries.d/sigstore-registries.yaml ファイルを更新します。
次の例は、ClusterImagePolicy オブジェクトの設定方法に関する一般的なガイドラインを示しています。パラメーターの詳細は、「クラスターおよびイメージポリシーのパラメーターについて」を参照してください。
デフォルトの openshift クラスターイメージポリシーは、必要な OpenShift Container Platform イメージの sigstore サポートを提供します。このクラスターイメージポリシーは、テクノロジープレビュー機能が有効なクラスターでのみアクティブになります。このクラスターイメージポリシーオブジェクトは、削除または変更しないでください。openshift で始まるクラスターイメージポリシー名は、システムで将来使用するために予約されています。
デフォルトの openshift クラスターイメージポリシーは、テクノロジープレビュー機能です。テクノロジープレビュー機能は、Red Hat 製品のサービスレベルアグリーメント (SLA) の対象外であり、機能的に完全ではないことがあります。Red Hat は、実稼働環境でこれらを使用することを推奨していません。テクノロジープレビュー機能は、最新の製品機能をいち早く提供して、開発段階で機能のテストを行い、フィードバックを提供していただくことを目的としています。
Red Hat のテクノロジープレビュー機能のサポート範囲に関する詳細は、テクノロジープレビュー機能のサポート範囲 を参照してください。
前提条件
- 署名操作のために、sigstore でサポートされている公開鍵基盤 (PKI) の鍵、Bring Your Own Public Key Infrastructure (BYOPKI) 証明書、または Cosign の公開鍵と秘密鍵のペア を用意する。
- イメージに署名するための署名プロセスがある。
- Cosign 署名を使用している場合は、Cosign 署名をサポートするレジストリーにアクセスできる。
OpenShift Container Platform リリースイメージリポジトリー (
quay.io/openshift-release-dev/ocp-releaseおよびquay.io/openshift-release-dev/ocp-v4.0-art-dev) 用にレジストリーミラーが設定されている場合は、テクノロジープレビュー機能セットを有効にする前に、OpenShift Container Platform リリースイメージの sigstore 署名をミラーレジストリーにミラーリングする必要があります。これを行わないと、リリースリポジトリーの署名検証を強制するデフォルトのopenshiftクラスターイメージポリシーにより、Cluster Version Operator が CVO Pod を新しいノードに移動する機能がブロックされ、機能セットの変更に伴うノードの更新が妨げられます。oc image mirrorコマンドを使用して署名をミラーリングできます。以下に例を示します。$ oc image mirror quay.io/openshift-release-dev/ocp-release:sha256-1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef.sig \ mirror.com/image/repo:sha256-1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef.sigBYOPKI 証明書を信頼のルートとして使用している場合は、
clusterという名前のFeatureGateCR を編集して、クラスターに必要なテクノロジープレビュー機能を有効にします。$ oc edit featuregate clusterFeatureGateCR の例apiVersion: config.openshift.io/v1 kind: FeatureGate metadata: name: cluster spec: featureSet: TechPreviewNoUpgrade1
手順
次の例のようなクラスターイメージポリシーオブジェクトを作成します。これらのパラメーターの詳細は、「イメージポリシーパラメーターについて」を参照してください。
公開鍵ポリシーと
MatchRepoDigestOrExact一致ポリシーを含むクラスターイメージポリシーオブジェクトの例apiVersion: config.openshift.io/v1 kind: ClusterImagePolicy1 metadata: name: p1 spec: scopes:2 - example.com policy:3 rootOfTrust:4 policyType: PublicKey5 publicKey: keyData: a2V5RGF0YQ==6 rekorKeyData: cmVrb3JLZXlEYXRh7 signedIdentity:8 matchPolicy: MatchRepoDigestOrExact- 1
ClusterImagePolicyオブジェクトを作成します。- 2
- このポリシーに割り当てられるリポジトリーまたはイメージのリストを定義します。クラスターイメージポリシーで、ポリシーが
quay.io/openshift-release-dev/ocp-releaseおよびquay.io/openshift-release-dev/ocp-v4.0-art-devリポジトリー内の OpenShift Container Platform イメージのデプロイメントをブロックしないことを確認します。これらのリポジトリー内のイメージは、クラスターの操作に必要です。 - 3
- イメージの検証方法を定義するパラメーターを指定します。
- 4
- ポリシーの Root of Trust を定義します。
- 5
- 信頼のルートを定義するポリシータイプ (公開鍵、BYOPKI 証明書、または Fulcio 証明書) を指定します。この例では、公開鍵と Rekor 検証を使用します。
- 6
- 公開鍵ポリシーの場合、base64 でエンコードされた公開鍵を PEM 形式で指定します。最大長は 8192 文字です。
- 7
- オプション: base64 でエンコードされた Rekor 公開鍵を PEM 形式で指定します。最大長は 8192 文字です。
- 8
- オプション: 署名と実際のイメージアイデンティティーのアイデンティティーを検証するためのプロセスとして、次のいずれかを指定します。
-
MatchRepoDigestOrExact。 -
MatchRepository。 -
ExactRepository。exactRepositoryパラメーターを指定する必要があります。 -
RemapIdentity。prefixおよびsignedPrefixパラメーターを指定する必要があります。
-
BYOPKI ポリシーおよび
MatchRepository一致ポリシーのクラスターイメージポリシーオブジェクトの例apiVersion: config.openshift.io/v1alpha1 kind: ClusterImagePolicy1 metadata: name: pki-policy spec: scopes: - example.io2 policy:3 rootOfTrust:4 policyType: PKI5 pki:6 caRootsData: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk....URS0tLS0t caIntermediatesData: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1J....lDQVRFLS0tLS0= pkiCertificateSubject:7 email: email@example.com hostname: myhost.example.com signedIdentity: matchPolicy: MatchRepository8 - 1
ClusterImagePolicyオブジェクトを作成します。- 2
- このポリシーに割り当てられるリポジトリーまたはイメージのリストを定義します。クラスターイメージポリシーで、ポリシーが
quay.io/openshift-release-dev/ocp-releaseおよびquay.io/openshift-release-dev/ocp-v4.0-art-devリポジトリー内の OpenShift Container Platform イメージのデプロイメントをブロックしないことを確認します。これらのリポジトリー内のイメージは、クラスターの操作に必要です。 - 3
- イメージの検証方法を定義するパラメーターを指定します。
- 4
- ポリシーの Root of Trust を定義します。
- 5
- 信頼のルートを定義するポリシータイプ (公開鍵、BYOPKI 証明書、または Fulcio 証明書) を指定します。この例では、BYOPKI 証明書を使用します。
- 6
- BYOPKI 証明書の場合は、
caRootsDataを指定します。このパラメーターは、base64 でエンコードされた PEM 形式の CA ルート証明書を指定します。最大長は 8192 文字です。必要に応じて、caIntermediatesDataで、base64 でエンコードされた PEM 形式の中間 CA ルート証明書を指定します。最大長は 8192 文字です。 - 7
- ホスト名とメールアドレスを使用してユーザーのアイデンティティーを認証するためのサブジェクト代替名 (SAN) を指定します。
-
email。証明書の生成時に指定したメールアドレスを指定します。 -
hostname。証明書の生成時に指定したホスト名を指定します。
-
- 8
- BYOPKI 証明書の場合、署名内のアイデンティティーと実際のイメージアイデンティティーを検証するために、
MatchRepositoryパラメーターを指定します。デフォルトの署名アイデンティティーはmatchRepoDigestOrExactです。これは、検証のために署名アイデンティティーにダイジェスト参照を必要とします。この場合の署名アイデンティティーは、リポジトリー参照を使用しており、イメージのダイジェストを含んでいません。
Fulcio 証明書ポリシーと
remapIdentity一致ポリシーを含むクラスターイメージポリシーオブジェクトの例apiVersion: config.openshift.io/v1 kind: ClusterImagePolicy1 metadata: name: p1 spec: scopes:2 - example.com policy:3 rootOfTrust:4 policyType: FulcioCAWithRekor5 fulcioCAWithRekor:6 fulcioCAData: a2V5RGF0YQ== fulcioSubject: oidcIssuer: "https://expected.OIDC.issuer/" signedEmail: "expected-signing-user@example.com" rekorKeyData: cmVrb3JLZXlEYXRh7 signedIdentity: matchPolicy: RemapIdentity8 remapIdentity: prefix: example.com9 signedPrefix: mirror-example.com10 - 1
ClusterImagePolicyオブジェクトを作成します。- 2
- このポリシーに割り当てられるリポジトリーまたはイメージのリストを定義します。クラスターイメージポリシーで、ポリシーが
quay.io/openshift-release-dev/ocp-releaseおよびquay.io/openshift-release-dev/ocp-v4.0-art-devリポジトリー内の OpenShift Container Platform イメージのデプロイメントをブロックしないことを確認します。これらのリポジトリー内のイメージは、クラスターの操作に必要です。 - 3
- イメージの検証方法を定義するパラメーターを指定します。
- 4
- ポリシーの Root of Trust を定義します。
- 5
- 信頼のルートを定義するポリシータイプ (公開鍵、BYOPKI 証明書、または Fulcio 証明書) を指定します。この例では、Fulcio 証明書を使用し、Rekor 検証を必須としています。
- 6
- Fulcio 証明書ポリシーの場合、次のパラメーターが必要です。
-
fulcioCAData: base64 でエンコードされた Fulcio 証明書を PEM 形式で指定します。最大長は 8192 文字です。 -
fulcioSubject: OIDC 発行者と Fulcio 認証設定のメールを指定します。
-
- 7
- base64 でエンコードされた Rekor 公開鍵を PEM 形式で指定します。このパラメーターは、
policyTypeがFulcioCAWithRekorの場合に必要です。最大長は 8192 文字です。 - 8
- オプション: 署名と実際のイメージアイデンティティーのアイデンティティーを検証するためのプロセスとして、次のいずれかを指定します。
-
MatchRepoDigestOrExact。 -
MatchRepository。 -
ExactRepository。exactRepositoryパラメーターを指定する必要があります。 -
RemapIdentity。prefixおよびsignedPrefixパラメーターを指定する必要があります。
-
- 9
remapIdentity一致ポリシーの場合、スコープ指定されたイメージ接頭辞と一致する必要がある接頭辞を指定します。その 2 つが一致する場合、スコープ指定されたイメージ接頭辞はsignedPrefixの値に置き換えられます。最大長は 512 文字です。- 10
remapIdentity一致ポリシーの場合、必要に応じて再度マッピングするイメージ接頭辞を指定します。最大長は 512 文字です。
クラスターイメージポリシーオブジェクトを作成します。
$ oc create -f <file_name>.yamlMachine Config Operator (MCO) により、クラスター内のマシン設定プール (MCP) が更新されます。変更の適用中であるため、各ノードでのスケジューリングが無効になります。
検証
クラスター内のノードが更新されたら、クラスターイメージポリシーが設定されていることを確認できます。
次のコマンドを実行して、ノードのデバッグ Pod を起動します。
$ oc debug node/<node_name>次のコマンドを実行して、デバッグシェル内のルートディレクトリーとして
/hostを設定します。sh-5.1# chroot /host/次のコマンドを実行して、
policy.jsonファイルを調べます。sh-5.1# cat /etc/containers/policy.json新しいクラスターイメージポリシーを示す公開鍵を含むクラスターイメージポリシーオブジェクトの出力例
# ... "transports": { # ... "docker": { "example.com": [ { "type": "sigstoreSigned", "keyData": "a2V5RGF0YQ==", "rekorPublicKeyData": "cmVrb3JLZXlEYXRh", "signedIdentity": { "type": "matchRepoDigestOrExact" } } ], # ...新しいクラスターイメージポリシーを示す BYOPKI 証明書のクラスターイメージポリシーオブジェクトの出力例
# ... "transports": { # ... "docker": { "example.io": [ { "type": "sigstoreSigned", "pki": { "caRootsData": "LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk....URS0tLS0t", "caIntermediatesData": "LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1J....lDQVRFLS0tLS0=", "subjectEmail": "email@example.com", "subjectHostname": "myhost.example.com" }, "signedIdentity": { "type": "matchRepository" } } ],新しいクラスターイメージポリシーを示す Fulcio 証明書を含むクラスターイメージポリシーオブジェクトの出力例
# ... "transports": { # ... "docker": { "example.com": [ { "type": "sigstoreSigned", "fulcio": { "caData": "a2V5RGF0YQ==", "oidcIssuer": "https://expected.OIDC.issuer/", "subjectEmail": "expected-signing-user@example.com" }, "rekorPublicKeyData": "cmVrb3JLZXlEYXRh", "signedIdentity": { "type": "remapIdentity", "prefix": "example.com", "signedPrefix": "mirror-example.com" } } ], # ...次のコマンドを実行して、
sigstore-registries.yamlファイルを調べます。sh-5.1# cat /etc/containers/registries.d/sigstore-registries.yamlスコープ指定されたレジストリーが追加されたことを示す出力例
docker: example.com: use-sigstore-attachments: true1 quay.io/openshift-release-dev/ocp-release: use-sigstore-attachments: true- 1
trueの場合、sigstore 署名をイメージと併せて読み取ることを指定しています。