Informazioni sul contratto
Il sito IBM Cloud Hyper Protect Virtual Servers per VPC è deprecato. A partire dal 28 febbraio 2026, non sarà più possibile creare nuove istanze. Le istanze esistenti saranno supportate fino al 20 febbraio 2027. Tutte le istanze ancora esistenti a quella data saranno eliminate. È possibile distribuire nuovamente i carichi di lavoro utilizzando IBM Confidential Computing Container Runtime(precedentemente noto come Hyper Protect Virtual Servers ) o IBM Confidential Computing Container Runtime for Red Hat Virtualization Solutions(precedentemente noto come Hyper Protect Container Runtime for Red Hat Virtualization Solutions). Per informazioni sulla migrazione dei dati, consultare la guida Migrazione. Per ulteriori informazioni, vedere l'annuncio di deprezzamento del servizio.
Quando si crea un'istanza IBM CloudHyper Protect Virtual Servers VPC con l'immagine IBM Hyper Protect Container Runtime (HPCR), è necessario specificare un contratto nel campo Dati utente.
Che cos' è un contratto?
Il contratto è un file di definizione nel formato YAML specifico per l'istanza Hyper Protect Virtual Servers for VPC. Questo file deve essere creato dall'utente cloud come prerequisiti per la creazione di un'istanza. Dopo che questo file è stato creato, deve essere passato come input come parte del campo Dati utente quando viene creata una istanza. Non puoi creare un'istanza senza un contratto valido. Se crei un'istanza senza un contratto, la distribuzione viene avviata e quindi non riesce e l'istanza passa allo stato di arresto. Il contratto è specifico per la creazione di un Hyper Protect Virtual Servers per l'istanza VPC ed è un'estensione della tecnologia IBM Secure Execution di Hyper Protect.
Se il carico di lavoro rivela i token decrittati tramite SSH o API REST, i dati decrittati contengono sia il carico di lavoro che i segreti dell'ambiente. Tuttavia, non contiene i semi utilizzati per la crittografia del volume.
Sezioni del contratto
Un file di contratto può avere le seguenti quattro sezioni di alto livello valide, di cui le sezioni workload e env sono obbligatorie.
workloadè una sezione obbligatoria.envè una sezione obbligatoria.attestationPublicKeyè una sezione facoltativa. Puoi fornire una chiave RSA pubblica come parte del contratto, che viene utilizzata per crittografare il documento di attestazione e l'attributo deve essere denominatoattestationPublicKey.envWorkloadSignatureè una sezione facoltativa e contiene la firma delle altre sezioni del contratto.
Le due sezioni principali in un contratto sono le sezioni workload e env. Queste due sezioni sono necessarie perché le informazioni che vengono aggiunte al contratto provengono da due persone diverse, vale a dire il
"carico di lavoro" e la persona "distributore".
La persona del carico di lavoro fornisce informazioni sul contenitore (o carico di lavoro) che deve essere portato in Hyper Protect Virtual Servers per l'istanza VPC. Include informazioni sul nome del contenitore, il Container Registry dove risiede, credenziali del Container Registry, il digest dell'immagine, le informazioni sul server notary (richieste per la convalida dell'immagine), le variabili di ambiente che devono essere passate al contenitore e il file di composizione della finestra mobile o i descrittori pod con le informazioni sul contenitore.
Se si utilizza un file di composizione docker, è supportato solo un contenitore. I descrittori pod supportano uno o più contenitori.
Il deployer lavora a stretto contatto con l' IBM Cloud. Questa persona riceve le informazioni del carico di lavoro (preferibilmente una sezione del carico di lavoro crittografata) dalla persona del carico di lavoro. Il distributore crea quindi
la sezione env del contratto. La env sezione contiene informazioni specifiche relative all'ambiente IBM Cloud. Di solito, si tratta di informazioni che la persona del carico di lavoro non ha e non ha bisogno di conoscere.
Un esempio è rappresentato dalle informazioni sull'istanza di registrazione IBM Cloud, che la persona del distributore crea, prima di aggiungere informazioni alla sezione env del contratto.
La sezione del workload
Questa sezione è una delle più importanti del contratto. La sezione workload può avere più sottosezioni e lo scopo delle sottosezioni è fornire le informazioni richieste per l'aumento del carico di lavoro. La sezione workload è la sezione principale che può avere le seguenti sezioni secondarie:
type: carico di lavoro. Questa sottosezione è obbligatoria.auths. Questa sottosezione è facoltativa.compose(per un singolo contenitore) oplay(per un singolo contenitore o più contenitori). Si escludono a vicenda; deve esistere una delle sezioni.images. Questa sottosezione è facoltativa.volumes. Questa sottosezione è facoltativa.
Il seguente frammento mostra un esempio di alto livello della sezione del carico di lavoro del contratto. Il minimo necessario per una sezione del carico di lavoro è la sezione di composizione. Le altre sezioni possono essere aggiunte in base al requisito.
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"
La sottosezione auths
La sezione auths è costituita da informazioni sul registro del contenitore. Se nel contratto viene utilizzata un'immagine pubblica, non hai bisogno della sezione auths perché non è richiesta alcuna credenziale. La
sottosezione auths è richiesta solo se le immagini del contenitore sono private. Questa sottosezione non contiene informazioni sull'immagine, come mostrato nel seguente esempio. Questa sottosezione deve contenere il nome del
registro immagini e le credenziali come username - password per lo stesso. La chiave deve essere il nome host del file Container Registry o la seguente stringa per il registro docker predefinito:
https://index.docker.io/v1/
Il seguente frammento mostra un esempio per IBM Cloud Registry. Per ulteriori informazioni sull'uso della chiave API, vedi Utilizzo del software client per l'autenticazione nell'automazione.
auths:
us.icr.io:
password: <apikey>
username: iamapikey
La sottosezione compose
Si compone di una sottosezione di archivio. La sottosezione di archiviazione contiene l'archivio file TGZ codificato Base64 del file docker-compose.yaml. Poiché l'immagine Hyper Protect Container Runtime utilizza Docker Engine
e Docker Compose per avviare il contenitore, le informazioni sul contenitore devono prima essere create utilizzando un file docker - compose standard. Questo file viene quindi archiviato e codificato con l' Base64, e l'output di questo processo
viene fornito come valore alla sottosezione dell'archivio, all'interno della sezione di composizione. Per ulteriori informazioni, vedi Panoramica di Docker Compose.
I punti di montaggio specificati nelle informazioni sui volumi del file docker - compose potrebbero essere allineati con il punto di montaggio del volume specificato nella sezione del carico di lavoro del contratto.
L'esecuzione di un build come parte di un file di composizione docker non è supportato. Assicurati che il tuo file docker compose non abbia una sezione build.
Entrambi i formato "yaml" e "yml" sono supportati per il file docker-compose. Si veda il seguente esempio di file docker-compose.
version: '3'
services:
nginx:
image: nginx@sha256:e73ba8654ba7fd1834e78a3d4e9d72ffaaa3372d42996af5c34ba3e1abc293e8
privileged: true
user: 0:0
restart: always
ports:
- 80:80
Esistono casi in cui il registro non è noto quando la sezione del carico di lavoro è pre-crittografata. Ad esempio, quando il fornitore del carico di lavoro desidera consentire al distributore di utilizzare un mirror del registro o un privato Container Registry, è possibile sovrascrivere dinamicamente il registro e le credenziali di pull. Questo sforzo deve essere coordinato tra il fornitore del carico di lavoro e l'addetto all'implementazione. Per ulteriori informazioni, consultare Utilizzo di un riferimento del registro dinamico.
Completa i seguenti passaggi per ottenere il file Base64 file di archivio codificato. IL Base64 l'output è disponibile in compose.b64 file. Passare a <COMPOSE_Folder> ed eseguire questi comandi:
tar czvf compose.tgz docker-compose.yml
base64 -w0 compose.tgz > compose.b64
Assicurati che il file tgz di composizione contenga solo directory e file normali. I collegamenti o i pipe non sono supportati.
Copiare il contenuto di compose.b64 come valore di compose -> archive.
compose:
archive: <paste the content of compose.b64 >
Per questo esempio, dovresti vedere una risposta simile al seguente output:
compose:
archive: H4sIAKOFmGIAA+2RTW6DMBBGs84pRuyB8Q8k+DIRwZOGtmBkkyrcvhgnLVVV1EWkqhJv4ZHt8ednWZvqhWxcmaYzjpKhed08HETMpQRfd3k2VeRhPpEJCUxymTPkIuOALBOIG8DHq3zn4vrSjiqdLY/nsv+xb2w7nRZywlPgo/4THNm3uiKntgCWdO1aowmZnwLUTflECpwo8Jpu9NyZ2zvQgdADFEudoXyQzSu+fPPzseSvedo6qjV7mDa2anZbdH8totL6somtUlvX8K4SJshDsFKU2NmFvAZuMc9U37wceeys+Y6BI8Fi6+6vxK5RS+YFDh6RNu//tuVlZWVJd4BcjKckQAIAAA=
La sottosezione play
Nel play sottosezione attraverso la quale è possibile definire il carico di lavoro Descrittori dei pod. Ogni pod può contenere
una o più definizioni del contenitore. I descrittori possono essere forniti in uno dei seguenti modi:
-
In formato YAML normale nella sottosezione
resourcesdiplay. Questa sezione è un array di descrittori e supporta due tipi di descrittori: Pods e ConfigMaps.Il seguente esempio illustra come utilizzare la sezione
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: NeverL'esempio seguente illustra l'uso di
initcontainerscon la sezioneresources:workload: | type: workload play: resources: - apiVersion: v1 kind: Pod metadata: name: busybox spec: initContainers: - name: attest image: ... volumeMounts: - mountPath: /var/hyperprotect name: datavolume containers: - name: main image: ... command: - printenv envFrom: - configMapRef: name: contract.config.map optional: false restartPolicy: Never -
Nel
archivesottosezione diplay, l'archivio è a Base64 file tar codificato e compresso con gzip. I pod o ConfigMaps sono rappresentati come file YAML, al livello superiore in questo file tar. Il file potrebbe contenere anche file aggiuntivi e tutti i file vengono estratti nel file system host prima dell'avvio dei Pod. La directory di lavoro corrente è la directory in cui sono stati estratti i file, quindi è possibile utilizzare un montaggio di volume con un percorso relativo per montare i file o le directory dal file YAML.Esempio:
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 -
In un formato modello nella sottosezione
templatesdiplay. Questa sezione è un array di descrittori in formato YAML. I pod o ConfigMaps possono avere punti di variabilità (POV) che non sono noti al momento della stesura dei descrittori. Questi POV possono essere rappresentati come modelli e i valori vengono completati al momento della distribuzione a partire dalle informazioni contenute nel contratto. Utilizziamo i template go come sintassi di template, che è la stessa utilizzata per i grafici helm, quindi i template possono facilmente essere scambiati con k8s. Sono supportati i seguenti oggettiBuilt-In:- Ambiente: questo oggetto contiene le variabili di ambiente come unite tra il carico di lavoro e la sezione ambiente. L'oggetto è disponibile come
{{ .Env }}.
Esempio:
workload: | type: workload auths: docker.io: password: <password> username: test play: templates: - apiVersion: v1 kind: Pod metadata: name: busybox spec: initContainers: - name: initcontainer image: docker.io/library/init-config@sha256:b1306efee704017b0e02efadc011d374063a4e9c47b86bdc57744fc3f0666383 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-903921e90ab9.ingress.jp-tok.logs.cloud.ibm.com iamApiKey: <iamApiKey of the service instance> / xxxx port: 443 env: REGISTRY: docker-io/testL'espressione
{{ .Env REGISTRY }}fa riferimento alla variabile di ambienteREGISTRYche in questo esempio è definita nella sezioneenvdel contratto.I modelli devono essere validi YAML, quindi è necessario eseguire l'escape di un'espressione di sostituzione se viene visualizzata come prima parte di una stringa. Altrimenti si scontra con il mappatura dei blocchi sintassi. Questo è diverso dai modelli di timone in cui le espressioni vengono applicate alla rappresentazione testuale del documento invece che alla rappresentazione del modello.
- Ambiente: questo oggetto contiene le variabili di ambiente come unite tra il carico di lavoro e la sezione ambiente. L'oggetto è disponibile come
Variabili di ambiente
Nel contratto, è possibile definire le variabili di ambiente nelle sezioni workload e env. Entrambi gli insiemi di variabili vengono uniti insieme con workload che ha la precedenza. I pod utilizzano
il concetto di ConfigMap per definire la configurazione, in modo che HPCR rappresenti le sezioni dell'ambiente unite come una
ConfigMap speciale denominata contract.config.map. Il seguente esempio monta tutte le variabili di ambiente dal contratto nel contenitore:
apiVersion: v1
kind: Pod
metadata:
name: busybox
spec:
containers:
- name: main
image: ...
command:
- printenv
envFrom:
- configMapRef:
name: contract.config.map
optional: false
restartPolicy: Never
Comunicazione pod
-
Da contenitore a contenitore
I contenitori all'interno di un Pod comunicano tra loro tramite
localhost. Ogni contenitore deve ascoltare su una porta diversa perché condividono l'indirizzo IP per impostazione predefinita. -
Pod da ospitare
Di solito un Pod deve esporre almeno uno dei suoi container all'host in modo che il container sia accessibile attraverso l'indirizzo IP sull'host tramite una porta mappata. Per questo caso d'uso, utilizzare il file
hostPortcaratteristica su un contenitore. Si noti che questa non è una buona pratica nel mondo dell' Kubernetes, in cui verrebbe invece utilizzato un servizio.Specificare sia
hostPortchecontainerPortesplicitamente. Se si specifica solocontainerPort, le porte non sono collegate.Esempio:
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 a Pod
Per passare da un pod all'altro, esponi un
hostPortsul pod di destinazione. Il pod di origine può quindi effettuare una richiesta all'host sulla porta esposta per raggiungere il pod di destinazione.Il Pod di origine può trovare l'indirizzo IP dell'host tramite il seguente comando:
ip route | awk '/default/ { print $3 }'
Volumi
Per Hyper Protect Container Runtime, i volumi sono gestiti dalla sezione volumes nel contratto. Sulla base di queste informazioni, HPCR crittografa e monta dispositivi a blocchi esterni sull'host. Per montare questi volumi nel pod, utilizza l'opzione di montaggio hostPath sul volume.
Esempio:
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
Il campo volumes qui definisce i dati sull'host da montare nel pod. È diverso da volumes nel contratto HPCR.
La sottosezione images
Docker ha annunciato il ritiro di Docker Content Trust (DCT). Poiché il DCT è basato su **Quadro notarile v1 **, che non viene più mantenuto attivamente, non è considerato una soluzione pronta per il futuro o sostenibile per la firma e la verifica delle immagini. Di conseguenza, i clienti sono incoraggiati ad abbandonare il DCT e ad adottare tecnologie di firma e verifica delle immagini conformi all'OCI e in linea con gli attuali standard di sicurezza della catena di fornitura. È possibile migrare le immagini dei container su IBM Cloud Container Registry (ICR). L'ICR si integra con il servizio di firma Red Hat (RHS) come radice di firma affidabile, fornendo un modello di fiducia sostenuto dal fornitore e allineandosi alle migliori pratiche contemporanee in materia di sicurezza dei container e della catena di fornitura. Per ulteriori informazioni, vedere Ritiro di Docker Content Trust.
La sottosezione images è intesa solo per un'immagine firmata.
Immagini descritte da docker compose
L'immagine del contenitore elencata nel file docker - compose può essere firmata o meno utilizzando Docker Content Trust (DCT).
L'esempio seguente mostra un URL di immagine:
<container registry>/<username or namespace>/<image name>
eg- us.icr.io/mynamespace/my-haproxy:
Di seguito è riportato un esempio di atto notarile URL:
notary: "https://notary.us.icr.io"
publicKey è la chiave pubblica corrispondente mediante la quale l'immagine viene firmata utilizzando DCT. Utilizza il seguente comando per ottenere la chiave pubblica:
cat ~/.docker/trust/tuf/us.icr.io/<username>/<imagename>/metadata/root.json
Il frammento di codice seguente ne è un esempio:
images:
dct:
us.icr.io/mynamespace/my-haproxy:
notary: "https://notary.us.icr.io"
publicKey: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUJpRENDQVM2Z0F3SUJBZ0lSQUxCMXBPYlpEQlRRc09GSFlxazMzaWd3Q2dZSUtvWkl6ajBFQXdJd0tqRW8KTUNZR0ExVUVBeE1mZFhNdWFXTnlMbWx2TDNCeVlXSm9ZWFF4TWpNdmJYa3RhR0Z3Y205NGVUQWVGdzB5TWpBMApNVE14TURFd01ETmFGdzB6TWpBME1UQXhNREV3TUROYU1Db3hLREFtQmdOVkJBTVRIM1Z6TG1samNpNXBieTl3CmNtRmlhR0YwTVRJekwyMTVMV2hoY0hKdmVIa3dXVEFUQmdjcWhrak9QUUlCQmdncWhrak9QUU1CQndOQ0FBU1AKWGsrelE2MlFZNjI3MWQ1cTBMZHY3SGc3QzZkMGZOUlRsQmJXekhOWWFDZzlpU0piYnVNdjVBY0JmMjlqQi83eApqYzhzVitxMksyemtkTHV4QWxGWm96VXdNekFPQmdOVkhROEJBZjhFQkFNQ0JhQXdFd1lEVlIwbEJBd3dDZ1lJCkt3WUJCUVVIQXdNd0RBWURWUjBUQVFIL0JBSXdBREFLQmdncWhrak9QUVFEQWdOSUFEQkZBaUIzd0JTa0IxaXAKZHZZYlBMbFBmS3RZT0hsYnZzUllKa0FZM2hnY0xuNWhwQUloQUt6cmhsU3p4K1I5bmdtMTBlZVkyaFNCRmgrawpMWHp6SFkwaktTVzhyM1FhCi0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0K
Per un'immagine non firmata, non è richiesta alcuna voce nella sottosezione delle immagini. Tuttavia, per le immagini non firmate, è richiesto un digest. Per ottenere il digest, segui questi passaggi:
- Accedi alla dashboard di Container Registry.
- Aprire l'immagine.
- Fare clic su Tag, quindi su Digest.
Dopo aver ottenuto il digest, aggiungerlo nel file docker-compose.yaml. Vedi il seguente esempio:
services:
<imagename>:
image: s390x/redis@sha256:db467ab5c53bdeef65762a7534e26fecb94a0f218bd38afd2eaba1a670c472b1
Immagini descritte dai descrittori pod
Le immagini dei container descritte dai descrittori Pod possono essere convalidate tramite Simple Signing ( Red Hat ).
Se all'immagine fa riferimento un digest, il servizio ne consente l'uso senza ulteriori controlli.
Le immagini senza digest hanno bisogno di una chiave GPG per essere convalidate. La chiave viene trasferita in un formato binario codificato in modo crittografico ( Base64 ) che può essere creato. Vedi il seguente esempio:
gpg -a --export ${KEY_ID}|base64 -w0
Questa chiave viene trasmessa attraverso il rhs sottosezione del images sezione. Questa sezione è una mappa con l'identificativo immagine come chiave e la chiave GPG nel campo publicKey:
Esempio:
images:
rhs:
OCI-image-identifier:
publicKey: abcdef
La sottosezione workload- volumes
La sezione volumes deve essere fornita nel contratto solo se un volume di dati è collegato all'istanza al momento della creazione. Le informazioni fornite in questa sezione vengono utilizzate per montare il volume dati allegato
(fornito dall'utente) e vengono successivamente crittografate utilizzando i "semi" forniti nelle sezioni workload e env. Puoi fornire qualsiasi percorso di tua scelta per il campo "mount". Il
percorso fornito dall'utente viene utilizzato internamente per montare il volume di dati. Il percorso di montaggio fornito nel contratto deve corrispondere al percorso fornito nella sezione volumi del file di configurazione del sistema (
docker-compose.yaml ) in modo che tutti i dati associati al carico di lavoro del container siano memorizzati in questo volume di dati.
La sottosezione volumes ha il supporto per la crittografia automatica del volume di dati con le origini fornite dall'utente. Se un volume di dati è collegato all'istanza Hyper Protect Virtual Servers, viene crittografato automaticamente
con i valori di inizializzazione forniti tramite il campo "seed" nelle sottosezioni volumes del contratto. Pertanto, è necessario fornire due elementi di inizializzazione, uno tramite la sezione workload (dalla persona del carico di lavoro) e l'altro tramite la sezione env (dalla persona del distributore). Questi due elementi di inizializzazione vengono convertiti internamente in sequenze UTF8 e concatenati. Successivamente,
l'hash (SHA256) della sequenza concatenata viene calcolato come un hexdigest, che viene utilizzato come passphrase LUKS per crittografare il volume di dati.
Attualmente, i semi di env e workload richiedono una lunghezza minima di 3 caratteri. A partire da marzo 2026, questo minimo sarà portato a 15 caratteri. Qualsiasi
valore di seme inferiore a 15 caratteri dopo il marzo 2026 può causare errori o distribuzioni non riuscite. Per evitare interruzioni, aggiornare al più presto tutti i valori dei semi con una lunghezza di
almeno 15 caratteri. Le regole sono definite nella sezione seguente.
A partire da marzo 2026, dovrete seguire queste regole per creare semi:
- Gli spazi non sono consentiti.
- Deve avere almeno
15caratteri. I caratteri ammessi sono i seguenti:- Lettere minuscole
(a-z) - Lettere maiuscole
(A-Z) - Numeri
(0-9) - Caratteri speciali
!@#$%^&*(),.?":{}|<>_-
- Lettere minuscole
È possibile utilizzare il seguente comando per convalidare l'hexdigest:
echo -n "seed1seed2" | sha256sum
Qui puoi imparare come il "seed" può essere fornito nella sezione del carico di lavoro del contratto. Per ulteriori informazioni su come fornire l'input "seed" attraverso la sezione env, vedi La sezione env.
È obbligatorio fornire entrambi i valori di inizializzazione per la cifratura. La crittografia ha esito negativo se solo una delle istanze fornite viene chiusa.
È possibile aggiungere un livello superiore di protezione e controllo della crittografia ai dati inattivi integrando con Hyper Protect Crypto Services. A partire da ibm-hyper-protect-container-runtime-1-0-s390x-11, è possibile
utilizzare Hyper Protect Crypto Services per generare un valore casuale come terzo seme e avvolgerlo con la chiave root. La passphrase LUKS viene generata utilizzando tre seed - il seed nella partizione dei metadati e i
due seed dal contratto. Per ulteriori informazioni, consultare Protezione dei dati.
Il seguente frammento è un esempio per la sezione dei volumi:
volumes:
test:
filesystem: ext4
mount: /mnt/data
seed: "workload_phrase"
A partire dalla versione dell'immagine ibm-hyper-protect-container-runtime-1-0-s390x-9 HPCR, per le Hyper Protect Virtual Servers nuove istanze VPC, il volume di dati è suddiviso in due parti. La prima partizione ( 100Mib ) è
riservata ai metadati interni; la seconda partizione rimane come volume di dati per il carico di lavoro. Solo i nuovi volumi sono partizionati e non puoi utilizzare il volume partizionato con una vecchia versione dell'immagine HPCR. Funziona
anche il provisioning con un volume crittografato esistente. La differenza è che il volume esistente non viene partizionato ed è anche possibile tornare a un'immagine precedente con questo volume.
A partire da ibm-hyper-protect-container-runtime-1-0-s390x-12, il distributore e il fornitore possono utilizzare la funzione "rolling of seeds". Viene fornita un'opzione per ruotare o ruotare i semi per aumentare la
postura di sicurezza o se il seme è compromesso. Quando il distributore o il fornitore o entrambi desiderano eseguire il rollio dei valori di inizializzazione, le informazioni sul valore di inizializzazione corrente devono essere specificate
nel parametro previousSeed e le nuove informazioni sul valore di inizializzazione devono essere specificate nel parametro seed.
Il seguente frammento è un esempio per la sezione dei volumi:
volumes:
test:
filesystem: ext4
mount: /mnt/data
seed: "workload_phrase1"
previousSeed: "workload_phrase"
A partire da ibm-hyper-protect-container-runtime-1-0-s390x-13, puoi collegare più volumi quando avvii l'istanza del server virtuale. I volumi collegati quando l'istanza è in esecuzione vengono ignorati.
Il seguente frammento è un esempio per la sezione dei volumi:
volumes:
test1:
filesystem: "ext4"
mount: "/mnt/data"
seed: "seed_value_with_minimum_15_characters"
test2:
filesystem: "ext4"
mount: "/mnt/test2"
seed: "seed_value_with_minimum_15_characters"
test3:
filesystem: "ext4"
mount: "/mnt/test3"
seed: "seed_value_with_minimum_15_characters"
La sezione env
La sezione env è anche una delle sezioni più importanti di un contratto. La sezione env di un contratto tratta le informazioni specifiche dell'ambiente cloud e non note alla persona del workload. Questa sezione viene
creata dalla persona del distributore.
Le sottosezioni della sezione env sono:
type: ca. Questa sottosezione è obbligatoria.logging. Questa sottosezione è obbligatoria.volumes. Questa sottosezione deve essere utilizzata solo quando un volume di dati è collegato.signingKey. Questa sottosezione deve essere utilizzata solo quando si desidera utilizzare una firma del contratto.env. Questa sottosezione viene utilizzata per specificare i valori per le variabilienvse sono definite dal provider del carico di lavoro.
La sottosezione logging
ICL
La sottosezione minima richiesta per questa sezione è logRouter. Per ulteriori informazioni, vedere Logging per Hyper Protect Virtual Servers per VPC.
Il seguente frammento è un esempio della sezione secondaria 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)
La sottosezione env- volumes
Leggere la sottosezione workload - volumes della sezione workload prima di continuare con questa sezione. Come già menzionato, per la crittografia del disco automatico del volume di dati collegato, è necessario
fornire due seed del cliente, uno nella sottosezione workload- volumes e l'altro nella sottosezione env- volumes. I semi possono essere qualsiasi testo casuale di vostra scelta.
Vedi il seguente esempio della sottosezione env- volumes:
volumes:
test:
seed: "seed_value_with_minimum_15_characters"
Quando si utilizza la funzione "rolling of seeds", è possibile utilizzare il seguente frammento come esempio:
volumes:
test:
seed: "seed_value_with_minimum_15_characters"
previousSeed: "env_phrase12345"
Quando si utilizzano più volumi, il distributore deve verificare che i volumi vengano creati in anticipo e specificare anche l'ID volume nel file del contratto. Altrimenti, è necessario specificare il nome del volume e il volume deve essere creato con lo stesso nome. Se non vengono specificati entrambi, il tasto del volume viene considerato come nome del volume e il volume deve essere creato con lo stesso nome durante o prima della creazione dell'istanza del server virtuale. Il frammento di codice seguente ne è un esempio:
env: |
logging:
logRouter:
hostname: 34be57c7-6ff2-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: "seed_value_with_minimum_15_characters"
test2:
apiKey: "L4SsSE32xxxxxjAgfHCVkdW8xl_CiqMn4Lpc1dzTD"
volumeName: "volume2"
seed: "seed_value_with_minimum_15_characters"
test3:
apiKey: "L4SsSE32xxxxxjAgfHCVkdW8xl_CiqMn4Lpc1dzTD"
seed: "seed_value_with_minimum_15_characters"
Dove:
- Nome volume: è il nome specificato quando si è creato il volume sul VPC.
- ID volume: è l'ID volume generato dal sistema del volume creato.
- Chiave volume: è il nome volume univoco per ogni volume.
Il tasto del volume deve essere lo stesso del tasto nella sottosezione del carico di lavoro - volumi.
Come detto, puoi eseguire l'integrazione con Hyper Protect Crypto Services per generare un terzo seed e includerlo nella tua chiave root. Vedi il seguente esempio. Per ulteriori informazioni, consultare Protezione dei dati.
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: "seed_value_with_minimum_15_characters"
apiKey: "**********************"
kmsTimeout: 10
sottosezione signingKey
Per ulteriori informazioni su come utilizzare signingKey, vedere Firma del contratto.
sottosezione env
-
Se i descrittori pod vengono utilizzati nella sezione
workload:Consultare l'esempio relativo al formato del modello nella sottosezione
play. -
Se viene utilizzato un file di composizione docker nella sezione
workload:Se il file docker compose ha una sezione di ambiente, puoi utilizzare il seguente frammento come esempio:
environment: KEY1: "${Value1}" KEY2: "${Value2}"Quando il file compose del docker ha una sezione environment, come mostrato nell'esempio precedente, è possibile passare i valori nella sezione
envdel deployer. Il seguente esempio mostra come specificare i valori per le variabilienv:env: value1: "abc" value2: "xyz"
Crittografia del contratto
È possibile codificare il contenuto di un contratto. Anche se puoi anche passare il contratto tramite i Dati dell'utente senza crittografia, ti consigliamo di crittografare il contratto. Si consiglia anche di provare inizialmente a utilizzare un contratto non codificato per scopi di test e, dopo che questo funziona come previsto, è possibile utilizzare un contratto codificato per il proprio ambiente di produzione.
È possibile decidere quali sezioni del contratto necessitano di crittografia. Ad esempio, è possibile scegliere di codificare solo la workload sezione oppure codificare solo la env sezione.
Quando Hyper Protect Virtual Servers per l'istanza VPC viene avviato, il bootloader decodifica il contratto. Prende il valore di ciascuna delle sezioni del contratto e lo decrittografa se è crittografato. Se rileva che una sezione non è crittografata, la considera come se fosse senza alcuna decrittografia. Devi utilizzare la chiave pubblica per crittografare il contratto prima di passarlo come input tramite la sezione Dati utente.
I certificati di crittografia e attestazione sono firmati dal certificato intermedio dell' IBM. Il certificato intermedio dell' IBM, a sua volta firmato dall' IBM, è firmato dal certificato intermedio Digicert, a sua volta firmato dall' DigiCert Trusted Root G4. Per ulteriori informazioni sui certificati, consultare DigiCert Certificati di autorità radice attendibile.
Download del certificato di cifratura ed estrazione della chiave pubblica
- Scarica il certificato. La tabella seguente riporta le date di scadenza dei certificati di crittografia e le date di dismissione/obsolescenza delle immagini in base alla versione dell'immagine.
| Versione immagine | Collegamento certificato | Data di scadenza del certificato di crittografia | Data di deprecazione |
|---|---|---|---|
ibm-hyper-protect-container-runtime-1-0-s390x-29 |
Certificato | 6 luglio 2027 | 6 febbraio 2027 |
ibm-hyper-protect-container-runtime-1-0-s390x-28 |
Certificato | 24 febbraio 2027 | 24 settembre 2026 |
ibm-hyper-protect-container-runtime-1-0-s390x-26 |
Certificato | 24 febbraio 2027 | 24 settembre 2026 |
ibm-hyper-protect-container-runtime-1-0-s390x-25 |
Certificato | 06 agosto 2026 | 31 marzo 2026 |
Nota
- Deprecato- È possibile utilizzare l'immagine per creare un'istanza dalla CLI IBM Cloud. Lo stato deprecato può scoraggiare l'uso dell'immagine prima che il suo stato cambi in obsoleto. Il catalogo immagini mantiene sempre le due versioni più recenti dell'immagine: n e n-1. Quando è disponibile una nuova versione ( n+1 ), il sistema depreca la versione più vecchia ( n-1 ).
- Obsoleto: Dopo la scadenza del certificato associato all'immagine, l'immagine non è più disponibile per il provisioning di un'istanza.
- Scaricare sempre i certificati di crittografia corrispondenti all'immagine e crittografare i contratti.
Per controllare lo stato obsoleto o obsoleto dell'immagine, puoi anche utilizzare il comando IBM Cloud image list.
Puoi fare riferimento alla documentazione per il comando di elenco immagini per ottenere lo stato dell'immagine.
- Convalidare il certificato di crittografia seguendo le istruzioni nell'argomento Convalida del certificato di crittografia del contratto.
Creazione della sezione workload crittografata di un contratto
Il valore di qualsiasi sezione in un contratto può essere testo semplice o crittografato. Completare i seguenti passaggi su un sistema Ubuntu per crittografare la sezione del carico di lavoro utilizzata in un contratto:
-
Creare il file
docker-compose.yamlin base ai requisiti del carico di lavoro. Ad esempio,services: redisnode01: image: s390x/redis@sha256:db467ab5c53bdeef65762a7534e26fecb94a0f218bd38afd2eaba1a670c472b1 ports: - "6379:6379"Per ulteriori informazioni, vedi Panoramica di Docker Compose.
-
Creare la sezione del carico di lavoro del contratto ed aggiungerne il contenuto al file
workload.yaml.Di seguito è riportato un esempio di
workload.yaml:type: workload auths: us.icr.io: password: ${API_KEY} username: iamapikey compose: archive: ${COMPOSE_VALUE} volumes: test0: mount: "/mnt/data" seed: "workload_seed12" filesystem: "ext4" env: key: "value" -
Esportare il percorso completo del file
workload.yamleibm-hyper-protect-container-runtime-1-0-s390x-29-encrypt.crt:WORKLOAD="<PATH to workload.yaml>" CONTRACT_KEY="<PATH to ibm-hyper-protect-container-runtime-1-0-s390x-29-encrypt.crt>" -
Utilizza il seguente comando per creare una password casuale. Il contratto viene crittografato tramite AES simmetrico con una password casuale.
PASSWORD="$(openssl rand 32 | base64 -w0)" -
A partire da OpenSSL 3.0, il sottocomando OpenSSL
rsautlè deprecato e viene sostituito dal sottocomandopkeyutl. Utilizzare uno dei seguenti comandi per criptare la password conibm-hyper-protect-container-runtime-1-0-s390x-29-encrypt.crt:- Utilizzo di
rsautl(deprecato):
ENCRYPTED_PASSWORD="$(echo -n "$PASSWORD" | base64 -d | openssl rsautl -encrypt -inkey $CONTRACT_KEY -certin | base64 -w0)"-
Utilizzando
pkeyutl(consigliato):ENCRYPTED_PASSWORD="$(echo -n "$PASSWORD" | base64 -d | openssl pkeyutl -encrypt -inkey $CONTRACT_KEY -certin -pkeyopt rsa_padding_mode:pkcs1 | base64 -w0)"
- Utilizzo di
-
Utilizzare il seguente comando per codificare il file
workload.yamlcon una password casuale:ENCRYPTED_WORKLOAD="$(echo -n "$PASSWORD" | base64 -d | openssl enc -aes-256-cbc -pbkdf2 -pass stdin -in "$WORKLOAD" | base64 -w0)" -
Utilizzare il seguente comando per ottenere la sezione crittografata del contratto:
echo "hyper-protect-basic.${ENCRYPTED_PASSWORD}.${ENCRYPTED_WORKLOAD}" -
Ottenere l'output dal passo 7 e aggiungerlo al file
user-data.yaml.workload: hyper-protect-basic.js7TGt77EQ5bgTIKk5C0pViFTRHqWtn..............Il prefisso
hyper-protect-basicè obbligatorio.
Creazione della sezione env crittografata di un contratto
Completare i seguenti passaggi su un sistema Ubuntu per crittografare la sezione dell' env e utilizzata in un contratto:
-
Creare la
envsezione del contratto e aggiungere il contenuto nel fileenv.yaml.Di seguito è riportato un esempio di
env.yaml:type: env logging: syslog: hostname: ${RSYSLOG_SERVER_IP} port: 6514 server: "${RSYSLOG_SERVER_ROOT_CA}" cert: "${RSYSLOG_CLIENT_CA}" key: "${RSYSLOG_CLIENT_KEY}" volumes: test0: seed: "stsolutiontest1" -
Esportare il percorso completo del file
env.yamleibm-hyper-protect-container-runtime-1-0-s390x-29-encrypt.crt:ENV="<PATH to env.yaml>" CONTRACT_KEY="<PATH to ibm-hyper-protect-container-runtime-1-0-s390x-29-encrypt.crt>" -
Utilizza il seguente comando per generare una password casuale:
PASSWORD="$(openssl rand 32 | base64 -w0)" -
A partire da OpenSSL 3.0, il sottocomando OpenSSL
rsautlè deprecato e viene sostituito dal sottocomandopkeyutl. Utilizzare uno dei seguenti comandi per criptare la password conibm-hyper-protect-container-runtime-1-0-s390x-29-encrypt.crt:rsautl(deprecato):
ENCRYPTED_PASSWORD="$(echo -n "$PASSWORD" | base64 -d | openssl rsautl -encrypt -inkey $CONTRACT_KEY -certin | base64 -w0)"-
pkeyutl(consigliato):ENCRYPTED_PASSWORD="$(echo -n "$PASSWORD" | base64 -d | openssl pkeyutl -encrypt -inkey $CONTRACT_KEY -certin -pkeyopt rsa_padding_mode:pkcs1 | base64 -w0)"
-
Utilizzare il seguente comando per codificare
env.yamlcon una password casuale:ENCRYPTED_ENV="$(echo -n "$PASSWORD" | base64 -d | openssl enc -aes-256-cbc -pbkdf2 -pass stdin -in "$ENV" | base64 -w0)" -
Utilizzare il seguente comando per ottenere la sezione crittografata del contratto:
echo "hyper-protect-basic.${ENCRYPTED_PASSWORD}.${ENCRYPTED_ENV}" -
Per crittografare la sezione del carico di lavoro, vedi Creazione della sezione
workloadcrittografata di un contratto. -
Ottenere l'output dal passo 6 e aggiungerlo al file
user-data.yaml.env: hyper-protect-basic.VWg/5/SWE+9jLfhr8q4i.........
Firma del contratto
La firma del contratto è una funzione opzionale che si può utilizzare con il contratto. È possibile scegliere di firmare un contratto prima che venga passato come input. È inoltre possibile impostare la scadenza del contratto al momento della
firma. I contratti che sono in testo semplice o crittografati possono essere firmati. La convalida della firma del contratto viene eseguita da Hyper Protect Virtual Servers per l'immagine VPC. Lo scopo di questa funzione di firma è garantire
che le sezioni workload e env siano sempre utilizzate insieme e non manomesse da terze parti. Questa funzione supporta anche l'impostazione della scadenza per il contratto. Cioè, se l'istanza viene avviata dopo la
scadenza della firma, il processo di avvio fallisce. La firma delle sezioni workload e env viene aggiunta come valore alla sezione envWorkloadSignature. Di seguito sono riportate due sezioni di un contratto
che sono rilevanti durante la creazione e l'aggiunta di una firma del contratto:
envWorkloadSignature: In questa sezione viene aggiunta la firma delle altre sezioni del contratto. Questa sezione non è richiesta per un contratto non firmato.signingKey: Questa sottosezione deve essere aggiunta alla sezione "env" del contratto. Questa sottosezione contiene il valore della chiave pubblica generata dall'utente, la cui chiave privata corrispondente è stata utilizzata per creare la firma del contratto. Una chiave pubblica o un certificato possono anche essere analizzati come stringa di tipo " Base64 ".
Completare i seguenti passaggi su un sistema Ubuntu per creare la firma del contratto:
-
Utilizzare il seguente comando per generare la coppia di chiavi per firmare il contratto (notare che "test1234" è la passphrase per generare le chiavi, è possibile utilizzarne una propria):
openssl genrsa -aes128 -passout pass:test1234 -out private.pem 4096 openssl rsa -in private.pem -passin pass:test1234 -pubout -out public.pem -
Il seguente comando è un esempio di come puoi ottenere la chiave di firma:
key=$(awk -vRS="\n" -vORS="\\\n" '1' public.pem) echo ${key%\\n} -
Facoltativamente, se desideri passare la chiave di firma come Base64:
key=$(cat public.pem | base64 -w 0) echo $key -
Facoltativamente, se si desidera abilitare la scadenza del contratto, seguire questi passaggi:
- Utilizza il seguente comando per generare una richiesta di certificato:
openssl req -new -key private.pem -passin pass:test1234 -out csr.pem- Il comando genera il certificato.
- Utilizzare il seguente comando per generare una chiave privata per la CA:
openssl genrsa -out personal_ca.key 2048- Genera un certificato CA autofirmato utilizzando il seguente comando:
openssl req -new -x509 -key personal_ca.key -out personal_ca.crt- Il seguente comando firma CSR con certificato CA autofirmato insieme al numero di giorni di validità del certificato. La data di fine del certificato generato è la data di scadenza del contratto:
openssl x509 -req -in csr.pem -CA personal_ca.crt -CAkey personal_ca.key -CAcreateserial -out certificate.pem -days 365 - Il seguente comando è un esempio per ottenere il certificato:
certificate=$(awk -vRS="\n" -vORS="\\\n" '1' certificate.pem) echo ${certificate%\\n} - Facoltativamente, utilizzare il comando seguente come esempio per ottenere il certificato Base64 formato:
certificate=$(cat certificate.pem | base64 -w 0) echo $certificate -
Crea il file “
env.yaml”. Vedi il seguente esempio:- Se
signingkeyè una chiave pubblica:
env: | type: env logging: logRouter: hostname: 34be57c7-6ff2-903921e90ab9.ingress.jp-tok.logs.cloud.ibm.com iamApiKey: <iamApiKey of the service instance> / xxxx port: 443 volumes: test: seed: "seed_value_with_minimum_15_characters" 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----"- Se
signingkeyè un certificato:
env: | type: env logging: logRouter: hostname: 34be57c7-6ff2-903921e90ab9.ingress.jp-tok.logs.cloud.ibm.com iamApiKey: <iamApiKey of the service instance> / xxxx port: 443 volumes: test: seed: "seed_value_with_minimum_15_characters" 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-----"- Se
signingkeyè un Base64 chiave o certificato di firma codificata:
env: | type: env logging: logRouter: hostname: 34be57c7-6ff2-903921e90ab9.ingress.jp-tok.logs.cloud.ibm.com iamApiKey: <iamApiKey of the service instance> / xxxx port: 443 volumes: test: seed: "seed_value_with_minimum_15_characters" signingKey: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tXG5NSUlGRVRDQ0F2a0NGQkFNeHlPNkNsN0JOS0JHeHRsQXpIcEkyb2lOTUEwR0NTcUdTSWIzRFFFQkN3VUFNRVV4XG5DekFKQmdOVkJBWVRBa0ZWTVJNd0VRWURWUVFJREFwVGIyMWxMVk4wWVhSbE1TRXdId1lEVlFRS0RCaEpiblJsXG5jbTVsZENCWGFXUm5hWFJ6SUZCMGVTQk1kR1F3SGhjTk1qUXdNVE13TURNMU9ETXpXaGNOTWpRd05UQTVNRE0xXG5PRE16V2pCRk1Rc3dDUVlEVlFRR0V3SkJWVEVUTUJFR0ExVUVDQXdLVTI5dFpTMVRkR0YwWlRFaE1COEdBMVVFXG5DZ3dZU1c1MFpYSnVaWFFnVjJsa1oybDBjeUJRZEhrZ1RIUmtNSUlDSWpBTkJna3Foa2lHOXcwQkFRRUZBQU9DXG5BZzhBTUlJQ0NnS0NBZ0VBdjVoNmk3Rm4xRE1VTSszQW5QUFpVTk1lMXNzM0tML0FtVW1wdHdsQVBFclZvSDFrXG5haXFUVXNTTmpYY3RqK25rOTVJK2UybnVndy9IbGFWVDFlUmdFdHZqc3NoZVhLYm9Gbit6Vy9pMzFOcTlVU2dRXG5aQTMyNVZ0Y2hZbGdKTFhNUGFIL3VrQlVyMFVJNExuakMvZE5kQVF6S3dXUE5GMkpsdjV3S1g4T0JWT1FPOURmXG5FeFZtY0VrS0RvaDBuWms1ZU9BOHZ6SkdoZnI4VHZReDlGUUZzUDRPWFR3UWdjZFpWMjZtTG0wYk1rcUV0M281XG44T1NwaXNxTkdZMVhuTUhqT1dOcVNiRXJrcGJJS0VGQVFTbldtekV2SmRIc1FYKzdlVEY3Q2lzSEpSRXNlVDRzXG5VU3VJRkJaS1hiUzNxcTZFTC9FWXZpdTBFR25ZL3JrSkpjSVJiOGh5Y3FIUmdvSVRUMmJXVDdQU01VeVhvWDNHXG5WS2ZwL3hLRmhrWXpvUkRTYjVTMGxoOHN1Z21vUmtpb0FrdzZHNTZDUDJoYWJsUFpSVU1tVUtjZUZmT0cvazRMXG5laThxSnRiZlFKOUJsQ05SUHBqcVkzc0dTZGVYSTR6ZWZ5UTh4eGN1czlTbDV3WFpWODZsejJsTy9mejNDdnBkXG4wZUt2ZnY1dVh5dkYzTzM2bHJsRUVSbVN1a2FaWWFFSkVDanhPVWVhZmM3RTFEVnlJYU1wYzJTT3VtMWNyd01HXG5SS2huVTFKU2hET04weUNsbktPbEFDZmpGSXBkcEVNcEU0bExwczF4K1BYVit4MjF6R0JNVXZYWWE0eHBieVdSXG5LMWdmTVdtdXZHT2l2bDl5MG1QU0lleUo5Ui83YlNSQWJjWUpSNE45OVRydFd4WlUxeVFpN0hTUlY1Y0NBd0VBXG5BVEFOQmdrcWhraUc5dzBCQVFzRkFBT0NBZ0VBZzAwNnpKNFpLd1Q4bW9PT2wzUGRUaEZVY2Y4cnJJbGVjOUl5XG5xUGNXU3F0NVVUZVlMSWU1OG9HaGhRbWNhSVJVT1FhaWI1SnFIMnVrenFwbytnc0ozelpiM2VJbjRGQjdjS2VmXG5McWFpZW1PdmVFZTEvcVN3QUdxTVp5WkVMc3NpT2ZsaG5KZHp1WVNSV084RE82UTZKTXFRdGhEY3cyMGJ1ZGpPXG56UDRuaFhRcVQrczhsanpxU0pXNzdoRGJyTkFlelR6LzBTSkZEdGFNQnM1VXdlWC8vNy80c1h0SjhrQklCU3hkXG43eTR3OHR1dXhVYVhPdFlNak5ySkFZTHdGVmVlTzhDRlVScGJFdXY3QUJUMGs4VTRFOEM2ajRVNEp5c3g0WFZQXG5aajM2cklBdHZjdGNoaDB5QWhIejh3aFhlMXR2YUZ3OXd6UkRBVG5UaEZBdUpHNFowN0syL3JsRFA5a085d21uXG5nOGhIeEtlcVFNSkRwMjllMHNHa3o4b0RpNk16MjRrOUNxRkpKMENVejFudHo3cnJEa0EzUXdRYkZSems5Mzh5XG4zclNmZVBPNXFYbFVROW1tMDVoWXIxRUtLY2VUTEVvd2M0WE9vdU5MbFVXR2lSc2hSUjFzek13NUMyOXByRkoyXG55WXVWOXRCYUZZa3E3ZG5oOEpubXJyZUV2QW5zS3l5RUN4TW10Vi9XNzAxT1NVWUJjVGh3Z0FvK2hrRWVPSisvXG53ck9TN3lvSnFERjF5KzVMTFFKbVVsckxDUFhlbTNaVGE0VU1lMXAyZzdnZTdEZzZadWQ5TkRCY01pZ2RIQnl0XG5KUC9pOVBjSlNFV3JjY1dKMWFqVG9VQ1owd3FmSjNaNEtxb0VkMGZhZFFoYjMyQXVEVWJ1N0UxMkVVRk5QR0lIXG44clFLYkRVPVxuLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLVxu - Se
-
Crea il file “
env.yaml”. Vedi il seguente esempio:env: | type: env logging: logRouter: hostname: 34be57c7-6ff2-903921e90ab9.ingress.jp-tok.logs.cloud.ibm.com iamApiKey: <iamApiKey of the service instance> / xxxx port: 443 volumes: test: seed: "seed_value_with_minimum_15_characters" 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----" -
Utilizzare il comando riportato di seguito per esportare il percorso completo di
env.yamleibm-hyper-protect-container-runtime-1-0-s390x-29-encrypt.crt:ENV="<PATH to env.yaml>" CONTRACT_KEY="<PATH to ibm-hyper-protect-container-runtime-1-0-s390x-29-encrypt.crt>" -
Utilizza il seguente comando per generare una password casuale:
PASSWORD="$(openssl rand 32 | base64 -w0)" -
A partire da OpenSSL 3.0, il sottocomando OpenSSL
rsautlè deprecato e viene sostituito dal sottocomandopkeyutl. Utilizzare uno dei seguenti comandi per criptare la password conibm-hyper-protect-container-runtime-1-0-s390x-29-encrypt.crt:- Utilizzo di
rsautl(deprecato):
ENCRYPTED_PASSWORD="$(echo -n "$PASSWORD" | base64 -d | openssl rsautl -encrypt -inkey $CONTRACT_KEY -certin | base64 -w0)" ``` - Utilizzando `pkeyutl` (consigliato): ```yaml {: pre} ENCRYPTED_PASSWORD="$(echo -n "$PASSWORD" | base64 -d | openssl pkeyutl -encrypt -inkey $CONTRACT_KEY -certin -pkeyopt rsa_padding_mode:pkcs1 | base64 -w0)" ``` - Utilizzo di
-
Utilizzare il seguente comando per codificare
env.yamlcon una password casuale:ENCRYPTED_ENV="$(echo -n "$PASSWORD" | base64 -d | openssl enc -aes-256-cbc -pbkdf2 -pass stdin -in "$ENV" | base64 -w0)" -
Utilizzare il seguente comando per estrarre la sezione
envcodificata:echo "hyper-protect-basic.${ENCRYPTED_PASSWORD}.${ENCRYPTED_ENV}"
I passaggi da 7 a 11 servono a criptare la sezione env. Se si sceglie di non codificare questa sezione, ignorare questi passi.
Una notifica sulla scadenza del contratto viene inviata al tuo servizio di registrazione. Le tempistiche per la notifica sono le seguenti:
- Il primo di ogni mese
- Tutti i giorni 30 giorni prima della scadenza
- Una volta ogni 4 ore se il contratto sta per scadere in 7 giorni
- Ogni ora se il contratto è scaduto o sta per scadere tra 1 giorno
Registri di avviso di scadenza dei certificati di crittografia e attestazione
HPVS registra messaggi di avviso al servizio di registrazione configurato sui certificati di crittografia e di attestazione scaduti o in scadenza.
Il calendario delle notifiche è il seguente:
-
30 giorni prima della scadenza: Ogni 24 ore viene generato un messaggio di avviso che informa che il certificato scadrà tra un mese.
Esempio:
HPL12011W: The Encryption certificate is going to expire -> Warning: The encryption certificate will expire on 12 February 2026 at 16:17:41 UTC, over 20 days. Upgrade to the latest image to unlock the latest features and avoid potential security vulnerabilities!!! -
7 giorni prima della scadenza: I messaggi di avviso vengono registrati ogni 12 ore all'avvicinarsi della data di scadenza, evidenziando la necessità di intervenire.
Esempio:
HPL12011W: The Encryption certificate is going to expire -> Warning: The encryption certificate will expire on 27 January 2026 at 16:17:41 UTC, over 4 days. Upgrade to the latest image to unlock the latest features and avoid potential security vulnerabilities!!! -
Dopo la scadenza del certificato: Se il certificato è scaduto, HPVS registra messaggi di avviso ogni 4 ore fino all'aggiornamento dell'immagine HPVS.
Esempio:
HPL12013W: The Encryption certificate expired -> Urgent: The encryption certificate expired on 15 June 2025 at 17:15:59 UTC, over 7 months. Immediate upgrade to the latest image is required to unlock the latest features and prevent serious security breaches.
Preparazione della sezione Attestazione
L'attestazione è una funzione opzionale che si può utilizzare con il contratto. L' attestationPublicKey, ovvero la chiave pubblica fornita dall'utente, viene utilizzata per crittografare il documento di attestazione. Questo può
essere fornito come chiave RSA pubblica o Base64 codificata della chiave pubblica RSA come parte del contratto.
-
Se si utilizza la chiave RSA pubblica in testo semplice per il file
attestationPublicKeynel file yaml, utilizzare il seguente esempio: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----" -
Se usi il Base64 chiave di firma codificata per il file
attestationPublicKeynel file yaml, utilizza il comando e l'esempio seguenti.base64 -w0 <public RSA key file>Devi sostituire
<public RSA key file>con il percorso del tuo file di chiavi RSA pubblico effettivo.attestationPublicKey: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUJpRENDQVM2Z0F3SUJBZ0lSQUxCMXBPYlpEQlRRc09GSFlxazMzaWd3Q2dZSUtvWkl6ajBFQXdJd0tqRW8KTUNZR0ExVUVBeE1mZFhNdWFXTnlMbWx2TDNCeVlXSm9ZWFF4TWpNdmJYa3RhR0Z3Y205NGVUQWVGdzB5TWpBMApNVE14TURFd01ETmFGdzB6TWpBME1UQXhNREV3TUROYU1Db3hLREFtQmdOVkJBTVRIM1Z6TG1samNpNXBieTl3CmNtRmlhR0YwTVRJekwyMTVMV2hoY0hKdmVIa3dXVEFUQmdjcWhrak9QUUlCQmdncWhrak9QUU1CQndOQ0FBU1AKWGsrelE2MlFZNjI3MWQ1cTBMZHY3SGc3QzZkMGZOUlRsQmJXekhOWWFDZzlpU0piYnVNdjVBY0JmMjlqQi83eApqYzhzVitxMksyemtkTHV4QWxGWm96VXdNekFPQmdOVkhROEJBZjhFQkFNQ0JhQXdFd1lEVlIwbEJBd3dDZ1lJCkt3WUJCUVVIQXdNd0RBWURWUjBUQVFIL0JBSXdBREFLQmdncWhrak9QUVFEQWdOSUFEQkZBaUIzd0JTa0IxaXAKZHZZYlBMbFBmS3RZT0hsYnZzUllKa0FZM2hnY0xuNWhwQUloQUt6cmhsU3p4K1I5bmdtMTBlZVkyaFNCRmgrawpMWHp6SFkwaktTVzhyM1FhCi0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0K -
Se hai criptato l'
attestationPublicKeye nel file yaml, devi seguire gli stessi passaggi indicati nella Crittografia del contratto.Per decodificare il documento di attestazione, segui le istruzioni in Decodifica del documento di attestazione.
Preparazione della firma
Per preparare la firma, completare i seguenti passaggi su un sistema operativo Windows ( Ubuntu ):
Se hai la crittografia user-data.yaml dalla Creazione del cifrato workload sezione di un contratto e creazione del contratto crittografato env sezione di un contratto,
passare al punto 3.
-
Ottenere i file
workload.yamleenv.yamlcodificati. -
Aggiungerli al file
user-data.yaml.workload: hyper-protect-basic.js7TGt77EQ5bgTIKk5C0pViFTRHqWtn.............. env: hyper-protect-basic.VWg/5/SWE+9jLfhr8q4i......... -
Crea il file “
contract.txt”. Aggiungere prima il valore diworkload, poi aggiungere il valore dienvdal fileuser-data.yaml. Assicurati che non ci siano spazi o nuove righe dopoworkloade prima dienv. Inoltre, assicurati che non venga aggiunta alcuna nuova riga o spazio alla fine del file. Si consiglia di verificare il contenuto binario del filecontract.txtcon strumenti qualihexdump. Nel dump del file binario, assicurarsi di non visualizzare il valore ASCII0acome ultima voce.hyper-protect-basic.js7TGt77EQ5bgTIKk5C0pViFTRHqWtn..............hyper-protect-basic.VWg/5/SWE+9jLfhr8q4i......... -
Per generare la firma, utilizzare il seguente comando:
echo $(cat contract.txt | tr -d "\n\r" | openssl dgst -sha256 -sign private.pem | openssl enc -base64) | tr -d ' ' -
Aggiungere la firma nel file
user-data.yaml:workload: hyper-protect-basic.js7TGt77EQ5bgTIKk5C0pViFTRHqWtn.............. env: hyper-protect-basic.VWg/5/SWE+9jLfhr8q4i......... envWorkloadSignature: Icbm1D/CVpLNYkWRC9e .....
Introduzione a un semplice Hyper Protect Virtual Servers per il contratto VPC
I seguenti esempi di comando vengono eseguiti su un sistema Ubuntu.
1. Ottieni i dettagli della tua istanza di registrazione
È possibile configurare la registrazione con IBM Log Analysis o un backend syslog generico. Questo esempio utilizza IBM Log Analysis. Puoi scegliere tra diversi piani. Per capire come ottenere i dettagli richiesti, come il nome host e la chiave di ingestione, vedere Logging for Hyper Protect Virtual Servers per VPC.
2. Crea una sezione env
Assicurati di non perdere il simbolo del tubo '|' se stai usando un contratto di testo normale. Non è richiesto se si prevede di crittografare la sezione.
env: |
type: env
logging:
logRouter:
hostname: 34be57c7-6ff2-903921e90ab9.ingress.jp-tok.logs.cloud.ibm.com
iamApiKey: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
port: 443
3. Preparazione del file docker-compose
Supponendo che tu abbia i dettagli di registrazione, trova un semplice file docker compose. L'esempio seguente ha un contenitore pubblico NGINX. Creare un sito docker-compose.yaml utilizzando l'esempio.
services:
nginx:
image: docker.io/library/nginx@sha256:b1306efee704017b0e02efadc011d374063a4e9c47b86bdc57744fc3f0666383
ports:
- 80:80
- 443:443
4. Ottieni la versione base64-encoded del file docker - compose
tar -czvf compose.tgz docker-compose.yaml
base64 -i compose.tgz > compose.b64
5. Crea la sezione di composizione con essa
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. Popolare la sezione del carico di lavoro
Assicurati di non perdere il simbolo del tubo (|) se stai usando un contratto in testo normale.
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. Il tuo semplice contratto è pronto
env: |
type: env
logging:
logRouter:
hostname: 34be57c7-6ff2-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==