Sobre o contrato

O site IBM Cloud Hyper Protect Virtual Servers para VPC está obsoleto. A partir de 28 de fevereiro de 2026, não será mais possível criar novas instâncias. As instâncias existentes terão suporte até 20 de fevereiro de 2027. Qualquer instância que ainda exista nessa data será excluída. Você pode reimplantar suas cargas de trabalho usando o IBM Confidential Computing Container Runtime(anteriormente conhecido como Hyper Protect Virtual Servers ) ou o IBM Confidential Computing Container Runtime para Red Hat Virtualization Solutions(anteriormente conhecido como Hyper Protect Container Runtime para Red Hat Virtualization Solutions). Para obter informações sobre migração de dados, consulte o Guia de migração. Para obter mais informações, consulte o anúncio de descontinuação do serviço.

Ao criar uma instância IBM CloudHyper Protect Virtual Servers VPC com a imagem IBM Hyper Protect Container Runtime (HPCR), você deve especificar um contrato como parte do campo Dados do usuário.

O que é um contrato?

O contrato é um arquivo de definição no formato YAML que é específico para o Hyper Protect Virtual Servers para a instância VPC. Esse arquivo deve ser criado pelo usuário da nuvem como um pré-requisito para a criação de uma instância. Depois que esse arquivo é criado, ele deve ser passado como uma entrada como parte do campo Dados do Usuário quando uma instância é criada. Não é possível criar uma instância sem um contrato válido. Se você criar uma instância sem um contrato, a implementação começa e então falha, e a instância entra em um estado de paralisação. O contrato é específico para criar um Hyper Protect Virtual Servers para a instância VPC e é uma extensão da tecnologia IBM Secure Execution by Hyper Protect.

Se a carga de trabalho divulgar os tokens descriptografados por meio de APIs SSH ou REST, os dados descriptografados conterão os segredos da carga de trabalho e do ambiente. No entanto, ele não contém as sementes que foram usadas para a criptografia de volume.

Seções de contrato

Um arquivo de contrato pode ter as seguintes quatro seções de alto nível válidas, das quais as seções workload e env são obrigatórias.

  • O workload é uma seção obrigatória
  • O env é uma seção obrigatória
  • attestationPublicKey é uma seção opcional.. Você pode fornecer uma chave RSA pública como parte do contrato, que é usado para criptografar o documento de comprovação e o atributo deve ser nomeado como attestationPublicKey.
  • O envWorkloadSignature é uma seção opcional e contém a assinatura das outras seções do contrato

As duas seções primárias em um contrato são as seções workload e env. Essas duas seções são necessárias porque as informações que são incluídas no contrato vêm de duas personas diferentes, a saber, a "carga de trabalho" e a persona "implementador".

A persona de carga de trabalho fornece informações sobre o contêiner (ou carga de trabalho) que precisa ser criado na instância do Hyper Protect Virtual Servers for VPC. Inclui informações sobre o nome do contêiner, o Container Registry onde reside, credenciais do Container Registry, o resumo da imagem, as informações do servidor notário (necessárias para validação da imagem), as variáveis de ambiente que precisam ser passadas para o contêiner e o arquivo de composição do docker ou descritores de pod com as informações do contêiner.

Se você usar um arquivo do Docker Compose, apenas um contêiner será suportado Os descritores de pod suportam um ou vários contêineres

A persona do implementador trabalha em estreita colaboração com IBM Cloud. Esta persona recebe as informações da carga de trabalho (preferencialmente uma seção de carga de trabalho criptografada) da persona de carga de trabalho. O implementador então cria a seção env do contrato. A env seção contém informações específicas sobre o ambiente IBM Cloud. Usualmente, é uma informação que a persona de carga de trabalho não tem e não precisa saber. Um exemplo são informações sobre a instância IBM Cloud Logging, que o implementador persona cria, antes de adicionar informações à seção env do contrato.

A seção de trabalho

Essa seção é uma das seções mais importantes do contrato. A seção workload pode ter várias subseções e o objetivo das subseções é fornecer informações necessárias para trazer à tona a carga de trabalho. A seção workload é a seção pai que pode ter as seguintes subseções:

  • type: carga de trabalho. Esta subseção é obrigatória.
  • auths. Esta subseção é opcional.
  • compose (para contêiner único) ou play (para contêiner único ou diversos contêineres). Eles são mutuamente exclusivos; uma das seções deve haver.
  • images. Esta subseção é opcional.
  • volumes. Esta subseção é opcional.

O trecho a seguir mostra uma amostra de alto nível da seção de carga de trabalho do contrato. O mínimo que uma seção de carga de trabalho precisa é a seção de compor. As outras seções podem ser adicionadas com base no 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"

A subseção auths

A seção auths consiste em informações sobre o registro do contêiner. Se uma imagem pública for usada no contrato, você não precisará da seção auths porque nenhuma credencial é necessária A subseção auths é necessária apenas se as imagens do container forem privadas. Esta subseção não possui nenhuma informação de imagem, como mostrado na amostra a seguir. Esta subseção precisa conter o nome do registro de imagem e as credenciais como username-password para o mesmo. A chave deve ser o nome do host do Container Registry ou a seguinte string para o registro do Docker padrão:

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

O trecho a seguir mostra um exemplo para o Registro IBM Cloud. Para obter mais informações sobre o uso da chave API, consulte Usando software cliente para autenticar na automação.

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

A subseção compose

Consiste em uma subseção de arquivo. A subseção de arquivo contém o arquivo de arquivo TGZ do Base64 codificado do arquivo docker-compose.yaml. Como a imagem do Hyper Protect Container Runtime usa Docker Engine e Docker Compose para iniciar o contêiner, as informações sobre o contêiner devem primeiro ser criadas usando um arquivo docker-compose padrão. Esse arquivo é então arquivado e codificado em Base64, e a saída desse processo é fornecida como o valor da subseção archive, na seção compose. Para obter mais informações, consulte Visão Geral do Docker Compose.

Os pontos de montagem especificados sob as informações de volumes do arquivo docker-compose podem estar alinhados com o ponto de montagem do volume especificado na seção de carga de trabalho do contrato.

Executar uma construção como parte de um arquivo do Docker Compose não é suportado. Certifique-se de que seu arquivo do Docker Compose não tenha uma seção build

Ambos os formatos "yaml" e "yml" são suportados para arquivo de compose docker. Veja o exemplo a seguir de um arquivo docker-compose.

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

Existem casos de uso em que o registro não é conhecido quando a seção de carga de trabalho é pré-criptografada. Por exemplo, quando o provedor de carga de trabalho deseja permitir que o implantador use um espelho de registro ou um privado Container Registry, é possível substituir dinamicamente o registro e as credenciais de pull. Esse esforço precisa ser coordenado entre o provedor de carga de trabalho e o implantador. Para obter mais informações, consulte Usando uma referência de registro dinâmico..

Conclua as etapas a seguir para obter o Base64 arquivo compactado codificado. O Base64 a saída está disponível no compose.b64 arquivo. Acesse o <COMPOSE_Folder> e execute os seguintes comandos:

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

Certifique-se de que o arquivo composto tgz contenha apenas diretórios e arquivos regulares. Links ou canais não são suportados.

Copie o conteúdo de compose.b64 como um valor de compose-> arquivo.

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

Para esse exemplo, você veria uma resposta semelhante à saída a seguir:

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

A subseção play

No play subseção, você pode definir a carga de trabalho por meio Descritores de pod. Cada pod pode conter uma ou mais definições do contêiner Os descritores podem ser fornecidos de uma das seguintes maneiras:

  • No formato YAML simples na subseção resources de play.. Esta seção é uma matriz de descritores e suporta dois tipos de descritores: Pods e ConfigMaps..

    O exemplo a seguir ilustra como usar a seção 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
    

    O exemplo a seguir ilustra como usar a seção initcontainers com a seção 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
    
  • No archive subseção de play, o arquivo é um Base64 arquivo tar codificado e compactado. Os Pods ou ConfigMaps são representados como arquivos YAML, no nível superior nesse arquivo tar O arquivo também pode conter arquivos extras e todos os arquivos são extraídos para o sistema de arquivos do host antes de os pods serem iniciados. O diretório ativo atual é o diretório no qual os arquivos foram extraídos, portanto, é possível usar uma montagem de volume com um caminho relativo para montar os arquivos ou diretórios do arquivo YAML.

    Exemplo:

    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
    
  • Em um formato de modelo na subseção templates de play. Esta seção é uma matriz de descritores no formato YAML Os pods ou ConfigMaps podem ter pontos de variabilidade (POV) que não são conhecidos no momento da redação dos descritores. Esses POVs podem ser representados como modelos e os valores são preenchidos no momento da implantação a partir das informações do contrato. Usamos go templates como a sintaxe de modelagem, que é a mesma usada para gráficos do helm, portanto, os modelos podem ser trocados facilmente com k8s. Suportamos os seguintes objetos Built-In:

    • Ambiente: esse objeto contém as variáveis de ambiente mescladas entre a carga de trabalho e a seção de ambiente. O objeto está disponível como {{ .Env }}..

    Exemplo:

    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
    

    A expressão {{ .Env REGISTRY }} faz referência à variável de ambiente REGISTRY que neste exemplo é definida na seção env do contrato.

    Os modelos precisam ser válidos YAML, portanto, uma expressão de substituição deverá ser escapada se ela aparecer como a primeira parte de uma sequência de caracteres Caso contrário, colide com o mapeamento de blocos sintaxe. Isso é diferente dos modelos de capacete, em que as expressões são aplicadas à representação textual do documento em vez da representação do modelo.

Variáveis de ambiente

No contrato, é possível definir variáveis de ambiente nas seções workload e env.. Ambos os conjuntos de variáveis são mesclados com workload tendo precedência. Os pods usam o conceito de um ConfigMap para definir a configuração, portanto, o HPCR representa as seções do ambiente mesclado como um ConfigMap especial denominado contract.config.map O exemplo a seguir monta todas as variáveis de ambiente do contrato no contêiner:

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

comunicação de pod

  • Contêiner para contêiner

    Os contêineres dentro de um pod se comunicam entre si por meio de localhost. Cada contêiner precisa escutar em uma porta diferente porque, por padrão, eles compartilham o endereço IP.

  • Pod para o host

    Normalmente, um pod precisa expor pelo menos um de seus contêineres ao host, de modo que o contêiner possa ser acessado pelo endereço IP do host por meio de uma porta mapeada. Para este caso de uso, use o hostPort recurso em um contêiner. Observe que isso não é uma boa prática no mundo do Kubernetes, no qual um serviço seria usado em seu lugar.

    Especifique hostPort e containerPort explicitamente. Se você especificar apenas containerPort, as portas não serão ligadas

    Exemplo:

    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 para Pod

    Para alcançar de um Pod para outro, exponha um hostPort no Pod de destino O Pod de origem pode então fazer uma solicitação para o host na porta exposta para chegar ao Pod de destino.

    O pod de origem pode encontrar o endereço IP do host por meio do seguinte comando:

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

Volumes

Para Hyper Protect Container Runtime, os volumes são gerenciados pela seção volumes no contrato. Com base nessas informações, o HPCR criptografa e monta dispositivos de bloco externos no host. Para montar esses volumes no pod, use a opção de montagem hostPath no volume..

Exemplo:

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

O campo volumes aqui define os dados no host a serem montadas no pod É diferente de volumes no contrato HPCR.

A subseção images

Docker anunciou a aposentadoria do Docker Content Trust (DCT). Como a DCT foi desenvolvida com base no legado Notário v1 framework, que não é mais mantido ativamente, ela não é considerada uma solução sustentável ou pronta para o futuro para assinatura e verificação de imagens. Como resultado, os clientes são incentivados a abandonar a DCT e adotar tecnologias de verificação e assinatura de imagem em conformidade com a OCI que se alinham aos padrões atuais de segurança da cadeia de suprimentos. Você pode migrar imagens de contêineres para IBM Cloud Container Registry (ICR). O ICR integra-se ao Red Hat Signing Service (RHS) como sua raiz confiável de assinatura, fornecendo um modelo de confiança apoiado pelo fornecedor e alinhamento com as práticas recomendadas contemporâneas de segurança de contêineres e cadeia de suprimentos. Para obter mais informações, consulte Retirada do Docker Content Trust.

A subseção images é significada apenas para uma imagem que é assinada.

Imagens descritas pelo Docker Compose

A imagem de contêiner listada no arquivo docker-compose pode ser assinada ou não assinada usando o Docker Content Trust (DCT).

O exemplo a seguir mostra uma imagem URL:

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

A seguir, apresentamos um exemplo de um cartório URL:

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

O publicKey é a chave pública correspondente pela qual a imagem é assinada usando DCT. Use o comando a seguir para obter a chave pública:

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

O trecho a seguir é um exemplo:

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

Para uma imagem que não é assinada, nenhuma entrada é necessária na subseção de imagens. No entanto, para imagens não assinadas, é necessária uma digestão. Siga as etapas a seguir para obter o resumo:

  1. Faça login no painel do Container Registry.
  2. Abra a imagem.
  3. Clique em Tag e, em seguida, clique em Digest.

Depois de obter o digest, adiciona este digest no arquivo docker-compose.yaml. Consulte o seguinte exemplo:

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

Imagens descritas por descritores de Pod

As imagens de contêineres descritas por descritores de pod podem ser validadas pelo Red Hat Simple Signing.

Se a imagem for referenciada por uma compilação, o serviço permitirá seu uso sem verificações adicionais.

As imagens sem uma compilação precisam de uma chave GPG para serem validadas A chave é transferida em um formato binário codificado em Base64 que pode ser criado. Consulte o seguinte exemplo:

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

Esta chave é transmitida através do rhs subseção do images seção. Esta seção é um mapa com o identificador de imagem como a chave e a chave GPG no campo publicKey:

Exemplo:

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

A subseção workload- volumes

A seção volumes precisa ser fornecida no contrato somente se um volume de dados for anexado à instância no momento da criação. As informações fornecidas nesta seção são usadas para montar o volume de dados anexado (fornecido pelo usuário) e, posteriormente, são criptografadas usando as "sementes" fornecidas nas seções workload e env. Você pode fornecer qualquer caminho de sua escolha para o campo "mount". O caminho fornecido pelo usuário é usado internamente para montar o volume de dados. O caminho de montagem fornecido no contrato deve corresponder ao caminho fornecido na seção de volumes do arquivo docker-compose.yaml para que todos os dados associados à carga de trabalho do contêiner sejam armazenados nesse volume de dados.

A subseção volumes tem suporte para criptografia automática do volume de dados com valores iniciais fornecidos pelo usuário. Se um volume de dados for conectado à instância do Hyper Protect Virtual Servers, ele será criptografado automaticamente com os valores iniciais que são fornecidos por meio do campo "valor inicial" nas subseções volumes do contrato. Assim, dois valores iniciais devem ser fornecidos, um por meio da seção workload (pela persona de carga de trabalho) e outro por meio da seção env (pela persona do implementador). Esses dois valores iniciais são convertidos internamente para sequências UTF8 e, em seguida, concatenados Posteriormente, o hash (SHA256) da sequência concatenada é calculado como uma compilação, que é usada como a passphrase do LUKS para criptografar o volume de dados.

Atualmente, as sementes env e workload exigem um comprimento mínimo de 3 caracteres. A partir de março de 2026, esse mínimo será aumentado para 15 caracteres. Qualquer valor de semente com menos de 15 caracteres após março de 2026 pode resultar em erros ou falhas na implementação. Para evitar interrupções, atualize todos os valores de semente para um comprimento de pelo menos 15 caracteres o mais rápido possível. As regras são definidas na seção a seguir.

A partir de março de 2026, você deverá seguir estas regras para criar sementes:

  • Nenhum espaço permitido.
  • Deve ter pelo menos 15 caracteres. A seguir estão os caracteres permitidos:
    • Letras minúsculas (a-z)
    • Letras maiúsculas (A-Z)
    • Números (0-9)
    • Caracteres especiais !@#$%^&*(),.?":{}|<>_-

Você pode usar o seguinte comando para validar o hexdigest:

echo -n "seed1seed2" | sha256sum

Aqui você pode aprender como a "semente" pode ser fornecida na seção de carga de trabalho do contrato. Para obter mais informações sobre como a entrada "seed" pode ser fornecida através da seção env, consulte A seção env. É obrigatório fornecer ambas as sementes para criptografia. A criptografia falha se apenas uma das sementes for fornecida instância embarca para baixo.

Você pode adicionar um nível mais alto de proteção e controle de criptografia aos seus dados em repouso, integrando-os com Hyper Protect Crypto Services. A partir de ibm-hyper-protect-container-runtime-1-0-s390x-11, você pode usar Hyper Protect Crypto Services para gerar um valor aleatório como a terceira semente e envolvê-lo com sua chave raiz. A passphrase do LUKS é gerada usando três valores iniciais-o valor inicial na partição de metadados e os dois valores iniciais do contrato. Para obter mais informações, consulte Protegendo seus dados.

O snippet a seguir é um exemplo para a seção de volumes:

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

A partir da versão da imagem ibm-hyper-protect-container-runtime-1-0-s390x-9 HPCR, para Hyper Protect Virtual Servers novas instâncias VPC, o volume de dados é particionado em duas partes. A primeira partição ( 100Mib ) é reservada para metadados internos; a segunda partição permanece como o volume de dados para carga de trabalho. Somente novos volumes são particionados e não é possível usar o volume particionado com uma versão mais antiga da imagem HPCR. O fornecimento com um volume criptografado existente também funciona A diferença é que o volume existente não é particionado e também é possível voltar para uma imagem mais antiga com esse volume..

A partir do ibm-hyper-protect-container-runtime-1-0-s390x-12, o implementador e o provedor podem usar o recurso de "rolagem de valores iniciais". Uma opção é fornecida para rolar ou girar as sementes para aumentar a postura de segurança ou se a semente estiver comprometida. Quando o implementador ou o provedor ou ambos desejam rolar os valores iniciais, as informações de valor inicial atuais devem ser especificadas no parâmetro previousSeed e as novas informações de valor inicial devem ser especificadas no parâmetro seed.

O snippet a seguir é um exemplo para a seção de volumes:

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

A partir do ibm-hyper-protect-container-runtime-1-0-s390x-13, é possível anexar vários volumes quando você ativa a instância de servidor virtual Os volumes que são anexados quando a instância está em execução são ignorados.

O snippet a seguir é um exemplo para a seção de 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"

A seção env

A seção env também é uma das seções mais importantes em um contrato. A seção env de um contrato lida com informações que são específicas para o ambiente em nuvem e não é conhecida a persona de carga de trabalho. Esta seção é criada pela persona implementador.

As subseções para a seção env são:

  • type: aprox. Esta subseção é obrigatória.
  • logging. Esta subseção é obrigatória.
  • volumes. Esta subseção deve ser usada apenas quando um volume de dados é anexado.
  • signingKey. Esta subseção deve ser usada apenas quando você quiser usar uma assinatura de contrato.
  • env. Esta subseção é usada para especificar valores para variáveis env se eles forem definidos pelo provedor de carga de trabalho.

A subseção logging

ICL

A subseção mínima necessária para essa seção é logRouter. Para obter mais informações, consulte Registro de Hyper Protect Virtual Servers para VPC.

O trecho a seguir é um exemplo da subseção 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)

A subseção env- volumes

Leia a subseção carga de trabalho-volumes da seção de carga de trabalho antes de continuar com esta seção. Conforme já mencionado, para criptografia de disco automática do volume de dados conectado, deve-se fornecer dois valores iniciais do cliente, um na subseção workload- volumes e o outro na subseção env- volumes. As sementes podem ser qualquer texto aleatório de sua escolha.

Veja o exemplo a seguir da subseção env- volumes:

volumes:
  test:
    seed: "seed_value_with_minimum_15_characters"

Quando estiver usando o recurso "rolagem de valores iniciais", é possível usar o fragmento a seguir como um exemplo:

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

Ao usar diversos volumes, o implementador deve assegurar que os volumes sejam criados antecipadamente e também especificar o ID do volume no arquivo de contrato. Caso contrário, o nome do volume deverá ser especificado e o volume deverá ser criado com o mesmo nome.. Se ambos não forem especificados, a chave do volume será considerada como o nome do volume e o volume deverá ser criado com o mesmo nome durante ou antes da criação da instância do servidor virtual. O trecho a seguir é um exemplo:

 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"

Em que:

  • Nome do volume: é o nome que você especificou quando criou o volume na VPC.
  • ID do Volume: é o ID do volume gerado pelo sistema do volume criado.
  • Chave do volume: é o nome do volume exclusivo para cada volume.

A chave do volume deve ser a mesma da chave na subseção carga de trabalho - volumes.

Conforme mencionado, é possível integrar com o Hyper Protect Crypto Services para gerar um terceiro valor inicial e agrupá-lo com sua chave raiz. Consulte o exemplo a seguir. Para obter mais informações, consulte Protegendo seus dados.

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

signingKey subseção

Para obter mais informações sobre como usar o signingKey, consulte Assinatura de contrato.

env subseção

  • Se os descritores de Pod forem usados na seção workload:

    Consulte o exemplo para o formato do modelo em a subseção play

  • Se um arquivo de composição do Docker for usado na seção workload:

    Se o docker compor arquivo tiver uma seção de ambiente, você pode usar o seguinte trecho como exemplo:

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

    Quando o arquivo docker compose tem uma seção de ambiente, como mostrado no exemplo anterior, você pode passar os valores na seção env do implantador. O exemplo a seguir mostra como especificar os valores para as variáveis env:

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

Criptografia de contrato

Você pode criptografar o conteúdo de um contrato. Embora você também possa passar no contrato por meio do Dados do Usuário sem criptografia, é recomendável criptografar o contrato. Também é recomendado que você tente inicialmente usar um contrato não criptografado para fins de testes e, depois que ele funciona como esperado, você pode usar um contrato criptografado para o seu ambiente de produção.

Você pode decidir quais seções do contrato precisam de criptografia. Por exemplo, você pode optar por criptografar apenas a seção workload, ou criptografar apenas a seção env.

Quando o Hyper Protect Virtual Servers para botas de instância VPC, o bootloader decriptografa o contrato. É preciso o valor de cada uma das seções no contrato e decripê-lo se ela for criptografada. Se achar que uma seção não é criptografada, ela considera como está sem nenhuma decriptografia. Você deve usar a chave pública para criptografar o contrato antes de passá-lo como uma entrada por meio da seção Dados do Usuário.

Os certificados de criptografia e atestado são assinados pelo certificado intermediário IBM. O certificado intermediário IBM é assinado pelo certificado intermediário IBM Digicert, que, por sua vez, é assinado por DigiCert Trusted Root G4. Para obter mais informações sobre os certificados, consulte DigiCert Certificados de autoridade raiz confiável.

Baixando o certificado de criptografia e extraindo a chave pública

  1. Faça o download do certificado. A tabela a seguir lista as datas de validade dos certificados de criptografia e as datas de descontinuação/obsolescência das imagens, com base na versão da imagem.
Datas de validade do certificado de criptografia e datas de depreciação/obsoletas da imagem
Versão de imagem Link do certificado Data de validade do certificado de criptografia: Data de descontinuação
ibm-hyper-protect-container-runtime-1-0-s390x-29 Certificado 6 de julho de 2027 6 de fevereiro de 2027
ibm-hyper-protect-container-runtime-1-0-s390x-28 Certificado 24 de fevereiro de 2027 24 de setembro de 2026
ibm-hyper-protect-container-runtime-1-0-s390x-26 Certificado 24 de fevereiro de 2027 24 de setembro de 2026
ibm-hyper-protect-container-runtime-1-0-s390x-25 Certificado 06 de agosto de 2026 31 de março de 2026

Nota

  • Preterido- Você pode usar a imagem para criar uma instância a partir da CLI do site IBM Cloud. O status depreciado pode desencorajar o uso da imagem antes que seu status mude para obsoleto. O catálogo de imagens sempre mantém as duas versões mais recentes da imagem: n e n-1. Quando uma nova versão ( n+1 ) está disponível, o sistema substitui a versão mais antiga ( n-1 ).
  • Obsoleta: Depois que o certificado associado à imagem expira, a imagem não fica disponível para provisionar uma instância.
  • Sempre faça o download dos certificados de criptografia que correspondem à imagem e criptografe os contratos.

Para verificar a descontinuação da imagem ou o status obsoleto, também é possível utilizar o comando IBM Cloud image list.

É possível consultar a documentação para o comando image list para obter o status da imagem.

  1. Valide o certificado de criptografia seguindo as instruções do tópico Validando o certificado de criptografia do contrato.

Criando a seção criptografada workload de um contrato

O valor de qualquer seção em um contrato pode ser texto simples ou criptografado. Conclua as etapas a seguir em um sistema Ubuntu para criptografar a seção de carga de trabalho usada em um contrato:

  1. Crie o arquivo docker-compose.yaml com base em seus requisitos de carga de trabalho. Por exemplo,

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

    Para obter mais informações, consulte Visão Geral do Docker Compose.

  2. Crie a seção de carga de trabalho do contrato e inclua o conteúdo no arquivo workload.yaml.

    A seguir, um exemplo 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. Exporte o caminho completo do arquivo 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. Use o comando a seguir para criar uma senha aleatória. O contrato é criptografado por meio de AES simétrico com uma senha aleatória.

    PASSWORD="$(openssl rand 32 | base64 -w0)"
    
  5. A partir de OpenSSL 3.0, o subcomando OpenSSL rsautl está obsoleto e está sendo substituído pelo subcomando pkeyutl. Use um dos seguintes comandos para criptografar a senha com ibm-hyper-protect-container-runtime-1-0-s390x-29-encrypt.crt:

    • Usando rsautl (obsoleto):
       ENCRYPTED_PASSWORD="$(echo -n "$PASSWORD" | base64 -d | openssl rsautl -encrypt -inkey $CONTRACT_KEY -certin | base64 -w0)"
    
    • Usando o site pkeyutl (recomendado):

      ENCRYPTED_PASSWORD="$(echo -n "$PASSWORD" | base64 -d | openssl pkeyutl -encrypt -inkey $CONTRACT_KEY -certin -pkeyopt rsa_padding_mode:pkcs1 | base64 -w0)"
      
  6. Use o seguinte comando para criptografar o arquivo workload.yaml com uma senha aleatória:

    ENCRYPTED_WORKLOAD="$(echo -n "$PASSWORD" | base64 -d | openssl enc -aes-256-cbc -pbkdf2 -pass stdin -in "$WORKLOAD" | base64 -w0)"
    
  7. Use o comando a seguir para obter a seção criptografada do contrato:

    echo "hyper-protect-basic.${ENCRYPTED_PASSWORD}.${ENCRYPTED_WORKLOAD}"
    
  8. Obter a saída da etapa 7 e adicioná-la ao arquivo user-data.yaml.

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

    O prefixo hyper-protect-basic é obrigatório.

Criando a seção criptografada env de um contrato

Conclua as etapas a seguir em um sistema Ubuntu para criptografar a seção env usada em um contrato:

  1. Crie a env seção do contrato e inclua o conteúdo no arquivo env.yaml..

    A seguir, um exemplo 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. Exporte o caminho completo do arquivo 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. Use o seguinte comando para criar uma senha aleatória:

    PASSWORD="$(openssl rand 32 | base64 -w0)"
    
  4. A partir de OpenSSL 3.0, o subcomando OpenSSL rsautl está obsoleto e está sendo substituído pelo subcomando pkeyutl. Use um dos seguintes comandos para criptografar a senha com ibm-hyper-protect-container-runtime-1-0-s390x-29-encrypt.crt:

    • rsautl (obsoleto):
       ENCRYPTED_PASSWORD="$(echo -n "$PASSWORD" | base64 -d | openssl rsautl -encrypt -inkey $CONTRACT_KEY -certin | base64 -w0)"
    
    • pkeyutl (recomendado):

      ENCRYPTED_PASSWORD="$(echo -n "$PASSWORD" | base64 -d | openssl pkeyutl -encrypt -inkey $CONTRACT_KEY -certin -pkeyopt rsa_padding_mode:pkcs1 | base64 -w0)"
      
  5. Use o seguinte comando para criptografar env.yaml com uma senha aleatória:

    ENCRYPTED_ENV="$(echo -n "$PASSWORD" | base64 -d | openssl enc -aes-256-cbc -pbkdf2 -pass stdin -in "$ENV" | base64 -w0)"
    
  6. Use o comando a seguir para obter a seção criptografada do contrato:

    echo "hyper-protect-basic.${ENCRYPTED_PASSWORD}.${ENCRYPTED_ENV}"
    
  7. Para criptografar a seção de carga de trabalho, consulte Criando a seção criptografada workload de um contrato.

  8. Obter a saída da etapa 6 e adicioná-la ao arquivo user-data.yaml.

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

Assinatura de contrato

A assinatura do contrato é um recurso opcional que você pode usar com o contrato. Você pode optar por assinar um contrato antes que ele seja transmitido como entrada. Você também pode definir a expiração do contrato durante a assinatura. Os contratos que estão em texto simples ou criptografados podem ser assinados. A validação da assinatura do contrato é feita pelo Hyper Protect Virtual Servers para imagem VPC. O objetivo deste recurso de assinatura é garantir que as seções workload e env sejam sempre usadas em conjunto e não sejam adulteradas por um terceiro. Esse recurso também suporta a configuração de expiração para o contrato Ou seja, se a instância for inicializada após a expiração da assinatura, o processo de inicialização falhará. A assinatura do workload e das seções env são adicionadas como o valor para a seção envWorkloadSignature. A seguir, são duas seções em um contrato que são relevantes enquanto criam e adicionam uma assinatura de contrato:

  • envWorkloadSignature: Esta seção é onde a assinatura das outras seções do contrato é adicionada. Esta seção não é necessária para um contrato que não é assinado.
  • signingKey: Essa subseção deve ser adicionada à seção env do contrato. Essa subseção contém o valor da chave pública gerada pelo usuário, cuja chave privada correspondente foi usada para criar a assinatura do contrato. Uma chave pública ou certificado também pode ser analisado como uma cadeia de caracteres Base64.

Conclua as etapas a seguir em um sistema Ubuntu para criar a assinatura do contrato:

  1. Use o seguinte comando para gerar par de chaves para assinar o contrato (note que "test1234" é o passphrase para gerar chaves, você pode usar o seu próprio):

    openssl genrsa -aes128 -passout pass:test1234 -out private.pem 4096
    openssl rsa -in private.pem -passin pass:test1234 -pubout -out public.pem
    
  2. O comando a seguir é um exemplo de como você pode obter a chave de assinatura:

    key=$(awk -vRS="\n" -vORS="\\\n" '1' public.pem)
    echo ${key%\\n}
    
  3. Opcionalmente, se você quiser passar a chave de assinatura como Base64:

    key=$(cat public.pem | base64 -w 0)
    echo $key
    
  4. Opcionalmente, se você quiser ativar a expiração do contrato, siga estas etapas:

    1. Use o seguinte comando para gerar uma solicitação de certificado:
       openssl req -new -key private.pem -passin pass:test1234 -out csr.pem
    
    1. O comando gera o certificado..
      • Use o seguinte comando para gerar uma chave privada para a CA:
      openssl genrsa -out personal_ca.key 2048
      
      • Gere um certificado de autoridade certificadora (CA) autoassinado usando o seguinte comando:
      openssl req -new -x509 -key personal_ca.key -out personal_ca.crt
      
      • O comando a seguir assina a CSR com um certificado CA autoassinado, juntamente com o número de dias de validade do certificado. A data de encerramento do certificado gerado é a data de expiração do contrato:
      openssl x509 -req -in csr.pem -CA personal_ca.crt -CAkey personal_ca.key -CAcreateserial -out certificate.pem -days 365
      
    2. O comando a seguir é um exemplo para obter o certificado:
      certificate=$(awk -vRS="\n" -vORS="\\\n" '1' certificate.pem)
      echo ${certificate%\\n}
      
    3. Opcionalmente, use o seguinte comando como exemplo para obter o certificado em Base64 formatar:
       certificate=$(cat certificate.pem | base64 -w 0)
       echo $certificate
    
  5. Crie o arquivo env.yaml . Consulte o seguinte exemplo:

    1. Se signingkey for uma chave pública:
       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 for um certificado:
         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 é um Base64 chave ou certificado de assinatura codificada:
         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. Crie o arquivo env.yaml . Consulte o seguinte exemplo:

     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. Use o seguinte comando para exportar caminho completo de 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. Use o seguinte comando para criar uma senha aleatória:

    PASSWORD="$(openssl rand 32 | base64 -w0)"
    
  9. A partir de OpenSSL 3.0, o subcomando OpenSSL rsautl está obsoleto e está sendo substituído pelo subcomando pkeyutl. Use um dos seguintes comandos para criptografar a senha com ibm-hyper-protect-container-runtime-1-0-s390x-29-encrypt.crt:

    • Usando rsautl (obsoleto):
        ENCRYPTED_PASSWORD="$(echo -n "$PASSWORD" | base64 -d | openssl rsautl -encrypt -inkey $CONTRACT_KEY -certin | base64 -w0)"
        ```
    - Usando o site `pkeyutl` (recomendado):
    
    ```yaml {: pre}
        ENCRYPTED_PASSWORD="$(echo -n "$PASSWORD" | base64 -d | openssl pkeyutl -encrypt -inkey $CONTRACT_KEY -certin -pkeyopt rsa_padding_mode:pkcs1 | base64 -w0)"
        ```
    
  10. Use o seguinte comando para criptografar env.yaml com uma senha aleatória:

    ENCRYPTED_ENV="$(echo -n "$PASSWORD" | base64 -d | openssl enc -aes-256-cbc -pbkdf2 -pass stdin -in "$ENV" | base64 -w0)"
    
  11. Use o comando a seguir para extrair a seção criptografada env:

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

As etapas 7 a 11 são usadas para criptografar a seção env. Se você optar por não criptografar esta seção, pule esses passos.

Uma notificação sobre o término do contrato é enviada ao seu serviço de registro. Os prazos para a notificação são os seguintes:

  • No primeiro dia de cada mês
  • Todos os dias durante 30 dias antes da expiração
  • Uma vez a cada 4 horas se o contrato estiver prestes a expirar em 7 dias
  • A cada hora se o contrato expirou ou está prestes a expirar em 1 dia

Registros de aviso de expiração de certificados de criptografia e atestação

O HPVS registra mensagens de aviso no serviço de registro configurado sobre certificados de criptografia e de atestado futuros e expirados.

O cronograma de notificação é o seguinte:

  • 30 dias antes da expiração: Uma mensagem de aviso é gerada uma vez a cada 24 horas, notificando que o certificado expirará em um mês.

    Exemplo:

    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 dias antes do vencimento: Mensagens de aviso são registradas a cada 12 horas à medida que a data de expiração se aproxima, destacando a necessidade de ação.

    Exemplo:

    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!!!
    
  • Após a expiração do certificado: Se o certificado tiver expirado, o HPVS registrará mensagens de aviso a cada 4 horas até que a imagem do HPVS seja atualizada.

    Exemplo:

    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.
    

Preparando a seção Atestado

O atestado é o recurso opcional que você pode usar com o contrato. A attestationPublicKey é a chave pública fornecida pelo usuário que é usada para criptografar o documento de atestado. Isso pode ser fornecido como uma chave RSA pública ou Base64 codificado da chave RSA pública como parte do contrato.

  • Se você usar a chave RSA pública de texto simples para o attestationPublicKey no arquivo yaml, use o exemplo a seguir:

    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 você usar o Base64 chave de assinatura codificada para o attestationPublicKey no arquivo yaml, use o comando e exemplo a seguir.

    base64 -w0 <public RSA key file>
    

    É necessário substituir <public RSA key file> pelo caminho para o seu arquivo de chave RSA público real

    attestationPublicKey: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUJpRENDQVM2Z0F3SUJBZ0lSQUxCMXBPYlpEQlRRc09GSFlxazMzaWd3Q2dZSUtvWkl6ajBFQXdJd0tqRW8KTUNZR0ExVUVBeE1mZFhNdWFXTnlMbWx2TDNCeVlXSm9ZWFF4TWpNdmJYa3RhR0Z3Y205NGVUQWVGdzB5TWpBMApNVE14TURFd01ETmFGdzB6TWpBME1UQXhNREV3TUROYU1Db3hLREFtQmdOVkJBTVRIM1Z6TG1samNpNXBieTl3CmNtRmlhR0YwTVRJekwyMTVMV2hoY0hKdmVIa3dXVEFUQmdjcWhrak9QUUlCQmdncWhrak9QUU1CQndOQ0FBU1AKWGsrelE2MlFZNjI3MWQ1cTBMZHY3SGc3QzZkMGZOUlRsQmJXekhOWWFDZzlpU0piYnVNdjVBY0JmMjlqQi83eApqYzhzVitxMksyemtkTHV4QWxGWm96VXdNekFPQmdOVkhROEJBZjhFQkFNQ0JhQXdFd1lEVlIwbEJBd3dDZ1lJCkt3WUJCUVVIQXdNd0RBWURWUjBUQVFIL0JBSXdBREFLQmdncWhrak9QUVFEQWdOSUFEQkZBaUIzd0JTa0IxaXAKZHZZYlBMbFBmS3RZT0hsYnZzUllKa0FZM2hnY0xuNWhwQUloQUt6cmhsU3p4K1I5bmdtMTBlZVkyaFNCRmgrawpMWHp6SFkwaktTVzhyM1FhCi0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0K
    
  • Se você criptografou o attestationPublicKey no arquivo yaml, deverá seguir as mesmas etapas mencionadas na criptografia do contrato.

    Para decriptografar o documento de atestado, siga as instruções em Decriptografando o documento de atestado.

Preparando a assinatura

Conclua as etapas a seguir em um sistema Ubuntu para preparar a assinatura:

Se você tiver o user-data.yaml criptografado das seções Criando a seção workload criptografada de um contrato e Criando a seção env criptografada de um contrato, pule para a etapa 3.

  1. Obtem os arquivos criptografados workload.yaml e criptografados env.yaml.

  2. Inclua-os no arquivo user-data.yaml.

    workload: hyper-protect-basic.js7TGt77EQ5bgTIKk5C0pViFTRHqWtn..............
    env: hyper-protect-basic.VWg/5/SWE+9jLfhr8q4i.........
    
  3. Crie o arquivo contract.txt . Adicione o valor de workload primeiro e, em seguida, adicione o valor de env do arquivo user-data.yaml. Certifique-se de que não haja espaço ou nova linha após workload e antes de env. Além disso, certifique-se de que nenhuma nova linha ou espaço seja adicionado ao final do arquivo. É recomendável fazer uma verificação cruzada do conteúdo binário do arquivo contract.txt com ferramentas como hexdump No dump de arquivo binário, certidão-se de não ver o valor de ASCII 0a como a última entrada.

    hyper-protect-basic.js7TGt77EQ5bgTIKk5C0pViFTRHqWtn..............hyper-protect-basic.VWg/5/SWE+9jLfhr8q4i.........
    
  4. Utilize o seguinte comando para gerar a assinatura:

    echo $(cat contract.txt | tr -d "\n\r" | openssl dgst -sha256 -sign private.pem | openssl enc -base64) | tr -d ' '
    
  5. Inclua a assinatura no arquivo user-data.yaml:

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

Introdução a um simples Hyper Protect Virtual Servers para contrato VPC

Os exemplos de comandos a seguir são executados em um sistema Ubuntu.

1. Obtenha os detalhes de sua instância de registro de registro

É possível configurar a criação de log com o IBM Log Analysis ou um backend de syslog genérico. Este exemplo usa o IBM Log Analysis Você pode escolher entre diferentes planos. Para entender como você obtém os detalhes necessários, como o nome do host e a chave de ingestão, consulte Registro em log para Hyper Protect Virtual Servers para VPC.

2. Crie a seção env

Certifique-se de não perder o símbolo de pipe '|' se estiver usando um contrato de texto simples. Ele não é necessário se você estiver planejando criptografar a seção.

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

3. Prepare o arquivo docker-compose

Supondo que você tenha os detalhes da criação de log, encontre um arquivo de compose de docker simples. O exemplo a seguir tem um contêiner público NGINX. Crie um docker-compose.yaml usando o exemplo.

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

4. Obtenha a versão base64-encoded do arquivo docker-compose

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

5. Crie a seção de composição com ela

  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. Preencher a seção de carga de trabalho

Certifique-se de não perder o símbolo de pipe (|) se estiver usando um contrato de texto simples.

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. Seu contrato simples está 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==

Próximas etapas