5.3. IBM Z 및 IBM LinuxONE에 기밀 컨테이너 배포


OpenShift 샌드박스 컨테이너를 배포한 후 IBM Z® 및 IBM® LinuxONE에 기밀 컨테이너를 배포할 수 있습니다.

중요

IBM Z® 및 IBM® LinuxONE의 기밀 컨테이너는 기술 프리뷰 기능 전용입니다. 기술 프리뷰 기능은 Red Hat 프로덕션 서비스 수준 계약(SLA)에서 지원되지 않으며 기능적으로 완전하지 않을 수 있습니다. 따라서 프로덕션 환경에서 사용하는 것은 권장하지 않습니다. 이러한 기능을 사용하면 향후 제품 기능을 조기에 이용할 수 있어 개발 과정에서 고객이 기능을 테스트하고 피드백을 제공할 수 있습니다.

Red Hat 기술 프리뷰 기능의 지원 범위에 대한 자세한 내용은 기술 프리뷰 기능 지원 범위를 참조하십시오.

클러스터 요구 사항

  • Confidential Compute attestation Operator를 설치하는 클러스터에 Red Hat OpenShift Container Platform 4.15 이상을 설치했습니다.

다음 단계를 수행하여 기밀 컨테이너를 배포합니다.

  1. Confidential Compute attestation Operator를 설치합니다.
  2. Trustee의 경로를 만듭니다.
  3. 기밀성 컨테이너 기능 게이트를 활성화합니다.
  4. 피어 Pod 구성 맵을 업데이트합니다.
  5. KataConfig CR(사용자 정의 리소스)을 삭제합니다.
  6. 피어 Pod 시크릿을 업데이트합니다.
  7. KataConfig CR을 다시 만듭니다.
  8. Trustee 인증 시크릿을 생성합니다.
  9. Trustee 구성 맵을 생성합니다.
  10. IBM Secure Execution (SE) 헤더를 가져옵니다.
  11. SE 인증서 및 키를 구성합니다.
  12. 영구 스토리지 구성 요소를 생성합니다.
  13. 인증 정책을 구성합니다.

    1. 참조 값을 생성합니다.
    2. 테스트된 클라이언트의 시크릿을 생성합니다.
    3. 리소스 액세스 정책을 생성합니다.
  14. SE에 대한 인증 정책을 만듭니다.
  15. KbsConfig CR을 생성합니다.
  16. 인증 프로세스를 확인합니다.

5.3.1. 기밀 컴퓨팅 인증 Operator 설치

CLI를 사용하여 IBM Z® 및 IBM® LinuxONE에 Confidential Compute attestation Operator를 설치할 수 있습니다.

사전 요구 사항

  • OpenShift CLI(oc)가 설치되어 있습니다.
  • cluster-admin 역할의 사용자로 클러스터에 액세스할 수 있어야 합니다.

프로세스

  1. trustee-namespace.yaml 매니페스트 파일을 생성합니다.

    apiVersion: v1
    kind: Namespace
    metadata:
      name: trustee-operator-system
  2. 다음 명령을 실행하여 trustee-operator-system 네임스페이스를 생성합니다.

    $ oc apply -f trustee-namespace.yaml
  3. trustee-operatorgroup.yaml 매니페스트 파일을 생성합니다.

    apiVersion: operators.coreos.com/v1
    kind: OperatorGroup
    metadata:
      name: trustee-operator-group
      namespace: trustee-operator-system
    spec:
      targetNamespaces:
      - trustee-operator-system
  4. 다음 명령을 실행하여 operator 그룹을 생성합니다.

    $ oc apply -f trustee-operatorgroup.yaml
  5. trustee-subscription.yaml 매니페스트 파일을 생성합니다.

    apiVersion: operators.coreos.com/v1alpha1
    kind: Subscription
    metadata:
      name: trustee-operator
      namespace: trustee-operator-system
    spec:
      channel: stable
      installPlanApproval: Automatic
      name: trustee-operator
      source: redhat-operators
      sourceNamespace: openshift-marketplace
      startingCSV: trustee-operator.v0.1.0
  6. 다음 명령을 실행하여 서브스크립션을 생성합니다.

    $ oc apply -f trustee-subscription.yaml
  7. 다음 명령을 실행하여 Operator가 올바르게 설치되었는지 확인합니다.

    $ oc get csv -n trustee-operator-system

    이 명령을 완료하는 데 몇 분이 걸릴 수 있습니다.

  8. 다음 명령을 실행하여 프로세스를 확인합니다.

    $ watch oc get csv -n trustee-operator-system

    출력 예

    NAME                      DISPLAY                        PHASE
    trustee-operator.v0.1.0   Trustee Operator  0.1.0        Succeeded

5.3.2. Trustee를 위한 경로 생성

Trustee의 엣지 TLS 종료를 사용하여 보안 경로를 생성할 수 있습니다. 외부 수신 트래픽은 라우터 Pod에 HTTPS로 도달하고 Trustee Pod에 HTTP로 전달합니다.

사전 요구 사항

  • 기밀 컨테이너 기능 게이트를 활성화했습니다.
  • Confidential Compute attestation Operator를 설치했습니다.

프로세스

  1. 다음 명령을 실행하여 엣지 경로를 만듭니다.

    $ oc create route edge --service=kbs-service --port kbs-port \
      -n trustee-operator-system
    참고

    참고: 현재 유효한 CA 서명 인증서가 있는 경로만 지원됩니다. 자체 서명된 인증서가 있는 경로를 사용할 수 없습니다.

  2. 다음 명령을 실행하여 TRUSTEE_HOST 변수를 설정합니다.

    $ TRUSTEE_HOST=$(oc get route -n trustee-operator-system kbs-service \
      -o jsonpath={.spec.host})
  3. 다음 명령을 실행하여 경로를 확인합니다.

    $ echo $TRUSTEE_HOST

    출력 예

    kbs-service-trustee-operator-system.apps.memvjias.eastus.aroapp.io

5.3.3. 기밀성 컨테이너 기능 게이트 활성화

기밀 컨테이너 기능 게이트를 활성화해야 합니다.

프로세스

  1. cc-feature-gate.yaml 매니페스트 파일을 생성합니다.

    apiVersion: v1
    kind: ConfigMap
    metadata:
      name: osc-feature-gates
      namespace: openshift-sandboxed-containers-operator
    data:
      confidential: "true"
  2. 다음 명령을 실행하여 구성 맵을 생성합니다.

    $ oc apply -f cc-feature-gate.yaml

5.3.4. 피어 Pod 구성 맵 업데이트

기밀 컨테이너의 피어 Pod 구성 맵을 업데이트해야 합니다.

참고

Secure Boot를 true 로 설정하여 기본적으로 활성화합니다. 기본값은 false 이며 보안 위험을 나타냅니다.

프로세스

  1. 다음 예에 따라 peer-pods-cm.yaml 매니페스트 파일을 생성합니다.

    apiVersion: v1
    kind: ConfigMap
    metadata:
      name: peer-pods-cm
      namespace: openshift-sandboxed-containers-operator
    data:
      CLOUD_PROVIDER: "libvirt"
      DISABLECVM: "false"
  2. 다음 명령을 실행하여 구성 맵을 생성합니다.

    $ oc apply -f peer-pods-cm.yaml
  3. 다음 명령을 실행하여 peerpodconfig-ctrl-caa-daemon 데몬 세트를 다시 시작합니다.

    $ oc set env ds/peerpodconfig-ctrl-caa-daemon \
      -n openshift-sandboxed-containers-operator REBOOT="$(date)"

5.3.5. KataConfig 사용자 지정 리소스 삭제

명령줄을 사용하여 KataConfig CR(사용자 정의 리소스)을 삭제할 수 있습니다.

사전 요구 사항

  • OpenShift CLI(oc)가 설치되어 있습니다.
  • cluster-admin 역할의 사용자로 클러스터에 액세스할 수 있어야 합니다.

프로세스

  1. 다음 명령을 실행하여 KataConfig CR을 삭제합니다.

    $ oc delete kataconfig example-kataconfig
  2. 다음 명령을 실행하여 사용자 정의 리소스가 삭제되었는지 확인합니다.

    $ oc get kataconfig example-kataconfig

    출력 예

    No example-kataconfig instances exist

중요

클라우드 공급자를 사용하여 배포된 OpenShift 샌드박스 컨테이너를 제거하는 경우 모든 Pod를 삭제해야 합니다. 나머지 Pod 리소스로 인해 클라우드 공급자의 예기치 않은 요금이 발생할 수 있습니다.

5.3.6. 피어 Pod 시크릿 업데이트

기밀 컨테이너의 피어 Pod 시크릿을 업데이트해야 합니다.

시크릿은 Pod VM(가상 머신) 이미지 및 피어 Pod 인스턴스를 생성하기 위한 인증 정보를 저장합니다.

기본적으로 OpenShift 샌드박스 컨테이너 Operator는 클러스터를 생성하는 데 사용되는 인증 정보를 기반으로 보안을 생성합니다. 그러나 다른 인증 정보를 사용하는 보안을 수동으로 생성할 수 있습니다.

사전 요구 사항

프로세스

  1. 다음 예에 따라 peer-pods-secret.yaml 매니페스트 파일을 생성합니다.

    apiVersion: v1
    kind: Secret
    metadata:
      name: peer-pods-secret
      namespace: openshift-sandboxed-containers-operator
    type: Opaque
    stringData:
      REDHAT_OFFLINE_TOKEN: "<rh_offline_token>" 1
      HKD_CRT: "<hkd_crt_value>" 2
    1
    Operator 빌드 이미지에 필요한 Red Hat 오프라인 토큰을 지정합니다.
    2
    Operator 빌드 이미지에 대해 IBM Secure Execution를 활성화하려면 HKD 인증서 값을 지정합니다.
  2. 다음 명령을 실행하여 시크릿을 생성합니다.

    $ oc apply -f peer-pods-secret.yaml

5.3.7. KataConfig 사용자 지정 리소스 다시 생성

기밀 컨테이너를 위해 KataConfig CR(사용자 정의 리소스)을 다시 생성해야 합니다.

중요

KataConfig CR을 생성하면 작업자 노드가 자동으로 재부팅됩니다. 재부팅에는 10분에서 60분 이상 걸릴 수 있습니다. 재부팅 시간을 방해하는 요소는 다음과 같습니다.

  • 더 많은 작업자 노드가 있는 대규모 OpenShift Container Platform 배포
  • BIOS 및 Cryostat 유틸리티 활성화.
  • SSD가 아닌 하드 디스크 드라이브에 배포합니다.
  • 가상 노드가 아닌 베어 메탈과 같은 물리적 노드에 배포됩니다.
  • 느린 CPU 및 네트워크입니다.

사전 요구 사항

  • cluster-admin 역할의 사용자로 클러스터에 액세스할 수 있어야 합니다.

프로세스

  1. 다음 예에 따라 example-kataconfig.yaml 매니페스트 파일을 생성합니다.

    apiVersion: kataconfiguration.openshift.io/v1
    kind: KataConfig
    metadata:
      name: example-kataconfig
    spec:
      enablePeerPods: true
      logLevel: info
    #  kataConfigPoolSelector:
    #    matchLabels:
    #      <label_key>: '<label_value>' 1
    1
    선택 사항: 노드 레이블을 적용하여 특정 노드에 kata-remote 를 설치한 경우 키와 값(예: cc: 'true' )을 지정합니다.
  2. 다음 명령을 실행하여 KataConfig CR을 생성합니다.

    $ oc apply -f example-kataconfig.yaml

    새로운 KataConfig CR이 생성되고 작업자 노드에 kata-remote 가 런타임 클래스로 설치됩니다.

    설치를 확인하기 전에 kata-remote 설치가 완료되고 작업자 노드가 재부팅될 때까지 기다립니다.

  3. 다음 명령을 실행하여 설치 진행 상황을 모니터링합니다.

    $ watch "oc describe kataconfig | sed -n /^Status:/,/^Events/p"

    kataNodes 아래의 모든 작업자의 상태가 설치되고 이유를 지정하지 않고 InProgress 조건이 False 이면 클러스터에 kata-remote 가 설치됩니다.

  4. 다음 명령을 실행하여 피어 Pod 이미지를 빌드하고 libvirt 볼륨에 업로드했는지 확인합니다.

    $ oc describe configmap peer-pods-cm -n openshift-sandboxed-containers-operator

    출력 예

    Name: peer-pods-cm
    Namespace: openshift-sandboxed-containers-operator
    Labels: <none>
    Annotations: <none>
    
    Data
    ====
    CLOUD_PROVIDER: libvirt
    DISABLECVM: false 1
    LIBVIRT_IMAGE_ID: fa-pp-vol 2
    
    BinaryData
    ====
    Events: <none>

    1
    Operator 빌드 이미지의 IBM Secure Execution 중에 기밀성 VM을 활성화합니다.
    2
    피어 Pod 이미지를 빌드하고 libvirt 볼륨에 업로드한 경우 값을 포함합니다.
  5. 다음 명령을 실행하여 UPDATEDMACHINECOUNTMACHINECOUNT 와 같은 경우 UPDATED MACHINECOUNT가 UPDATED 상태에 있는지 확인하려면 kata-oc 머신 구성 풀 진행 상황을 모니터링합니다.

    $ watch oc get mcp/kata-oc
  6. 다음 명령을 실행하여 데몬 세트를 확인합니다.

    $ oc get -n openshift-sandboxed-containers-operator ds/peerpodconfig-ctrl-caa-daemon
  7. 다음 명령을 실행하여 런타임 클래스를 확인합니다.

    $ oc get runtimeclass

    출력 예

    NAME             HANDLER          AGE
    kata             kata             152m
    kata-remote      kata-remote      152m

5.3.8. Trustee 인증 보안 생성

Trustee에 대한 인증 시크릿을 생성해야 합니다.

사전 요구 사항

  • OpenShift CLI(oc)가 설치되어 있습니다.
  • cluster-admin 역할의 사용자로 클러스터에 액세스할 수 있어야 합니다.

프로세스

  1. 다음 명령을 실행하여 개인 키를 생성합니다.

    $ openssl genpkey -algorithm ed25519 > privateKey
  2. 다음 명령을 실행하여 공개 키를 생성합니다.

    $ openssl pkey -in privateKey -pubout -out publicKey
  3. 다음 명령을 실행하여 보안을 생성합니다.

    $ oc create secret generic kbs-auth-public-key --from-file=publicKey -n trustee-operator-system
  4. 다음 명령을 실행하여 시크릿을 확인합니다.

    $ oc get secret -n trustee-operator-system

5.3.9. Trustee 구성 맵 생성

Trustee 서버를 구성하려면 구성 맵을 생성해야 합니다.

사전 요구 사항

  • Trustee를 위한 경로를 생성했습니다.

프로세스

  1. kbs-config-cm.yaml 매니페스트 파일을 생성합니다.

    apiVersion: v1
    kind: ConfigMap
    metadata:
      name: kbs-config-cm
      namespace: trustee-operator-system
    data:
      kbs-config.json: |
        {
          "insecure_http" : true,
          "sockets": ["0.0.0.0:8080"],
          "auth_public_key": "/etc/auth-secret/publicKey",
          "attestation_token_config": {
            "attestation_token_type": "CoCo"
          },
          "repository_config": {
            "type": "LocalFs",
            "dir_path": "/opt/confidential-containers/kbs/repository"
          },
          "as_config": {
            "work_dir": "/opt/confidential-containers/attestation-service",
            "policy_engine": "opa",
            "attestation_token_broker": "Simple",
              "attestation_token_config": {
              "duration_min": 5
              },
            "rvps_config": {
              "store_type": "LocalJson",
              "store_config": {
                "file_path": "/opt/confidential-containers/rvps/reference-values/reference-values.json"
              }
             }
          },
          "policy_engine_config": {
            "policy_path": "/opt/confidential-containers/opa/policy.rego"
          }
        }
  2. 다음 명령을 실행하여 구성 맵을 생성합니다.

    $ oc apply -f kbs-config-cm.yaml

5.3.10. IBM Secure Execution 헤더 가져오기

IBM Secure Execution (SE) 헤더를 가져와야 합니다.

사전 요구 사항

  • SE 헤더를 일시적으로 저장할 네트워크 블록 스토리지 장치가 있습니다.

프로세스

  1. 다음 명령을 실행하여 SE 헤더의 임시 폴더를 생성합니다.

    $ mkdir -p /tmp/ibmse/hdr
  2. 다음 명령을 실행하여 IBM s390 Linux 리포지토리에서 pvextract-hdr 툴을 다운로드합니다.

    $ wget https://github.com/ibm-s390-linux/s390-tools/raw/v2.33.1/rust/pvattest/tools/pvextract-hdr -O /tmp/pvextract-hdr
  3. 다음 명령을 실행하여 툴을 실행 가능하게 만듭니다.

    $ chmod +x /tmp/pvextract-hdr
  4. 다음 명령을 실행하여 $IMAGE_OUTPUT_DIR 변수를 설정합니다.

    $ export IMAGE=$IMAGE_OUTPUT_DIR/se-podvm-commit-short-id.qcow2
  5. 다음 명령을 실행하여 $IMAGE 변수를 설정합니다.

    $ export IMAGE=/root/rooo/se-podvm-d1fb986-dirty-s390x.qcow2
  6. 다음 명령을 실행하여 nbd 커널 모듈을 활성화합니다.

    $ modprobe nbd
  7. 다음 명령을 실행하여 SE 이미지를 NBD(네트워크 블록 장치)로 연결합니다.

    $ qemu-nbd --connect=/dev/nbd0 $IMAGE
  8. 다음 명령을 실행하여 SE 이미지의 마운트 디렉터리를 생성합니다.

    $ mkdir -p /mnt/se-image/
  9. 다음 명령을 실행하여 프로세스를 일시 중지합니다.

    $ sleep 1
  10. 다음 명령을 실행하여 블록 장치를 나열합니다.

    $ lsblk

    출력 예

    nbd0                                           43:0    0  100G  0 disk
    ├─nbd0p1                                       43:1    0  255M  0 part
    ├─nbd0p2                                       43:2    0    6G  0 part
    │ └─luks-e23e15fa-9c2a-45a5-9275-aae9d8e709c3 253:2    0    6G  0 crypt
    └─nbd0p3                                       43:3    0 12.4G  0 part
    nbd1                                           43:32   0   20G  0 disk
    ├─nbd1p1                                       43:33   0  255M  0 part
    ├─nbd1p2                                       43:34   0    6G  0 part
    │ └─luks-5a540f7c-c0cb-419b-95e0-487670d91525 253:3    0    6G  0 crypt
    └─nbd1p3                                       43:35   0 86.9G  0 part
    nbd2                                           43:64   0    0B  0 disk
    nbd3                                           43:96   0    0B  0 disk
    nbd4                                           43:128  0    0B  0 disk
    nbd5                                           43:160  0    0B  0 disk
    nbd6                                           43:192  0    0B  0 disk
    nbd7                                           43:224  0    0B  0 disk
    nbd8                                           43:256  0    0B  0 disk
    nbd9                                           43:288  0    0B  0 disk
    nbd10                                          43:320  0    0B  0 disk

  11. 사용 가능한 NBD 파티션에 SE 이미지 디렉토리를 마운트하고 다음 명령을 실행하여 SE 헤더를 추출합니다.

    $ mount /dev/<nbdXp1> /mnt/se-image/ /tmp/pvextract-hdr \
      -o /tmp/ibmse/hdr/hdr.bin /mnt/se-image/se.img

    출력 예

    SE header found at offset 0x014000
    SE header written to '/tmp/ibmse/hdr/hdr.bin' (640 bytes)

    NBD를 사용할 수 없는 경우 다음 오류가 표시됩니다.

    mount: /mnt/se-image: can't read superblock on /dev/nbd0p1
  12. 다음 명령을 실행하여 SE 이미지 디렉터리를 마운트 해제합니다.

    $ umount /mnt/se-image/
  13. 다음 명령을 실행하여 네트워크 블록 스토리지 장치의 연결을 해제합니다.

    $ qemu-nbd --disconnect /dev/nbd0

5.3.11. IBM Secure Execution 인증서 및 키 구성

작업자 노드에 대한 IBM Secure Execution (SE) 인증서 및 키를 구성해야 합니다.

사전 요구 사항

  • bastion 노드의 IP 주소가 있습니다.
  • 작업자 노드의 내부 IP 주소가 있습니다.

프로세스

  1. 다음 단계를 수행하여 인증 정책 필드를 가져옵니다.

    1. 다음 명령을 실행하여 OpenShift Trustee 리포지토리에서 se_parse_hdr.py 스크립트를 다운로드합니다.

      $ wget https://github.com/openshift/trustee/raw/main/attestation-service/verifier/src/se/se_parse_hdr.py -O /tmp/se_parse_hdr.py
    2. 다음 명령을 실행하여 SE Host Key Document (HKD) 인증서에 대한 임시 디렉토리를 만듭니다.

      $ mkdir /tmp/ibmse/hkds/
    3. 다음 명령을 실행하여 HKD(Host Key Document) 인증서를 임시 디렉터리에 복사합니다.

      $ cp ~/path/to/<hkd_cert.crt> /tmp/ibmse/hkds/<hkd_cert.crt>
      참고

      HKD 인증서는 피어 Pod 보안을 생성할 때 다운로드한 인증서와 동일해야 합니다.

    4. se_parse_hdr.py 스크립트를 실행하여 인증 정책 필드를 가져옵니다.

      $ python3 /tmp/se_parse_hdr.py /tmp/ibmse/hdr/hdr.bin /tmp/ibmse/hkds/<hkd_cert.crt>

      출력 예

      ...
        ================================================
        se.image_phkh: xxx
        se.version: 256
        se.tag: xxx
        se.attestation_phkh: xxx

      SE 인증 정책 구성 맵에 이러한 값을 기록합니다.

  2. 다음 단계를 수행하여 인증서 및 CRL(인증서 취소 목록)을 가져옵니다.

    1. 다음 명령을 실행하여 인증서에 대한 임시 디렉터리를 생성합니다.

      $ mkdir /tmp/ibmse/certs
    2. 다음 명령을 실행하여 ibm-z-host-key-signing-gen2.crt 인증서를 다운로드합니다.

      $ wget https://www.ibm.com/support/resourcelink/api/content/public/ibm-z-host-key-signing-gen2.crt -O /tmp/ibmse/certs/ibm-z-host-key-signing-gen2.crt
    3. 다음 명령을 실행하여 CryostatCert CA.crt 인증서를 다운로드합니다.

      $ wget https://www.ibm.com/support/resourcelink/api/content/public/DigiCertCA.crt -O /tmp/ibmse/certs/DigiCertCA.crt
    4. 다음 명령을 실행하여 CRL의 임시 디렉터리를 생성합니다.

      $ mkdir /tmp/ibmse/crls
    5. 다음 명령을 실행하여 MellanoxCert TrustedRootG4.crl 파일을 다운로드합니다.

      $ wget http://crl3.digicert.com/DigiCertTrustedRootG4.crl -O /tmp/ibmse/crls/DigiCertTrustedRootG4.crl
    6. 다음 명령을 실행하여 clevisCert TrustedG4CodeSigningRSA4096SHA3842021CA1.crl 파일을 다운로드합니다.

      $ wget http://crl3.digicert.com/DigiCertTrustedG4CodeSigningRSA4096SHA3842021CA1.crl -O /tmp/ibmse/crls/DigiCertTrustedG4CodeSigningRSA4096SHA3842021CA1.crl
  3. RSA 키를 생성합니다.

    1. 다음 명령을 실행하여 RSA 키 쌍을 생성합니다.

      $ openssl genrsa -aes256 -passout pass:<password> -out /tmp/encrypt_key-psw.pem 4096 1
      1
      RSA 키 암호를 지정합니다.
    2. 다음 명령을 실행하여 RSA 키에 대한 임시 디렉터리를 생성합니다.

      $ mkdir /tmp/ibmse/rsa
    3. 다음 명령을 실행하여 encrypt_key.pub 키를 만듭니다.

      $ openssl rsa -in /tmp/encrypt_key-psw.pem -passin pass:<password> -pubout -out /tmp/ibmse/rsa/encrypt_key.pub
    4. 다음 명령을 실행하여 encrypt_key.pem 키를 생성합니다.

      $ openssl rsa -in /tmp/encrypt_key-psw.pem -passin pass:<password> -out /tmp/ibmse/rsa/encrypt_key.pem
  4. 다음 명령을 실행하여 /tmp/ibmse 디렉터리의 구조를 확인합니다.

    $ tree /tmp/ibmse

    출력 예

    /tmp/ibmse
    ├── certs
    │   ├── ibm-z-host-key-signing-gen2.crt
    |   └── DigiCertCA.crt
    ├── crls
    │   └── ibm-z-host-key-gen2.crl
    │   └── DigiCertTrustedRootG4.crl
    │   └── DigiCertTrustedG4CodeSigningRSA4096SHA3842021CA1.crl
    ├── hdr
    │   └── hdr.bin
    ├── hkds
    │   └── <hkd_cert.crt>
    └── rsa
        ├── encrypt_key.pem
        └── encrypt_key.pub

  5. 다음 단계를 수행하여 이러한 파일을 OpenShift Container Platform 작업자 노드에 복사합니다.

    1. 다음 명령을 실행하여 /tmp/ibmse 디렉토리에서 압축 파일을 생성합니다.

      $ tar -czf ibmse.tar.gz -C /tmp/ibmse
    2. 다음 명령을 실행하여 .tar.gz 파일을 클러스터의 bastion 노드에 복사합니다.

      $ scp /tmp/ibmse.tar.gz root@<ocp_bastion_ip>:/tmp 1
      1
      bastion 노드의 IP 주소를 지정합니다.
    3. 다음 명령을 실행하여 SSH를 통해 bastion 노드에 연결합니다.

      $ ssh root@<ocp_bastion_ip>
    4. 다음 명령을 실행하여 .tar.gz 파일을 각 작업자 노드에 복사합니다.

      $ scp /tmp/ibmse.tar.gz core@<worker_node_ip>:/tmp 1
      1
      작업자 노드의 IP 주소를 지정합니다.
    5. 다음 명령을 실행하여 각 작업자 노드에서 .tar.gz 를 추출합니다.

      $ ssh core@<worker_node_ip> 'sudo mkdir -p /opt/confidential-containers/ && sudo tar -xzf /tmp/ibmse.tar.gz -C /opt/confidential-containers/'
    6. 다음 명령을 실행하여 ibmse 폴더 권한을 업데이트합니다.

      $ ssh core@<worker_node_ip> 'sudo chmod -R 755 /opt/confidential-containers/ibmse/'

5.3.12. 영구 스토리지 구성 요소 생성

ibmse 폴더를 Trustee Pod에 마운트하려면 영구 스토리지 구성 요소, PV(영구 볼륨) 및 PVC(영구 볼륨 클레임)를 생성해야 합니다.

프로세스

  1. persistent-volume.yaml 매니페스트 파일을 생성합니다.

    apiVersion: v1
    kind: PersistentVolume
    metadata:
      name: ibmse-pv
      namespace: trustee-operator-system
    spec:
      capacity:
        storage: 100Mi
      accessModes:
        - ReadOnlyMany
      storageClassName: ""
      local:
        path: /opt/confidential-containers/ibmse
      nodeAffinity:
        required:
          nodeSelectorTerms:
            - matchExpressions:
                - key: node-role.kubernetes.io/worker
                  operator: Exists
  2. 다음 명령을 실행하여 영구 볼륨을 생성합니다.

    $ oc apply -f persistent-volume.yaml
  3. persistent-volume-claim.yaml 매니페스트 파일을 생성합니다.

    apiVersion: v1
    kind: PersistentVolumeClaim
    metadata:
      name: ibmse-pvc
      namespace: trustee-operator-system
    spec:
      accessModes:
        - ReadOnlyMany
      storageClassName: ""
      resources:
        requests:
          storage: 100Mi
  4. 다음 명령을 실행하여 영구 볼륨 클레임을 생성합니다.

    $ oc apply -f persistent-volume-claim.yaml

5.3.13. 인증 정책 구성

다음 인증 정책 설정을 구성할 수 있습니다.

참조 값

하드웨어 플랫폼의 신뢰할 수 있는 다이제스트를 지정하여 RVPS(Reference Value Provider Service)에 대한 참조 값을 구성할 수 있습니다.

클라이언트는 실행 중인 소프트웨어, TEE(신뢰할 수 있는 실행 환경) 하드웨어 및 펌웨어에서 측정을 수집하고 클레임과 함께 Attestation Server에 견적을 제출합니다. 이러한 측정은 Trustee에 등록된 신뢰할 수 있는 다이제스트와 일치해야 합니다. 이 프로세스에서는 기밀 VM(CVM)이 예상 소프트웨어 스택을 실행 중이고 변조되지 않도록 합니다.

클라이언트의 시크릿
테스트된 클라이언트와 공유할 하나 이상의 시크릿을 생성해야 합니다.
리소스 액세스 정책

액세스할 리소스를 결정하려면 Trustee 정책 엔진에 대한 정책을 구성해야 합니다.

TEE 증명의 유효성을 결정하는 신뢰 정책 엔진과 인증 서비스 정책 엔진을 혼동하지 마십시오.

인증 정책
IBM Secure Execution에 대한 인증 정책을 생성해야 합니다.

프로세스

  1. rvps-configmap.yaml 매니페스트 파일을 생성합니다.

    apiVersion: v1
    kind: ConfigMap
    metadata:
      name: rvps-reference-values
      namespace: trustee-operator-system
    data:
      reference-values.json: |
        [ 1
        ]
    1
    이 값을 비워 둡니다.
  2. 다음 명령을 실행하여 RVPS 구성 맵을 생성합니다.

    $ oc apply -f rvps-configmap.yaml
  3. 다음 예에 따라 인증된 클라이언트와 공유할 하나 이상의 시크릿을 생성합니다.

    $ oc create secret generic kbsres1 --from-literal key1=<res1val1> \
      --from-literal key2=<res1val2> -n trustee-operator-system

    이 예에서 kbsres1 시크릿에는 두 개의 항목(key1,key2)이 있으며, 이 항목은 Trustee 클라이언트가 검색합니다. 요구 사항에 따라 더 많은 시크릿을 추가할 수 있습니다.

  4. resourcepolicy-configmap.yaml 매니페스트 파일을 생성합니다.

    apiVersion: v1
    kind: ConfigMap
    metadata:
      name: resource-policy
      namespace: trustee-operator-system
    data:
      policy.rego: | 1
        package policy 2
        path := split(data["resource-path"], "/")
        default allow = false
        allow {
          count(path) == 3
          input["tee"] == "se"
        }
    1
    리소스 정책의 이름 policy.rego 는 Trustee 구성 맵에 정의된 리소스 정책과 일치해야 합니다.
    2
    리소스 정책은 Open Policy Agent 사양을 따릅니다. 이 예제에서는 TEE가 샘플 attester가 아닌 경우 모든 리소스를 검색할 수 있습니다.
  5. 다음 명령을 실행하여 리소스 정책 구성 맵을 생성합니다.

    $ oc apply -f resourcepolicy-configmap.yaml
  6. attestation-policy.yaml 매니페스트 파일을 생성합니다.

    apiVersion: v1
    kind: ConfigMap
    metadata:
      name: attestation-policy
      namespace: trustee-operator-system
    data:
      default.rego: | 1
        package policy
        import rego.v1
        default allow = false
        converted_version := sprintf("%v", [input["se.version"]])
        allow if {
            input["se.attestation_phkh"] == "<se.attestation_phkh>" 2
            input["se.image_phkh"] == "<se.image_phkh>"
            input["se.tag"] == "<se.tag>"
            converted_version == "256"
        }
    1
    정책 이름을 수정하지 마십시오.
    2
    se_parse_hdr.py 스크립트를 실행하여 얻은 attestation 정책 필드를 지정합니다.
  7. 다음 명령을 실행하여 인증 정책 구성 맵을 생성합니다.

    $ oc apply -f attestation-policy.yaml

5.3.14. KbsConfig 사용자 정의 리소스 생성

Trustee를 시작하려면 KbsConfig CR(사용자 정의 리소스)을 생성해야 합니다.

그런 다음 Trustee pod 및 pod 로그를 확인하여 구성을 확인합니다.

프로세스

  1. kbsconfig-cr.yaml 매니페스트 파일을 생성합니다.

    apiVersion: confidentialcontainers.org/v1alpha1
    kind: KbsConfig
    metadata:
      labels:
        app.kubernetes.io/name: kbsconfig
        app.kubernetes.io/instance: kbsconfig
        app.kubernetes.io/part-of: trustee-operator
        app.kubernetes.io/managed-by: kustomize
        app.kubernetes.io/created-by: trustee-operator
      name: kbsconfig
      namespace: trustee-operator-system
    spec:
      kbsConfigMapName: kbs-config-cm
      kbsAuthSecretName: kbs-auth-public-key
      kbsDeploymentType: AllInOneDeployment
      kbsRvpsRefValuesConfigMapName: rvps-reference-values
      kbsSecretResources: ["kbsres1"]
      kbsResourcePolicyConfigMapName: resource-policy
      kbsAttestationPolicyConfigMapName: attestation-policy
      kbsServiceType: NodePort
      ibmSEConfigSpec:
        certStorePvc: ibmse-pvc
  2. 다음 명령을 실행하여 KbsConfig CR을 생성합니다.

    $ oc apply -f kbsconfig-cr.yaml

검증

  1. 다음 명령을 실행하여 기본 프로젝트를 설정합니다.

    $ oc project trustee-operator-system
  2. 다음 명령을 실행하여 Pod를 확인합니다.

    $ oc get pods -n trustee-operator-system

    출력 예

    NAME                                                   READY   STATUS    RESTARTS   AGE
    trustee-deployment-8585f98449-9bbgl                    1/1     Running   0          22m
    trustee-operator-controller-manager-5fbd44cd97-55dlh   2/2     Running   0          59m

  3. 다음 명령을 실행하여 POD_NAME 환경 변수를 설정합니다.

    $ POD_NAME=$(oc get pods -l app=kbs -o jsonpath='{.items[0].metadata.name}' -n trustee-operator-system)
  4. 다음 명령을 실행하여 Pod 로그를 확인합니다.

    $ oc logs -n trustee-operator-system $POD_NAME

    출력 예

    [2024-05-30T13:44:24Z INFO  kbs] Using config file /etc/kbs-config/kbs-config.json
    [2024-05-30T13:44:24Z WARN  attestation_service::rvps] No RVPS address provided and will launch a built-in rvps
    [2024-05-30T13:44:24Z INFO  attestation_service::token::simple] No Token Signer key in config file, create an ephemeral key and without CA pubkey cert
    [2024-05-30T13:44:24Z INFO  api_server] Starting HTTPS server at [0.0.0.0:8080]
    [2024-05-30T13:44:24Z INFO  actix_server::builder] starting 12 workers
    [2024-05-30T13:44:24Z INFO  actix_server::server] Tokio runtime found; starting in existing Tokio runtime

  5. 다음 명령을 실행하여 ibmse-pvc 영구 볼륨 클레임을 Trustee Pod에 노출합니다.

    $ oc patch deployment trustee-deployment --namespace=trustee-operator-system --type=json -p='[{"op": "remove", "path": "/spec/template/spec/volumes/5/persistentVolumeClaim/readOnly"}]'
  6. 다음 명령을 실행하여 kbs-service 가 노드 포트에 노출되었는지 확인합니다.

    $ oc get svc kbs-service -n trustee-operator-system

    출력 예

    NAME          TYPE       CLUSTER-IP      EXTERNAL-IP   PORT(S)          AGE
    kbs-service   NodePort   198.51.100.54   <none>        8080:31862/TCP   23h

    kbs-service URL은 https://<worker_node_ip>:<node_port > 입니다(예: https://172.16.0.56:31862 ).

5.3.15. 인증 프로세스 확인

테스트 Pod를 생성하고 시크릿을 검색하여 인증 프로세스를 확인할 수 있습니다. Pod 이미지는 Key Broker Service 및 기본 인증 흐름을 테스트하는 툴인 KBS 클라이언트를 배포합니다.

중요

이 절차는 인증이 작동하는지 확인하는 예입니다. 메모리 덤프를 사용하여 데이터를 캡처할 수 있으므로 표준 I/O에 민감한 데이터를 작성하지 마십시오. 메모리에 기록된 데이터만 암호화됩니다.

사전 요구 사항

  • Trustee 서버와 테스트 Pod가 동일한 클러스터에서 실행되지 않는 경우 경로를 생성했습니다.

프로세스

  1. verification-pod.yaml 매니페스트 파일을 생성합니다.

    apiVersion: v1
    kind: Pod
    metadata:
      name: kbs-client
    spec:
      containers:
      - name: kbs-client
        image: quay.io/confidential-containers/kbs-client:latest
        imagePullPolicy: IfNotPresent
        command:
          - sleep
          - "360000"
        env:
          - name: RUST_LOG
            value:  none
  2. 다음 명령을 실행하여 Pod를 생성합니다.

    $ oc create -f verification-pod.yaml
  3. 다음 명령을 실행하여 https.crt 파일을 kbs-client Pod에 복사합니다.

    $ oc cp https.crt kbs-client:/
  4. 다음 명령을 실행하여 Pod 시크릿을 가져옵니다.

    $ oc exec -it kbs-client -- kbs-client --cert-file https.crt \
      --url https://kbs-service:8080 get-resource \
      --path default/kbsres1/key1

    출력 예

    res1val1

    Trustee 서버는 인증에 성공한 경우에만 시크릿을 반환합니다.

Red Hat logoGithubRedditYoutubeTwitter

자세한 정보

평가판, 구매 및 판매

커뮤니티

Red Hat 문서 정보

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

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

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

Red Hat 소개

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

© 2024 Red Hat, Inc.