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 이상을 설치했습니다.
다음 단계를 수행하여 기밀 컨테이너를 배포합니다.
- Confidential Compute attestation Operator를 설치합니다.
- Trustee의 경로를 만듭니다.
- 기밀성 컨테이너 기능 게이트를 활성화합니다.
- 피어 Pod 구성 맵을 업데이트합니다.
-
KataConfig
CR(사용자 정의 리소스)을 삭제합니다. - 피어 Pod 시크릿을 업데이트합니다.
-
KataConfig
CR을 다시 만듭니다. - Trustee 인증 시크릿을 생성합니다.
- Trustee 구성 맵을 생성합니다.
- IBM Secure Execution (SE) 헤더를 가져옵니다.
- SE 인증서 및 키를 구성합니다.
- 영구 스토리지 구성 요소를 생성합니다.
인증 정책을 구성합니다.
- 참조 값을 생성합니다.
- 테스트된 클라이언트의 시크릿을 생성합니다.
- 리소스 액세스 정책을 생성합니다.
- SE에 대한 인증 정책을 만듭니다.
-
KbsConfig
CR을 생성합니다. - 인증 프로세스를 확인합니다.
5.3.1. 기밀 컴퓨팅 인증 Operator 설치
CLI를 사용하여 IBM Z® 및 IBM® LinuxONE에 Confidential Compute attestation Operator를 설치할 수 있습니다.
사전 요구 사항
-
OpenShift CLI(
oc
)가 설치되어 있습니다. -
cluster-admin
역할의 사용자로 클러스터에 액세스할 수 있어야 합니다.
프로세스
trustee-namespace.yaml
매니페스트 파일을 생성합니다.apiVersion: v1 kind: Namespace metadata: name: trustee-operator-system
다음 명령을 실행하여
trustee-operator-system
네임스페이스를 생성합니다.$ oc apply -f trustee-namespace.yaml
trustee-operatorgroup.yaml
매니페스트 파일을 생성합니다.apiVersion: operators.coreos.com/v1 kind: OperatorGroup metadata: name: trustee-operator-group namespace: trustee-operator-system spec: targetNamespaces: - trustee-operator-system
다음 명령을 실행하여 operator 그룹을 생성합니다.
$ oc apply -f trustee-operatorgroup.yaml
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
다음 명령을 실행하여 서브스크립션을 생성합니다.
$ oc apply -f trustee-subscription.yaml
다음 명령을 실행하여 Operator가 올바르게 설치되었는지 확인합니다.
$ oc get csv -n trustee-operator-system
이 명령을 완료하는 데 몇 분이 걸릴 수 있습니다.
다음 명령을 실행하여 프로세스를 확인합니다.
$ 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를 설치했습니다.
프로세스
다음 명령을 실행하여 엣지 경로를 만듭니다.
$ oc create route edge --service=kbs-service --port kbs-port \ -n trustee-operator-system
참고참고: 현재 유효한 CA 서명 인증서가 있는 경로만 지원됩니다. 자체 서명된 인증서가 있는 경로를 사용할 수 없습니다.
다음 명령을 실행하여
TRUSTEE_HOST
변수를 설정합니다.$ TRUSTEE_HOST=$(oc get route -n trustee-operator-system kbs-service \ -o jsonpath={.spec.host})
다음 명령을 실행하여 경로를 확인합니다.
$ echo $TRUSTEE_HOST
출력 예
kbs-service-trustee-operator-system.apps.memvjias.eastus.aroapp.io
5.3.3. 기밀성 컨테이너 기능 게이트 활성화
기밀 컨테이너 기능 게이트를 활성화해야 합니다.
프로세스
cc-feature-gate.yaml
매니페스트 파일을 생성합니다.apiVersion: v1 kind: ConfigMap metadata: name: osc-feature-gates namespace: openshift-sandboxed-containers-operator data: confidential: "true"
다음 명령을 실행하여 구성 맵을 생성합니다.
$ oc apply -f cc-feature-gate.yaml
5.3.4. 피어 Pod 구성 맵 업데이트
기밀 컨테이너의 피어 Pod 구성 맵을 업데이트해야 합니다.
Secure Boot를 true
로 설정하여 기본적으로 활성화합니다. 기본값은 false
이며 보안 위험을 나타냅니다.
프로세스
다음 예에 따라
peer-pods-cm.yaml
매니페스트 파일을 생성합니다.apiVersion: v1 kind: ConfigMap metadata: name: peer-pods-cm namespace: openshift-sandboxed-containers-operator data: CLOUD_PROVIDER: "libvirt" DISABLECVM: "false"
다음 명령을 실행하여 구성 맵을 생성합니다.
$ oc apply -f peer-pods-cm.yaml
다음 명령을 실행하여
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
역할의 사용자로 클러스터에 액세스할 수 있어야 합니다.
프로세스
다음 명령을 실행하여
KataConfig
CR을 삭제합니다.$ oc delete kataconfig example-kataconfig
다음 명령을 실행하여 사용자 정의 리소스가 삭제되었는지 확인합니다.
$ oc get kataconfig example-kataconfig
출력 예
No example-kataconfig instances exist
클라우드 공급자를 사용하여 배포된 OpenShift 샌드박스 컨테이너를 제거하는 경우 모든 Pod를 삭제해야 합니다. 나머지 Pod 리소스로 인해 클라우드 공급자의 예기치 않은 요금이 발생할 수 있습니다.
5.3.6. 피어 Pod 시크릿 업데이트
기밀 컨테이너의 피어 Pod 시크릿을 업데이트해야 합니다.
시크릿은 Pod VM(가상 머신) 이미지 및 피어 Pod 인스턴스를 생성하기 위한 인증 정보를 저장합니다.
기본적으로 OpenShift 샌드박스 컨테이너 Operator는 클러스터를 생성하는 데 사용되는 인증 정보를 기반으로 보안을 생성합니다. 그러나 다른 인증 정보를 사용하는 보안을 수동으로 생성할 수 있습니다.
사전 요구 사항
-
REDHAT_OFFLINE_TOKEN
. Red Hat API 토큰에서 RHEL 이미지를 다운로드하기 위해 이 토큰 을 생성했습니다. -
HKD_CRT
. HKD(Host Key Document) 인증서를 사용하면 IBM Z®에서 보안 실행을 수행할 수 있습니다. 자세한 내용은 IBM 문서의 리소스 링크에서 호스트 키 문서 가져오기 를 참조하십시오.
프로세스
다음 예에 따라
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
다음 명령을 실행하여 시크릿을 생성합니다.
$ 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
역할의 사용자로 클러스터에 액세스할 수 있어야 합니다.
프로세스
다음 예에 따라
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'
)을 지정합니다.
다음 명령을 실행하여
KataConfig
CR을 생성합니다.$ oc apply -f example-kataconfig.yaml
새로운
KataConfig
CR이 생성되고 작업자 노드에kata-remote
가 런타임 클래스로 설치됩니다.설치를 확인하기 전에
kata-remote
설치가 완료되고 작업자 노드가 재부팅될 때까지 기다립니다.다음 명령을 실행하여 설치 진행 상황을 모니터링합니다.
$ watch "oc describe kataconfig | sed -n /^Status:/,/^Events/p"
kataNodes
아래의 모든 작업자의 상태가설치되고
이유를 지정하지 않고InProgress
조건이False
이면 클러스터에kata-remote
가 설치됩니다.다음 명령을 실행하여 피어 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>
다음 명령을 실행하여
UPDATEDMACHINECOUNT
가MACHINECOUNT
와 같은 경우UPDATED
MACHINECOUNT가 UPDATED 상태에 있는지 확인하려면kata-oc
머신 구성 풀 진행 상황을 모니터링합니다.$ watch oc get mcp/kata-oc
다음 명령을 실행하여 데몬 세트를 확인합니다.
$ oc get -n openshift-sandboxed-containers-operator ds/peerpodconfig-ctrl-caa-daemon
다음 명령을 실행하여 런타임 클래스를 확인합니다.
$ oc get runtimeclass
출력 예
NAME HANDLER AGE kata kata 152m kata-remote kata-remote 152m
5.3.8. Trustee 인증 보안 생성
Trustee에 대한 인증 시크릿을 생성해야 합니다.
사전 요구 사항
-
OpenShift CLI(
oc
)가 설치되어 있습니다. -
cluster-admin
역할의 사용자로 클러스터에 액세스할 수 있어야 합니다.
프로세스
다음 명령을 실행하여 개인 키를 생성합니다.
$ openssl genpkey -algorithm ed25519 > privateKey
다음 명령을 실행하여 공개 키를 생성합니다.
$ openssl pkey -in privateKey -pubout -out publicKey
다음 명령을 실행하여 보안을 생성합니다.
$ oc create secret generic kbs-auth-public-key --from-file=publicKey -n trustee-operator-system
다음 명령을 실행하여 시크릿을 확인합니다.
$ oc get secret -n trustee-operator-system
5.3.9. Trustee 구성 맵 생성
Trustee 서버를 구성하려면 구성 맵을 생성해야 합니다.
사전 요구 사항
- Trustee를 위한 경로를 생성했습니다.
프로세스
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" } }
다음 명령을 실행하여 구성 맵을 생성합니다.
$ oc apply -f kbs-config-cm.yaml
5.3.10. IBM Secure Execution 헤더 가져오기
IBM Secure Execution (SE) 헤더를 가져와야 합니다.
사전 요구 사항
- SE 헤더를 일시적으로 저장할 네트워크 블록 스토리지 장치가 있습니다.
프로세스
다음 명령을 실행하여 SE 헤더의 임시 폴더를 생성합니다.
$ mkdir -p /tmp/ibmse/hdr
다음 명령을 실행하여 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
다음 명령을 실행하여 툴을 실행 가능하게 만듭니다.
$ chmod +x /tmp/pvextract-hdr
다음 명령을 실행하여
$IMAGE_OUTPUT_DIR
변수를 설정합니다.$ export IMAGE=$IMAGE_OUTPUT_DIR/se-podvm-commit-short-id.qcow2
다음 명령을 실행하여
$IMAGE
변수를 설정합니다.$ export IMAGE=/root/rooo/se-podvm-d1fb986-dirty-s390x.qcow2
다음 명령을 실행하여
nbd
커널 모듈을 활성화합니다.$ modprobe nbd
다음 명령을 실행하여 SE 이미지를 NBD(네트워크 블록 장치)로 연결합니다.
$ qemu-nbd --connect=/dev/nbd0 $IMAGE
다음 명령을 실행하여 SE 이미지의 마운트 디렉터리를 생성합니다.
$ mkdir -p /mnt/se-image/
다음 명령을 실행하여 프로세스를 일시 중지합니다.
$ sleep 1
다음 명령을 실행하여 블록 장치를 나열합니다.
$ 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
사용 가능한 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
다음 명령을 실행하여 SE 이미지 디렉터리를 마운트 해제합니다.
$ umount /mnt/se-image/
다음 명령을 실행하여 네트워크 블록 스토리지 장치의 연결을 해제합니다.
$ qemu-nbd --disconnect /dev/nbd0
5.3.11. IBM Secure Execution 인증서 및 키 구성
작업자 노드에 대한 IBM Secure Execution (SE) 인증서 및 키를 구성해야 합니다.
사전 요구 사항
- bastion 노드의 IP 주소가 있습니다.
- 작업자 노드의 내부 IP 주소가 있습니다.
프로세스
다음 단계를 수행하여 인증 정책 필드를 가져옵니다.
다음 명령을 실행하여 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
다음 명령을 실행하여 SE Host Key Document (HKD) 인증서에 대한 임시 디렉토리를 만듭니다.
$ mkdir /tmp/ibmse/hkds/
다음 명령을 실행하여 HKD(Host Key Document) 인증서를 임시 디렉터리에 복사합니다.
$ cp ~/path/to/<hkd_cert.crt> /tmp/ibmse/hkds/<hkd_cert.crt>
참고HKD 인증서는 피어 Pod 보안을 생성할 때 다운로드한 인증서와 동일해야 합니다.
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 인증 정책 구성 맵에 이러한 값을 기록합니다.
다음 단계를 수행하여 인증서 및 CRL(인증서 취소 목록)을 가져옵니다.
다음 명령을 실행하여 인증서에 대한 임시 디렉터리를 생성합니다.
$ mkdir /tmp/ibmse/certs
다음 명령을 실행하여
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
다음 명령을 실행하여 CryostatCert
CA.crt
인증서를 다운로드합니다.$ wget https://www.ibm.com/support/resourcelink/api/content/public/DigiCertCA.crt -O /tmp/ibmse/certs/DigiCertCA.crt
다음 명령을 실행하여 CRL의 임시 디렉터리를 생성합니다.
$ mkdir /tmp/ibmse/crls
다음 명령을 실행하여 MellanoxCert
TrustedRootG4.crl
파일을 다운로드합니다.$ wget http://crl3.digicert.com/DigiCertTrustedRootG4.crl -O /tmp/ibmse/crls/DigiCertTrustedRootG4.crl
다음 명령을 실행하여 clevisCert
TrustedG4CodeSigningRSA4096SHA3842021CA1.crl
파일을 다운로드합니다.$ wget http://crl3.digicert.com/DigiCertTrustedG4CodeSigningRSA4096SHA3842021CA1.crl -O /tmp/ibmse/crls/DigiCertTrustedG4CodeSigningRSA4096SHA3842021CA1.crl
RSA 키를 생성합니다.
다음 명령을 실행하여 RSA 키 쌍을 생성합니다.
$ openssl genrsa -aes256 -passout pass:<password> -out /tmp/encrypt_key-psw.pem 4096 1
- 1
- RSA 키 암호를 지정합니다.
다음 명령을 실행하여 RSA 키에 대한 임시 디렉터리를 생성합니다.
$ mkdir /tmp/ibmse/rsa
다음 명령을 실행하여
encrypt_key.pub
키를 만듭니다.$ openssl rsa -in /tmp/encrypt_key-psw.pem -passin pass:<password> -pubout -out /tmp/ibmse/rsa/encrypt_key.pub
다음 명령을 실행하여
encrypt_key.pem
키를 생성합니다.$ openssl rsa -in /tmp/encrypt_key-psw.pem -passin pass:<password> -out /tmp/ibmse/rsa/encrypt_key.pem
다음 명령을 실행하여
/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
다음 단계를 수행하여 이러한 파일을 OpenShift Container Platform 작업자 노드에 복사합니다.
다음 명령을 실행하여
/tmp/ibmse
디렉토리에서 압축 파일을 생성합니다.$ tar -czf ibmse.tar.gz -C /tmp/ibmse
다음 명령을 실행하여
.tar.gz
파일을 클러스터의 bastion 노드에 복사합니다.$ scp /tmp/ibmse.tar.gz root@<ocp_bastion_ip>:/tmp 1
- 1
- bastion 노드의 IP 주소를 지정합니다.
다음 명령을 실행하여 SSH를 통해 bastion 노드에 연결합니다.
$ ssh root@<ocp_bastion_ip>
다음 명령을 실행하여
.tar.gz
파일을 각 작업자 노드에 복사합니다.$ scp /tmp/ibmse.tar.gz core@<worker_node_ip>:/tmp 1
- 1
- 작업자 노드의 IP 주소를 지정합니다.
다음 명령을 실행하여 각 작업자 노드에서
.tar.gz
를 추출합니다.$ ssh core@<worker_node_ip> 'sudo mkdir -p /opt/confidential-containers/ && sudo tar -xzf /tmp/ibmse.tar.gz -C /opt/confidential-containers/'
다음 명령을 실행하여
ibmse
폴더 권한을 업데이트합니다.$ ssh core@<worker_node_ip> 'sudo chmod -R 755 /opt/confidential-containers/ibmse/'
5.3.12. 영구 스토리지 구성 요소 생성
ibmse
폴더를 Trustee Pod에 마운트하려면 영구 스토리지 구성 요소, PV(영구 볼륨) 및 PVC(영구 볼륨 클레임)를 생성해야 합니다.
프로세스
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
다음 명령을 실행하여 영구 볼륨을 생성합니다.
$ oc apply -f persistent-volume.yaml
persistent-volume-claim.yaml
매니페스트 파일을 생성합니다.apiVersion: v1 kind: PersistentVolumeClaim metadata: name: ibmse-pvc namespace: trustee-operator-system spec: accessModes: - ReadOnlyMany storageClassName: "" resources: requests: storage: 100Mi
다음 명령을 실행하여 영구 볼륨 클레임을 생성합니다.
$ 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에 대한 인증 정책을 생성해야 합니다.
프로세스
rvps-configmap.yaml
매니페스트 파일을 생성합니다.apiVersion: v1 kind: ConfigMap metadata: name: rvps-reference-values namespace: trustee-operator-system data: reference-values.json: | [ 1 ]
- 1
- 이 값을 비워 둡니다.
다음 명령을 실행하여 RVPS 구성 맵을 생성합니다.
$ oc apply -f rvps-configmap.yaml
다음 예에 따라 인증된 클라이언트와 공유할 하나 이상의 시크릿을 생성합니다.
$ oc create secret generic kbsres1 --from-literal key1=<res1val1> \ --from-literal key2=<res1val2> -n trustee-operator-system
이 예에서
kbsres1
시크릿에는 두 개의 항목(key1
,key2
)이 있으며, 이 항목은 Trustee 클라이언트가 검색합니다. 요구 사항에 따라 더 많은 시크릿을 추가할 수 있습니다.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가 아닌 경우 모든 리소스를 검색할 수 있습니다.
다음 명령을 실행하여 리소스 정책 구성 맵을 생성합니다.
$ oc apply -f resourcepolicy-configmap.yaml
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" }
다음 명령을 실행하여 인증 정책 구성 맵을 생성합니다.
$ oc apply -f attestation-policy.yaml
5.3.14. KbsConfig 사용자 정의 리소스 생성
Trustee를 시작하려면 KbsConfig
CR(사용자 정의 리소스)을 생성해야 합니다.
그런 다음 Trustee pod 및 pod 로그를 확인하여 구성을 확인합니다.
프로세스
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
다음 명령을 실행하여
KbsConfig
CR을 생성합니다.$ oc apply -f kbsconfig-cr.yaml
검증
다음 명령을 실행하여 기본 프로젝트를 설정합니다.
$ oc project trustee-operator-system
다음 명령을 실행하여 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
다음 명령을 실행하여
POD_NAME
환경 변수를 설정합니다.$ POD_NAME=$(oc get pods -l app=kbs -o jsonpath='{.items[0].metadata.name}' -n trustee-operator-system)
다음 명령을 실행하여 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
다음 명령을 실행하여
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"}]'
다음 명령을 실행하여
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가 동일한 클러스터에서 실행되지 않는 경우 경로를 생성했습니다.
프로세스
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
다음 명령을 실행하여 Pod를 생성합니다.
$ oc create -f verification-pod.yaml
다음 명령을 실행하여
https.crt
파일을kbs-client
Pod에 복사합니다.$ oc cp https.crt kbs-client:/
다음 명령을 실행하여 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 서버는 인증에 성공한 경우에만 시크릿을 반환합니다.