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 comoattestationPublicKey.- 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) ouplay(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
resourcesdeplay.. 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: NeverO exemplo a seguir ilustra como usar a seção
initcontainerscom a seçãoresources: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
archivesubseção deplay, 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
templatesdeplay. 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 objetosBuilt-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/testA expressão
{{ .Env REGISTRY }}faz referência à variável de ambienteREGISTRYque neste exemplo é definida na seçãoenvdo 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.
- 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
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
hostPortrecurso 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
hostPortecontainerPortexplicitamente. Se você especificar apenascontainerPort, as portas não serão ligadasExemplo:
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
hostPortno 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:
- Faça login no painel do Container Registry.
- Abra a imagem.
- 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
15caracteres. A seguir estão os caracteres permitidos:- Letras minúsculas
(a-z) - Letras maiúsculas
(A-Z) - Números
(0-9) - Caracteres especiais
!@#$%^&*(),.?":{}|<>_-
- Letras minúsculas
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áveisenvse 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
envdo implantador. O exemplo a seguir mostra como especificar os valores para as variáveisenv: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
- 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.
| 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.
- 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:
-
Crie o arquivo
docker-compose.yamlcom 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.
-
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" -
Exporte o caminho completo do arquivo
workload.yamleibm-hyper-protect-container-runtime-1-0-s390x-29-encrypt.crt:WORKLOAD="<PATH to workload.yaml>" CONTRACT_KEY="<PATH to ibm-hyper-protect-container-runtime-1-0-s390x-29-encrypt.crt>" -
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)" -
A partir de OpenSSL 3.0, o subcomando OpenSSL
rsautlestá obsoleto e está sendo substituído pelo subcomandopkeyutl. Use um dos seguintes comandos para criptografar a senha comibm-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)"
- Usando
-
Use o seguinte comando para criptografar o arquivo
workload.yamlcom uma senha aleatória:ENCRYPTED_WORKLOAD="$(echo -n "$PASSWORD" | base64 -d | openssl enc -aes-256-cbc -pbkdf2 -pass stdin -in "$WORKLOAD" | base64 -w0)" -
Use o comando a seguir para obter a seção criptografada do contrato:
echo "hyper-protect-basic.${ENCRYPTED_PASSWORD}.${ENCRYPTED_WORKLOAD}" -
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:
-
Crie a
envseção do contrato e inclua o conteúdo no arquivoenv.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" -
Exporte o caminho completo do arquivo
env.yamleibm-hyper-protect-container-runtime-1-0-s390x-29-encrypt.crt:ENV="<PATH to env.yaml>" CONTRACT_KEY="<PATH to ibm-hyper-protect-container-runtime-1-0-s390x-29-encrypt.crt>" -
Use o seguinte comando para criar uma senha aleatória:
PASSWORD="$(openssl rand 32 | base64 -w0)" -
A partir de OpenSSL 3.0, o subcomando OpenSSL
rsautlestá obsoleto e está sendo substituído pelo subcomandopkeyutl. Use um dos seguintes comandos para criptografar a senha comibm-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)"
-
Use o seguinte comando para criptografar
env.yamlcom uma senha aleatória:ENCRYPTED_ENV="$(echo -n "$PASSWORD" | base64 -d | openssl enc -aes-256-cbc -pbkdf2 -pass stdin -in "$ENV" | base64 -w0)" -
Use o comando a seguir para obter a seção criptografada do contrato:
echo "hyper-protect-basic.${ENCRYPTED_PASSWORD}.${ENCRYPTED_ENV}" -
Para criptografar a seção de carga de trabalho, consulte Criando a seção criptografada
workloadde um contrato. -
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çãoenvdo 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:
-
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 -
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} -
Opcionalmente, se você quiser passar a chave de assinatura como Base64:
key=$(cat public.pem | base64 -w 0) echo $key -
Opcionalmente, se você quiser ativar a expiração do contrato, siga estas etapas:
- Use o seguinte comando para gerar uma solicitação de certificado:
openssl req -new -key private.pem -passin pass:test1234 -out csr.pem- 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 - O comando a seguir é um exemplo para obter o certificado:
certificate=$(awk -vRS="\n" -vORS="\\\n" '1' certificate.pem) echo ${certificate%\\n} - Opcionalmente, use o seguinte comando como exemplo para obter o certificado em Base64 formatar:
certificate=$(cat certificate.pem | base64 -w 0) echo $certificate -
Crie o arquivo
env.yaml. Consulte o seguinte exemplo:- Se
signingkeyfor 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----"- Se
signingkeyfor 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-----"- 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 - Se
-
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----" -
Use o seguinte comando para exportar caminho completo de
env.yamleibm-hyper-protect-container-runtime-1-0-s390x-29-encrypt.crt:ENV="<PATH to env.yaml>" CONTRACT_KEY="<PATH to ibm-hyper-protect-container-runtime-1-0-s390x-29-encrypt.crt>" -
Use o seguinte comando para criar uma senha aleatória:
PASSWORD="$(openssl rand 32 | base64 -w0)" -
A partir de OpenSSL 3.0, o subcomando OpenSSL
rsautlestá obsoleto e está sendo substituído pelo subcomandopkeyutl. Use um dos seguintes comandos para criptografar a senha comibm-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)" ``` - Usando
-
Use o seguinte comando para criptografar
env.yamlcom uma senha aleatória:ENCRYPTED_ENV="$(echo -n "$PASSWORD" | base64 -d | openssl enc -aes-256-cbc -pbkdf2 -pass stdin -in "$ENV" | base64 -w0)" -
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
attestationPublicKeyno 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
attestationPublicKeyno 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 realattestationPublicKey: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUJpRENDQVM2Z0F3SUJBZ0lSQUxCMXBPYlpEQlRRc09GSFlxazMzaWd3Q2dZSUtvWkl6ajBFQXdJd0tqRW8KTUNZR0ExVUVBeE1mZFhNdWFXTnlMbWx2TDNCeVlXSm9ZWFF4TWpNdmJYa3RhR0Z3Y205NGVUQWVGdzB5TWpBMApNVE14TURFd01ETmFGdzB6TWpBME1UQXhNREV3TUROYU1Db3hLREFtQmdOVkJBTVRIM1Z6TG1samNpNXBieTl3CmNtRmlhR0YwTVRJekwyMTVMV2hoY0hKdmVIa3dXVEFUQmdjcWhrak9QUUlCQmdncWhrak9QUU1CQndOQ0FBU1AKWGsrelE2MlFZNjI3MWQ1cTBMZHY3SGc3QzZkMGZOUlRsQmJXekhOWWFDZzlpU0piYnVNdjVBY0JmMjlqQi83eApqYzhzVitxMksyemtkTHV4QWxGWm96VXdNekFPQmdOVkhROEJBZjhFQkFNQ0JhQXdFd1lEVlIwbEJBd3dDZ1lJCkt3WUJCUVVIQXdNd0RBWURWUjBUQVFIL0JBSXdBREFLQmdncWhrak9QUVFEQWdOSUFEQkZBaUIzd0JTa0IxaXAKZHZZYlBMbFBmS3RZT0hsYnZzUllKa0FZM2hnY0xuNWhwQUloQUt6cmhsU3p4K1I5bmdtMTBlZVkyaFNCRmgrawpMWHp6SFkwaktTVzhyM1FhCi0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0K -
Se você criptografou o
attestationPublicKeyno 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.
-
Obtem os arquivos criptografados
workload.yamle criptografadosenv.yaml. -
Inclua-os no arquivo
user-data.yaml.workload: hyper-protect-basic.js7TGt77EQ5bgTIKk5C0pViFTRHqWtn.............. env: hyper-protect-basic.VWg/5/SWE+9jLfhr8q4i......... -
Crie o arquivo
contract.txt. Adicione o valor deworkloadprimeiro e, em seguida, adicione o valor deenvdo arquivouser-data.yaml. Certifique-se de que não haja espaço ou nova linha apósworkloade antes deenv. 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 arquivocontract.txtcom ferramentas comohexdumpNo dump de arquivo binário, certidão-se de não ver o valor de ASCII0acomo a última entrada.hyper-protect-basic.js7TGt77EQ5bgTIKk5C0pViFTRHqWtn..............hyper-protect-basic.VWg/5/SWE+9jLfhr8q4i......... -
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 ' ' -
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==