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 denominato attestationPublicKey.
  • 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) o play (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 resources di play. 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: Never
    

    L'esempio seguente illustra l'uso di initcontainers con la sezione resources:

    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 archive sottosezione di play, 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 templates di play. 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 oggetti Built-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/test
    

    L'espressione {{ .Env REGISTRY }} fa riferimento alla variabile di ambiente REGISTRY che in questo esempio è definita nella sezione env del 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.

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 hostPort caratteristica su un contenitore. Si noti che questa non è una buona pratica nel mondo dell' Kubernetes, in cui verrebbe invece utilizzato un servizio.

    Specificare sia hostPort che containerPort esplicitamente. Se si specifica solo containerPort, 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 hostPort sul 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:

  1. Accedi alla dashboard di Container Registry.
  2. Aprire l'immagine.
  3. 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 15 caratteri. I caratteri ammessi sono i seguenti:
    • Lettere minuscole (a-z)
    • Lettere maiuscole (A-Z)
    • Numeri (0-9)
    • Caratteri speciali !@#$%^&*(),.?":{}|<>_-

È 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 variabili env se 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 env del deployer. Il seguente esempio mostra come specificare i valori per le variabili env:

    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

  1. 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.
Date di scadenza dei certificati di crittografia e date di deprezzamento/ obsolescenza delle immagini
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.

  1. 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:

  1. Creare il file docker-compose.yaml in 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.

  2. 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"
    
  3. Esportare il percorso completo del file workload.yaml e ibm-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>"
    
  4. 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)"
    
  5. A partire da OpenSSL 3.0, il sottocomando OpenSSL rsautl è deprecato e viene sostituito dal sottocomando pkeyutl. Utilizzare uno dei seguenti comandi per criptare la password con ibm-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)"
      
  6. Utilizzare il seguente comando per codificare il file workload.yaml con una password casuale:

    ENCRYPTED_WORKLOAD="$(echo -n "$PASSWORD" | base64 -d | openssl enc -aes-256-cbc -pbkdf2 -pass stdin -in "$WORKLOAD" | base64 -w0)"
    
  7. Utilizzare il seguente comando per ottenere la sezione crittografata del contratto:

    echo "hyper-protect-basic.${ENCRYPTED_PASSWORD}.${ENCRYPTED_WORKLOAD}"
    
  8. 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:

  1. Creare la env sezione del contratto e aggiungere il contenuto nel file env.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"
    
  2. Esportare il percorso completo del file env.yaml e ibm-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>"
    
  3. Utilizza il seguente comando per generare una password casuale:

    PASSWORD="$(openssl rand 32 | base64 -w0)"
    
  4. A partire da OpenSSL 3.0, il sottocomando OpenSSL rsautl è deprecato e viene sostituito dal sottocomando pkeyutl. Utilizzare uno dei seguenti comandi per criptare la password con ibm-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)"
      
  5. Utilizzare il seguente comando per codificare env.yaml con una password casuale:

    ENCRYPTED_ENV="$(echo -n "$PASSWORD" | base64 -d | openssl enc -aes-256-cbc -pbkdf2 -pass stdin -in "$ENV" | base64 -w0)"
    
  6. Utilizzare il seguente comando per ottenere la sezione crittografata del contratto:

    echo "hyper-protect-basic.${ENCRYPTED_PASSWORD}.${ENCRYPTED_ENV}"
    
  7. Per crittografare la sezione del carico di lavoro, vedi Creazione della sezione workload crittografata di un contratto.

  8. 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:

  1. 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
    
  2. 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}
    
  3. Facoltativamente, se desideri passare la chiave di firma come Base64:

    key=$(cat public.pem | base64 -w 0)
    echo $key
    
  4. Facoltativamente, se si desidera abilitare la scadenza del contratto, seguire questi passaggi:

    1. Utilizza il seguente comando per generare una richiesta di certificato:
       openssl req -new -key private.pem -passin pass:test1234 -out csr.pem
    
    1. 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
      
    2. Il seguente comando è un esempio per ottenere il certificato:
      certificate=$(awk -vRS="\n" -vORS="\\\n" '1' certificate.pem)
      echo ${certificate%\\n}
      
    3. Facoltativamente, utilizzare il comando seguente come esempio per ottenere il certificato Base64 formato:
       certificate=$(cat certificate.pem | base64 -w 0)
       echo $certificate
    
  5. Crea il file “ env.yaml ”. Vedi il seguente esempio:

    1. 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----"
    
    1. 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-----"
    
    1. 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
    
  6. 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----"
    
  7. Utilizzare il comando riportato di seguito per esportare il percorso completo di env.yaml e ibm-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>"
    
  8. Utilizza il seguente comando per generare una password casuale:

    PASSWORD="$(openssl rand 32 | base64 -w0)"
    
  9. A partire da OpenSSL 3.0, il sottocomando OpenSSL rsautl è deprecato e viene sostituito dal sottocomando pkeyutl. Utilizzare uno dei seguenti comandi per criptare la password con ibm-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)"
        ```
    
  10. Utilizzare il seguente comando per codificare env.yaml con una password casuale:

    ENCRYPTED_ENV="$(echo -n "$PASSWORD" | base64 -d | openssl enc -aes-256-cbc -pbkdf2 -pass stdin -in "$ENV" | base64 -w0)"
    
  11. Utilizzare il seguente comando per estrarre la sezione env codificata:

    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 attestationPublicKey nel 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 attestationPublicKey nel 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' attestationPublicKey e 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.

  1. Ottenere i file workload.yaml e env.yaml codificati.

  2. Aggiungerli al file user-data.yaml.

    workload: hyper-protect-basic.js7TGt77EQ5bgTIKk5C0pViFTRHqWtn..............
    env: hyper-protect-basic.VWg/5/SWE+9jLfhr8q4i.........
    
  3. Crea il file “ contract.txt ”. Aggiungere prima il valore di workload, poi aggiungere il valore di env dal file user-data.yaml. Assicurati che non ci siano spazi o nuove righe dopo workload e prima di env. Inoltre, assicurati che non venga aggiunta alcuna nuova riga o spazio alla fine del file. Si consiglia di verificare il contenuto binario del file contract.txt con strumenti quali hexdump. Nel dump del file binario, assicurarsi di non visualizzare il valore ASCII 0a come ultima voce.

    hyper-protect-basic.js7TGt77EQ5bgTIKk5C0pViFTRHqWtn..............hyper-protect-basic.VWg/5/SWE+9jLfhr8q4i.........
    
  4. 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 ' '
    
  5. 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==

Passi successivi