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 集群镜像策略只是一个技术预览功能。技术预览功能不受红帽产品服务等级协议(SLA)支持,且功能可能并不完整。红帽不推荐在生产环境中使用它们。这些技术预览功能可以使用户提早试用新的功能,并有机会在开发阶段提供反馈意见。
有关红帽技术预览功能支持范围的更多信息,请参阅以下链接:
先决条件
- 您有一个 sigstore 支持的公钥基础架构(PKI)密钥、自带公钥基础架构(BYOPKI)证书或提供 Cosign 公钥和私钥对,用于签名操作。
- 您有一个签名过程来为您的镜像签名。
- 如果使用 Cosign 签名,您可以访问支持 Cosign 签名的 registry。
如果为 OpenShift Container Platform 发行版本镜像存储库配置了 registry 镜像,则
quay.io/openshift-release-dev/ocp-release和quay.io/openshift-release-dev/ocp-v4.0-art-dev,在启用技术预览功能集前,您必须将 OpenShift Container Platform 发行镜像的 sigstore 签名镜像(mirror)到镜像 registry 中。否则,为发行版本存储库强制执行签名验证的默认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.sig如果您使用 BYOPKI 证书作为信任的根目录,您可以通过编辑名为
cluster的FeatureGateCR 为集群启用所需的技术预览功能:$ oc edit featuregate clusterFeatureGateCR 示例apiVersion: config.openshift.io/v1 kind: FeatureGate metadata: name: cluster spec: featureSet: TechPreviewNoUpgrade1 - 1
- 启用所需的
SigstoreImageVerificationPKI功能。
警告在集群中启用
TechPreviewNoUpgrade功能集无法撤消,并会阻止次版本更新。此功能集允许您在测试集群中启用这些技术预览功能,您可以在测试集群中完全测试它们。不要在生产环境集群中启用此功能。
流程
创建类似以下示例的集群镜像策略对象。有关这些参数的具体详情,请参阅"关于镜像策略参数"。
带有公钥策略和
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-dev/ocp-v4.0-art-dev仓库中部署 OpenShift Container Platform 镜像。集群操作需要这些软件仓库中的镜像。 - 3
- 指定定义如何验证镜像的参数。
- 4
- 定义策略的信任根。
- 5
- 指定定义信任根的策略类型,可以是公钥、BYOPKI 证书或 Fulcio 证书。这个示例使用带有 Rekor 验证的公钥。
- 6
- 对于公钥策略,以 PEM 格式指定 base64 编码的公钥。最大长度为 8192 个字符。
- 7
- 可选:以 PEM 格式指定 base64 编码的 Rekor 公钥。最大长度为 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-dev/ocp-v4.0-art-dev仓库中部署 OpenShift Container Platform 镜像。集群操作需要这些软件仓库中的镜像。 - 3
- 指定定义如何验证镜像的参数。
- 4
- 定义策略的信任根。
- 5
- 指定定义信任根的策略类型,可以是公钥、BYOPKI 证书或 Fulcio 证书。这个示例使用 BYOPKI 证书。
- 6
- 对于 BYOPKI 证书,指定
caRootsData。这个参数以 PEM 格式指定 base64 编码的 CA root 证书。最大长度为 8192 个字符。(可选)使用caIntermediatesData,以 PEM 格式指定 base64 编码的中间 CA root 证书。最大长度为 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-dev/ocp-v4.0-art-dev仓库中部署 OpenShift Container Platform 镜像。集群操作需要这些软件仓库中的镜像。 - 3
- 指定定义如何验证镜像的参数。
- 4
- 定义策略的信任根。
- 5
- 指定定义信任根的策略类型,可以是公钥、BYOPKI 证书或 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" } } ], # ...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显示添加了范围 registry 的输出示例
docker: example.com: use-sigstore-attachments: true1 quay.io/openshift-release-dev/ocp-release: use-sigstore-attachments: true- 1
- 为
true时,指定 sigstore 签名将与镜像一起读取。