12.4. 创建镜像策略 CR
ImagePolicy 自定义资源(CR) 可让集群管理员或应用程序开发人员为特定命名空间配置 sigstore 签名验证策略。MCO 监视不同命名空间中的 ImagePolicy 实例,并更新集群中所有节点上的 /etc/crio/policies/<namespace>.json 和 /etc/containers/registries.d/sigstore-registries.yaml 文件。
如果镜像策略中有范围的镜像或存储库嵌套在集群镜像策略中的范围镜像或存储库下,则仅应用来自集群镜像策略的策略。但是,镜像策略对象被创建并显示错误消息。例如,如果镜像策略指定了 example.com/global/image,并且集群镜像策略指定了 example.com/global,命名空间会集成集群镜像策略中的策略。
以下示例显示了如何配置 ImagePolicy 对象的一般准则。有关参数的详情,请参阅"关于集群和镜像策略参数"。
先决条件
- 您有一个 sigstore 支持的公钥基础架构(PKI)密钥、自带公钥基础架构(BYOPKI)证书或提供 Cosign 公钥和私钥对,用于签名操作。
- 您有一个签名过程来为您的镜像签名。
- 如果使用 Cosign 签名,您可以访问支持 Cosign 签名的 registry。
如果您使用 BYOPKI 证书作为信任的根目录,您可以通过编辑名为
cluster的FeatureGateCR 为集群启用所需的技术预览功能:$ oc edit featuregate clusterFeatureGateCR 示例apiVersion: config.openshift.io/v1 kind: FeatureGate metadata: name: cluster spec: featureSet: TechPreviewNoUpgrade1 - 1
- 启用所需的
SigstoreImageVerification功能。
警告在集群中启用
TechPreviewNoUpgrade功能集无法撤消,并会阻止次版本更新。此功能集允许您在测试集群中启用这些技术预览功能,您可以在测试集群中完全测试它们。不要在生产环境集群中启用此功能。
流程
创建类似以下示例的镜像策略对象。有关这些参数的具体详情,请参阅"关于集群和镜像策略参数"。
带有公钥策略和
MatchRepository匹配策略的镜像策略对象示例apiVersion: config.openshift.io/v1 kind: ImagePolicy1 metadata: name: p0 namespace: mynamespace2 spec: scopes:3 - example.io/crio/signed policy:4 rootOfTrust:5 policyType: PublicKey6 publicKey: keyData: a2V5RGF0YQ==7 rekorKeyData: cmVrb3JLZXlEYXRh8 signedIdentity: matchPolicy: MatchRepository9 - 1
- 创建
ImagePolicy对象。 - 2
- 指定应用镜像策略的命名空间。
- 3
- 定义分配给此策略的存储库或镜像列表。
- 4
- 指定定义如何验证镜像的参数。
- 5
- 定义策略的信任根。
- 6
- 指定定义信任根的策略类型,可以是公钥、BYOPKI 证书或 Fulcio 证书。在这里,使用 Rekor 验证的公钥。
- 7
- 对于公钥策略,以 PEM 格式指定 base64 编码的公钥。最大长度为 8192 个字符。
- 8
- 可选:以 PEM 格式指定 base64 编码的 Rekor 公钥。最大长度为 8192 个字符。
- 9
- 可选:指定以下进程之一来验证签名中的身份和实际镜像身份:
-
MatchRepoDigestOrExact. -
MatchRepository. -
ExactRepository.必须指定exactRepository参数。 -
RemapIdentity。必须指定prefix和signedPrefix参数。
-
BYOPKI 策略和
MatchRepository匹配策略的镜像策略对象示例apiVersion: config.openshift.io/v1alpha1 kind: ImagePolicy1 metadata: name: pki-policy namespace: mynamespace2 spec: scopes: - example.io3 policy:4 rootOfTrust:5 policyType: PKI6 pki:7 caRootsData: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk....RVJUSUZJQ0FURS0tLS0t caIntermediatesData: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSURkVENDQ....0QT09Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0= pkiCertificateSubject:8 email: email@example.com hostname: myhost.example.com signedIdentity: matchPolicy: MatchRepository9 - 1
- 创建
ImagePolicy对象。 - 2
- 指定应用镜像策略的命名空间。
- 3
- 定义分配给此策略的存储库或镜像列表。
- 4
- 指定定义如何验证镜像的参数。
- 5
- 定义策略的信任根。
- 6
- 指定定义信任根的策略类型,可以是公钥、BYOPKI 证书或 Fulcio 证书。在这里,BYOPKI 证书。
- 7
- 对于 BYOPKI 证书,指定
caRootsData。这个参数以 PEM 格式指定 base64 编码的 CA root 证书。最大长度为 8192 个字符。(可选)使用caIntermediatesData,以 PEM 格式指定 base64 编码的中间 CA root 证书。最大长度为 8192 个字符。 - 8
- 指定主题备用名称(SAN),来使用主机名和电子邮件地址验证用户身份:
-
email。指定在生成证书时指定的电子邮件地址。 -
hostname。指定生成证书时指定的主机名。
-
- 9
- 对于 BYOPKI 证书,指定
MatchRepository来验证签名和实际镜像身份中的身份。默认签名身份为matchRepoDigestOrExact,它需要摘要规格。本例中没有为摘要镜像创建签名。
带有 Fulcio 证书策略和
ExactRepository匹配策略的镜像策略对象示例apiVersion: config.openshift.io/v1 kind: ImagePolicy1 metadata: name: p1 namespace: mynamespace2 spec: scopes:3 - example.io/crio/signed policy:4 rootOfTrust:5 policyType: FulcioCAWithRekor6 fulcioCAWithRekor:7 fulcioCAData: a2V5RGF0YQ== fulcioSubject: oidcIssuer: "https://expected.OIDC.issuer/" signedEmail: "expected-signing-user@example.com" rekorKeyData: cmVrb3JLZXlEYXRh8 signedIdentity: matchPolicy: ExactRepository9 exactRepository: repository: quay.io/crio/signed10 - 1
- 创建
ImagePolicy对象。 - 2
- 指定应用镜像策略的命名空间。
- 3
- 定义分配给此策略的存储库或镜像列表。
- 4
- 指定定义如何验证镜像的参数。
- 5
- 定义策略的信任根。
- 6
- 指定定义信任根的策略类型,可以是公钥、BYOPKI 证书或 Fulcio 证书。在这里,一个带有所需 Rekor 验证的 Fulcio 证书。
- 7
- 对于 Fulcio 证书策略,需要以下参数:
-
fulcioCAData: 指定 PEM 格式的 base64 编码的 Fulcio 证书。最大长度为 8192 个字符。 -
fulcioSubject:指定 OIDC 签发者和 Fulcio 身份验证配置的电子邮件。
-
- 8
- 以 PEM 格式指定一个 base64 编码的 Rekor 公钥。当
policyType是FulcioCAWithRekor时,需要此参数。最大长度为 8192 个字符。 - 9
- 可选:指定以下进程之一来验证签名中的身份和实际镜像身份:
-
MatchRepoDigestOrExact. -
MatchRepository. -
ExactRepository.必须指定exactRepository参数。 -
RemapIdentity。必须指定prefix和signedPrefix参数。
-
- 10
- 对于
exactRepository匹配策略,请指定包含镜像身份和签名的存储库。
创建镜像策略对象:
$ 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/运行以下命令检查
<namespace>.json文件:sh-5.1# cat /etc/crio/policies/<namespace>.json带有一个公钥的镜像策略对象的示例输出,显示新的镜像策略。
# ... "transports": { # ... "docker": { "example.io/crio/signed": [ { "type": "sigstoreSigned", "keyData": "a2V5RGF0YQ==", "rekorPublicKeyData": "cmVrb3JLZXlEYXRh", "signedIdentity": { "type": "matchRepository", "dockerRepository": "example.org/crio/signed" } # ...BYOPKI 证书的镜像策略对象的输出示例,显示新镜像策略
# ... "transports": { # ... "docker": { "docker.io": [ { "type": "sigstoreSigned", "pki": { "caRootsData": "LS0t...LS0t", "caIntermediatesData": "LS0t...LS0t" "subjectEmail": "email@example.com", "subjectHostname": "myhost.example.com" }, "signedIdentity": { "type": "matchRepository" } } ],带有一个 Fulcio 证书的镜像策略对象的示例输出,显示新的镜像策略。
# ... "transports": { # ... "docker": { "example.io/crio/signed": [ { "type": "sigstoreSigned", "fulcio": { "caData": "a2V5RGF0YQ==", "oidcIssuer": "https://expected.OIDC.issuer/", "subjectEmail": "expected-signing-user@example.com" }, "rekorPublicKeyData": "cmVrb3JLZXlEYXRh", "signedIdentity": { "type": "exactRepository", "dockerRepository": "quay.io/crio/signed" } } ], # ...运行以下命令检查
sigstore-registries.yaml文件:sh-5.1# cat /etc/containers/registries.d/sigstore-registries.yaml显示添加了范围 registry 的输出示例
docker: example.io/crio/signed: use-sigstore-attachments: true1 quay.io/openshift-release-dev/ocp-release: use-sigstore-attachments: true- 1
- 为
true时,指定 sigstore 签名将与镜像一起读取。
运行以下命令,检查 sigstore 签名验证的 crio 日志:
sh-5.1# journalctl -u crio | grep -A 100 "Pulling image: example.io/crio"删除时间戳的输出示例
# ... msg="IsRunningImageAllowed for image docker:example.io/crio/signed:latest" file="signature/policy_eval.go:274"1 msg="Using transport \"docker\" specific policy section \"example.io/crio/signed\"" file="signature/policy_eval.go:150"2 msg="Reading /var/lib/containers/sigstore/crio/signed@sha256=18b42e8ea347780f35d979a829affa178593a8e31d90644466396e1187a07f3a/signature-1" file="docker/docker_image_src.go:545" msg="Looking for Sigstore attachments in quay.io/crio/signed:sha256-18b42e8ea347780f35d979a829affa178593a8e31d90644466396e1187a07f3a.sig" file="docker/docker_client.go:1138" msg="GET https://quay.io/v2/crio/signed/manifests/sha256-18b42e8ea347780f35d979a829affa178593a8e31d90644466396e1187a07f3a.sig" file="docker/docker_client.go:617" msg="Content-Type from manifest GET is \"application/vnd.oci.image.manifest.v1+json\"" file="docker/docker_client.go:989" msg="Found a Sigstore attachment manifest with 1 layers" file="docker/docker_image_src.go:639" msg="Fetching Sigstore attachment 1/1: sha256:8276724a208087e73ae5d9d6e8f872f67808c08b0acdfdc73019278807197c45" file="docker/docker_image_src.go:644" # ...