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 오브젝트를 구성하는 방법에 대한 일반적인 지침을 보여줍니다. 매개변수에 대한 자세한 내용은 "클러스터 및 이미지 정책 매개변수 정보"를 참조하십시오.

사전 요구 사항

  • PKI(Sigstore 지원 공개 키 인프라) 키, BYOPK(Bring Your Own Public Key Infrastructure) 인증서 또는 서명 작업에 Cosign 공개 및 개인 키 쌍을 제공합니다.
  • 이미지에 서명하기 위한 서명 프로세스가 있습니다.
  • Cosign 서명을 사용하는 경우 Cosign 서명을 지원하는 레지스트리에 액세스할 수 있습니다.
  • 신뢰의 루트로 BYOPKI 인증서를 사용하는 경우 cluster 라는 FeatureGate 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/v1
    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
    신뢰의 루트, 공개 키, BYOPKI 인증서 또는 Fulcio 인증서 를 정의하는 정책 유형을 지정합니다. 여기에서 Rekor 확인 기능이 있는 공개 키입니다.
    7
    공개 키 정책의 경우 PEM 형식으로 base64로 인코딩된 공개 키를 지정합니다. 최대 길이는 8192자입니다.
    8
    선택 사항: base64로 인코딩된 Rekor 공개 키를 PEM 형식으로 지정합니다. 최대 길이는 8192자입니다.
    9
    선택 사항: 서명 및 실제 이미지 ID의 ID를 확인하려면 다음 프로세스 중 하나를 지정합니다.
    • MatchRepoDigestOrExact.
    • MatchRepository.
    • ExactRepository. exactRepository 매개변수를 지정해야 합니다.
    • RemapIdentity. prefixsignedPrefix 매개변수를 지정해야 합니다.

    BYOPKI 정책 및 MatchRepository 일치 정책의 이미지 정책 오브젝트의 예

    apiVersion: config.openshift.io/v1alpha1
    kind: ImagePolicy 
    1
    
    metadata:
      name: pki-policy
      namespace: mynamespace 
    2
    
    spec:
      scopes:
      - example.io 
    3
    
      policy: 
    4
    
        rootOfTrust: 
    5
    
          policyType: PKI 
    6
    
          pki: 
    7
    
            caRootsData: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk....RVJUSUZJQ0FURS0tLS0t
            caIntermediatesData: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSURkVENDQ....0QT09Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0=
            pkiCertificateSubject: 
    8
    
              email: email@example.com
              hostname: myhost.example.com
        signedIdentity:
          matchPolicy: MatchRepository 
    9
    Copy to Clipboard Toggle word wrap

    1
    ImagePolicy 오브젝트를 생성합니다.
    2
    이미지 정책이 적용되는 네임스페이스를 지정합니다.
    3
    이 정책에 할당된 리포지토리 또는 이미지 목록을 정의합니다.
    4
    이미지 확인 방법을 정의하는 매개변수를 지정합니다.
    5
    정책에 대한 신뢰의 루트를 정의합니다.
    6
    신뢰의 루트, 공개 키, BYOPKI 인증서 또는 Fulcio 인증서 를 정의하는 정책 유형을 지정합니다. BYOPKI 인증서입니다.
    7
    BYOPKI 인증서의 경우 caRootsData 를 지정합니다. 이 매개변수는 base64로 인코딩된 CA 루트 인증서를 PEM 형식으로 지정합니다. 최대 길이는 8192자입니다. 선택적으로 caIntermediatesData 를 사용하여 PEM 형식으로 base64로 인코딩된 중간 CA 루트 인증서를 지정합니다. 최대 길이는 8192자입니다.
    8
    호스트 이름과 이메일 주소를 사용하여 사용자 ID를 인증하는 SAN(주체 대체 이름)을 지정합니다.
    • 이메일. 인증서가 생성될 때 지정된 이메일 주소를 지정합니다.
    • 호스트 이름. 인증서가 생성될 때 지정된 호스트 이름을 지정합니다.
    9
    BYOPKI 인증서의 경우 MatchRepository 를 지정하여 서명 및 실제 이미지 ID의 ID를 확인합니다. 기본 서명된 ID는 다이제스트 사양이 필요한 matchRepoDigestOrExact 입니다. 이 경우 다이제스트된 이미지에 대한 서명이 생성되지 않았습니다.

    Fulcio 인증서 정책 및 ExactRepository 일치 정책이 있는 이미지 정책 오브젝트의 예

    apiVersion: config.openshift.io/v1
    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
    신뢰의 루트, 공개 키, BYOPKI 인증서 또는 Fulcio 인증서 를 정의하는 정책 유형을 지정합니다. 여기에서는 Rekor 확인이 필요한 Fulcio 인증서입니다.
    7
    Fulcio 인증서 정책의 경우 다음 매개변수가 필요합니다.
    • fulcioCAData: base64로 인코딩된 Fulcio 인증서를 PEM 형식으로 지정합니다. 최대 길이는 8192자입니다.
    • fulcioSubject: OIDC 발행자 및 Fulcio 인증 구성의 이메일을 지정합니다.
    8
    PEM 형식으로 base64로 인코딩된 Rekor 공개 키를 지정합니다. 이 매개변수는 policyTypeFulcioCAWithRekor 인 경우 필요합니다. 최대 길이는 8192자입니다.
    9
    선택 사항: 서명 및 실제 이미지 ID의 ID를 확인하려면 다음 프로세스 중 하나를 지정합니다.
    • MatchRepoDigestOrExact.
    • MatchRepository.
    • ExactRepository. exactRepository 매개변수를 지정해야 합니다.
    • RemapIdentity. prefixsignedPrefix 매개변수를 지정해야 합니다.
    10
    정확한Repository 일치 정책의 경우 이미지 ID 및 서명이 포함된 리포지토리를 지정합니다.
  2. 이미지 정책 오브젝트를 생성합니다.

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

    MCO(Machine Config Operator)는 클러스터의 MCP(Machine config pool)를 업데이트합니다.

검증

  • 클러스터의 노드가 업데이트되면 이미지 정책이 구성되어 있는지 확인할 수 있습니다.

    1. 다음 명령을 실행하여 노드의 디버그 Pod를 시작합니다.

      $ oc debug node/<node_name>
      Copy to Clipboard Toggle word wrap
    2. 다음 명령을 실행하여 디버그 쉘 내에서 /host 를 root 디렉터리로 설정합니다.

      sh-5.1# chroot /host/
      Copy to Clipboard Toggle word wrap
    3. 다음 명령을 실행하여 & lt;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

      새 이미지 정책을 표시하는 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"
                }
              }
            ],
      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

      범위가 지정된 레지스트리가 추가되었음을 보여주는 출력 예

      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. 다음 명령을 실행하여 crio 로그에 sigstore 서명 확인이 있는지 확인합니다.

      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

자세한 정보

평가판, 구매 및 판매

커뮤니티

Red Hat 문서 정보

Red Hat을 사용하는 고객은 신뢰할 수 있는 콘텐츠가 포함된 제품과 서비스를 통해 혁신하고 목표를 달성할 수 있습니다. 최신 업데이트를 확인하세요.

보다 포괄적 수용을 위한 오픈 소스 용어 교체

Red Hat은 코드, 문서, 웹 속성에서 문제가 있는 언어를 교체하기 위해 최선을 다하고 있습니다. 자세한 내용은 다음을 참조하세요.Red Hat 블로그.

Red Hat 소개

Red Hat은 기업이 핵심 데이터 센터에서 네트워크 에지에 이르기까지 플랫폼과 환경 전반에서 더 쉽게 작업할 수 있도록 강화된 솔루션을 제공합니다.

Theme

© 2025 Red Hat