2.4. 컨테이너 이미지 서명


Red Hat은 Red Hat Container Registries에 있는 이미지에 대한 서명을 제공합니다. 이러한 서명은 MCO(Machine Config Operator)를 사용하여 OpenShift Container Platform 4 클러스터로 가져올 때 자동으로 확인할 수 있습니다.

Quay.io는 OpenShift Container Platform을 구성하는 대부분의 이미지를 제공하며 릴리스 이미지만 서명됩니다. 릴리스 이미지는 승인된 OpenShift Container Platform 이미지를 참조하여 공급 체인 공격에 대한 보안 수준을 제공합니다. 그러나 로깅, 모니터링 및 서비스 메시와 같은 OpenShift Container Platform에 대한 일부 확장 기능은 OLM(Operator Lifecycle Manager)에서 Operator로 제공됩니다. 이러한 이미지는 Red Hat Ecosystem Catalog 컨테이너 이미지 레지스트리에서 제공됩니다.

Red Hat 레지스트리와 인프라 간의 이미지의 무결성을 확인하려면 서명 확인을 활성화하십시오.

2.4.1. Red Hat Container Registries에 대한 서명 확인 활성화

Red Hat Container Registries에 대한 컨테이너 서명 검증을 활성화하려면 이러한 레지스트리의 이미지를 확인하는 키를 지정하는 서명 확인 정책 파일을 작성해야 합니다. RHEL8 노드의 경우 레지스트리는 기본적으로 /etc/containers/registries.d 에 이미 정의되어 있습니다.

프로세스

  1. 작업자 노드에 필요한 구성이 포함된 Butane 구성 파일 51-worker-rh-registry-trust.bu를 만듭니다.

    참고

    Butane에 대한 자세한 내용은 “Butane 을 사용하여 머신 구성 생성”을 참조하십시오.

    variant: openshift
    version: 4.17.0
    metadata:
      name: 51-worker-rh-registry-trust
      labels:
        machineconfiguration.openshift.io/role: worker
    storage:
      files:
      - path: /etc/containers/policy.json
        mode: 0644
        overwrite: true
        contents:
          inline: |
            {
              "default": [
                {
                  "type": "insecureAcceptAnything"
                }
              ],
              "transports": {
                "docker": {
                  "registry.access.redhat.com": [
                    {
                      "type": "signedBy",
                      "keyType": "GPGKeys",
                      "keyPath": "/etc/pki/rpm-gpg/RPM-GPG-KEY-redhat-release"
                    }
                  ],
                  "registry.redhat.io": [
                    {
                      "type": "signedBy",
                      "keyType": "GPGKeys",
                      "keyPath": "/etc/pki/rpm-gpg/RPM-GPG-KEY-redhat-release"
                    }
                  ]
                },
                "docker-daemon": {
                  "": [
                    {
                      "type": "insecureAcceptAnything"
                    }
                  ]
                }
              }
            }
  2. Butane을 사용하여 작업자 노드의 디스크에 작성할 파일이 포함된 머신 구성 YAML 파일 51-worker-rh-registry-trust.yaml을 생성합니다.

    $ butane 51-worker-rh-registry-trust.bu -o 51-worker-rh-registry-trust.yaml
  3. 생성된 머신 구성을 적용합니다.

    $ oc apply -f 51-worker-rh-registry-trust.yaml
  4. 작업자 머신 구성 풀이 새 머신 구성을 사용하여 롤아웃되었는지 확인합니다.

    1. 새 머신 구성이 생성되었는지 확인합니다.

      $ oc get mc

      샘플 출력

      NAME                                               GENERATEDBYCONTROLLER                      IGNITIONVERSION   AGE
      00-master                                          a2178ad522c49ee330b0033bb5cb5ea132060b0a   3.2.0             25m
      00-worker                                          a2178ad522c49ee330b0033bb5cb5ea132060b0a   3.2.0             25m
      01-master-container-runtime                        a2178ad522c49ee330b0033bb5cb5ea132060b0a   3.2.0             25m
      01-master-kubelet                                  a2178ad522c49ee330b0033bb5cb5ea132060b0a   3.2.0             25m
      01-worker-container-runtime                        a2178ad522c49ee330b0033bb5cb5ea132060b0a   3.2.0             25m
      01-worker-kubelet                                  a2178ad522c49ee330b0033bb5cb5ea132060b0a   3.2.0             25m
      51-master-rh-registry-trust                                                                   3.2.0             13s
      51-worker-rh-registry-trust                                                                   3.2.0             53s 1
      99-master-generated-crio-seccomp-use-default                                                  3.2.0             25m
      99-master-generated-registries                     a2178ad522c49ee330b0033bb5cb5ea132060b0a   3.2.0             25m
      99-master-ssh                                                                                 3.2.0             28m
      99-worker-generated-crio-seccomp-use-default                                                  3.2.0             25m
      99-worker-generated-registries                     a2178ad522c49ee330b0033bb5cb5ea132060b0a   3.2.0             25m
      99-worker-ssh                                                                                 3.2.0             28m
      rendered-master-af1e7ff78da0a9c851bab4be2777773b   a2178ad522c49ee330b0033bb5cb5ea132060b0a   3.2.0             8s
      rendered-master-cd51fd0c47e91812bfef2765c52ec7e6   a2178ad522c49ee330b0033bb5cb5ea132060b0a   3.2.0             24m
      rendered-worker-2b52f75684fbc711bd1652dd86fd0b82   a2178ad522c49ee330b0033bb5cb5ea132060b0a   3.2.0             24m
      rendered-worker-be3b3bce4f4aa52a62902304bac9da3c   a2178ad522c49ee330b0033bb5cb5ea132060b0a   3.2.0             48s 2

      1
      새 머신 구성
      2
      새로 렌더링된 머신 구성
    2. 작업자 머신 구성 풀이 새 머신 구성을 사용하여 업데이트되었는지 확인합니다.

      $ oc get mcp

      샘플 출력

      NAME     CONFIG                                             UPDATED   UPDATING   DEGRADED   MACHINECOUNT   READYMACHINECOUNT   UPDATEDMACHINECOUNT   DEGRADEDMACHINECOUNT   AGE
      master   rendered-master-af1e7ff78da0a9c851bab4be2777773b   True      False      False      3              3                   3                     0                      30m
      worker   rendered-worker-be3b3bce4f4aa52a62902304bac9da3c   False     True       False      3              0                   0                     0                      30m 1

      1
      UPDATING 필드가 True 이면 머신 구성 풀이 새 머신 구성으로 업데이트됩니다. 필드가 False 가 되면 작업자 머신 구성 풀이 새 머신 구성에 롤아웃됩니다.
  5. 클러스터에서 RHEL7 작업자 노드를 사용하는 경우 작업자 머신 구성 풀이 업데이트되면 /etc/containers/registries.d 디렉터리의 해당 노드에 YAML 파일을 생성하여 지정된 레지스트리 서버의 분리된 서명 위치를 지정합니다. 다음 예제는 registry.access.redhat.comregistry.redhat.io 에서 호스팅되는 이미지에 대해서만 작동합니다.

    1. 각 RHEL7 작업자 노드에 대한 디버그 세션을 시작합니다.

      $ oc debug node/<node_name>
    2. 루트 디렉토리를 /host 로 변경합니다.

      sh-4.2# chroot /host
    3. 다음을 포함하는 /etc/containers/registries.d/registry.redhat.io.yaml 파일을 만듭니다.

      docker:
           registry.redhat.io:
               sigstore: https://registry.redhat.io/containers/sigstore
    4. 다음을 포함하는 /etc/containers/registries.d/registry.access.redhat.com.yaml 파일을 만듭니다.

      docker:
           registry.access.redhat.com:
               sigstore: https://access.redhat.com/webassets/docker/content/sigstore
    5. 디버그 세션을 종료합니다.

2.4.2. 서명 확인 구성 확인

머신 구성을 클러스터에 적용한 후 머신 구성 컨트롤러에서 새 MachineConfig 오브젝트를 감지하고 새로운 rendered-worker-<hash> 버전을 생성합니다.

사전 요구 사항

  • 머신 구성 파일을 사용하여 서명 확인 활성화로 설정해야 합니다.

프로세스

  1. 명령줄에서 다음 명령을 실행하여 원하는 작업자에 대한 정보를 표시합니다.

    $ oc describe machineconfigpool/worker

    초기 작업자 모니터링의 출력 예

    Name:         worker
    Namespace:
    Labels:       machineconfiguration.openshift.io/mco-built-in=
    Annotations:  <none>
    API Version:  machineconfiguration.openshift.io/v1
    Kind:         MachineConfigPool
    Metadata:
      Creation Timestamp:  2019-12-19T02:02:12Z
      Generation:          3
      Resource Version:    16229
      Self Link:           /apis/machineconfiguration.openshift.io/v1/machineconfigpools/worker
      UID:                 92697796-2203-11ea-b48c-fa163e3940e5
    Spec:
      Configuration:
        Name:  rendered-worker-f6819366eb455a401c42f8d96ab25c02
        Source:
          API Version:  machineconfiguration.openshift.io/v1
          Kind:         MachineConfig
          Name:         00-worker
          API Version:  machineconfiguration.openshift.io/v1
          Kind:         MachineConfig
          Name:         01-worker-container-runtime
          API Version:  machineconfiguration.openshift.io/v1
          Kind:         MachineConfig
          Name:         01-worker-kubelet
          API Version:  machineconfiguration.openshift.io/v1
          Kind:         MachineConfig
          Name:         51-worker-rh-registry-trust
          API Version:  machineconfiguration.openshift.io/v1
          Kind:         MachineConfig
          Name:         99-worker-92697796-2203-11ea-b48c-fa163e3940e5-registries
          API Version:  machineconfiguration.openshift.io/v1
          Kind:         MachineConfig
          Name:         99-worker-ssh
      Machine Config Selector:
        Match Labels:
          machineconfiguration.openshift.io/role:  worker
      Node Selector:
        Match Labels:
          node-role.kubernetes.io/worker:
      Paused:                              false
    Status:
      Conditions:
        Last Transition Time:  2019-12-19T02:03:27Z
        Message:
        Reason:
        Status:                False
        Type:                  RenderDegraded
        Last Transition Time:  2019-12-19T02:03:43Z
        Message:
        Reason:
        Status:                False
        Type:                  NodeDegraded
        Last Transition Time:  2019-12-19T02:03:43Z
        Message:
        Reason:
        Status:                False
        Type:                  Degraded
        Last Transition Time:  2019-12-19T02:28:23Z
        Message:
        Reason:
        Status:                False
        Type:                  Updated
        Last Transition Time:  2019-12-19T02:28:23Z
        Message:               All nodes are updating to rendered-worker-f6819366eb455a401c42f8d96ab25c02
        Reason:
        Status:                True
        Type:                  Updating
      Configuration:
        Name:  rendered-worker-d9b3f4ffcfd65c30dcf591a0e8cf9b2e
        Source:
          API Version:            machineconfiguration.openshift.io/v1
          Kind:                   MachineConfig
          Name:                   00-worker
          API Version:            machineconfiguration.openshift.io/v1
          Kind:                   MachineConfig
          Name:                   01-worker-container-runtime
          API Version:            machineconfiguration.openshift.io/v1
          Kind:                   MachineConfig
          Name:                   01-worker-kubelet
          API Version:            machineconfiguration.openshift.io/v1
          Kind:                   MachineConfig
          Name:                   99-worker-92697796-2203-11ea-b48c-fa163e3940e5-registries
          API Version:            machineconfiguration.openshift.io/v1
          Kind:                   MachineConfig
          Name:                   99-worker-ssh
      Degraded Machine Count:     0
      Machine Count:              1
      Observed Generation:        3
      Ready Machine Count:        0
      Unavailable Machine Count:  1
      Updated Machine Count:      0
    Events:                       <none>

  2. oc describe 명령을 다시 실행합니다.

    $ oc describe machineconfigpool/worker

    작업자가 업데이트된 후 출력 예

    ...
        Last Transition Time:  2019-12-19T04:53:09Z
        Message:               All nodes are updated with rendered-worker-f6819366eb455a401c42f8d96ab25c02
        Reason:
        Status:                True
        Type:                  Updated
        Last Transition Time:  2019-12-19T04:53:09Z
        Message:
        Reason:
        Status:                False
        Type:                  Updating
      Configuration:
        Name:  rendered-worker-f6819366eb455a401c42f8d96ab25c02
        Source:
          API Version:            machineconfiguration.openshift.io/v1
          Kind:                   MachineConfig
          Name:                   00-worker
          API Version:            machineconfiguration.openshift.io/v1
          Kind:                   MachineConfig
          Name:                   01-worker-container-runtime
          API Version:            machineconfiguration.openshift.io/v1
          Kind:                   MachineConfig
          Name:                   01-worker-kubelet
          API Version:            machineconfiguration.openshift.io/v1
          Kind:                   MachineConfig
          Name:                   51-worker-rh-registry-trust
          API Version:            machineconfiguration.openshift.io/v1
          Kind:                   MachineConfig
          Name:                   99-worker-92697796-2203-11ea-b48c-fa163e3940e5-registries
          API Version:            machineconfiguration.openshift.io/v1
          Kind:                   MachineConfig
          Name:                   99-worker-ssh
      Degraded Machine Count:     0
      Machine Count:              3
      Observed Generation:        4
      Ready Machine Count:        3
      Unavailable Machine Count:  0
      Updated Machine Count:      3
    ...

    참고

    Observed Generation 매개변수는 컨트롤러에서 생성된 구성의 생성에 따라 증가된 개수를 보여줍니다. 이 컨트롤러는 사양을 처리하고 수정본을 생성하지 못하더라도 이 값을 업데이트합니다. Configuration Source 값은 51-worker-rh-registry-trust 구성을 나타냅니다.

  3. 다음 명령을 사용하여 policy.json 파일이 있는지 확인합니다.

    $ oc debug node/<node> -- chroot /host cat /etc/containers/policy.json

    출력 예

    Starting pod/<node>-debug ...
    To use host binaries, run `chroot /host`
    {
      "default": [
        {
          "type": "insecureAcceptAnything"
        }
      ],
      "transports": {
        "docker": {
          "registry.access.redhat.com": [
            {
              "type": "signedBy",
              "keyType": "GPGKeys",
              "keyPath": "/etc/pki/rpm-gpg/RPM-GPG-KEY-redhat-release"
            }
          ],
          "registry.redhat.io": [
            {
              "type": "signedBy",
              "keyType": "GPGKeys",
              "keyPath": "/etc/pki/rpm-gpg/RPM-GPG-KEY-redhat-release"
            }
          ]
        },
        "docker-daemon": {
          "": [
            {
              "type": "insecureAcceptAnything"
            }
          ]
        }
      }
    }

  4. 다음 명령을 사용하여 registry.redhat.io.yaml 파일이 있는지 확인합니다.

    $ oc debug node/<node> -- chroot /host cat /etc/containers/registries.d/registry.redhat.io.yaml

    출력 예

    Starting pod/<node>-debug ...
    To use host binaries, run `chroot /host`
    docker:
         registry.redhat.io:
             sigstore: https://registry.redhat.io/containers/sigstore

  5. 다음 명령을 사용하여 registry.access.redhat.yaml 파일이 있는지 확인합니다.

    $ oc debug node/<node> -- chroot /host cat /etc/containers/registries.d/registry.access.redhat.com.yaml

    출력 예

    Starting pod/<node>-debug ...
    To use host binaries, run `chroot /host`
    docker:
         registry.access.redhat.com:
             sigstore: https://access.redhat.com/webassets/docker/content/sigstore

2.4.3. 검증 가능한 서명이 없는 컨테이너 이미지의 확인 이해

각 OpenShift Container Platform 릴리스 이미지는 변경할 수 없으며 Red Hat 프로덕션 키를 사용하여 서명됩니다. OpenShift Container Platform 업데이트 또는 설치 중에 릴리스 이미지에서 확인 가능한 서명이 없는 컨테이너 이미지를 배포할 수 있습니다. 서명된 각 릴리스 이미지 다이제스트는 변경할 수 없습니다. 릴리스 이미지의 각 참조는 다른 이미지의 변경 불가능한 다이제스트이므로 콘텐츠를 전송하여 신뢰할 수 있습니다. 즉, 릴리스 이미지의 서명은 모든 릴리스 콘텐츠의 유효성을 검사합니다.

예를 들어 검증 가능한 서명이 없는 이미지 참조는 서명된 OpenShift Container Platform 릴리스 이미지에 포함되어 있습니다.

릴리스 정보 출력 예

$ oc adm release info  quay.io/openshift-release-dev/ ocp-release@sha256:2309578b68c5666dad62aed696f1f9d778ae1a089ee461060ba7b9514b7ca417 -o pullspec 1
quay.io/openshift-release-dev/ocp-v4.0-art-dev@sha256:9aafb914d5d7d0dec4edd800d02f811d7383a7d49e500af548eab5d00c1bffdb 2

1
서명된 릴리스 이미지 SHA.
2
릴리스에는 확인 가능한 서명이 없는 컨테이너 이미지입니다.

2.4.3.1. 업데이트 중 자동 확인

서명 확인은 자동입니다. CVO(OpenShift Cluster Version Operator)는 OpenShift Container Platform 업데이트 중에 릴리스 이미지의 서명을 확인합니다. 이는 내부 프로세스입니다. 자동 확인에 실패하면 OpenShift Container Platform 설치 또는 업데이트가 실패합니다.

서명 확인은 skopeo 명령줄 유틸리티를 사용하여 수동으로 수행할 수도 있습니다.

2.4.3.2. skopeo를 사용하여 Red Hat 컨테이너 이미지의 서명 확인

OCP 릴리스 미러 사이트에서 해당 서명을 가져와서 OpenShift Container Platform 릴리스 이미지에 포함된 컨테이너 이미지의 서명을 확인할 수 있습니다. 미러 사이트의 서명은 Podman 또는 CRI-O에서 쉽게 이해할 수 있는 형식이 아니므로 skopeo standalone-verify 명령을 사용하여 Red Hat에서 릴리스 이미지에 서명했는지 확인할 수 있습니다.

사전 요구 사항

  • skopeo 명령줄 유틸리티를 설치했습니다.

프로세스

  1. 다음 명령을 실행하여 릴리스의 전체 SHA를 가져옵니다.

    $ oc adm release info <release_version>  \ 1
    1
    <release_version>을 릴리스 번호로 바꿉니다(예: 4.14.3 ).

    출력 조각의 예

    ---
    Pull From: quay.io/openshift-release-dev/ocp-release@sha256:e73ab4b33a9c3ff00c9f800a38d69853ca0c4dfa5a88e3df331f66df8f18ec55
    ---

  2. 다음 명령을 실행하여 Red Hat 릴리스 키를 가져옵니다.

    $ curl -o pub.key https://access.redhat.com/security/data/fd431d51.txt
  3. 다음 명령을 실행하여 확인할 특정 릴리스의 서명 파일을 가져옵니다.

    $ curl -o signature-1 https://mirror.openshift.com/pub/openshift-v4/signatures/openshift-release-dev/ocp-release/sha256%<sha_from_version>/signature-1 \ 1
    1
    & lt;sha_from_version >을 릴리스의 SHA와 일치하는 미러 사이트에 대한 전체 링크의 SHA 값으로 바꿉니다. 예를 들어 4.12.23 릴리스의 서명 링크는 https://mirror.openshift.com/pub/openshift-v4/signatures/openshift-release-dev/ocp-release/sha256%e73ab4b33a9c3ff00c9f800a38d69853ca0c4dfa5a88e3df331f66df8f18ec55/signature-1 이며 SHA 값은 e73ab4b33a9c3ff00c9f800a38d69853ca0c4dfa5a88e3df331f18f18ec55 입니다.
  4. 다음 명령을 실행하여 릴리스 이미지에 대한 매니페스트를 가져옵니다.

    $ skopeo inspect --raw docker://<quay_link_to_release> > manifest.json \ 1
    1
    & lt;quay_link_to_release >를 oc adm release info 명령의 출력으로 바꿉니다. 예를 들어 quay.io/openshift-release-dev/ocp-release@sha256:e73ab4b33a9c3ff00c9f800a38d69853ca0c4dfa5a88e3df331f66df8f18ec55.
  5. skopeo를 사용하여 서명을 확인합니다.

    $ skopeo standalone-verify manifest.json quay.io/openshift-release-dev/ocp-release:<release_number>-<arch> any signature-1 --public-key-file pub.key

    다음과 같습니다.

    <release_number>
    릴리스 번호를 지정합니다(예: 4.14.3 ).
    <arch>

    아키텍처를 지정합니다(예: x86_64 ).

    출력 예

    Signature verified using fingerprint 567E347AD0044ADE55BA8A5F199E2F91FD431D51, digest sha256:e73ab4b33a9c3ff00c9f800a38d69853ca0c4dfa5a88e3df331f66df8f18ec55

2.4.4. 추가 리소스

Red Hat logoGithubRedditYoutubeTwitter

자세한 정보

평가판, 구매 및 판매

커뮤니티

Red Hat 문서 정보

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

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

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

Red Hat 소개

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

© 2024 Red Hat, Inc.