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라는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
- 선택 사항: base64로 인코딩된 Rekor 공개 키를 PEM 형식으로 지정합니다. 최대 길이는 8192자입니다.
- 9
- 선택 사항: 서명 및 실제 이미지 ID의 ID를 확인하려면 다음 프로세스 중 하나를 지정합니다.
-
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를 지정합니다. 이 매개변수는 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: 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: base64로 인코딩된 Fulcio 인증서를 PEM 형식으로 지정합니다. 최대 길이는 8192자입니다. -
fulcioSubject: OIDC 발행자 및 Fulcio 인증 구성의 이메일을 지정합니다.
-
- 8
- PEM 형식으로 base64로 인코딩된 Rekor 공개 키를 지정합니다. 이 매개변수는
policyType이FulcioCAWithRekor인 경우 필요합니다. 최대 길이는 8192자입니다. - 9
- 선택 사항: 서명 및 실제 이미지 ID의 ID를 확인하려면 다음 프로세스 중 하나를 지정합니다.
-
MatchRepoDigestOrExact. -
MatchRepository. -
ExactRepository.exactRepository매개변수를 지정해야 합니다. -
RemapIdentity.prefix및signedPrefix매개변수를 지정해야 합니다.
-
- 10
정확한Repository일치 정책의 경우 이미지 ID 및 서명이 포함된 리포지토리를 지정합니다.
이미지 정책 오브젝트를 생성합니다.
$ oc create -f <file_name>.yamlMCO(Machine Config Operator)는 클러스터의 MCP(Machine config pool)를 업데이트합니다.
검증
클러스터의 노드가 업데이트되면 이미지 정책이 구성되어 있는지 확인할 수 있습니다.
다음 명령을 실행하여 노드의 디버그 Pod를 시작합니다.
$ oc debug node/<node_name>다음 명령을 실행하여 디버그 쉘 내에서
/host를 root 디렉터리로 설정합니다.sh-5.1# chroot /host/다음 명령을 실행하여 &
lt;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범위가 지정된 레지스트리가 추가되었음을 보여주는 출력 예
docker: example.io/crio/signed: use-sigstore-attachments: true1 quay.io/openshift-release-dev/ocp-release: use-sigstore-attachments: true- 1
true인 경우 sigstore 서명을 이미지와 함께 읽도록 지정합니다.
다음 명령을 실행하여 crio 로그에 sigstore 서명 확인이 있는지 확인합니다.
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" # ...