12.3. 创建集群镜像策略 CR
ClusterImagePolicy 自定义资源(CR)可让集群管理员为整个集群配置 sigstore 签名验证策略。启用后,Machine Config Operator (MCO)会监控 ClusterImagePolicy 对象,并更新集群中所有节点上的 /etc/containers/policy.json 和 /etc/containers/registries.d/sigstore-registries.yaml 文件。
以下示例显示了如何配置 ClusterImagePolicy 对象的一般准则。有关参数的详情,请参阅"关于集群和镜像策略参数"。
先决条件
- 您有一个 sigstore 支持的公钥基础架构(PKI)或 Cosign 公钥和私钥对用于签名操作。
- 您有一个签名过程来为您的镜像签名。
- 如果使用 Cosign 签名,您可以访问支持 Cosign 签名的 registry。
您可以通过编辑名为
cluster的FeatureGateCR 为集群启用所需的技术预览功能:$ oc edit featuregate clusterFeatureGateCR 示例apiVersion: config.openshift.io/v1 kind: FeatureGate metadata: name: cluster spec: featureSet: TechPreviewNoUpgrade1 - 1
- 启用所需的
SigstoreImageVerification功能。
警告在集群中启用
TechPreviewNoUpgrade功能集无法撤消,并会阻止次版本更新。此功能集允许您在测试集群中启用这些技术预览功能,您可以在测试集群中完全测试它们。不要在生产环境集群中启用此功能。保存更改后,会创建新的机器配置,然后更新机器配置池,并在应用更改时在每个节点上调度。
流程
创建类似以下示例的集群镜像策略对象。有关这些参数的具体详情,请参阅"关于镜像策略参数"。
带有公钥策略和
MatchRepoDigestOrExact匹配策略的集群镜像策略对象示例apiVersion: config.openshift.io/v1alpha1 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-dev/ocp-v4.0-art-dev仓库中部署 OpenShift Container Platform 镜像。集群操作需要这些软件仓库中的镜像。 - 3
- 指定定义如何验证镜像的参数。
- 4
- 定义策略的信任根。
- 5
- 指定定义信任根的策略类型,可以是公钥或 Fulcio 证书。在这里,使用 Rekor 验证的公钥。
- 6
- 对于公钥策略,以 PEM 格式指定 base64 编码的公钥。最大长度为 8192 个字符。
- 7
- 可选:以 PEM 格式指定 base64 编码的 Rekor 公钥。最大长度为 8192 个字符。
- 8
- 可选:指定以下进程之一来验证签名中的身份和实际镜像身份:
-
MatchRepoDigestOrExact. -
MatchRepository. -
ExactRepository.必须指定exactRepository参数。 -
RemapIdentity。必须指定prefix和signedPrefix参数。
-
带有 Fulcio 证书策略和
remapIdentity匹配策略的集群镜像策略对象示例apiVersion: config.openshift.io/v1alpha1 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-dev/ocp-v4.0-art-dev仓库中部署 OpenShift Container Platform 镜像。集群操作需要这些软件仓库中的镜像。 - 3
- 指定定义如何验证镜像的参数。
- 4
- 定义策略的信任根。
- 5
- 指定定义信任根的策略类型,可以是公钥或 Fulcio 证书。在这里,一个带有所需 Rekor 验证的 Fulcio 证书。
- 6
- 对于 Fulcio 证书策略,需要以下参数:
-
fulcioCAData: 指定 PEM 格式的 base64 编码的 Fulcio 证书。最大长度为 8192 个字符。 -
fulcioSubject:指定 OIDC 签发者和 Fulcio 身份验证配置的电子邮件。
-
- 7
- 以 PEM 格式指定一个 base64 编码的 Rekor 公钥。当
policyType是FulcioCAWithRekor时,需要此参数。最大长度为 8192 个字符。 - 8
- 可选:指定以下进程之一来验证签名中的身份和实际镜像身份。
-
MatchRepoDigestOrExact. -
MatchRepository. -
ExactRepository.必须指定exactRepository参数。 -
RemapIdentity。必须指定prefix和signedPrefix参数。
-
- 9
- 对于
remapIdentity匹配策略,请指定应与范围镜像前缀匹配的前缀。如果两个匹配项,则将有范围的镜像前缀替换为signedPrefix的值。最大长度为 512 个字符。 - 10
- 对于
remapIdentity匹配策略,请根据需要指定要重新映射的镜像前缀。最大长度为 512 个字符。
创建集群镜像策略对象:
$ oc create -f <file_name>.yamlMachine Config Operator (MCO) 更新集群中的机器配置池 (MCP)。
验证
更新集群中的节点后,您可以验证是否已配置了集群镜像策略:
运行以下命令,为节点启动 debug pod:
$ oc debug node/<node_name>运行以下命令,将
/host设置为 debug shell 中的根目录: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" } } ], # ...带有显示新集群镜像策略的 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显示添加了范围 registry 的输出示例
docker: example.com: use-sigstore-attachments: true1 quay.io/openshift-release-dev/ocp-release: use-sigstore-attachments: true- 1
- 为
true时,指定 sigstore 签名将与镜像一起读取。