A propos du contrat

Le site IBM Cloud Hyper Protect Virtual Servers pour VPC est obsolète. À partir du 28 février 2026, vous ne pourrez plus créer de nouvelles instances. Les instances existantes seront prises en charge jusqu’au 20 février 2027. Toutes les instances qui existeront encore à cette date seront supprimées. Vous pouvez redéployer vos charges de travail en utilisant IBM Confidential Computing Container Runtime(anciennement connu sous le nom de Hyper Protect Virtual Servers ) ou IBM Confidential Computing Container Runtime for Red Hat Virtualization Solutions(anciennement connu sous le nom de Hyper Protect Container Runtime for Red Hat Virtualization Solutions). Pour plus d'informations sur la migration des données, voir le guide Migration. Pour plus d'informations, voir l'annonce de dépréciation du service.

Lorsque vous créez une IBM CloudHyper Protect Virtual Servers instance VPC avec l'image IBM Hyper Protect Container Runtime (HPCR), vous devez spécifier un contrat dans le champ Données utilisateur.

Qu'est-ce qu'un contrat?

Le contrat est un fichier de définition au format YAML qui est spécifique à l'instance Hyper Protect Virtual Servers pour VPC. Ce fichier doit être créé par l'utilisateur de cloud comme condition préalable à la création d'une instance. Une fois ce fichier créé, il doit être transmis en tant qu'entrée dans la zone Données utilisateur lors de la création d'une instance. Vous ne pouvez pas créer d'instance sans contrat valide. Si vous créez une instance sans contrat, le déploiement démarre, puis échoue, et l'instance passe à l'état d'arrêt. Le contrat est spécifique à la création d'une instance Hyper Protect Virtual Servers pour VPC et est une extension de la technologie IBM Secure Execution par Hyper Protect.

Si la charge de travail divulgue les jetons déchiffrés via SSH ou les API REST, les données déchiffrées contiennent à la fois la charge de travail et les secrets de l'environnement. Cependant, il ne contient pas les graines qui ont été utilisées pour le chiffrement par volume.

Sections de contrat

Un fichier de contrat peut comporter les quatre sections de haut niveau valides suivantes, dont les sections workload et env sont obligatoires.

  • workload est une section obligatoire.
  • env est une section obligatoire.
  • attestationPublicKey est une section facultative. Vous pouvez fournir une clé RSA publique dans le cadre du contrat, qui est utilisée pour chiffrer le document d'attestation et l'attribut doit être nommé attestationPublicKey.
  • envWorkloadSignature est une section facultative qui contient la signature des autres sections du contrat.

Les deux sections principales d'un contrat sont les sections workload et env. Ces deux sections sont nécessaires parce que les informations qui sont ajoutées au contrat proviennent de deux personnes différentes, à savoir la personne "charge de travail" et la personne "déployeuse".

La personne de charge de travail fournit des informations sur le conteneur (ou la charge de travail) qui doit être mis en place sur l'instance Hyper Protect Virtual Servers pour VPC. Il comprend des informations sur le nom du conteneur, le Container Registry où il réside, les pouvoirs du Container Registry, le résumé de l'image, les informations du serveur notaire (requises pour la validation de l'image), les variables d'environnement qui doivent être transmises au conteneur et le fichier de composition Docker ou les descripteurs de Pod avec les informations du conteneur.

Si vous utilisez un fichier docker compose, un seul conteneur est pris en charge. Les descripteurs de pod prennent en charge un ou plusieurs conteneurs.

Le déploiement travaille en étroite collaboration avec l' IBM Cloud. Cette personne reçoit les informations de charge de travail (de préférence une section de charge de travail chiffrée) de la part de la personne de charge de travail. Le déployeur crée ensuite la section env du contrat. Cette env section contient des informations spécifiques à l'environnement IBM Cloud. Généralement, il s'agit d'informations que la personne de charge de travail n'a pas et n'a pas besoin de connaître. Par exemple, des informations sur l'instance IBM Cloud Logging, créée par le déployeur, avant d'ajouter des informations à la section env du contrat.

Section de la charge de travail

Cette section est l'une des plus importantes du contrat. La section workload peut comporter plusieurs sous-sections et l'objectif de ces sous-sections est de fournir les informations requises pour l'augmentation de la charge de travail. La section workload est la section parent qui peut comporter les sous-sections suivantes:

  • type: charge de travail. Cette sous-section est obligatoire.
  • auths. Cette sous-section est facultative.
  • compose (pour un conteneur unique) ou play (pour un conteneur unique ou plusieurs conteneurs). Elles s'excluent mutuellement ; l'une des sections doit exister.
  • images. Cette sous-section est facultative.
  • volumes. Cette sous-section est facultative.

Le fragment suivant montre un exemple de haut niveau de la section de charge de travail du contrat. La section de composition est le minimum dont une section de charge de travail a besoin. Les autres sections peuvent être ajoutées en fonction des exigences.

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 sous-section auths

La section auths contient des informations sur le registre du conteneur. Si une image publique est utilisée dans le contrat, vous n'avez pas besoin de la section auths car aucune donnée d'identification n'est requise. La sous-section auths est requise uniquement si les images de conteneur sont privées. Cette sous-section ne contient pas d'informations d'image, comme illustré dans l'exemple suivant. Cette sous-section doit contenir le nom du registre d'images et les données d'identification telles que username-password pour le même. La clé doit être le nom d'hôte du Container Registry ou la chaîne suivante pour le registre Docker par défaut :

https://index.docker.io/v1/

Le fragment suivant illustre un exemple pour IBM Cloud Registry. Pour plus d'informations sur l'utilisation de la clé d'API, voir Utilisation du logiciel client pour l'authentification dans l'automatisation.

auths:
  us.icr.io:
    password: <apikey>
    username: iamapikey

La sous-section compose

Il se compose d'une sous-section d'archivage. La sous-section d'archive contient l'archive de fichier TGZ codée en Base64 du fichier docker-compose.yaml. Etant donné que l'image Hyper Protect Container Runtime utilise Docker Engine et Docker Compose pour démarrer le conteneur, les informations sur le conteneur doivent d'abord être créées à l'aide d'un fichier docker-compose standard. Ce fichier est ensuite archivé et encodé en format Base64, et le résultat de ce processus est fourni comme valeur à la sous-section archive, dans la section de composition. Pour plus d'informations, voir Présentation de Docker Compose.

Les points de montage spécifiés sous les informations de volumes du fichier docker-compose peuvent être alignés avec le point de montage de volume spécifié dans la section de charge de travail du contrat.

L'exécution d'une génération dans le cadre d'un fichier Docker Compose n'est pas prise en charge. Assurez-vous que votre fichier Docker Compose ne comporte pas de section build.

Les formats "yaml" et "yml" sont pris en charge pour le fichier docker-compose. Consultez l'exemple suivant de fichier Docker Compose.

version: '3'
services:
  nginx:
    image: nginx@sha256:e73ba8654ba7fd1834e78a3d4e9d72ffaaa3372d42996af5c34ba3e1abc293e8
    privileged: true
    user: 0:0
    restart: always
    ports:
    - 80:80

Il existe des cas d'utilisation où le registre n'est pas connu lorsque la section de la charge de travail est pré-chiffrée. Par exemple, lorsque le fournisseur de charge de travail souhaite autoriser le déployeur à utiliser un miroir de registre ou un registre privé Container Registry, il est possible de remplacer dynamiquement le registre et les informations d'identification de récupération. Cet effort doit être coordonné entre le fournisseur de la charge de travail et le responsable du déploiement. Pour plus d'informations, voir Utilisation d'une référence de registre dynamique.

Effectuez les étapes suivantes pour obtenir le Base64 fichier d'archive codé. Le Base64 la sortie est disponible dans le compose.b64 déposer. Accédez à <COMPOSE_Folder> et exécutez les commandes suivantes:

tar czvf compose.tgz docker-compose.yml
base64 -w0 compose.tgz > compose.b64

Assurez-vous que le fichier compose tgz contient uniquement des répertoires et des fichiers normaux. Les liens ou les canaux de communication ne sont pas pris en charge.

Copiez le contenu de compose.b64 en tant que valeur de compose-> archive.

compose:
  archive: <paste the content of compose.b64 >

Pour cet exemple, vous obtenez une réponse similaire à la sortie suivante :

compose:
  archive: H4sIAKOFmGIAA+2RTW6DMBBGs84pRuyB8Q8k+DIRwZOGtmBkkyrcvhgnLVVV1EWkqhJv4ZHt8ednWZvqhWxcmaYzjpKhed08HETMpQRfd3k2VeRhPpEJCUxymTPkIuOALBOIG8DHq3zn4vrSjiqdLY/nsv+xb2w7nRZywlPgo/4THNm3uiKntgCWdO1aowmZnwLUTflECpwo8Jpu9NyZ2zvQgdADFEudoXyQzSu+fPPzseSvedo6qjV7mDa2anZbdH8totL6somtUlvX8K4SJshDsFKU2NmFvAZuMc9U37wceeys+Y6BI8Fi6+6vxK5RS+YFDh6RNu//tuVlZWVJd4BcjKckQAIAAA=

La sous-section play

Dans le play sous-section, vous pouvez définir la charge de travail via Descripteurs de pods. Chaque pod peut contenir une ou plusieurs définitions de conteneur. Les descripteurs peuvent être fournis de l'une des manières suivantes :

  • Au format YAML simple dans la sous-section resources de play. Cette section est un tableau de descripteurs et prend en charge deux types de descripteurs: Pods et ConfigMaps.

    L'exemple suivant montre comment utiliser la section 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'exemple suivant illustre comment utiliser la section initcontainers avec la section 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
    
  • Dans le archive sous-section de play, les archives sont un Base64 fichier tar codé et compressé. Les pods ou ConfigMaps sont représentés sous forme de fichiers YAML, au niveau supérieur dans ce fichier tar. Le fichier peut également contenir des fichiers supplémentaires et tous les fichiers sont extraits vers le système de fichiers hôte avant le démarrage des Pods. Le répertoire de travail en cours est le répertoire dans lequel les fichiers ont été extraits. Il est donc possible d'utiliser un montage de volume avec un chemin relatif pour monter les fichiers ou les répertoires à partir du fichier YAML.

    Exemple :

    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
    
  • Dans un format de modèle dans la sous-section templates de play. Cette section est un tableau de descripteurs au format YAML. Les pods ou ConfigMaps peuvent avoir des points de variabilité (POV) qui ne sont pas connus au moment de la rédaction des descripteurs. Ces POV peuvent être représentés sous forme de modèles et les valeurs sont complétées au moment du déploiement à partir des informations contenues dans le contrat. Nous utilisons des modèles go comme syntaxe de modélisation, qui est la même que celle utilisée pour les chartes Helm, de sorte que les modèles peuvent facilement être échangés avec k8s. Nous prenons en charge les objets Built-In suivants:

    • Environnement: cet objet contient les variables d'environnement fusionnées entre la charge de travail et la section d'environnement. L'objet est disponible sous la forme {{ .Env }}.

    Exemple :

    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'expression {{ .Env REGISTRY }} fait référence à la variable d'environnement REGISTRY qui, dans cet exemple, est définie dans la section env du contrat.

    Les modèles doivent être valides YAML, de sorte qu'une expression de remplacement doit être mise en échappement si elle apparaît en tant que première partie d'une chaîne. Sinon, il entre en collision avec le mappage de blocs syntaxe. Ceci est différent des modèles de barre où les expressions sont appliquées à la représentation textuelle du document au lieu de la représentation du modèle.

Variables d'environnement

Dans le contrat, vous pouvez définir des variables d'environnement dans les sections workload et env. Les deux ensembles de variables sont fusionnés avec workload qui est prioritaire. Les pods utilisent le concept de ConfigMap pour définir la configuration. Par conséquent, HPCR représente les sections d'environnement fusionnées sous la forme d'une ConfigMap spéciale nommée contract.config.map. L'exemple suivant monte toutes les variables d'environnement du contrat dans le conteneur:

apiVersion: v1
kind: Pod
metadata:
  name: busybox
spec:
  containers:
  - name: main
    image: ...
    command:
    - printenv
    envFrom:
    - configMapRef:
        name: contract.config.map
        optional: false
  restartPolicy: Never

Communication de pod

  • Conteneur à conteneur

    Les conteneurs à l'intérieur d'un pod communiquent entre eux via localhost. Chaque conteneur doit écouter sur un port différent car ils partagent l'adresse IP par conception.

  • Pod vers hôte

    En général, un Pod doit exposer au moins un de ses conteneurs à l'hôte afin que le conteneur soit accessible via l'adresse IP sur l'hôte par le biais d'un port mappé. Pour ce cas d'utilisation, utilisez le hostPort fonctionnalité sur un conteneur. Notez que ce n 'est pas une bonne pratique dans le monde de l' Kubernetes, où l'on utiliserait plutôt un service.

    Spécifiez explicitement hostPort et containerPort. Si vous spécifiez uniquement containerPort, les ports ne sont pas liés.

    Exemple :

    apiVersion: v1
    kind: Pod
    metadata:
        name: nginx-with-busybox
    spec:
        containers:
            - image: ...
              name: frontend
              ports:
                - containerPort: 80
                  hostPort: 80
              volumeMounts:
                - mountPath: /etc/nginx
                  name: local-frontend
                  readOnly: true
            - command:
                - httpd
                - -vv
                - -f
                - -p
                - "8080"
                - -h
                - /www
              image: ...
              name: backend
              volumeMounts:
                - mountPath: /www
                  name: local-backend
                  readOnly: true
        volumes:
            - hostPath:
                path: ./www
                type: Directory
              name: local-backend
            - hostPath:
                path: ./nginx
                type: Directory
              name: local-frontend
    
  • Pod à pod

    Pour accéder d'un pod à un autre, exposez un hostPort sur le pod cible. Le pod source peut ensuite envoyer une demande à l'hôte sur le port exposé pour accéder au pod cible.

    Le Pod source peut trouver l'adresse IP de l'hôte via la commande suivante :

    ip route | awk '/default/ { print $3 }'
    

Volumes

Pour Hyper Protect Container Runtime, les volumes sont gérés par la section volumes du contrat. Sur la base de ces informations, HPCR chiffre et monte les périphériques de bloc externes sur l'hôte. Pour monter ces volumes dans le pod, utilisez l'option de montage hostPath sur le volume.

Exemple :

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

La zone volumes définit ici les données sur l'hôte à monter dans le pod. Il est différent de volumes dans le contrat HPCR.

La sous-section images

Docker a annoncé le départ à la retraite de Docker Content Trust (DCT). Étant donné que DCT repose sur l'ancien cadre Notary v1, qui n'est plus activement maintenu, il n'est pas considéré comme une solution prête pour l'avenir ou durable pour la signature et la vérification d'images. Par conséquent, les clients sont encouragés à abandonner le DCT et à adopter des technologies de signature et de vérification d'images conformes à l'OCI qui s'alignent sur les normes actuelles de sécurité de la chaîne d'approvisionnement. Vous pouvez migrer des images de conteneurs vers IBM Cloud Container Registry (ICR). ICR s'intègre au service de signature Red Hat (RHS) en tant que racine de confiance de la signature, fournissant un modèle de confiance soutenu par le fournisseur et s'alignant sur les meilleures pratiques contemporaines en matière de sécurité des conteneurs et de chaîne d'approvisionnement. Pour plus d'informations, voir Retirons Docker Content Trust.

La sous-section images est destinée uniquement à une image signée.

Images décrites par docker compose

L'image de conteneur répertoriée dans le fichier docker-compose peut être signée ou non à l'aide de Docker Content Trust (DCT).

L'exemple suivant illustre une image URL:

<container registry>/<username or namespace>/<image name>
eg- us.icr.io/mynamespace/my-haproxy:

Voici un exemple d' URL notariale :

notary: "https://notary.us.icr.io"

publicKey est la clé publique correspondante par laquelle l'image est signée à l'aide de DCT. Utilisez la commande suivante pour obtenir la clé publique :

cat ~/.docker/trust/tuf/us.icr.io/<username>/<imagename>/metadata/root.json

Voici un exemple d'extrait :

images:
  dct:
    us.icr.io/mynamespace/my-haproxy:
      notary: "https://notary.us.icr.io"
      publicKey: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUJpRENDQVM2Z0F3SUJBZ0lSQUxCMXBPYlpEQlRRc09GSFlxazMzaWd3Q2dZSUtvWkl6ajBFQXdJd0tqRW8KTUNZR0ExVUVBeE1mZFhNdWFXTnlMbWx2TDNCeVlXSm9ZWFF4TWpNdmJYa3RhR0Z3Y205NGVUQWVGdzB5TWpBMApNVE14TURFd01ETmFGdzB6TWpBME1UQXhNREV3TUROYU1Db3hLREFtQmdOVkJBTVRIM1Z6TG1samNpNXBieTl3CmNtRmlhR0YwTVRJekwyMTVMV2hoY0hKdmVIa3dXVEFUQmdjcWhrak9QUUlCQmdncWhrak9QUU1CQndOQ0FBU1AKWGsrelE2MlFZNjI3MWQ1cTBMZHY3SGc3QzZkMGZOUlRsQmJXekhOWWFDZzlpU0piYnVNdjVBY0JmMjlqQi83eApqYzhzVitxMksyemtkTHV4QWxGWm96VXdNekFPQmdOVkhROEJBZjhFQkFNQ0JhQXdFd1lEVlIwbEJBd3dDZ1lJCkt3WUJCUVVIQXdNd0RBWURWUjBUQVFIL0JBSXdBREFLQmdncWhrak9QUVFEQWdOSUFEQkZBaUIzd0JTa0IxaXAKZHZZYlBMbFBmS3RZT0hsYnZzUllKa0FZM2hnY0xuNWhwQUloQUt6cmhsU3p4K1I5bmdtMTBlZVkyaFNCRmgrawpMWHp6SFkwaktTVzhyM1FhCi0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0K

Pour une image qui n'est pas signée, aucune entrée n'est requise dans la sous-section images. Toutefois, pour les images non signées, un prétraitement est requis. Suivez les étapes suivantes pour obtenir le résumé :

  1. Connectez-vous au tableau de bord d' Container Registry.
  2. Ouvrez l'image.
  3. Cliquez sur Etiquette, puis sur Prétraitement.

Une fois que vous avez obtenu le prétraitement, ajoutez-le dans le fichier docker-compose.yaml. Voir l'exemple suivant :

services:
  <imagename>:
    image: s390x/redis@sha256:db467ab5c53bdeef65762a7534e26fecb94a0f218bd38afd2eaba1a670c472b1

Images décrites par les descripteurs de pod

Les images de conteneurs décrites par des descripteurs Pod peuvent être validées par la signature simple d' Red Hat.

Si l'image est référencée par un condensé, le service autorise son utilisation sans vérifications supplémentaires.

Les images sans condensé ont besoin d'une clé GPG pour être validées. La clé est transférée dans un format binaire encodé en « Base64 » qui peut être créé. Voir l'exemple suivant :

gpg -a --export ${KEY_ID}|base64 -w0

Cette clé est transmise à travers le rhs sous-section du images section. Cette section est une mappe avec l'identificateur d'image comme clé et la clé GPG dans la zone publicKey:

Exemple :

images:
  rhs:
      OCI-image-identifier:
        publicKey: abcdef

La sous-section workload- volumes

La section volumes doit être fournie dans le contrat uniquement si un volume de données est connecté à l'instance au moment de la création. Les informations fournies dans cette section sont utilisées pour monter le volume de données joint (fourni par l'utilisateur) et sont ensuite chiffrées à l'aide des « clés » fournies dans les sections workload et env. Vous pouvez indiquer le chemin de votre choix pour la zone "mount". Le chemin fourni par l'utilisateur est utilisé en interne pour monter le volume de données. Le chemin de montage fourni dans le contrat doit correspondre au chemin fourni dans la section volumes du fichier d' docker-compose.yaml, afin que toutes les données associées à la charge de travail du conteneur soient stockées dans ce volume de données.

La sous-section volumes prend en charge le chiffrement automatique du volume de données avec des valeurs de départ fournies par l'utilisateur. Si un volume de données est connecté à l'instance Hyper Protect Virtual Servers, il est chiffré automatiquement avec les valeurs de départ fournies via la zone "seed" dans les sous-sections volumes du contrat. Par conséquent, deux valeurs de départ doivent être fournies, l'une via la section workload (par la personne de charge de travail) et l'autre via la section env (par la personne de déployeur). Ces deux valeurs de départ sont converties en interne en séquences UTF8, puis concaténées. Par la suite, le hachage (SHA256) de la séquence concaténée est calculé comme un hexdigest, qui est utilisé comme phrase passe LUKS pour chiffrer le volume de données.

Actuellement, les semences env et workload requièrent une longueur minimale de 3 caractères. À partir de mars 2026, ce minimum sera porté à 15 caractères. Toute valeur de semence inférieure à 15 caractères après mars 2026 peut entraîner des erreurs ou des échecs de déploiement. Pour éviter les perturbations, mettez à jour dès que possible toutes les valeurs de semences avec une longueur d'au moins 15 caractères. Les règles sont définies dans la section suivante.

À partir de mars 2026, vous devrez respecter les règles suivantes pour créer des semences :

  • Aucun espace autorisé.
  • Doit comporter au moins 15 caractères. Les caractères autorisés sont les suivants :
    • Lettres minuscules (a-z)
    • Lettres majuscules (A-Z)
    • Nombres (0-9)
    • Caractères spéciaux !@#$%^&*(),.?":{}|<>_-

Vous pouvez utiliser la commande suivante pour valider l'hexdigest :

echo -n "seed1seed2" | sha256sum

Ici, vous pouvez apprendre comment la "valeur de départ" peut être fournie dans la section de la charge de travail du contrat. Pour plus d'informations sur la façon dont l'entrée "seed" peut être fournie via la section env, voir La section env. Il est obligatoire de fournir les deux valeurs de départ pour le chiffrement. Le chiffrement échoue si une seule des valeurs de départ est fournie et que l'instance est arrêtée.

Vous pouvez ajouter un niveau supérieur de protection et de contrôle par chiffrement à vos données au repos en intégrant Hyper Protect Crypto Services. À partir de ibm-hyper-protect-container-runtime-1-0-s390x-11, vous pouvez utiliser Hyper Protect Crypto Services pour générer une valeur aléatoire comme troisième graine et l'envelopper avec votre clé racine. La phrase passe LUKS est générée à l'aide de trois valeurs de départ: la valeur de départ dans la partition de métadonnées et les deux valeurs de départ du contrat. Pour plus d'informations, voir Sécurisation de vos données.

Le fragment suivant est un exemple pour la section volumes:

volumes:
  test:
    filesystem: ext4
    mount: /mnt/data
    seed: "workload_phrase"

À partir de la version d'image ibm-hyper-protect-container-runtime-1-0-s390x-9 HPCR, pour les Hyper Protect Virtual Servers nouvelles instances VPC, le volume de données est partitionné en deux parties. La première partition ( 100Mib ) est réservée aux métadonnées internes; la deuxième partition reste le volume de données pour la charge de travail. Seuls les nouveaux volumes sont partitionnés et vous ne pouvez pas utiliser le volume partitionné avec une version antérieure de l'image HPCR. La mise à disposition avec un volume chiffré existant fonctionne également. La différence est que le volume existant n'est pas partitionné et que vous pouvez également revenir à une image plus ancienne avec ce volume.

A partir de ibm-hyper-protect-container-runtime-1-0-s390x-12, le déployeur et le fournisseur peuvent utiliser la fonction "rolling of seeds". Une option est fournie pour rouler ou faire pivoter les points de départ afin d'augmenter la posture de sécurité, ou si la valeur de départ est compromise. Lorsque le déployeur ou le fournisseur ou les deux souhaitent transférer les valeurs de départ, les informations de valeur de départ en cours doivent être spécifiées dans le paramètre previousSeed et les nouvelles informations de valeur de départ doivent être spécifiées dans le paramètre seed.

Le fragment suivant est un exemple pour la section volumes:

volumes:
  test:
    filesystem: ext4
    mount: /mnt/data
    seed: "workload_phrase1"
    previousSeed: "workload_phrase"

A partir de la ibm-hyper-protect-container-runtime-1-0-s390x-13, vous pouvez connecter plusieurs volumes lorsque vous démarrez l'instance de serveur virtuel. Les volumes qui sont attachés lorsque l'instance est en cours d'exécution sont ignorés.

Le fragment suivant est un exemple pour la section volumes:

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 section env

La section env est également l'une des sections les plus importantes d'un contrat. La section env d'un contrat traite des informations qui sont spécifiques à l'environnement de cloud et qui ne sont pas connues de la personne de charge de travail. Cette section est créée par la personne déployeuse.

Les sous-sections de la section env sont les suivantes:

  • type: env. Cette sous-section est obligatoire.
  • logging. Cette sous-section est obligatoire.
  • volumes. Cette sous-section ne doit être utilisée que lorsqu'un volume de données est connecté.
  • signingKey. Cette sous-section doit être utilisée uniquement lorsque vous souhaitez utiliser une signature de contrat.
  • env. Cette sous-section permet de spécifier des valeurs pour les variables env si elles sont définies par le fournisseur de charge de travail.

La sous-section logging

ICL

La sous-section minimale requise pour cette section est logRouter. Pour plus d'informations, voir Logging for Hyper Protect Virtual Servers for VPC.

Le fragment suivant est un exemple de la sous-section 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 sous-section env- volumes

Lisez la sous-section workload-volumes de la section workload avant de passer à cette section. Comme indiqué précédemment, pour le chiffrement de disque automatique du volume de données connecté, vous devez fournir deux valeurs de départ client, l'une dans la sous-section workload- volumes et l'autre dans la sous-section env- volumes. Les graines peuvent être n'importe quel texte aléatoire de votre choix.

Voir l'exemple suivant de la sous-section env- volumes:

volumes:
  test:
    seed: "seed_value_with_minimum_15_characters"

Lorsque vous utilisez la fonction "rolling of seeds", vous pouvez utiliser le fragment suivant comme exemple:

volumes:
  test:
    seed: "seed_value_with_minimum_15_characters"
    previousSeed: "env_phrase12345"

Lorsque vous utilisez plusieurs volumes, le déployeur doit s'assurer que les volumes sont créés à l'avance et spécifier également l'ID de volume dans le fichier de contrat. Sinon, le nom de volume doit être indiqué et le volume doit être créé avec le même nom. Si les deux ne sont pas spécifiés, la clé de volume est considérée comme le nom du volume et le volume doit être créé avec le même nom pendant ou avant la création de l'instance de serveur virtuel. Voici un exemple d'extrait :

 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"

Où :

  • Nom du volume : il s'agit du nom que vous avez spécifié lors de la création du volume sur le VPC.
  • ID volume: ID volume généré par le système du volume créé.
  • Clé de volume: nom unique de chaque volume.

La clé de volume doit être la même que celle de la sous-section workload - volumes.

Comme indiqué, vous pouvez effectuer une intégration à Hyper Protect Crypto Services pour générer une troisième valeur de départ et l'encapsuler avec votre clé racine. Consultez l'exemple suivant. Pour plus d'informations, voir Sécurisation de vos données.

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

Sous-section signingKey

Pour plus d'informations sur l'utilisation de signingKey, voir Signature du contrat.

Sous-section env

  • Si des descripteurs de pod sont utilisés dans la section workload:

    Voir l'exemple de format de modèle dans la sous-section play.

  • Si un fichier Docker Compose est utilisé dans la section workload:

    Si le fichier docker compose comporte une section d'environnement, vous pouvez utiliser le fragment suivant comme exemple:

    environment:
      KEY1: "${Value1}"
      KEY2: "${Value2}"
    

    Lorsque le fichier compose du docker comporte une section environment, comme dans l'exemple précédent, vous pouvez transmettre les valeurs dans la section env du deployer. L'exemple suivant montre comment spécifier les valeurs des variables env:

    env:
     value1: "abc"
     value2: "xyz"
    

Chiffrement de contrat

Vous pouvez chiffrer le contenu d'un contrat. Bien que vous puissiez également transmettre le contrat via Données utilisateur sans chiffrement, il est recommandé de chiffrer le contrat. Il est également recommandé d'essayer d'abord d'utiliser un contrat non chiffré à des fins de test, et une fois qu'il fonctionne comme prévu, vous pouvez utiliser un contrat chiffré pour votre environnement de production.

Vous pouvez décider quelles sections du contrat doivent être chiffrées. Par exemple, vous pouvez choisir de chiffrer uniquement la section workload ou chiffrer uniquement la section env.

Lorsque l'instance Hyper Protect Virtual Servers pour VPC démarre, le chargeur d'amorçage déchiffre le contrat. Elle prend la valeur de chacune des sections du contrat et la déchiffre si elle est chiffrée. S'il constate qu'une section n'est pas chiffrée, il la considère comme étant sans déchiffrement. Vous devez utiliser la clé publique pour chiffrer le contrat avant de le transmettre en tant qu'entrée via la section Données utilisateur.

Les certificats de chiffrement et d'attestation sont signés par le certificat intermédiaire d' IBM. Le certificat intermédiaire d' IBM, est signé par le certificat intermédiaire Digicert d' IBM, qui est à son tour signé par le certificat racine de confiance d' DigiCert (Trusted Root G4 ). Pour plus d'informations sur les certificats, voir DigiCert Trusted Root Authority Certificates.

Téléchargement du certificat de chiffrement et extraction de la clé publique

  1. Téléchargez le certificat. Le tableau ci-dessous répertorie les dates d'expiration des certificats de chiffrement ainsi que les dates de fin de prise en charge ou d'obsolescence des images, en fonction de la version de l'image.
Dates d'expiration des certificats de cryptage et dates d'obsolescence des images
Version de l'image Lien de certificat Date d'expiration du certificat de chiffrement Date d'obsolescence
ibm-hyper-protect-container-runtime-1-0-s390x-29 certificate 6 juillet 2027 6 février 2027
ibm-hyper-protect-container-runtime-1-0-s390x-28 certificate 24 février 2027 24 septembre 2026
ibm-hyper-protect-container-runtime-1-0-s390x-26 certificate 24 février 2027 24 septembre 2026
ibm-hyper-protect-container-runtime-1-0-s390x-25 certificate 06 août 2026 31 mars 2026

Remarque

  • Déclassé- Vous pouvez utiliser l'image pour créer une instance à partir de la CLI de IBM Cloud. Le statut "déprécié" peut décourager l'utilisation de l'image avant que son statut ne devienne "obsolète". Le catalogue d'images conserve toujours les deux versions d'images les plus récentes : n et n-1. Lorsqu'une nouvelle version ( n+1 ) est disponible, le système supprime la version la plus ancienne ( n-1 ).
  • Obsolète: Lorsque le certificat associé à l'image expire, l'image n'est plus disponible pour provisionner une instance.
  • Téléchargez toujours les certificats de cryptage correspondant à l'image et cryptez les contrats.

Pour vérifier le statut d'obsolescence ou d'obsolescence de l'image, vous pouvez également utiliser la commande de liste d'images IBM Cloud.

Vous pouvez vous référer à la documentation pour la commande de liste d'images afin d'obtenir le statut de l'image.

  1. Valider le certificat de chiffrement en suivant les instructions de la rubrique Validation du certificat de chiffrement du contrat.

Création de la section workload chiffrée d'un contrat

La valeur de n'importe quelle section d'un contrat peut être en texte clair ou chiffrée. Effectuez les étapes suivantes sur un système d' Ubuntu s pour chiffrer la section de la charge de travail utilisée dans un contrat :

  1. Créez le fichier docker-compose.yaml en fonction de vos besoins en charge de travail. Par exemple :

    services:
      redisnode01:
        image: s390x/redis@sha256:db467ab5c53bdeef65762a7534e26fecb94a0f218bd38afd2eaba1a670c472b1
        ports:
          - "6379:6379"
    

    Pour plus d'informations, voir Présentation de Docker Compose.

  2. Créez la section de charge de travail du contrat et ajoutez le contenu dans le fichier workload.yaml.

    Voici un exemple de ​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. Exportez le chemin complet du fichier workload.yaml et de 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. Utilisez la commande suivante pour créer un mot de passe aléatoire. Le contrat est crypté au moyen d'un algorithme symétrique AES et d'un mot de passe aléatoire.

    PASSWORD="$(openssl rand 32 | base64 -w0)"
    
  5. À partir de OpenSSL 3.0, la sous-commande OpenSSL rsautl est obsolète et remplacée par la sous-commande pkeyutl. Utilisez l'une des commandes suivantes pour crypter le mot de passe avec ibm-hyper-protect-container-runtime-1-0-s390x-29-encrypt.crt:

    • Utilisation de rsautl (obsolète):
       ENCRYPTED_PASSWORD="$(echo -n "$PASSWORD" | base64 -d | openssl rsautl -encrypt -inkey $CONTRACT_KEY -certin | base64 -w0)"
    
    • Utilisation de pkeyutl (recommandé):

      ENCRYPTED_PASSWORD="$(echo -n "$PASSWORD" | base64 -d | openssl pkeyutl -encrypt -inkey $CONTRACT_KEY -certin -pkeyopt rsa_padding_mode:pkcs1 | base64 -w0)"
      
  6. Utilisez la commande suivante pour chiffrer le fichier workload.yaml avec un mot de passe aléatoire:

    ENCRYPTED_WORKLOAD="$(echo -n "$PASSWORD" | base64 -d | openssl enc -aes-256-cbc -pbkdf2 -pass stdin -in "$WORKLOAD" | base64 -w0)"
    
  7. Utilisez la commande suivante pour obtenir la section chiffrée du contrat:

    echo "hyper-protect-basic.${ENCRYPTED_PASSWORD}.${ENCRYPTED_WORKLOAD}"
    
  8. Obtenez la sortie de l'étape 7 et ajoutez-la au fichier user-data.yaml.

    workload: hyper-protect-basic.js7TGt77EQ5bgTIKk5C0pViFTRHqWtn..............
    

    Le préfixe hyper-protect-basic est obligatoire.

Création de la section env chiffrée d'un contrat

Effectuez les étapes suivantes sur un système d' Ubuntu s pour chiffrer la section d' env s utilisée dans un contrat :

  1. Créez la section env du contrat et ajoutez le contenu dans le fichier env.yaml.

    Voici un exemple de 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. Exportez le chemin complet du fichier env.yaml et de 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. Utilisez la commande suivante pour créer un mot de passe aléatoire :

    PASSWORD="$(openssl rand 32 | base64 -w0)"
    
  4. À partir de OpenSSL 3.0, la sous-commande OpenSSL rsautl est obsolète et remplacée par la sous-commande pkeyutl. Utilisez l'une des commandes suivantes pour crypter le mot de passe avec ibm-hyper-protect-container-runtime-1-0-s390x-29-encrypt.crt:

    • rsautl (obsolète):
       ENCRYPTED_PASSWORD="$(echo -n "$PASSWORD" | base64 -d | openssl rsautl -encrypt -inkey $CONTRACT_KEY -certin | base64 -w0)"
    
    • pkeyutl (recommandé):

      ENCRYPTED_PASSWORD="$(echo -n "$PASSWORD" | base64 -d | openssl pkeyutl -encrypt -inkey $CONTRACT_KEY -certin -pkeyopt rsa_padding_mode:pkcs1 | base64 -w0)"
      
  5. Utilisez la commande suivante pour chiffrer env.yaml avec un mot de passe aléatoire:

    ENCRYPTED_ENV="$(echo -n "$PASSWORD" | base64 -d | openssl enc -aes-256-cbc -pbkdf2 -pass stdin -in "$ENV" | base64 -w0)"
    
  6. Utilisez la commande suivante pour obtenir la section chiffrée du contrat:

    echo "hyper-protect-basic.${ENCRYPTED_PASSWORD}.${ENCRYPTED_ENV}"
    
  7. Pour chiffrer la section de charge de travail, voir Création de la section workload chiffrée d'un contrat.

  8. Obtenez la sortie de l'étape 6 et ajoutez-la au fichier user-data.yaml.

    env: hyper-protect-basic.VWg/5/SWE+9jLfhr8q4i.........
    

Signature du contrat

La signature du contrat est une fonctionnalité facultative que vous pouvez utiliser avec le contrat. Vous pouvez choisir de signer un contrat avant qu'il ne soit transmis en tant qu'entrée. Vous pouvez également fixer la date d'expiration du contrat lors de la signature. Les contrats en texte brut ou chiffrés peuvent être signés. La validation de la signature du contrat est effectuée par l'image Hyper Protect Virtual Servers pour VPC. L'objectif de cette fonction de signature est de s'assurer que les sections workload et env sont toujours utilisées ensemble et ne sont pas altérées par un tiers. Cette fonction prend également en charge la définition de l'expiration pour le contrat. En d'autres termes, si l'instance est démarrée après l'expiration de la signature, le processus de démarrage échoue. La signature des sections workload et env est ajoutée en tant que valeur à la section envWorkloadSignature. Voici deux sections d'un contrat qui sont pertinentes lors de la création et de l'ajout d'une signature de contrat:

  • envWorkloadSignature: C'est dans cette section que la signature des autres sections du contrat est ajoutée. Cette section n'est pas requise pour un contrat qui n'est pas signé.
  • signingKey: Cette sous-section doit être ajoutée à la section « env » du contrat. Cette sous-section contient la valeur de la clé publique générée par l'utilisateur, dont la clé privée correspondante a été utilisée pour créer la signature du contrat. Une clé publique ou un certificat peuvent également être analysés en tant que chaîne de caractères « Base64 ».

Effectuez les étapes suivantes sur un système d' Ubuntu s pour créer la signature du contrat :

  1. Utilisez la commande suivante pour générer une paire de clés afin de signer le contrat (notez que "test1234" est la phrase passe permettant de générer des clés. Vous pouvez utiliser la vôtre):

    openssl genrsa -aes128 -passout pass:test1234 -out private.pem 4096
    openssl rsa -in private.pem -passin pass:test1234 -pubout -out public.pem
    
  2. La commande suivante est un exemple d'obtention de la clé de signature:

    key=$(awk -vRS="\n" -vORS="\\\n" '1' public.pem)
    echo ${key%\\n}
    
  3. Facultativement, si vous souhaitez transmettre la clé de signature en tant que Base64:

    key=$(cat public.pem | base64 -w 0)
    echo $key
    
  4. Si vous souhaitez activer l'expiration du contrat, suivez les étapes suivantes :

    1. Utilisez la commande suivante pour générer une demande de certificat :
       openssl req -new -key private.pem -passin pass:test1234 -out csr.pem
    
    1. La commande génère le certificat.
      • Utilisez la commande suivante pour générer une clé privée pour l’autorité de certification :
      openssl genrsa -out personal_ca.key 2048
      
      • Générez un certificat CA auto-signé à l'aide de la commande suivante :
      openssl req -new -x509 -key personal_ca.key -out personal_ca.crt
      
      • La commande suivante signe le CSR avec un certificat d'autorité de certification auto-signé ainsi que le nombre de jours de validité du certificat. La date de fin du certificat généré est la date d'expiration du contrat:
      openssl x509 -req -in csr.pem -CA personal_ca.crt -CAkey personal_ca.key -CAcreateserial -out certificate.pem -days 365
      
    2. La commande suivante est un exemple d'obtention du certificat:
      certificate=$(awk -vRS="\n" -vORS="\\\n" '1' certificate.pem)
      echo ${certificate%\\n}
      
    3. Vous pouvez éventuellement utiliser la commande suivante comme exemple pour obtenir le certificat dans Base64 format:
       certificate=$(cat certificate.pem | base64 -w 0)
       echo $certificate
    
  5. Créez le fichier env.yaml. Voir l'exemple suivant :

    1. Si signingkey est une clé publique:
       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. Si signingkey est un certificat:
         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. Si signingkey est un Base64 clé de signature ou certificat codé :
         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. Créez le fichier env.yaml. Voir l'exemple suivant :

     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. Utilisez la commande suivante pour exporter le chemin complet de env.yaml et 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. Utilisez la commande suivante pour créer un mot de passe aléatoire :

    PASSWORD="$(openssl rand 32 | base64 -w0)"
    
  9. À partir de OpenSSL 3.0, la sous-commande OpenSSL rsautl est obsolète et remplacée par la sous-commande pkeyutl. Utilisez l'une des commandes suivantes pour crypter le mot de passe avec ibm-hyper-protect-container-runtime-1-0-s390x-29-encrypt.crt:

    • Utilisation de rsautl (obsolète):
        ENCRYPTED_PASSWORD="$(echo -n "$PASSWORD" | base64 -d | openssl rsautl -encrypt -inkey $CONTRACT_KEY -certin | base64 -w0)"
        ```
    - Utilisation de `pkeyutl` (recommandé):
    
    ```yaml {: pre}
        ENCRYPTED_PASSWORD="$(echo -n "$PASSWORD" | base64 -d | openssl pkeyutl -encrypt -inkey $CONTRACT_KEY -certin -pkeyopt rsa_padding_mode:pkcs1 | base64 -w0)"
        ```
    
  10. Utilisez la commande suivante pour chiffrer env.yaml avec un mot de passe aléatoire:

    ENCRYPTED_ENV="$(echo -n "$PASSWORD" | base64 -d | openssl enc -aes-256-cbc -pbkdf2 -pass stdin -in "$ENV" | base64 -w0)"
    
  11. Utilisez la commande suivante pour extraire la section env chiffrée:

    echo "hyper-protect-basic.${ENCRYPTED_PASSWORD}.${ENCRYPTED_ENV}"
    

Les étapes 7 à 11 sont utilisées pour crypter la section env. Si vous choisissez de ne pas chiffrer cette section, ignorez ces étapes.

Une notification concernant l'expiration du contrat est envoyée à votre service de journalisation. Les chronologies de la notification sont les suivantes:

  • Le premier de chaque mois
  • Tous les jours pendant 30 jours avant l'expiration
  • Une fois toutes les 4 heures si le contrat est sur le point d'expirer dans 7 jours
  • Toutes les heures si le contrat a expiré ou est sur le point d'expirer dans un jour

Journaux d'avertissement d'expiration des certificats de chiffrement et d'attestation

HPVS envoie des messages d'avertissement au service de journalisation configuré concernant les certificats de chiffrement et d'attestation à venir et expirés.

Le calendrier de notification est le suivant :

  • 30 jours avant l'expiration: Un message d'avertissement est généré toutes les 24 heures, notifiant que le certificat expirera dans un mois.

    Exemple :

    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 jours avant l'expiration: Des messages d'avertissement sont enregistrés toutes les 12 heures à l'approche de la date d'expiration, soulignant la nécessité d'agir.

    Exemple :

    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!!!
    
  • Après l'expiration du certificat: Si le certificat a expiré, HPVS enregistre des messages d'avertissement toutes les 4 heures jusqu'à ce que l'image HPVS soit mise à jour.

    Exemple :

    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.
    

Préparation de la section Attestation

L'attestation est une fonction facultative que vous pouvez utiliser avec le contrat. L' attestationPublicKey, ou clé publique, est la clé publique fournie par l'utilisateur qui est utilisée pour crypter le document d'attestation. Cela peut être fourni sous forme de clé publique RSA ou Base64 codé de la clé publique RSA dans le cadre du contrat.

  • Si vous utilisez la clé RSA publique en texte en clair pour attestationPublicKey dans le fichier yaml, utilisez l'exemple suivant:

    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----"
    
  • Si vous utilisez le Base64 clé de signature codée pour le attestationPublicKey dans le fichier yaml, utilisez la commande et l'exemple suivants.

    base64 -w0 <public RSA key file>
    

    Vous devez remplacer <public RSA key file> par le chemin d'accès à votre fichier de clé RSA publique.

    attestationPublicKey: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUJpRENDQVM2Z0F3SUJBZ0lSQUxCMXBPYlpEQlRRc09GSFlxazMzaWd3Q2dZSUtvWkl6ajBFQXdJd0tqRW8KTUNZR0ExVUVBeE1mZFhNdWFXTnlMbWx2TDNCeVlXSm9ZWFF4TWpNdmJYa3RhR0Z3Y205NGVUQWVGdzB5TWpBMApNVE14TURFd01ETmFGdzB6TWpBME1UQXhNREV3TUROYU1Db3hLREFtQmdOVkJBTVRIM1Z6TG1samNpNXBieTl3CmNtRmlhR0YwTVRJekwyMTVMV2hoY0hKdmVIa3dXVEFUQmdjcWhrak9QUUlCQmdncWhrak9QUU1CQndOQ0FBU1AKWGsrelE2MlFZNjI3MWQ1cTBMZHY3SGc3QzZkMGZOUlRsQmJXekhOWWFDZzlpU0piYnVNdjVBY0JmMjlqQi83eApqYzhzVitxMksyemtkTHV4QWxGWm96VXdNekFPQmdOVkhROEJBZjhFQkFNQ0JhQXdFd1lEVlIwbEJBd3dDZ1lJCkt3WUJCUVVIQXdNd0RBWURWUjBUQVFIL0JBSXdBREFLQmdncWhrak9QUVFEQWdOSUFEQkZBaUIzd0JTa0IxaXAKZHZZYlBMbFBmS3RZT0hsYnZzUllKa0FZM2hnY0xuNWhwQUloQUt6cmhsU3p4K1I5bmdtMTBlZVkyaFNCRmgrawpMWHp6SFkwaktTVzhyM1FhCi0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0K
    
  • Si vous avez chiffré l' attestationPublicKey e dans le fichier yaml, vous devez suivre les mêmes étapes que celles mentionnées dans le chiffrement du contrat.

    Pour déchiffrer le document d'attestation, suivez les instructions de la rubrique Déchiffrement du document d'attestation.

Préparation de la signature

Effectuez les étapes suivantes sur un système d' Ubuntu, afin de préparer la signature :

Si vous avez le crypté user-data.yaml à partir de la création du crypté workload section d'un contrat et création du crypté env section d'un contrat sections, passez à l'étape 3.

  1. Obtenez les fichiers workload.yaml et env.yaml chiffrés.

  2. Ajoutez-les dans le fichier user-data.yaml.

    workload: hyper-protect-basic.js7TGt77EQ5bgTIKk5C0pViFTRHqWtn..............
    env: hyper-protect-basic.VWg/5/SWE+9jLfhr8q4i.........
    
  3. Créez le fichier contract.txt. Ajoutez d'abord la valeur d' workload, puis ajoutez la valeur d' env du fichier user-data.yaml. Assurez-vous qu'il n'y a pas d'espace ou de nouvelle ligne après workload et avant env. Assurez-vous également qu'aucune nouvelle ligne ou espace n'est ajouté à la fin du fichier. Il est recommandé de vérifier le contenu binaire du fichier contract.txt à l'aide d'outils tels que hexdump. Dans le vidage du fichier binaire, veillez à ne pas voir la valeur ASCII 0a comme dernière entrée.

    hyper-protect-basic.js7TGt77EQ5bgTIKk5C0pViFTRHqWtn..............hyper-protect-basic.VWg/5/SWE+9jLfhr8q4i.........
    
  4. Utilisez la commande suivante pour générer la signature:

    echo $(cat contract.txt | tr -d "\n\r" | openssl dgst -sha256 -sign private.pem | openssl enc -base64) | tr -d ' '
    
  5. Ajoutez la signature dans le fichier user-data.yaml:

    workload: hyper-protect-basic.js7TGt77EQ5bgTIKk5C0pViFTRHqWtn..............
    env: hyper-protect-basic.VWg/5/SWE+9jLfhr8q4i.........
    envWorkloadSignature: Icbm1D/CVpLNYkWRC9e .....
    

Initiation à un contrat Hyper Protect Virtual Servers simple pour VPC

Les exemples de commande suivants sont exécutés sur un système Ubuntu.

1. Obtenez les détails de votre instance de journalisation

Vous pouvez configurer la journalisation avec IBM Log Analysis ou un système de back end syslog générique. Cet exemple utilise IBM Log Analysis. Vous pouvez choisir parmi différents plans. Pour comprendre comment obtenir les détails requis tels que le nom d'hôte et la clé d'ingestion, consultez la section Logging for Hyper Protect Virtual Servers for VPC.

2. Créez la section env

Veillez à ne pas oublier le symbole de barre verticale « | » si vous utilisez un contrat en texte brut. Elle n'est pas obligatoire si vous prévoyez de chiffrer la section.

env: |
  type: env
  logging:
    logRouter:
      hostname: 34be57c7-6ff2-903921e90ab9.ingress.jp-tok.logs.cloud.ibm.com
      iamApiKey: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
      port: 443

3. Préparez le fichier docker-compose

En supposant que vous disposez des détails de journalisation, recherchez un fichier Docker Compose simple. L'exemple suivant présente un conteneur public NGINX. Créez un site docker-compose.yaml en vous inspirant de l'exemple.

services:
  nginx:
    image: docker.io/library/nginx@sha256:b1306efee704017b0e02efadc011d374063a4e9c47b86bdc57744fc3f0666383
    ports:
    - 80:80
    - 443:443

4. Obtenez la version base64-encoded du fichier docker-compose

tar -czvf compose.tgz docker-compose.yaml
base64 -i compose.tgz > compose.b64

5. Créez la section Compose avec elle

  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. Remplir la section de charge de travail

Assurez-vous de ne pas oublier le symbole de la barre verticale (|) si vous utilisez un contrat en texte brut.

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. Votre contrat simple est prêt

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==

Etapes suivantes