장기 구매 계약 정보
IBM Hyper Protect Container Runtime (HPCR) 이미지를 사용하여 VPC 인스턴스에 대한 IBM Cloud Hyper Protect Virtual Servers 을 작성하는 경우 사용자 데이터 필드의 일부로 계약을 지정해야 합니다.
계약의 개념
계약은 VPC 인스턴스의 Hyper Protect Virtual Servers 에 특정한 YAML 형식의 정의 파일입니다. 이 파일은 인스턴스 작성을 위한 전제조건으로 클라우드 사용자가 작성해야 합니다. 이 파일을 작성한 후에는 인스턴스가 작성될 때 사용자 데이터 필드의 일부로 입력으로 전달되어야 합니다. 올바른 계약 없이 인스턴스를 작성할 수 없습니다. 계약 없이 인스턴스를 작성하는 경우 배치가 시작되고 실패하며 인스턴스는 종료 상태가 됩니다. 이 계약은 VPC 인스턴스에 대한 Hyper Protect Virtual Servers 작성에 특정하며 Hyper Protect에 의한 IBM Secure Execution 기술의 확장입니다.
작업량이 SSH 또는 REST API를 통해 해독된 토큰을 공개하는 경우, 해독된 데이터에는 작업량과 환경 비밀번호가 모두 포함됩니다. 그러나 볼륨 암호화에 사용된 씨앗은 포함되어 있지 않습니다.
계약 섹션
계약 파일에는 다음 네 개의 올바른 상위 레벨 섹션이 있을 수 있으며, 이 중 workload
및 env
섹션은 필수입니다.
workload
는 필수 섹션입니다.env
는 필수 섹션입니다.attestationPublicKey
는 선택적 섹션입니다. 공개 RSA키를 계약의 일부로 제공할 수 있으며, 이는 증명 문서를 암호화하는 데 사용되며 속성의 이름은attestationPublicKey
로 지정되어야 합니다.envWorkloadSignature
는 선택적 섹션이며 계약의 다른 섹션에 대한 서명을 포함합니다.
계약의 두 가지 기본 섹션은 workload
및 env
섹션입니다. 계약에 추가되는 정보는 두 개의 다른 페르소나 (즉, "워크로드" 및 "배치자" 페르소나) 에서 제공되므로 이 두 섹션이 필요합니다.
워크로드 페르소나는 VPC 인스턴스의 Hyper Protect Virtual Servers 에서 가져와야 하는 컨테이너 (또는 워크로드) 에 대한 정보를 제공합니다. 컨테이너 이름, 컨테이너 이름에 대한 정보가 포함되어 있습니다. Container Registry 그것이 상주하는 곳, 증명서 Container Registry, 이미지 다이제스트, 공증 서버 정보(이미지 검증에 필요함), 컨테이너에 전달해야 하는 환경 변수, Docker Compose 파일 또는 컨테이너 정보가 포함된 Pod 설명자입니다.
Docker 작성 파일을 사용하는 경우 하나의 컨테이너만 지원됩니다. 팟 (Pod) 디스크립터는 하나 이상의 컨테이너를 지원합니다.
배치자는 IBM Cloud와 밀접하게 작업합니다. 이 개인은 워크로드 개인으로부터 워크로드 정보 (암호화된 워크로드 섹션이 권장됨) 를 수신합니다. 그러면 배치자는 계약의 env
섹션을 작성합니다. env
섹션에는 IBM Cloud 환경에 특정한 정보가 있습니다. 일반적으로 워크로드 페르소나에는 없으며 알 필요가 없는 정보입니다. 예를 들어, 배치자가 계약의 env
섹션에 정보를 추가하기 전에 작성하는 IBM Cloud 로깅 인스턴스에 대한 정보가 있습니다.
워크로드 섹션
이 부분은 계약서에서 가장 중요한 부분 중 하나입니다. workload
섹션에는 여러 서브섹션이 있을 수 있으며 서브섹션의 목적은 워크로드를 가져오는 데 필요한 정보를 제공하는 것입니다. workload
섹션은 다음 하위 섹션을 포함할 수 있는 상위 섹션입니다.
type
: 작업량. 이 서브섹션은 필수입니다.auths
이 서브섹션은 선택적입니다.compose
(단일 컨테이너의 경우) 또는play
(단일 컨테이너 또는 다중 컨테이너의 경우). 이들은 상호 배타적이며 섹션 중 하나가 존재해야 합니다.images
이 서브섹션은 선택적입니다.volumes
이 서브섹션은 선택적입니다.
다음 스니펫은 계약의 워크로드 섹션에 대한 상위 레벨 샘플을 보여줍니다. 워크로드 섹션에 필요한 최소 사항습니다, 중 테이블 섹션입니다. 요구사항에 따라 다른 섹션을 추가할 수 있습니다.
workload: |
type: workload
auths:
<registry url>:
password: <password>
username: <user name>
<registry url>:
password: <password>
username: <user name>
compose:
archive: <base64 encoded of tgz of docker-compose.yaml>
images:
dct:
<docker image name (without the tag, an example is docker.io/redbookuser/s390x:)>:
notary: "<notary URL>"
publicKey: <docker content trust signed public key>
<docker image name>:
notary: "<notary URL>"
publicKey: <docker content trust signed public key>
volumes:
<volume key>:
mount: "<data volume mount path>"
seed: "<Passphrase of the luks encryption>"
filesystem: "ext4"
auths
서브섹션
auths
섹션은 컨테이너의 레지스트리에 대한 정보로 구성됩니다. 공용 이미지가 계약에서 사용되는 경우에는 신임 정보가 필요하지 않으므로 auths
섹션이 필요하지 않습니다. auths
서브섹션은 컨테이너 이미지가 개인용인 경우에만 필요합니다. 이 하위 섹션에는 다음 샘플에 표시된 대로 이미지 정보가 없습니다. 이 서브섹션에는 이미지 레지스트리의 이름과 동일한
사용자 이름 암호와 같은 신임 정보가 포함되어야 합니다. 키는 호스트 이름이어야 합니다. Container Registry 또는 기본 docker 레지스트리에 대한 다음 문자열:
https://index.docker.io/v1/
다음 스니펫은 IBM Cloud 레지스트리의 예를 보여줍니다. API키 사용에 대한 자세한 정보는 클라이언트 소프트웨어를 사용하여 자동화에서 인증 을 참조하십시오.
auths:
us.icr.io:
password: <apikey>
username: iamapikey
compose
서브섹션
이는 아카이브 서브섹션으로 구성됩니다. 아카이브 서브섹션에는 docker-compose.yaml
파일의 Base64 인코딩 TGZ 파일 아카이브가 포함되어 있습니다. Hyper Protect Container Runtime 이미지가 Docker Engine 및 Docker Compose 를 사용하여 컨테이너를 시작하므로 컨테이너에 대한 정보는 먼저 표준 Docker-compose 파일을 사용하여 작성되어야
합니다. 이 파일은 아카이브되고, Base64 로 인코딩되며, 이 프로세스의 출력은 컴포즈 섹션 내의 아카이브 하위 섹션에 대한 값으로 제공됩니다. 자세한 정보는 Docker Compose개요 를 참조하십시오.
Docker-compose 파일의 볼륨 정보 아래에 지정된 마운트 포인트는 계약의 워크로드 섹션에 지정된 볼륨 마운트 포인트와 정렬될 수 있습니다.
Docker 작성 파일의 일부로 빌드를 실행하는 것은 지원되지 않습니다. Docker 작성 파일에 build
섹션이 없는지 확인하십시오.
"yaml" 및 "yml" 형식 모두 docker-compose 파일에 대해 지원됩니다. 다음 도커 컴포즈 파일의 예시를 참조하세요.
version: '3'
services:
nginx:
image: nginx@sha256:e73ba8654ba7fd1834e78a3d4e9d72ffaaa3372d42996af5c34ba3e1abc293e8
privileged: true
user: 0:0
restart: always
ports:
- 80:80
작업 부하 섹션이 사전 암호화되어 있을 때 레지스트리가 알려지지 않은 경우가 있습니다. 예를 들어, 작업량 제공자가 배포자가 레지스트리 미러 또는 개인 Container Registry 를 사용하도록 허용하려는 경우, 레지스트리와 풀 자격 증명을 동적으로 재정의할 수 있습니다. 이 작업은 작업량 제공자와 배포자 사이에 조율되어야 합니다. 자세한 정보는 동적 레지스트리 참조 사용 을 참조하십시오.
다음 단계를 완료하여 Base64 인코딩된 아카이브 파일. 그만큼 Base64 출력은 다음에서 사용할 수 있습니다. compose.b64 파일.
<COMPOSE_Folder>
으로 이동하여 다음 명령을 실행합니다:
tar czvf compose.tgz docker-compose.yml
base64 -w0 compose.tgz > compose.b64
compose tgz 파일에 디렉터리와 일반 파일만 포함되어 있는지 확인하세요. 링크 또는 파이프는 지원되지 않습니다.
compose.b64 의 컨텐츠를 compose - > archive값으로 복사하십시오.
compose:
archive: <paste the content of compose.b64 >
이 예제에서는 다음 출력과 유사한 응답을 볼 수 있습니다.
compose:
archive: H4sIAKOFmGIAA+2RTW6DMBBGs84pRuyB8Q8k+DIRwZOGtmBkkyrcvhgnLVVV1EWkqhJv4ZHt8ednWZvqhWxcmaYzjpKhed08HETMpQRfd3k2VeRhPpEJCUxymTPkIuOALBOIG8DHq3zn4vrSjiqdLY/nsv+xb2w7nRZywlPgo/4THNm3uiKntgCWdO1aowmZnwLUTflECpwo8Jpu9NyZ2zvQgdADFEudoXyQzSu+fPPzseSvedo6qjV7mDa2anZbdH8totL6somtUlvX8K4SJshDsFKU2NmFvAZuMc9U37wceeys+Y6BI8Fi6+6vxK5RS+YFDh6RNu//tuVlZWVJd4BcjKckQAIAAA=
play
서브섹션
에서 play
하위 섹션에서는 다음을 통해 워크로드를 정의할 수 있습니다. 포드 설명자. 각 팟 (Pod) 에는 하나 이상의 컨테이너 정의가 포함될 수 있습니다. 설명자는 다음 중 한 가지 방법으로 제공할 수 있습니다:
-
play
의resources
서브섹션에 있는 일반 YAML 형식.니다 있습니다. 이 섹션은 디스크립터의 배열이며 두 가지 유형의 디스크립터 Pods 및 ConfigMaps를 지원합니다.다음 예제는
resources
섹션을 사용하는 방법을 보여줍니다.workload: | type: workload play: resources: - apiVersion: v1 kind: Pod metadata: name: busybox spec: containers: - name: main image: ... command: - printenv envFrom: - configMapRef: name: contract.config.map optional: false restartPolicy: Never
-
에서
archive
하위 섹션play
, 아카이브는 Base64 인코딩되고 gzip으로 압축된 tar 파일입니다. 팟 (Pod) 또는 ConfigMaps 는 이 tar 파일의 최상위 레벨에서 YAML 파일로 표시됩니다. 또한, 파일 내에 추가 파일이 포함되어 있을 수 있으며, 모든 파일은 Pod가 시작되기 전에 호스트 파일 시스템으로 추출됩니다. 현재 작업 디렉토리 는 파일이 추출된 디렉토리이므로 상대 경로가 있는 볼륨 마운트를 사용하여 YAML 파일에서 파일 또는 디렉토리를 마운트할 수 있습니다.예:
workload: | type: workload play: archive: ${COMPOSE_VALUE} auths: us.icr.io: username: iamapikey password: Eqx0TS.... volumes: test-volume: mount: /var/hyperprotect seed: "workload phrase" filesystem: ext4
-
play
의templates
서브섹션에 있는 템플리트 형식으로. 이 섹션은 YAML 형식의 디스크립터 배열입니다. 포드 또는 ConfigMaps 설명자를 작성할 때 알려지지 않은 가변성 포인트(POV)를 가질 수 있습니다. 이러한 POV는 템플릿으로 표현될 수 있으며, 계약의 정보로부터 배포 시점에 값이 완성됩니다. go 템플리트 를 템플리트 구문으로 사용합니다. 이 구문은 helm 차트에 사용되는 것과 동일하므로 템플리트를 k8s와 쉽게 교환할 수 있습니다. 다음Built-In
오브젝트를 지원합니다.- 환경: 이 오브젝트에는 워크로드와 환경 섹션 사이에 병합된 환경 변수가 포함되어 있습니다. 오브젝트는
{{ .Env }}
로 사용 가능합니다.
예:
workload: | type: workload auths: docker.io: password: <password> username: test play: templates: - apiVersion: v1 kind: Pod metadata: name: busybox spec: containers: - name: main image: "{{ .Env.REGISTRY }}/hpse-docker-busybox-s390x@sha256:732efa374f1e6c964caeacab0bcb370385ee386041a14d4a32176462e3f75c7b" command: - printenv envFrom: - configMapRef: name: contract.config.map optional: false restartPolicy: Never env: | type: env logging: logRouter: hostname: 34be57c7-6ff2-4685-8839-903921e90ab9.ingress.jp-tok.logs.cloud.ibm.com iamApiKey: <iamApiKey of the service instance> / xxxx port: 443 env: REGISTRY: docker-io/test
{{ .Env REGISTRY }}
표현식은 이 예에서 계약의env
섹션에 정의된REGISTRY
환경 변수를 참조합니다.템플리트는 유효한 YAML이어야 하므로, 대체 표현식이 문자열의 첫 번째 파트로 표시되는 경우에는 이스케이프되어야 합니다. 그렇지 않으면 다음과 충돌합니다. 블록 매핑 통사론. 이것은 모델 표현 대신 문서의 텍스트 표현에 표현식이 적용되는 헬름 템플릿 과는 다릅니다.
- 환경: 이 오브젝트에는 워크로드와 환경 섹션 사이에 병합된 환경 변수가 포함되어 있습니다. 오브젝트는
환경 변수
계약에서 workload
및 env
섹션에 환경 변수를 정의할 수 있습니다. 두 변수 세트 모두 workload
가 우선하여 함께 병합됩니다. 팟 (Pod) 은 ConfigMap 의 개념을 사용하여 구성을 정의하므로 HPCR은 병합된 환경 섹션을 contract.config.map
라는 특수 ConfigMap 으로 표시합니다. 다음 예제는 계약의 모든 환경 변수를 컨테이너에 마운트합니다.
apiVersion: v1
kind: Pod
metadata:
name: busybox
spec:
containers:
- name: main
image: ...
command:
- printenv
envFrom:
- configMapRef:
name: contract.config.map
optional: false
restartPolicy: Never
팟 (Pod)
-
컨테이너 대 컨테이너
하나의 Pod 내의 컨테이너는 다음을 통해 서로 통신합니다.
localhost
. 컨테이너는 설계상 IP 주소를 공유하기 때문에 각 컨테이너는 서로 다른 포트를 통해 수신 대기해야 합니다. -
팟 (Pod) 대 호스트
보통 포드는 적어도 하나의 컨테이너를 호스트에 노출시켜야 합니다. 그래야 매핑된 포트를 통해 호스트의 IP 주소로 컨테이너에 접근할 수 있기 때문입니다. 이 사용 사례에서는
hostPort
컨테이너의 기능. 이는 Kubernetes 환경에서는 서비스가 대신 사용되는 우수 사례 가 아님 을 참고하십시오.hostPort
및containerPort
를 명시적으로 지정하십시오.containerPort
만 지정하는 경우 포트가 바인드되지 않습니다.예:
apiVersion: v1 kind: Pod metadata: name: nginx-with-busybox spec: containers: - image: ... name: frontend ports: - containerPort: 80 hostPort: 80 volumeMounts: - mountPath: /etc/nginx name: local-frontend readOnly: true - command: - httpd - -vv - -f - -p - "8080" - -h - /www image: ... name: backend volumeMounts: - mountPath: /www name: local-backend readOnly: true volumes: - hostPath: path: ./www type: Directory name: local-backend - hostPath: path: ./nginx type: Directory name: local-frontend
-
팟 (Pod) 대 팟
한 팟 (Pod) 에서 다른 팟 (Pod) 으로 도달하려면 대상 팟 (Pod) 에서
hostPort
을 노출하십시오. 그러면 소스 팟 (Pod) 이 노출된 포트의 호스트에 요청하여 대상 팟 (Pod) 에 도달할 수 있습니다.소스 포드는 다음 명령어를 통해 호스트의 IP 주소를 찾을 수 있습니다.
ip route | awk '/default/ { print $3 }'
볼륨
Hyper Protect Container Runtime의 경우, 볼륨은 계약의 볼륨 섹션에서 관리됩니다. 이 정보를 기반으로 HPCR은 호스트에 외부 블록 장치를 암호화하고 마운트합니다. 이러한 볼륨을 팟 (Pod) 에 마운트하려면 볼륨에서 hostPath 마운트 옵션을 사용하십시오.
예:
apiVersion: v1
kind: Pod
metadata:
name: busybox
spec:
containers:
- name: main
image: ...
volumeMounts:
- name: test-volume
readOnly: true
mountPath: /fromHost
volumes:
- name: test-volume
hostPath:
path: /var/hyperprotect
type: Directory
restartPolicy: Never
여기서 volumes
필드는 팟 (Pod) 에 마운트될 호스트의 데이터를 정의합니다. HPCR 계약의 volumes
와는 다릅니다.
images
서브섹션
images
서브섹션은 서명된 이미지에만 적용됩니다.
Docker Compose에 의해 설명된 이미지
docker-compose 파일에 나열된 컨테이너 이미지는 Docker DCT (Content Trust) 를 사용하여 서명하거나 서명하지 않을 수 있습니다.
다음 예제는 이미지 URL 를 보여줍니다:
<container registry>/<username or namespace>/<image name>
eg- us.icr.io/mynamespace/my-haproxy:
다음은 공증인의 예입니다 URL:
notary: "https://notary.us.icr.io"
publicKey
는 DCT를 사용하여 이미지에 서명하는 데 사용되는 해당 공개 키입니다. 다음 명령을 사용하여 공개 키를 받습니다:
cat ~/.docker/trust/tuf/us.icr.io/<username>/<imagename>/metadata/root.json
다음 코드 조각이 그 예입니다:
images:
dct:
us.icr.io/mynamespace/my-haproxy:
notary: "https://notary.us.icr.io"
publicKey: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUJpRENDQVM2Z0F3SUJBZ0lSQUxCMXBPYlpEQlRRc09GSFlxazMzaWd3Q2dZSUtvWkl6ajBFQXdJd0tqRW8KTUNZR0ExVUVBeE1mZFhNdWFXTnlMbWx2TDNCeVlXSm9ZWFF4TWpNdmJYa3RhR0Z3Y205NGVUQWVGdzB5TWpBMApNVE14TURFd01ETmFGdzB6TWpBME1UQXhNREV3TUROYU1Db3hLREFtQmdOVkJBTVRIM1Z6TG1samNpNXBieTl3CmNtRmlhR0YwTVRJekwyMTVMV2hoY0hKdmVIa3dXVEFUQmdjcWhrak9QUUlCQmdncWhrak9QUU1CQndOQ0FBU1AKWGsrelE2MlFZNjI3MWQ1cTBMZHY3SGc3QzZkMGZOUlRsQmJXekhOWWFDZzlpU0piYnVNdjVBY0JmMjlqQi83eApqYzhzVitxMksyemtkTHV4QWxGWm96VXdNekFPQmdOVkhROEJBZjhFQkFNQ0JhQXdFd1lEVlIwbEJBd3dDZ1lJCkt3WUJCUVVIQXdNd0RBWURWUjBUQVFIL0JBSXdBREFLQmdncWhrak9QUVFEQWdOSUFEQkZBaUIzd0JTa0IxaXAKZHZZYlBMbFBmS3RZT0hsYnZzUllKa0FZM2hnY0xuNWhwQUloQUt6cmhsU3p4K1I5bmdtMTBlZVkyaFNCRmgrawpMWHp6SFkwaktTVzhyM1FhCi0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0K
서명되지 않은 이미지의 경우 이미지 서브섹션에 항목이 필요하지 않습니다. 그러나 서명되지 않은 이미지의 경우 요약이 필요합니다. 요약본을 받으려면 다음 단계를 완료하세요:
- Container Registry 대시보드에 로그인합니다.
- 이미지를 여십시오.
- 태그를 클릭한 후 요약을 클릭하십시오.
요약을 가져온 후 docker-compose.yaml
파일에 이 요약을 추가하십시오. 다음 예를 참조하십시오.
services:
<imagename>:
image: s390x/redis@sha256:db467ab5c53bdeef65762a7534e26fecb94a0f218bd38afd2eaba1a670c472b1
팟 (Pod) 디스크립터에서 설명하는 이미지
Pod 설명자에 의해 기술된 컨테이너 이미지는 Red Hat 의 간단한 서명(Simple Signing)을 통해 검증될 수 있습니다.
이미지가 요약에서 참조되는 경우 서비스는 추가 검사 없이 해당 사용을 허용합니다.
요약이 없는 이미지의 경우 GPG키를 유효성 검증해야 합니다. 키는 생성 가능한 바이너리 형식( Base64 )으로 전송됩니다. 다음 예를 참조하십시오.
gpg -a --export ${KEY_ID}|base64 -w0
이 키는 다음을 통해 전달됩니다.rhs
하위 섹션 images
부분. 이 섹션은 publicKey
필드에 이미지 ID를 키로 사용하고 GPG키를 사용하는 맵입니다.
예:
images:
rhs:
OCI-image-identifier:
publicKey: abcdef
workload
- volumes
서브섹션
volumes
섹션은 작성 시 데이터 볼륨이 인스턴스에 첨부된 경우에만 계약에서 제공해야 합니다. 이 섹션에 제공된 정보는 첨부된 데이터 볼륨(사용자가 제공)을 탑재하는 데 사용되며, 나중에 "시드"를 사용하여 암호화됩니다( workload
및 env
섹션에 제공됨). "마운트" 필드에 대해 선택한 경로를 제공할 수 있습니다.
사용자가 제공하는 경로는 내부적으로 데이터 볼륨을 마운트하는 데 사용됩니다. 컨테이너 워크로드와 관련된 모든 데이터가 이 데이터 볼륨에 저장되도록 하려면, 계약서에 제공된 마운트 경로가 docker-compose.yaml
파일의 볼륨 섹션에 제공된 경로와 일치해야 합니다.
volumes
서브섹션에는 사용자 제공 시드를 사용하여 데이터 볼륨의 자동 암호화를 지원합니다. 데이터 볼륨이 Hyper Protect Virtual Servers 인스턴스에 연결되는 경우 계약의 volumes
하위 섹션에 있는 "seed" 필드를 통해 제공되는 시드를 사용하여 자동으로 암호화됩니다. 따라서 두 개의 시드가 제공되어야 합니다. 하나는 workload
섹션 (워크로드 페르소나에 의해) 을 통해 제공되고 다른 하나는 env
섹션 (배치자 페르소나에 의해) 을 통해 제공됩니다. 이 두 시드는 내부적으로 UTF8 시퀀스로 변환된 후 연결됩니다. 나중에 연결된 시퀀스의 해시 (SHA256) 는 데이터 볼륨을 암호화하기 위해 LUKS 비밀번호 문구로 사용되는 16진다이제스트로 계산됩니다.
다음 명령을 사용하여 헥스다이제스트의 유효성을 검사할 수 있습니다:
echo -n "seed1seed2" | sha256sum
여기서 계약의 워크로드 섹션에서 "시드" 를 제공하는 방법을 학습할 수 있습니다. env
섹션을 통해 "seed" 입력을 제공하는 방법에 대한 자세한 정보는 env
섹션 을 참조하십시오. 암호화를 위해 두 시드를 모두 제공해야 합니다. 제공된 인스턴스 중 하나의 seed만 종료되는 경우
암호화에 실패합니다.
Hyper Protect Crypto Services와 통합하여 저장된 데이터에 상위 레벨의 암호화 보호 및 제어를 추가할 수 있습니다. ibm-hyper-protect-container-runtime-1-0-s390x-11
부터 Hyper Protect Crypto Services 를 사용하여 무작위 값을 세 번째 시드로 생성하고 루트 키로 랩핑할 수 있습니다. LUKS 비밀번호 문구는 세 개 의 시드 (메타데이터 파티션의 시드와 계약의 두 시드) 를 사용하여 생성됩니다. 자세한 정보는 데이터 보안을 참조하십시오.
다음 스니펫은 볼륨 섹션의 예입니다.
volumes:
test:
filesystem: ext4
mount: /mnt/data
seed: "workload phrase"
VPC 인스턴스의 새 Hyper Protect Virtual Servers 의 경우 HPCR 이미지 버전 ibm-hyper-protect-container-runtime-1-0-s390x-9
부터 데이터 볼륨이 두 파트로 파티션됩니다. 첫 번째 파티션 (100Mib) 은 내부 메타데이터용으로 예약되어 있으며 두 번째 파티션은 워크로드용 데이터 볼륨으로 남아 있습니다. 새 볼륨만 파티션되며 이전 했 (스냅샷)
버전의 HPCR 이미지와 함께 파티션된 볼륨을 사용할 수 없습니다. 기존의 암호화된 볼륨을 사용한 프로비저닝도 작동합니다. 차이점은 기존 볼륨이 파티션되지 않으며 이 볼륨을 사용하여 이전 이미지로 돌아갈 수도 있다는 점입니다.
ibm-hyper-protect-container-runtime-1-0-s390x-12
부터 배치자 및 제공자는 "시드 롤링" 기능을 사용할 수 있습니다. 시드를 굴리거나 회전시켜 보안 상태를 높이거나 시드가 손상되는 경우에는 옵션이 제공됩니다. 배치자, 제공자 또는 둘 다에서 시드를 롤링하려는 경우 현재 시드 정보를 previousSeed
매개변수에 지정해야
하며 새 시드 정보를 seed
매개변수에 지정해야 합니다.
다음 스니펫은 볼륨 섹션의 예입니다.
volumes:
test:
filesystem: ext4
mount: /mnt/data
seed: "workload phrase1"
previousSeed: "workload phrase"
ibm-hyper-protect-container-runtime-1-0-s390x-13
부터 가상 서버 인스턴스를 시작할 때 여러 볼륨을 연결할 수 있습니다. 인스턴스가 실행될 때 첨부된 볼륨은 무시됩니다.
다음 스니펫은 볼륨 섹션의 예입니다.
volumes:
test1:
filesystem: "ext4"
mount: "/mnt/data"
seed: "seed1"
test2:
filesystem: "ext4"
mount: "/mnt/test2"
seed: "seed2"
test3:
filesystem: "ext4"
mount: "/mnt/test3"
seed: "seed3"
env
섹션
env
섹션은 계약에서 가장 중요한 섹션 중 하나이기도 합니다. 계약의 env
섹션은 클라우드 환경에 특정하며 워크로드 페르소나에 알려지지 않은 정보를 다룹니다. 이 섹션은 배치자가 작성합니다.
env
섹션의 하위 섹션은 다음과 같습니다.
type
: 환경. 이 서브섹션은 필수입니다.logging
이 서브섹션은 필수입니다.volumes
이 서브섹션은 데이터 볼륨이 연결된 경우에만 사용해야 합니다.signingKey
이 하위 섹션은 계약 서명을 사용하려는 경우에만 사용해야 합니다.env
이 서브섹션은env
변수가 워크로드 제공자에 의해 정의된 경우 이 변수의 값을 지정하는 데 사용됩니다.
logging
서브섹션
ICL
이 섹션에 필요한 최소 하위 섹션은 logRouter입니다. 자세한 내용은 VPC에 대한 Hyper Protect Virtual Servers 로깅 을 참조하세요.
다음 스니펫은 ICL
서브섹션의 예제입니다.
env:
logging:
logRouter:
hostname: <host name of the service instance> /
iamApiKey: <iamApiKey of the service instance> / xxxx
port: <port of the service instance(443)
env
- volumes
서브섹션
이 섹션을 계속하기 전에 워크로드 섹션의 workload-volumes 서브섹션을 읽으십시오. 이미 언급한 대로, 첨부된 데이터 볼륨의 자동 디스크 암호화를 위해 두 개의 고객 seed를 제공해야 합니다. 하나는 workload
- volumes
서브섹션에 있고 다른 하나는 env
- volumes
서브섹션에 있습니다. 시드는 사용자가 선택한 임의의 텍스트일 수 있습니다.
env
- volumes
하위 섹션의 다음 예를 참조하십시오
volumes:
test:
seed: "env phrase"
"시드 롤링" 기능을 사용하는 경우 다음 스니펫을 예로 사용할 수 있습니다.
volumes:
test:
seed: "env phrase1"
previousSeed: "env phrase"
여러 볼륨을 사용하는 경우 배치자는 볼륨이 미리 작성되었는지 확인하고 계약 파일에 볼륨 ID도 지정해야 합니다. 그렇지 않으면 볼륨 이름을 지정하고 동일한 이름으로 볼륨을 작성해야 합니다. 둘 다 지정되지 않으면 볼륨 키가 볼륨 이름으로 간주되며, 가상 서버 인스턴스가 생성되는 동안 또는 그 이전에 동일한 이름으로 볼륨을 생성해야 합니다. 다음 코드 조각이 그 예입니다:
env: |
logging:
logRouter:
hostname: 34be57c7-6ff2-4685-8839-903921e90ab9.ingress.jp-tok.logs.cloud.ibm.com
iamApiKey: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
port: 443
volumes:
test1:
apiKey: "L4SsSE32xxxxxjAgfHCVkdW8xl_CiqMn4Lpc1dzTD"
volumeID: "r006-f7b44467-01af-xxx-xxxx-xxxxxxx"
seed: "seed1"
test2:
apiKey: "L4SsSE32xxxxxjAgfHCVkdW8xl_CiqMn4Lpc1dzTD"
volumeName: "volume2"
seed: "seed2"
test3:
apiKey: "L4SsSE32xxxxxjAgfHCVkdW8xl_CiqMn4Lpc1dzTD"
seed: "seed3"
여기서:
- 볼륨 이름: VPC에서 볼륨을 생성할 때 지정한 이름입니다.
- 볼륨 ID: 작성된 볼륨의 시스템 생성 볼륨 ID입니다.
- 볼륨 키: 각 볼륨의 고유 볼륨 이름입니다.
볼륨 키는 작업량 하위 섹션의 키와 동일해야 합니다.
언급한 대로 Hyper Protect Crypto Services 와 통합하여 세 번째 시드를 생성하고 루트 키로 랩핑할 수 있습니다. 다음 예를 참조하십시오. 자세한 정보는 데이터 보안을 참조하십시오.
volumes:
test:
kms:
- apiKey: "L4SsSE32xxxxxjAgfHCVkdW8xl_CiqMn4Lpc1dzTD"
crn: "crn:v1:bluemix:public:hs-crypto:us-south:a/xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx:xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx:key:xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
type: "public"
- apiKey: "L4SsSE32xxxxxjAgfHCVkdW8xl_CiqMn4Lpc1dzTD"
crn: "crn:v1:bluemix:public:hs-crypto:us-south:a/xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx:xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx:key:xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
type: "private"
seed: "seed1"
apiKey: "**********************"
kmsTimeout: 10
signingKey
서브섹션
사용 방법에 대한 자세한 내용은 signingKey
, 계약서 서명을 참조하세요.
env
서브섹션
-
workload
섹션에서 팟 (Pod) 디스크립터가 사용되는 경우:play
하위 섹션 에서 템플리트 형식에 대한 예제를 참조하십시오. -
Docker 작성 파일이
workload
섹션에서 사용되는 경우:Docker 작성 파일에 환경 섹션이 있는 경우 다음 스니펫을 예제로 사용할 수 있습니다.
environment: KEY1: "${Value1}" KEY2: "${Value2}"
도커 컴포즈 파일에 이전 예제에서 보았던 것처럼 환경 섹션이 있는 경우, deployer의 환경 설정(
env
) 섹션에 값을 전달할 수 있습니다. 다음 예제는env
변수의 값을 지정하는 방법을 보여줍니다.env: value1: "abc" value2: "xyz"
계약 암호화
계약의 컨텐츠를 암호화할 수 있습니다. 암호화 없이 사용자 데이터 를 통해 계약을 전달할 수도 있지만 계약을 암호화하는 것이 좋습니다. 또한 테스트 목적으로 암호화되지 않은 계약을 처음에 사용하도록 권장하며, 예상대로 작동한 후에는 프로덕션 환경에 암호화된 계약을 사용할 수 있습니다.
암호화가 필요한 계약의 섹션을 결정할 수 있습니다. 예를 들어, workload
섹션만 암호화 하거나 env
섹션만 암호화 하도록 선택할 수 있습니다.
VPC 인스턴스의 Hyper Protect Virtual Servers 가 부팅되면 부트 로더가 계약을 복호화합니다. 계약의 각 섹션 값을 사용하고 암호화된 경우 복호화합니다. 섹션이 암호화되지 않은 것을 발견하면 복호화가 없는 것으로 간주합니다. 사용자 데이터 섹션을 통해 입력으로 전달하기 전에 공개 키를 사용하여 계약을 암호화해야 합니다.
암호화 및 증명 인증서는 중간 인증서( IBM )에 의해 서명됩니다. IBM 의 중간 인증서는 IBM 의 Digicert 중간 인증서에 의해 서명되고, 이 인증서는 DigiCert 의 Trusted Root G4 에 의해 서명됩니다. 인증서에 대한 자세한 정보는 DigiCert Trusted Root Authority Certificates를 참조하십시오.
암호화 인증서 다운로드 및 공개 키 추출
-
인증서를 다운로드하십시오. 다음 표에는 이미지의 버전을 기반으로 하는 암호화 인증서 만료 날짜 및 더 이상 사용되지 않는 이미지 날짜가 나열되어 있습니다.
2025년 3월 25일부터 인증서 링크가 변경됩니다.
암호화 인증서 만료 날짜 및 이미지 사용 중단/사용되지 않는 날짜 이미지 버전 인증서 링크 암호화 인증서 만료 날짜 지원 중단 날짜 사용 안함 날짜 ibm-hyper-protect-container-runtime-1-0-s390x-23
인증서 2026년 2월 26일 ibm-hyper-protect-container-runtime-1-0-s390x-22
인증서 2026년 2월 26일 ibm-hyper-protect-container-runtime-1-0-s390x-21
인증서 2026년 2월 26일 ibm-hyper-protect-container-runtime-1-0-s390x-20
인증서 2025년 9월 2일 ibm-hyper-protect-container-runtime-1-0-s390x-19
인증서 2025년 9월 2일 ibm-hyper-protect-container-runtime-1-0-s390x-18
인증서 2025년 7월 4일 ibm-hyper-protect-container-runtime-1-0-s390x-17
인증서 2025년 7월 4일 참고:
- 사용 중단: 이 이미지를 사용하여 IBM Cloud 의 CLI에서 인스턴스를 생성할 수 있습니다. 사용 중단 상태는 상태가 사용 중단으로 변경되기 전에 이미지의 사용을 방해할 수 있습니다.
- 사용 불가: 이 이미지를 사용하여 인스턴스를 만들 수 없습니다. 사용하지 않는 이미지를 인스턴스를 생성하는 데 사용하려고 하면, 해당 이미지를 인스턴스를 생성하는 데 사용할 수 없다는 메시지가 표시됩니다.
- 항상 이미지에 해당하는 암호화 인증서를 다운로드하고 계약을 암호화하세요.
이미지 더 이상 사용되지 않음 또는 더 이상 사용되지 않음 상태를 확인하기 위해 IBM Cloud 이미지 목록 명령을 사용할 수도 있습니다.
이미지 목록 명령에 대한 문서 를 참조하여 이미지의 상태를 가져올 수 있습니다.
-
계약 암호화 인증서 검증 항목의 지침에 따라 암호화 인증서를 검증합니다.
계약의 암호화된 workload
섹션 작성
계약에 있는 섹션의 값은 일반 텍스트이거나 암호화될 수 있습니다. Ubuntu 시스템에서 다음 단계를 완료하여 계약에 사용된 작업 부하 섹션을 암호화하십시오
-
워크로드 요구사항에 따라
docker-compose.yaml
파일을 작성하십시오. 예를 들면 다음과 같습니다.services: redisnode01: image: s390x/redis@sha256:db467ab5c53bdeef65762a7534e26fecb94a0f218bd38afd2eaba1a670c472b1 ports: - "6379:6379"
자세한 정보는 Docker Compose개요 를 참조하십시오.
-
계약의 워크로드 섹션 을 작성하고
workload.yaml
파일에 컨텐츠를 추가하십시오. -
workload.yaml
파일 및ibm-hyper-protect-container-runtime-1-0-s390x-23-encrypt.crt
의 전체 경로를 내보내십시오.WORKLOAD="<PATH to workload.yaml>" CONTRACT_KEY="<PATH to ibm-hyper-protect-container-runtime-1-0-s390x-23-encrypt.crt>"
-
임의의 암호를 생성하려면 다음 명령을 사용하십시오(계약은 임의의 암호를 사용하는 대칭형 AES를 통해 암호화됩니다):
PASSWORD="$(openssl rand 32 | base64 -w0)"
-
다음 명령을 사용하여
ibm-hyper-protect-container-runtime-1-0-s390x-23-encrypt.crt
로 비밀번호를 암호화하십시오.ENCRYPTED_PASSWORD="$(echo -n "$PASSWORD" | base64 -d | openssl rsautl -encrypt -inkey $CONTRACT_KEY -certin | base64 -w0 )"
-
다음 명령을 사용하여 무작위 비밀번호로
workload.yaml
파일을 암호화하십시오.ENCRYPTED_WORKLOAD="$(echo -n "$PASSWORD" | base64 -d | openssl enc -aes-256-cbc -pbkdf2 -pass stdin -in "$WORKLOAD" | base64 -w0)"
-
다음 명령을 사용하여 계약의 암호화된 섹션을 가져오십시오.
echo "hyper-protect-basic.${ENCRYPTED_PASSWORD}.${ENCRYPTED_WORKLOAD}"
-
7단계에서 출력을 가져와서
user-data.yaml
파일에 추가하십시오.workload: hyper-protect-basic.js7TGt77EQ5bgTIKk5C0pViFTRHqWtn..............
hyper-protect-basic
접두부는 필수입니다.
계약의 암호화된 env
섹션 작성
Ubuntu 시스템에서 다음 단계를 완료하여 계약에 사용되는 env
섹션을 암호화하십시오
-
계약의
env
섹션 을 작성하고env.yaml
파일에 컨텐츠를 추가하십시오. -
env.yaml
파일 및ibm-hyper-protect-container-runtime-1-0-s390x-23-encrypt.crt
의 전체 경로를 내보내십시오.ENV="<PATH to env.yaml>" CONTRACT_KEY="<PATH to ibm-hyper-protect-container-runtime-1-0-s390x-23-encrypt.crt>"
-
다음 명령을 사용하여 임의의 비밀번호를 생성합니다:
PASSWORD="$(openssl rand 32 | base64 -w0)"
-
다음 명령을 사용하여
ibm-hyper-protect-container-runtime-1-0-s390x-23-encrypt.crt
로 비밀번호를 암호화하십시오.ENCRYPTED_PASSWORD="$(echo -n "$PASSWORD" | base64 -d | openssl rsautl -encrypt -inkey $CONTRACT_KEY -certin | base64 -w0)"
-
다음 명령을 사용하여 무작위 비밀번호로
env.yaml
를 암호화하십시오.ENCRYPTED_ENV="$(echo -n "$PASSWORD" | base64 -d | openssl enc -aes-256-cbc -pbkdf2 -pass stdin -in "$ENV" | base64 -w0)"
-
다음 명령을 사용하여 계약의 암호화된 섹션을 가져오십시오.
echo "hyper-protect-basic.${ENCRYPTED_PASSWORD}.${ENCRYPTED_ENV}"
-
워크로드 섹션을 암호화하려면 계약의 암호화된
workload
섹션 작성 을 참조하십시오. -
6단계에서 출력을 가져와서
user-data.yaml
파일에 추가하십시오.env: hyper-protect-basic.VWg/5/SWE+9jLfhr8q4i.........
계약 서명
계약 서명은 계약과 함께 사용할 수 있는 선택적 기능입니다. 계약이 입력으로 전달되기 전에 서명하도록 선택할 수 있습니다. 계약 체결 시 계약 만료일을 설정할 수도 있습니다. 일반 텍스트 또는 암호화된 계약에 서명할 수 있습니다. 계약 서명의 유효성 검증은 VPC 이미지에 대해 Hyper Protect Virtual Servers 에 의해 수행됩니다. 이 서명 기능의 목적은 workload
및 env
섹션이 항상 함께 사용되고 써드파티에 의해 변경되지 않도록 하는 것입니다. 이 기능은 장기 구매 계약의 만기 설정도 지원합니다. 즉, 서명이 만료된 후에 인스턴스가 부팅되면 부팅 과정이 실패합니다. workload
및 env
섹션의 서명이 envWorkloadSignature
섹션에 값으로 추가됩니다. 다음은 계약 서명을 작성하고 추가하는 동안 관련된 계약의
두 섹션입니다.
envWorkloadSignature
: 이 섹션은 계약서의 다른 섹션에 서명을 추가하는 곳입니다. 서명되지 않은 계약에는 이 섹션이 필요하지 않습니다.signingKey
: 이 하위 항목은 계약서의 "env
" 섹션에 추가되어야 합니다. 이 하위 섹션은 사용자 생성 공개 키의 값을 담고 있으며, 해당 개인 키는 계약 서명을 생성하는 데 사용되었습니다. 공개 키 또는 인증서는 Base64 문자열로 구문 분석할 수도 있습니다.
Ubuntu 시스템에서 다음 단계를 완료하여 계약 서명을 생성하십시오
-
다음 명령을 사용하여 계약에 서명할 키 쌍을 생성하십시오 ("test1234" 는 키를 생성하기 위한 비밀번호 문구이며 사용자가 직접 사용할 수 있음).
openssl genrsa -aes128 -passout pass:test1234 -out private.pem 4096 openssl rsa -in private.pem -passin pass:test1234 -pubout -out public.pem
-
다음 명령은 서명 키를 가져오는 방법의 예입니다.
key=$(awk -vRS="\n" -vORS="\\\n" '1' public.pem) echo ${key%\\n}
-
선택적으로 서명 키를 다음과 같이 전달하려는 경우 Base64:
key=$(cat public.pem | base64 -w 0) echo $key
-
계약 만료 기능을 활성화하려면 다음 단계를 따르십시오
- 다음 명령을 사용하여 인증서 요청을 생성합니다:
openssl req -new -key private.pem -passin pass:test1234 -out csr.pem
- 이 명령은 인증서를 생성합니다.
- 다음 명령을 사용하여 CA용 개인 키를 생성합니다:
openssl genrsa -out personal_ca.key 2048
- 다음 명령을 사용하여 자체 서명된 CA 인증서를 생성합니다:
openssl req -new -x509 -key personal_ca.key -out personal_ca.crt
- 다음 명령은 자체 서명된 CA 인증서로 CSR에 서명하고 인증서가 유효한 기간을 일수로 표시합니다. 생성된 인증서의 종료 날짜는 장기 구매 계약 만기 날짜입니다.
openssl x509 -req -in csr.pem -CA personal_ca.crt -CAkey personal_ca.key -CAcreateserial -out certificate.pem -days 365
- 다음 명령은 인증서를 가져오는 예입니다.
certificate=$(awk -vRS="\n" -vORS="\\\n" '1' certificate.pem) echo ${certificate%\\n}
- 선택적으로 다음 명령을 예로 사용하여 인증서를 가져옵니다. Base64 체재:
certificate=$(cat certificate.pem | base64 -w 0) echo $certificate
- 다음 명령을 사용하여 인증서 요청을 생성합니다:
-
env.yaml
파일을 만듭니다. 다음 예를 참조하십시오.-
signingkey
가 공개 키인 경우:env: | type: env logging: logRouter: hostname: 34be57c7-6ff2-4685-8839-903921e90ab9.ingress.jp-tok.logs.cloud.ibm.com iamApiKey: <iamApiKey of the service instance> / xxxx port: 443 volumes: test: seed: "hogwarts" signingKey: "-----BEGIN PUBLIC KEY-----\nMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAvLaeSA8Nc3p99HNUMwon\n5lMMALAsIxRRpWUaEZ5IcUky2sgCi/rSmxU2sm6FK/BmCftk33f5W2BsYHdY9R/0\nELZ9A4POQcJsPF3ronU2QHwnRjcqYuUFXmf1VqfPPLpELriFNoCb2FN2zCa+VUmu\n+fGhroZ3Fr9kBPwJhGr917E5jeCQ+MzsGkulcTvr0SfvThiZQQ/KlU0R35ThamF3\n8C0F5IQBpqDUwDFmWvD5lF2SmprpluDBFEj8LLfLxvW9M2Qwku6nGUnnFReg3vNH\n7IF0SRr1K1AdO5hEmevCdyG9hgTdUY6dXcjntiN/kbqXErILknvzDnb4jyPZZRdK\ndrOzVt8hjbdmkS396SrMFtA++QrV3GNZl5zCscpn6d8S7BEA8mDzroo2UAbrypVP\n9l9AmzUnmnPCpZQySUUHoY0xG2vgMSA50CWH7Uwjmpixr02Td4/LU8fE7NWCO6ci\nx4++ANSaxu+uuZ2Pe1OjjgV98r06ZUs38eaxptLZqLpn3N6w8WAJxGwSLapZwNtP\ng2spUXu2Eh/TN5t4/ly5iXOsyIy8IPtTrUPX7rpaaqFZ72P6BJLj3WLEvOG/eF/8\nBTjrsZAjb8YjkO1uGk10IPa63sniZWe5vlm9w9UKy2uGuy6RhWxwoVHRRbfhboQF\nsO20dsVwgTZn8c46HMD2PoMCAwEAAQ==\n-----END PUBLIC KEY----"
-
signingkey
가 인증서인 경우:env: | type: env logging: logRouter: hostname: 34be57c7-6ff2-4685-8839-903921e90ab9.ingress.jp-tok.logs.cloud.ibm.com iamApiKey: <iamApiKey of the service instance> / xxxx port: 443 volumes: test: seed: "hogwarts" signingKey: "-----BEGIN CERTIFICATE-----\nMIIFETCCAvkCFBAMxyO6Cl7BNKBGxtlAzHpI2oiNMA0GCSqGSIb3DQEBCwUAMEUx\nCzAJBgNVBAYTAkFVMRMwEQYDVQQIDApTb21lLVN0YXRlMSEwHwYDVQQKDBhJbnRl\ncm5ldCBXaWRnaXRzIFB0eSBMdGQwHhcNMjQwMTMwMDM1ODMzWhcNMjQwNTA5MDM1\nODMzWjBFMQswCQYDVQQGEwJBVTETMBEGA1UECAwKU29tZS1TdGF0ZTEhMB8GA1UE\nCgwYSW50ZXJuZXQgV2lkZ2l0cyBQdHkgTHRkMIICIjANBgkqhkiG9w0BAQEFAAOC\nAg8AMIICCgKCAgEAv5h6i7Fn1DMUM+3AnPPZUNMe1ss3KL/AmUmptwlAPErVoH1k\naiqTUsSNjXctj+nk95I+e2nugw/HlaVT1eRgEtvjssheXKboFn+zW/i31Nq9USgQ\nZA325VtchYlgJLXMPaH/ukBUr0UI4LnjC/dNdAQzKwWPNF2Jlv5wKX8OBVOQO9Df\nExVmcEkKDoh0nZk5eOA8vzJGhfr8TvQx9FQFsP4OXTwQgcdZV26mLm0bMkqEt3o5\n8OSpisqNGY1XnMHjOWNqSbErkpbIKEFAQSnWmzEvJdHsQX+7eTF7CisHJREseT4s\nUSuIFBZKXbS3qq6EL/EYviu0EGnY/rkJJcIRb8hycqHRgoITT2bWT7PSMUyXoX3G\nVKfp/xKFhkYzoRDSb5S0lh8sugmoRkioAkw6G56CP2hablPZRUMmUKceFfOG/k4L\nei8qJtbfQJ9BlCNRPpjqY3sGSdeXI4zefyQ8xxcus9Sl5wXZV86lz2lO/fz3Cvpd\n0eKvfv5uXyvF3O36lrlEERmSukaZYaEJECjxOUeafc7E1DVyIaMpc2SOum1crwMG\nRKhnU1JShDON0yClnKOlACfjFIpdpEMpE4lLps1x+PXV+x21zGBMUvXYa4xpbyWR\nK1gfMWmuvGOivl9y0mPSIeyJ9R/7bSRAbcYJR4N99TrtWxZU1yQi7HSRV5cCAwEA\nATANBgkqhkiG9w0BAQsFAAOCAgEAg006zJ4ZKwT8moOOl3PdThFUcf8rrIlec9Iy\nqPcWSqt5UTeYLIe58oGhhQmcaIRUOQaib5JqH2ukzqpo+gsJ3zZb3eIn4FB7cKef\nLqaiemOveEe1/qSwAGqMZyZELssiOflhnJdzuYSRWO8DO6Q6JMqQthDcw20budjO\nzP4nhXQqT+s8ljzqSJW77hDbrNAezTz/0SJFDtaMBs5UweX//7/4sXtJ8kBIBSxd\n7y4w8tuuxUaXOtYMjNrJAYLwFVeeO8CFURpbEuv7ABT0k8U4E8C6j4U4Jysx4XVP\nZj36rIAtvctchh0yAhHz8whXe1tvaFw9wzRDATnThFAuJG4Z07K2/rlDP9kO9wmn\ng8hHxKeqQMJDp29e0sGkz8oDi6Mz24k9CqFJJ0CUz1ntz7rrDkA3QwQbFRzk938y\n3rSfePO5qXlUQ9mm05hYr1EKKceTLEowc4XOouNLlUWGiRshRR1szMw5C29prFJ2\nyYuV9tBaFYkq7dnh8JnmrreEvAnsKyyECxMmtV/W701OSUYBcThwgAo+hkEeOJ+/\nwrOS7yoJqDF1y+5LLQJmUlrLCPXem3ZTa4UMe1p2g7ge7Dg6Zud9NDBcMigdHByt\nJP/i9PcJSEWrccWJ1ajToUCZ0wqfJ3Z4KqoEd0fadQhb32AuDUbu7E12EUFNPGIH\n8rQKbDU=\n-----END CERTIFICATE-----"
-
만약에
singingkey
는 Base64 인코딩된 서명 키 또는 인증서:env: | type: env logging: logRouter: hostname: 34be57c7-6ff2-4685-8839-903921e90ab9.ingress.jp-tok.logs.cloud.ibm.com iamApiKey: <iamApiKey of the service instance> / xxxx port: 443 volumes: test: seed: "hogwarts" signingKey: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tXG5NSUlGRVRDQ0F2a0NGQkFNeHlPNkNsN0JOS0JHeHRsQXpIcEkyb2lOTUEwR0NTcUdTSWIzRFFFQkN3VUFNRVV4XG5DekFKQmdOVkJBWVRBa0ZWTVJNd0VRWURWUVFJREFwVGIyMWxMVk4wWVhSbE1TRXdId1lEVlFRS0RCaEpiblJsXG5jbTVsZENCWGFXUm5hWFJ6SUZCMGVTQk1kR1F3SGhjTk1qUXdNVE13TURNMU9ETXpXaGNOTWpRd05UQTVNRE0xXG5PRE16V2pCRk1Rc3dDUVlEVlFRR0V3SkJWVEVUTUJFR0ExVUVDQXdLVTI5dFpTMVRkR0YwWlRFaE1COEdBMVVFXG5DZ3dZU1c1MFpYSnVaWFFnVjJsa1oybDBjeUJRZEhrZ1RIUmtNSUlDSWpBTkJna3Foa2lHOXcwQkFRRUZBQU9DXG5BZzhBTUlJQ0NnS0NBZ0VBdjVoNmk3Rm4xRE1VTSszQW5QUFpVTk1lMXNzM0tML0FtVW1wdHdsQVBFclZvSDFrXG5haXFUVXNTTmpYY3RqK25rOTVJK2UybnVndy9IbGFWVDFlUmdFdHZqc3NoZVhLYm9Gbit6Vy9pMzFOcTlVU2dRXG5aQTMyNVZ0Y2hZbGdKTFhNUGFIL3VrQlVyMFVJNExuakMvZE5kQVF6S3dXUE5GMkpsdjV3S1g4T0JWT1FPOURmXG5FeFZtY0VrS0RvaDBuWms1ZU9BOHZ6SkdoZnI4VHZReDlGUUZzUDRPWFR3UWdjZFpWMjZtTG0wYk1rcUV0M281XG44T1NwaXNxTkdZMVhuTUhqT1dOcVNiRXJrcGJJS0VGQVFTbldtekV2SmRIc1FYKzdlVEY3Q2lzSEpSRXNlVDRzXG5VU3VJRkJaS1hiUzNxcTZFTC9FWXZpdTBFR25ZL3JrSkpjSVJiOGh5Y3FIUmdvSVRUMmJXVDdQU01VeVhvWDNHXG5WS2ZwL3hLRmhrWXpvUkRTYjVTMGxoOHN1Z21vUmtpb0FrdzZHNTZDUDJoYWJsUFpSVU1tVUtjZUZmT0cvazRMXG5laThxSnRiZlFKOUJsQ05SUHBqcVkzc0dTZGVYSTR6ZWZ5UTh4eGN1czlTbDV3WFpWODZsejJsTy9mejNDdnBkXG4wZUt2ZnY1dVh5dkYzTzM2bHJsRUVSbVN1a2FaWWFFSkVDanhPVWVhZmM3RTFEVnlJYU1wYzJTT3VtMWNyd01HXG5SS2huVTFKU2hET04weUNsbktPbEFDZmpGSXBkcEVNcEU0bExwczF4K1BYVit4MjF6R0JNVXZYWWE0eHBieVdSXG5LMWdmTVdtdXZHT2l2bDl5MG1QU0lleUo5Ui83YlNSQWJjWUpSNE45OVRydFd4WlUxeVFpN0hTUlY1Y0NBd0VBXG5BVEFOQmdrcWhraUc5dzBCQVFzRkFBT0NBZ0VBZzAwNnpKNFpLd1Q4bW9PT2wzUGRUaEZVY2Y4cnJJbGVjOUl5XG5xUGNXU3F0NVVUZVlMSWU1OG9HaGhRbWNhSVJVT1FhaWI1SnFIMnVrenFwbytnc0ozelpiM2VJbjRGQjdjS2VmXG5McWFpZW1PdmVFZTEvcVN3QUdxTVp5WkVMc3NpT2ZsaG5KZHp1WVNSV084RE82UTZKTXFRdGhEY3cyMGJ1ZGpPXG56UDRuaFhRcVQrczhsanpxU0pXNzdoRGJyTkFlelR6LzBTSkZEdGFNQnM1VXdlWC8vNy80c1h0SjhrQklCU3hkXG43eTR3OHR1dXhVYVhPdFlNak5ySkFZTHdGVmVlTzhDRlVScGJFdXY3QUJUMGs4VTRFOEM2ajRVNEp5c3g0WFZQXG5aajM2cklBdHZjdGNoaDB5QWhIejh3aFhlMXR2YUZ3OXd6UkRBVG5UaEZBdUpHNFowN0syL3JsRFA5a085d21uXG5nOGhIeEtlcVFNSkRwMjllMHNHa3o4b0RpNk16MjRrOUNxRkpKMENVejFudHo3cnJEa0EzUXdRYkZSems5Mzh5XG4zclNmZVBPNXFYbFVROW1tMDVoWXIxRUtLY2VUTEVvd2M0WE9vdU5MbFVXR2lSc2hSUjFzek13NUMyOXByRkoyXG55WXVWOXRCYUZZa3E3ZG5oOEpubXJyZUV2QW5zS3l5RUN4TW10Vi9XNzAxT1NVWUJjVGh3Z0FvK2hrRWVPSisvXG53ck9TN3lvSnFERjF5KzVMTFFKbVVsckxDUFhlbTNaVGE0VU1lMXAyZzdnZTdEZzZadWQ5TkRCY01pZ2RIQnl0XG5KUC9pOVBjSlNFV3JjY1dKMWFqVG9VQ1owd3FmSjNaNEtxb0VkMGZhZFFoYjMyQXVEVWJ1N0UxMkVVRk5QR0lIXG44clFLYkRVPVxuLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLVxu
-
-
env.yaml
파일을 만듭니다. 다음 예를 참조하십시오.env: | type: env logging: logRouter: hostname: 34be57c7-6ff2-4685-8839-903921e90ab9.ingress.jp-tok.logs.cloud.ibm.com iamApiKey: <iamApiKey of the service instance> / xxxx port: 443 volumes: test: seed: "hogwarts" signingKey: "-----BEGIN PUBLIC KEY-----\nMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAvLaeSA8Nc3p99HNUMwon\n5lMMALAsIxRRpWUaEZ5IcUky2sgCi/rSmxU2sm6FK/BmCftk33f5W2BsYHdY9R/0\nELZ9A4POQcJsPF3ronU2QHwnRjcqYuUFXmf1VqfPPLpELriFNoCb2FN2zCa+VUmu\n+fGhroZ3Fr9kBPwJhGr917E5jeCQ+MzsGkulcTvr0SfvThiZQQ/KlU0R35ThamF3\n8C0F5IQBpqDUwDFmWvD5lF2SmprpluDBFEj8LLfLxvW9M2Qwku6nGUnnFReg3vNH\n7IF0SRr1K1AdO5hEmevCdyG9hgTdUY6dXcjntiN/kbqXErILknvzDnb4jyPZZRdK\ndrOzVt8hjbdmkS396SrMFtA++QrV3GNZl5zCscpn6d8S7BEA8mDzroo2UAbrypVP\n9l9AmzUnmnPCpZQySUUHoY0xG2vgMSA50CWH7Uwjmpixr02Td4/LU8fE7NWCO6ci\nx4++ANSaxu+uuZ2Pe1OjjgV98r06ZUs38eaxptLZqLpn3N6w8WAJxGwSLapZwNtP\ng2spUXu2Eh/TN5t4/ly5iXOsyIy8IPtTrUPX7rpaaqFZ72P6BJLj3WLEvOG/eF/8\nBTjrsZAjb8YjkO1uGk10IPa63sniZWe5vlm9w9UKy2uGuy6RhWxwoVHRRbfhboQF\nsO20dsVwgTZn8c46HMD2PoMCAwEAAQ==\n-----END PUBLIC KEY----"
-
다음 명령을 사용하여
env.yaml
및ibm-hyper-protect-container-runtime-1-0-s390x-23-encrypt.crt
의 전체 경로를 내보내십시오.ENV="<PATH to env.yaml>" CONTRACT_KEY="<PATH to ibm-hyper-protect-container-runtime-1-0-s390x-23-encrypt.crt>"
-
다음 명령을 사용하여 임의의 비밀번호를 생성합니다:
PASSWORD="$(openssl rand 32 | base64 -w0)"
-
다음 명령을 사용하여
ibm-hyper-protect-container-runtime-1-0-s390x-23-encrypt.crt.
로 비밀번호를 암호화하십시오.ENCRYPTED_PASSWORD="$(echo -n "$PASSWORD" | base64 -d | openssl rsautl -encrypt -inkey $CONTRACT_KEY -certin | base64 -w0)"
-
다음 명령을 사용하여 무작위 비밀번호로
env.yaml
를 암호화하십시오.
ENCRYPTED_ENV="$(echo -n "$PASSWORD" | base64 -d | openssl enc -aes-256-cbc -pbkdf2 -pass stdin -in "$ENV" | base64 -w0)"
- 다음 명령을 사용하여 암호화된
env
섹션을 추출하십시오.
echo "hyper-protect-basic.${ENCRYPTED_PASSWORD}.${ENCRYPTED_ENV}"
4-8단계는 env
섹션을 암호화하는 데 사용됩니다. 이 섹션을 암호화하지 않도록 선택하는 경우 다음 단계를 건너뛰십시오.
계약 만료에 대한 알림이 로깅 서비스로 전송됩니다. 알림의 타임라인은 다음과 같습니다.
- 매월 1 일
- 만기 전 30일동안 매일
- 계약이 7일후에 만기될 예정인 경우 4시간마다 한 번
- 계약이 이미 만료되었거나 하루 안에 만료될 경우 매 시간마다
증명 섹션 준비
증명은 계약과 함께 사용할 수 있는 선택적 기능입니다. attestationPublicKey
는 사용자가 제공한 공개 키로서, 증명 문서를 암호화하는 데 사용됩니다. 이는 공개 RSA 키로 제공되거나 Base64 공개 RSA 키를 계약의 일부로 인코딩합니다.
-
yaml 파일에서
attestationPublicKey
에 대해 일반 텍스트 공용 RSA키를 사용하는 경우 다음 예제를 사용하십시오.attestationPublicKey: "-----BEGIN PUBLIC KEY-----\nMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAvLaeSA8Nc3p99HNUMwon\n5lMMALAsIxRRpWUaEZ5IcUky2sgCi/rSmxU2sm6FK/BmCftk33f5W2BsYHdY9R/0\nELZ9A4POQcJsPF3ronU2QHwnRjcqYuUFXmf1VqfPPLpELriFNoCb2FN2zCa+VUmu\n+fGhroZ3Fr9kBPwJhGr917E5jeCQ+MzsGkulcTvr0SfvThiZQQ/KlU0R35ThamF3\n8C0F5IQBpqDUwDFmWvD5lF2SmprpluDBFEj8LLfLxvW9M2Qwku6nGUnnFReg3vNH\n7IF0SRr1K1AdO5hEmevCdyG9hgTdUY6dXcjntiN/kbqXErILknvzDnb4jyPZZRdK\ndrOzVt8hjbdmkS396SrMFtA++QrV3GNZl5zCscpn6d8S7BEA8mDzroo2UAbrypVP\n9l9AmzUnmnPCpZQySUUHoY0xG2vgMSA50CWH7Uwjmpixr02Td4/LU8fE7NWCO6ci\nx4++ANSaxu+uuZ2Pe1OjjgV98r06ZUs38eaxptLZqLpn3N6w8WAJxGwSLapZwNtP\ng2spUXu2Eh/TN5t4/ly5iXOsyIy8IPtTrUPX7rpaaqFZ72P6BJLj3WLEvOG/eF/8\nBTjrsZAjb8YjkO1uGk10IPa63sniZWe5vlm9w9UKy2uGuy6RhWxwoVHRRbfhboQF\nsO20dsVwgTZn8c46HMD2PoMCAwEAAQ==\n-----END PUBLIC KEY----"
-
당신이 사용하는 경우 Base64 인코딩된 서명 키
attestationPublicKey
yaml 파일에서 다음 명령과 예제를 사용합니다.base64 -w0 <public RSA key file>
<public RSA key file>
를 실제 공개 RSA키 파일에 대한 경로로 바꿔야 합니다.attestationPublicKey: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUJpRENDQVM2Z0F3SUJBZ0lSQUxCMXBPYlpEQlRRc09GSFlxazMzaWd3Q2dZSUtvWkl6ajBFQXdJd0tqRW8KTUNZR0ExVUVBeE1mZFhNdWFXTnlMbWx2TDNCeVlXSm9ZWFF4TWpNdmJYa3RhR0Z3Y205NGVUQWVGdzB5TWpBMApNVE14TURFd01ETmFGdzB6TWpBME1UQXhNREV3TUROYU1Db3hLREFtQmdOVkJBTVRIM1Z6TG1samNpNXBieTl3CmNtRmlhR0YwTVRJekwyMTVMV2hoY0hKdmVIa3dXVEFUQmdjcWhrak9QUUlCQmdncWhrak9QUU1CQndOQ0FBU1AKWGsrelE2MlFZNjI3MWQ1cTBMZHY3SGc3QzZkMGZOUlRsQmJXekhOWWFDZzlpU0piYnVNdjVBY0JmMjlqQi83eApqYzhzVitxMksyemtkTHV4QWxGWm96VXdNekFPQmdOVkhROEJBZjhFQkFNQ0JhQXdFd1lEVlIwbEJBd3dDZ1lJCkt3WUJCUVVIQXdNd0RBWURWUjBUQVFIL0JBSXdBREFLQmdncWhrak9QUVFEQWdOSUFEQkZBaUIzd0JTa0IxaXAKZHZZYlBMbFBmS3RZT0hsYnZzUllKa0FZM2hnY0xuNWhwQUloQUt6cmhsU3p4K1I5bmdtMTBlZVkyaFNCRmgrawpMWHp6SFkwaktTVzhyM1FhCi0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0K
-
attestationPublicKey
를 yaml 파일로 암호화한 경우, 계약 암호화에 언급된 것과 동일한 단계를 따라야 합니다.증명 문서를 복호화하려면 증명 문서 복호화 의 지시사항을 따르십시오.
서명 준비
Ubuntu 시스템에서 다음 단계를 완료하여 서명을 준비하십시오
계약의 암호화된 workload
만들기 섹션 과 계약의 암호화된 env
만들기 섹션 에 있는 암호화된 user-data.yaml
가 있다면, 3단계로 건너뛰십시오.
-
암호화된
workload.yaml
및 암호화된env.yaml
파일을 가져오십시오. -
이를
user-data.yaml
파일에 추가하십시오.workload: hyper-protect-basic.js7TGt77EQ5bgTIKk5C0pViFTRHqWtn.............. env: hyper-protect-basic.VWg/5/SWE+9jLfhr8q4i.........
-
contract.txt
파일을 만듭니다. 먼저workload
의 값을 추가한 다음,user-data.yaml
파일에서env
의 값을 추가합니다.workload
뒤와env
앞에는 공백이나 줄 바꿈이 없어야 합니다. 또한, 파일 끝에 새로운 줄이나 공백이 추가되지 않도록 하십시오.hexdump
와 같은 도구를 사용하여contract.txt
파일의 2진 컨텐츠를 교차 검사하는 것이 좋습니다. 2진 파일 덤프에서0a
ASCII값이 마지막 항목으로 표시되지 않는지 확인하십시오.hyper-protect-basic.js7TGt77EQ5bgTIKk5C0pViFTRHqWtn..............hyper-protect-basic.VWg/5/SWE+9jLfhr8q4i.........
-
다음 명령을 사용하여 서명을 생성하십시오.
echo $(cat contract.txt | tr -d "\n\r" | openssl dgst -sha256 -sign private.pem | openssl enc -base64) | tr -d ' '
-
user-data.yaml
파일에 서명을 추가하십시오.workload: hyper-protect-basic.js7TGt77EQ5bgTIKk5C0pViFTRHqWtn.............. env: hyper-protect-basic.VWg/5/SWE+9jLfhr8q4i......... envWorkloadSignature: Icbm1D/CVpLNYkWRC9e .....
VPC 계약을 위한 단순 Hyper Protect Virtual Servers 시작하기
다음 명령 예제는 Ubuntu 시스템에서 실행됩니다.
1. 로깅 인스턴스의 세부사항 가져오기
IBM Log Analysis 또는 일반 syslog 백엔드를 사용하여 로깅을 구성할 수 있습니다. 이 예제에서는 IBM Log Analysis를 사용합니다. 다양한 플랜 중에서 선택할 수 있습니다. 호스트 이름과 수집 키와 같은 필수 세부 정보를 얻는 방법을 이해하려면 VPC용 Hyper Protect Virtual Servers 의 로깅을 참조하십시오.
2. env
섹션 작성
일반 텍스트 계약을 사용하는 경우 파이프 기호 '|'를 놓치지 않도록 주의하십시오. 섹션을 암호화하려는 경우에는 필요하지 않습니다.
env: |
type: env
logging:
logRouter:
hostname: 34be57c7-6ff2-4685-8839-903921e90ab9.ingress.jp-tok.logs.cloud.ibm.com
iamApiKey: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
port: 443
3. Docker 작성 파일 준비
로깅 세부사항이 있다고 가정하고 단순 Docker 작성 파일을 찾으십시오. 다음 예제에는 공용 NGINX 컨테이너가 있습니다. 예제를 사용하여 docker-compose.yaml 을 작성하십시오.
services:
nginx:
image: docker.io/library/nginx@sha256:b1306efee704017b0e02efadc011d374063a4e9c47b86bdc57744fc3f0666383
ports:
- 80:80
- 443:443
4. Docker-compose 파일의 base64-encoded 버전 가져오기
tar -czvf compose.tgz docker-compose.yaml
base64 -i compose.tgz > compose.b64
5. 작성 섹션 작성
compose:
archive: H4sIADXNg2IAA+3W326CMBQGcK59it555XbanraMq70KlOLIJhjqzPb2q6g3S9xiIi7T75eQlj+hDYcP6vvVuo/hMZsQJc6YsU2+t2NfsmKyyhHLjKRUSmbCTDmpo/e4KQchsqHvNz9d99v5f8of6l/3/jUMi8Puw+fq7XJj7ApsmU/WX2m7r7/j9Abs6s/W2kzQ5aZw2p3XfxuG2PZdIeZ6Poth2LY+xGImRLdsu49dR4h2VS5DsT/yHF9KZWxRSU02NCGkxJJ0FQVSoSlrn8Jba5eyrEsOT55dlduq9sY55sbrhlJpda7HG6/7YRP3YyxETkVOhz6zLtI2++unc/tO5b+84AfgrPyn4JM0pDXyfw3I/32bMvdH5+SfOK0TpdZWIv/XgPzftynX/Udn/f/NmH+l8P+/CuQfAAAAAAAAAAAAAOD2fAEPQbuiACgAAA==
6. 워크로드 섹션 채우기
일반 텍스트 계약서를 사용하는 경우 파이프 기호(|)를 놓치지 않도록 주의하십시오.
workload: |
type: workload
compose:
archive: H4sIADXNg2IAA+3W326CMBQGcK59it555XbanraMq70KlOLIJhjqzPb2q6g3S9xiIi7T75eQlj+hDYcP6vvVuo/hMZsQJc6YsU2+t2NfsmKyyhHLjKRUSmbCTDmpo/e4KQchsqHvNz9d99v5f8of6l/3/jUMi8Puw+fq7XJj7ApsmU/WX2m7r7/j9Abs6s/W2kzQ5aZw2p3XfxuG2PZdIeZ6Poth2LY+xGImRLdsu49dR4h2VS5DsT/yHF9KZWxRSU02NCGkxJJ0FQVSoSlrn8Jba5eyrEsOT55dlduq9sY55sbrhlJpda7HG6/7YRP3YyxETkVOhz6zLtI2++unc/tO5b+84AfgrPyn4JM0pDXyfw3I/32bMvdH5+SfOK0TpdZWIv/XgPzftynX/Udn/f/NmH+l8P+/CuQfAAAAAAAAAAAAAOD2fAEPQbuiACgAAA==
7. 간단한 계약이 준비되었습니다.
env: |
type: env
logging:
logRouter:
hostname: 34be57c7-6ff2-4685-8839-903921e90ab9.ingress.jp-tok.logs.cloud.ibm.com
iamApiKey: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
port: 443
workload: |
type: workload
compose:
archive: H4sIADXNg2IAA+3W326CMBQGcK59it555XbanraMq70KlOLIJhjqzPb2q6g3S9xiIi7T75eQlj+hDYcP6vvVuo/hMZsQJc6YsU2+t2NfsmKyyhHLjKRUSmbCTDmpo/e4KQchsqHvNz9d99v5f8of6l/3/jUMi8Puw+fq7XJj7ApsmU/WX2m7r7/j9Abs6s/W2kzQ5aZw2p3XfxuG2PZdIeZ6Poth2LY+xGImRLdsu49dR4h2VS5DsT/yHF9KZWxRSU02NCGkxJJ0FQVSoSlrn8Jba5eyrEsOT55dlduq9sY55sbrhlJpda7HG6/7YRP3YyxETkVOhz6zLtI2++unc/tO5b+84AfgrPyn4JM0pDXyfw3I/32bMvdH5+SfOK0TpdZWIv/XgPzftynX/Udn/f/NmH+l8P+/CuQfAAAAAAAAAAAAAOD2fAEPQbuiACgAAA==