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)或 Cosign 公钥和私钥对用于签名操作。
  • 您有一个签名过程来为您的镜像签名。
  • 如果使用 Cosign 签名,您可以访问支持 Cosign 签名的 registry。
  • 如果为 OpenShift Container Platform 发行版本镜像存储库配置了 registry 镜像,则 quay.io/openshift-release-dev/ocp-releasequay.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
    Copy to Clipboard Toggle word wrap
  • 您可以通过编辑名为 clusterFeatureGate CR 为集群启用所需的技术预览功能:

    $ oc edit featuregate cluster
    Copy to Clipboard Toggle word wrap

    FeatureGate CR 示例

    apiVersion: config.openshift.io/v1
    kind: FeatureGate
    metadata:
      name: cluster
    spec:
      featureSet: TechPreviewNoUpgrade 
    1
    Copy to Clipboard Toggle word wrap

    1
    启用所需的 SigstoreImageVerification 功能。
    警告

    在集群中启用 TechPreviewNoUpgrade 功能集无法撤消,并会阻止次版本更新。此功能集允许您在测试集群中启用这些技术预览功能,您可以在测试集群中完全测试它们。不要在生产环境集群中启用此功能。

    保存更改后,会创建新的机器配置,然后更新机器配置池,并在应用更改时在每个节点上调度。

流程

  1. 创建类似以下示例的镜像策略对象。有关这些参数的具体详情,请参阅"关于集群和镜像策略参数"。

    带有公钥策略和 MatchRepository 匹配策略的镜像策略对象示例

    apiVersion: config.openshift.io/v1alpha1
    kind: ImagePolicy 
    1
    
    metadata:
      name: p0
      namespace: mynamespace 
    2
    
    spec:
      scopes: 
    3
    
        - example.io/crio/signed
      policy: 
    4
    
        rootOfTrust: 
    5
    
          policyType: PublicKey 
    6
    
          publicKey:
            keyData: a2V5RGF0YQ== 
    7
    
            rekorKeyData: cmVrb3JLZXlEYXRh 
    8
    
        signedIdentity:
          matchPolicy: MatchRepository 
    9
    Copy to Clipboard Toggle word wrap

    1
    创建 ImagePolicy 对象。
    2
    指定应用镜像策略的命名空间。
    3
    定义分配给此策略的存储库或镜像列表。
    4
    指定定义如何验证镜像的参数。
    5
    定义策略的信任根。
    6
    指定定义信任根的策略类型,可以是公钥或 Fulcio 证书。在这里,使用 Rekor 验证的公钥。
    7
    对于公钥策略,以 PEM 格式指定 base64 编码的公钥。最大长度为 8192 个字符。
    8
    可选:以 PEM 格式指定 base64 编码的 Rekor 公钥。最大长度为 8192 个字符。
    9
    可选:指定以下进程之一来验证签名中的身份和实际镜像身份:
    • MatchRepoDigestOrExact.
    • MatchRepository.
    • ExactRepository.必须指定 exactRepository 参数。
    • RemapIdentity。必须指定 prefixsignedPrefix 参数。

    带有 Fulcio 证书策略和 ExactRepository 匹配策略的镜像策略对象示例

    apiVersion: config.openshift.io/v1alpha1
    kind: ImagePolicy 
    1
    
    metadata:
      name: p1
      namespace: mynamespace 
    2
    
    spec:
      scopes: 
    3
    
        - example.io/crio/signed
      policy: 
    4
    
        rootOfTrust: 
    5
    
          policyType: FulcioCAWithRekor 
    6
    
          fulcioCAWithRekor: 
    7
    
            fulcioCAData: a2V5RGF0YQ==
            fulcioSubject:
              oidcIssuer: "https://expected.OIDC.issuer/"
              signedEmail: "expected-signing-user@example.com"
            rekorKeyData: cmVrb3JLZXlEYXRh 
    8
    
        signedIdentity:
          matchPolicy: ExactRepository 
    9
    
          exactRepository:
            repository: quay.io/crio/signed 
    10
    Copy to Clipboard Toggle word wrap

    1
    创建 ImagePolicy 对象。
    2
    指定应用镜像策略的命名空间。
    3
    定义分配给此策略的存储库或镜像列表。
    4
    指定定义如何验证镜像的参数。
    5
    定义策略的信任根。
    6
    指定定义信任根的策略类型,可以是公钥或 Fulcio 证书。在这里,一个带有所需 Rekor 验证的 Fulcio 证书。
    7
    对于 Fulcio 证书策略,需要以下参数:
    • fulcioCAData: 指定 PEM 格式的 base64 编码的 Fulcio 证书。最大长度为 8192 个字符。
    • fulcioSubject :指定 OIDC 签发者和 Fulcio 身份验证配置的电子邮件。
    8
    以 PEM 格式指定一个 base64 编码的 Rekor 公钥。当 policyTypeFulcioCAWithRekor 时,需要此参数。最大长度为 8192 个字符。
    9
    可选:指定以下进程之一来验证签名中的身份和实际镜像身份:
    • MatchRepoDigestOrExact.
    • MatchRepository.
    • ExactRepository.必须指定 exactRepository 参数。
    • RemapIdentity。必须指定 prefixsignedPrefix 参数。
    10
    对于 exactRepository 匹配策略,请指定包含镜像身份和签名的存储库。
  2. 创建镜像策略对象:

    $ oc create -f <file_name>.yaml
    Copy to Clipboard Toggle word wrap

    Machine Config Operator (MCO) 更新集群中的机器配置池 (MCP)。

验证

  • 更新集群中的节点后,您可以验证是否已配置了镜像策略:

    1. 运行以下命令,为节点启动 debug pod:

      $ oc debug node/<node_name>
      Copy to Clipboard Toggle word wrap
    2. 运行以下命令,将 /host 设置为 debug shell 中的根目录:

      sh-5.1# chroot /host/
      Copy to Clipboard Toggle word wrap
    3. 运行以下命令检查 <namespace>.json 文件:

      sh-5.1# cat /etc/crio/policies/<namespace>.json
      Copy to Clipboard Toggle word wrap

      带有一个公钥的镜像策略对象的示例输出,显示新的镜像策略。

      # ...
       "transports": {
      # ...
        "docker": {
         "example.io/crio/signed": [
          {
           "type": "sigstoreSigned",
           "keyData": "a2V5RGF0YQ==",
           "rekorPublicKeyData": "cmVrb3JLZXlEYXRh",
           "signedIdentity": {
            "type": "matchRepository",
            "dockerRepository": "example.org/crio/signed"
           }
      # ...
      Copy to Clipboard Toggle word wrap

      带有一个 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"
           }
          }
         ],
      # ...
      Copy to Clipboard Toggle word wrap

    4. 运行以下命令检查 sigstore-registries.yaml 文件:

      sh-5.1# cat /etc/containers/registries.d/sigstore-registries.yaml
      Copy to Clipboard Toggle word wrap

      显示添加了范围 registry 的输出示例

      docker:
        example.io/crio/signed:
          use-sigstore-attachments: true 
      1
      
        quay.io/openshift-release-dev/ocp-release:
          use-sigstore-attachments: true
      Copy to Clipboard Toggle word wrap

      1
      true 时,指定 sigstore 签名将与镜像一起读取。
    5. 运行以下命令,检查 sigstore 签名验证的 crio 日志:

      sh-5.1#  journalctl -u crio | grep -A 100 "Pulling image: example.io/crio"
      Copy to Clipboard Toggle word wrap

      删除时间戳的输出示例

      # ...
      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"
      # ...
      Copy to Clipboard Toggle word wrap

      1
      IsRunningImageAllowed 行确认镜像被配置的 sigstore 验证策略允许。
      2
      使用传输 \"docker\" 特定的策略部分 \"example.io/crio/signed\"" file="signature/policy_eval.go:150 行确认已应用了镜像策略。
返回顶部
Red Hat logoGithubredditYoutubeTwitter

学习

尝试、购买和销售

社区

关于红帽文档

通过我们的产品和服务,以及可以信赖的内容,帮助红帽用户创新并实现他们的目标。 了解我们当前的更新.

让开源更具包容性

红帽致力于替换我们的代码、文档和 Web 属性中存在问题的语言。欲了解更多详情,请参阅红帽博客.

關於紅帽

我们提供强化的解决方案,使企业能够更轻松地跨平台和环境(从核心数据中心到网络边缘)工作。

Theme

© 2025 Red Hat