契約について

VPC の IBM Cloud Hyper Protect Virtual Servers は非推奨。 2026年2月28日現在、新しいインスタンスを作成することはできません。 既存のインスタンスは、2027年2月20日までサポートされます。 その日付にまだ存在するインスタンスはすべて削除されます。 IBM Confidential Computing Container Runtime(旧称: Hyper Protect Virtual Servers )または IBM Confidential Computing Container Runtime for Red Hat Virtualization Solutions(旧称:Hyper Protect Container Runtime for Red Hat Virtualization Solutions )を使用して、ワークロードを再デプロイできます。 データ移行については、 移行ガイドを 参照してください。 詳しくは、 サービス廃止のお知らせを ご覧ください。

VPCインスタンス用にHyper Protect IBM Container Runtime( IBM CloudHyper Protect Virtual Servers HPCR)イメージを使用してインスタンスを作成する際には、 ユーザー データフィールドの一部として契約を指定する必要があります。

契約とは何ですか?

この契約は、VPC インスタンス用の Hyper Protect Virtual Servers に固有の YAML 形式の定義ファイルです。 このファイルは、インスタンスを作成するための前提条件として、クラウド・ユーザーが作成する必要があります。 このファイルは、作成された後、インスタンスの作成時に 「ユーザー・データ」 フィールドの一部として入力として渡す必要があります。 有効な契約なしでインスタンスを作成することはできません。 契約なしでインスタンスを作成すると、デプロイメントが開始されてから失敗し、インスタンスはシャットダウン状態になります。 この契約は、VPC インスタンス用の Hyper Protect Virtual Servers の作成に固有のものであり、 IBM Secure Execution Technology by Hyper Protect の拡張機能です。

ワークロードがSSHまたはREST APIを通じて復号化されたトークンを公開している場合、復号化されたデータにはワークロードと環境の秘密の両方が含まれています。 ただし、ボリューム暗号化に使用された種子は含まれていません。

契約セクション

契約ファイルには、以下の 4 つの有効な概要セクションを含めることができます。これらのセクションのうち、 workload セクションと env セクションは必須です。

  • workload は必須セクションです。
  • env は必須セクションです。
  • attestationPublicKey は、オプションのセクションです。 パブリック RSA キーを契約の一部として指定できます。これは、認証文書を暗号化するために使用され、属性の名前は attestationPublicKey にする必要があります。
  • envWorkloadSignature はオプションのセクションであり、契約の他のセクションの署名を含みます。

契約の 2 つの基本セクションは、 workload セクションと env セクションです。 これらの 2 つのセクションが必要になるのは、契約に追加される情報が、「ワークロード」と「デプロイヤー」のペルソナという 2 人の異なるペルソナからのものであるためです。

ワークロード・ペルソナは、VPC インスタンスの Hyper Protect Virtual Servers で起動する必要があるコンテナー (またはワークロード) に関する情報を提供します。 コンテナの名前、Container Registryどこにあるのか、その資格はContainer Registry、イメージ ダイジェスト、公証サーバー情報 (イメージ検証に必要)、コンテナーに渡す必要がある環境変数、コンテナー情報を含む docker compose ファイルまたは Pod 記述子。

Docker Compose ファイルを使用する場合は、1 つのコンテナーのみがサポートされます。 ポッド記述子は、1 つ以上のコンテナーをサポートします。

デプロイ担当者は、 IBM Cloud と緊密に連携します。 このペルソナは、ワークロード・ペルソナからワークロード情報 (暗号化されたワークロード・セクションが望ましい) を受け取ります。 その後、デプロイヤーは契約の env セクションを作成します。 この env セクションには、 IBM Cloud 環境に固有の情報が含まれています。 通常は、ワークロード・ペルソナには存在せず、知る必要もない情報です。 例としては、契約の env セクションに情報を追加する前に、デプロイヤー・ペルソナが作成する IBM Cloud ロギング・インスタンスに関する情報があります。

ワークロード・セクション

この条項は契約の中で最も重要な条項のひとつです。 workload セクションは複数のサブセクションを持つことができます。サブセクションの目的は、ワークロードを立ち上げるために必要な情報を提供することです。 workload セクションは、以下のサブセクションを持つことができる親セクションです。

  • type:作業量。 このサブセクションは必須です。
  • auths このサブセクションはオプションです。
  • compose (単一コンテナーの場合) または play (単一コンテナーまたは複数コンテナーの場合)。 これらは相互に排他的です。いずれかのセクションが存在している必要があります。
  • images このサブセクションはオプションです。
  • volumes このサブセクションはオプションです。

以下のスニペットは、契約のワークロード・セクションの概要を示しています。 ワークロード・セクションが必要とする最小限のものは、compose セクションです。 その他のセクションは、要件に基づいて追加できます。

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"

auths サブセクション

auths セクションは、コンテナーのレジストリーに関する情報で構成されます。 契約でパブリック・イメージを使用する場合、資格情報は必要ないため、 auths セクションは必要ありません。 auths サブセクションは、コンテナー・イメージがプライベートである場合にのみ必要です。 以下の例に示すように、このサブセクションにはイメージ情報はありません。 このサブセクションには、イメージ・レジストリーの名前と資格情報 (同じものの username-password など) を含める必要があります。 キーはホスト名である必要がありますContainer Registryまたは、デフォルトの Docker レジストリの場合は次の文字列:

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

以下のスニペットは、 IBM Cloud レジストリーの例を示しています。 API キーの使用について詳しくは、 クライアント・ソフトウェアを使用した自動化での認証 を参照してください。

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

compose サブセクション

これは、アーカイブ・サブセクションで構成されます。 アーカイブ・サブセクションには、 docker-compose.yaml ファイルの Base64 エンコード TGZ ファイル・アーカイブが含まれています。 Hyper Protect Container Runtime イメージは Docker Engine および Docker Compose を使用してコンテナーを開始するため、最初に標準の docker-compose ファイルを使用してコンテナーに関する情報を作成する必要があります。 このファイルはアーカイブされ、 Base64 エンコードされ、このプロセスの出力は、コンポーズセクション内のアーカイブサブセクションの値として提供されます。 詳しくは、 Docker Composeの概要 を参照してください。

docker-compose ファイルのボリューム情報の下に指定されているマウント・ポイントは、契約のワークロード・セクションに指定されているボリューム・マウント・ポイントと整合している可能性があります。

Docker Compose ファイルの一部としてビルドを実行することはサポートされていません。 Docker Compose ファイルに build セクションがないことを確認します。

docker-compose ファイルでは、「yaml」形式と「yml」形式の両方がサポートされます。 Docker Compose ファイルの例を以下に示します。

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

ワークロードセクションが事前に暗号化されている場合、レジストリが不明であるというユースケースが存在します。 例えば、ワークロードプロバイダーがデプロイヤーにレジストリミラーやプライベートレジストリの使用を許可したい場合、レジストリとプル認証 Container Registry 情報を動的に上書きすることが可能です。 この作業は、作業負荷の提供者と展開者の間で調整する必要があります。 詳しくは、 動的レジストリー・リファレンスの使用 を参照してください。

以下の手順を完了してBase64エンコードされたアーカイブ ファイル。 のBase64出力はcompose.b64ファイル。 <COMPOSE_Folder> に移動して、以下のコマンドを実行します。

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

Compose tgz ファイルにはディレクトリと通常のファイルのみが含まれていることを確認します。 リンクまたはパイプはサポートされていません。

compose.b64 の内容を compose-> archive の値としてコピーします。

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

この例の場合、以下の出力のような応答が表示されます。

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

play サブセクション

の中に play サブセクションでは、ワークロードを次のように定義できます。ポッド記述子。 各ポッドには、1 つ以上のコンテナー定義を含めることができます。 記述子は、以下のいずれかの方法で指定できます:

  • playresources サブセクション内のプレーン YAML 形式。 このセクションは記述子の配列であり、 ポッドConfigMapsの 2 つのタイプの記述子をサポートします。

    以下の例は、 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
    

    次の例は、 resources セクションを使った initcontainers の使い方を示している:

    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
    
  • の中に archive のサブセクション play、アーカイブはBase64エンコードされ、gzip 圧縮された tar ファイル。 ポッドまたは ConfigMaps は、この tar ファイルの最上位にある YAML ファイルとして表されます。 ファイルには余分なファイルが含まれている可能性があり、すべてのファイルがホストファイルシステムに抽出された後に、Podが起動されます。 現行作業ディレクトリー は、ファイルが抽出されたディレクトリーであるため、相対パスを指定したボリューム・マウントを使用して、YAML ファイルからファイルまたはディレクトリーをマウントすることができます。

    次に例を示します。

    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
    
  • playtemplates サブセクション内のテンプレート・フォーマット。 このセクションは、YAML 形式の記述子の配列です。 ポッドまたはConfigMaps 記述子を記述する時点で不明な可変性ポイント(POV)を持つことがあります。 これらのPOV はテンプレートとして表現することができ、値は契約上の情報からデプロイ時に完成されます。 go templates をテンプレート構文として使用します。これは、 helm チャートで使用されるものと同じであるため、テンプレートを k8sと簡単に交換できます。 以下の Built-In オブジェクトをサポートします。

    • 環境: このオブジェクトには、ワークロードと環境セクションの間でマージされた環境変数が含まれます。 オブジェクトは {{ .Env }} として使用可能です。

    次に例を示します。

    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
    

    {{ .Env REGISTRY }} 式は、この例で契約の env セクションに定義されている REGISTRY 環境変数を参照します。

    テンプレートは有効な YAMLである必要があるため、置換式がストリングの最初の部分として出現する場合はエスケープする必要があります。 そうでなければ、ブロックマッピング構文。 これは、モデル表現ではなくドキュメントのテキスト表現に式が適用される ヘルムテンプレートとは異なります。

環境変数

契約では、 workload セクションおよび env セクションで環境変数を定義できます。 両方の変数セットは、 workload が優先されるように結合されます。 ポッドは ConfigMap の概念を使用して構成を定義するため、HPCR はマージされた環境セクションを contract.config.map という名前の特殊な ConfigMap として表します。 以下の例では、すべての環境変数を契約からコンテナーにマウントします。

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

ポッド・コミュニケーション

  • コンテナー間

    1つのポッド内のコンテナは、localhost。 各コンテナは異なるポートをリッスンする必要があります。なぜなら、設計上、IPアドレスを共有しているからです。

  • ホストへのポッド

    通常、ポッドは、そのコンテナの少なくとも1つをホストに公開する必要があります。これにより、ホスト上のIPアドレスから、マッピングされたポートを通じてコンテナにアクセスできるようになります。 このユースケースでは、hostPort コンテナ上の機能。 なお、これは Kubernetes の世界では 推奨されない手法であり、代わりにサービスを使用すべきである。

    hostPortcontainerPort の両方を明示的に指定します。 containerPort のみを指定した場合、ポートはバインドされません。

    次に例を示します。

    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
    
  • ポッドからポッド

    あるポッドから別のポッドに到達するには、ターゲット・ポッドで hostPort を公開します。 その後、ソース・ポッドは、ターゲット・ポッドに到達するために、公開されたポートでホストに対して要求を行うことができます。

    ソース Pod は次のコマンドでホストの IP アドレスを見つけることができます。

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

Volumes

Hyper Protect Container Runtime の場合、ボリュームは、契約の 「ボリューム」 セクションによって管理されます。 この情報に基づいて、HPCR は外部ブロック デバイスを暗号化し、ホストにマウントします。 これらのボリュームをポッドにマウントするには、ボリュームで hostPath マウント・オプションを使用します。

次に例を示します。

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

ここで volumes フィールドは、ポッドにマウントされるホスト上のデータを定義します。 これは、HPCR 契約の volumes とは異なります。

images サブセクション

Docker は、 Docker コンテンツ・トラスト(DCT )の退任を発表した。 DCTはレガシーな Notary v1 フレームワーク上に構築されていますが、このフレームワークは現在アクティブに保守されていないため、画像署名と検証のための将来対応可能な、または持続可能なソリューションとは考えられていません。 その結果、顧客はDCTから移行し、現在のサプライチェーンセキュリティ標準に沿った OCI準拠の画像署名・検証技術を採用することが推奨される。 コンテナイメージを IBM Cloud Container Registry (ICR) に移行できる。 ICRは、 Red Hat Signing Service (RHS) を信頼できる署名ルートとして統合し、ベンダーに裏付けされた信頼モデルを提供し、現代のコンテナ・セキュリティとサプライチェーンのベスト・プラクティスとの整合を図っている。 詳しくは、 Docker コンテンツ・トラストを引退する を参照。

images サブセクションは、署名されたイメージのみを対象としています。

Docker Compose によって記述されるイメージ

docker-compose ファイルにリストされるコンテナー・イメージは、 Docker Content Trust (DCT) を使用して署名することも、署名しないこともできます。

次の例は、画像 URL を示しています:

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

以下は、公証人( URL )の例です:

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

publicKey は、DCT を使用してイメージの署名に使用される、対応する公開鍵です。 公開鍵を取得するには、次のコマンドを実行してください:

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

以下のスニペットはその一例です:

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

署名されていないイメージの場合、イメージのサブセクションに項目は必要ありません。 ただし、署名されていないイメージの場合は、ダイジェストが必要です。 ダイジェストを取得するには、以下の手順を実行してください:

  1. Container Registry のダッシュボードにログインしてください。
  2. イメージを開きます。
  3. 「タグ」 をクリックし、 「ダイジェスト」 をクリックします。

ダイジェストを取得したら、このダイジェストを docker-compose.yaml ファイルに追加します。 以下の例を参照してください。

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

ポッド記述子によって記述されるイメージ

Pod ディスクリプタで記述されたコンテナイメージは、 Red Hat のシンプル署名で検証できます。

イメージがダイジェストによって参照されている場合、サービスは追加の検査なしでその使用を許可します。

ダイジェストのないイメージでは、GPG 鍵を検証する必要があります。 鍵は、作成可能な Base64 エンコードされたバイナリ形式で転送されます。 以下の例を参照してください。

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

この鍵は、rhs のサブセクション images セクション。 このセクションは、キーとしてイメージ ID を持ち、 publicKey フィールドに GPG キーを持つマップです。

次に例を示します。

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

workload- volumes サブセクション

契約で volumes セクションを指定する必要があるのは、作成時にデータ・ボリュームがインスタンスに接続されている場合のみです。 このセクションで提供される情報は、ユーザーが提供した添付データボリュームのマウントに使用され、その後、 workload および env セクションで提供された「種」を使用して暗号化されます。 「マウント」フィールドには、任意のパスを指定できます。 ユーザーが指定したパスは、データボリュームのマウントに内部的に使用されます。 契約で指定されたマウントパスは、 docker-compose.yaml ファイルのボリュームセクションで指定されたパスと一致する必要があります。これにより、コンテナのワークロードに関連付けられたすべてのデータがこのデータボリュームに保存されます。

volumes サブセクションは、ユーザー提供のシードを使用したデータ・ボリュームの自動暗号化をサポートしています。 データ・ボリュームが Hyper Protect Virtual Servers インスタンスに接続されている場合、そのデータ・ボリュームは、契約の volumes サブセクションの「seed」フィールドで指定されたシードを使用して自動的に暗号化されます。 したがって、2 つのシードを指定する必要があります。1 つは workload セクションを介して (ワークロード・ペルソナによって) 提供され、もう 1 つは env セクションを介して (デプロイヤー・ペルソナによって) 提供されます。 これらの 2 つのシードは、内部的に UTF8 シーケンスに変換されてから、連結されます。 その後、連結シーケンスのハッシュ (SHA256) が 16 進ダイジェストとして計算されます。これは、データ・ボリュームを暗号化するための LUKS パスフレーズとして使用されます。

現在、 envworkload のシードには、 最低3文字の長さが必要です。 2026年3月以降、この最低文字数は15文字に引き上げられる2026年3月以降に 15文字より短いシード値を使用すると、エラーまたはデプロイメントに失敗する可能性があります。 中断を避けるため、できるだけ早くすべてのシード値を少なくとも 15 文字の長さに更新してください。 ルールは以下のセクションで定義されている。

2026年3月以降、タネを作るには以下のルールに従わなければならない:

  • スペースは使用できません。
  • 少なくとも 15。 以下は使用可能な文字である:
    • 小文字 (a-z)
    • 大文字 (A-Z)
    • 数値 (0-9)
    • 特殊文字 !@#$%^&*(),.?":{}|<>_-

hexdigest の妥当性を確認するには、次のコマンドを使用できます:

echo -n "seed1seed2" | sha256sum

ここでは、契約のワークロード・セクションで「シード」を指定する方法について説明します。 env セクションを通じて「シード」入力を提供する方法について詳しくは、 env セクション を参照してください。 暗号化のために両方のシードを指定する必要があります。 インスタンスがシャットダウンしたシードが 1 つのみの場合、暗号化は失敗します。

データを保存状態において、より高度な暗号化保護と制御を追加するには、との統合により実現 Hyper Protect Crypto Services できます。 から開始し、 ibm-hyper-protect-container-runtime-1-0-s390x-11 を第三のシードとしてランダム値を生成 Hyper Protect Crypto Services し、ルートキーでラップすることができます。 LUKS パスフレーズは、 3 つ のシード (メタデータ・パーティション内のシードとコントラクトからの 2 つのシード) を使用して生成されます。 詳しくは、データの保護を参照してください。

以下のスニペットは、volumes セクションの例です。

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

HPCRイメージバージョンから ibm-hyper-protect-container-runtime-1-0-s390x-9、新しいVPC Hyper Protect Virtual Servers インスタンスでは、データボリュームが2つの部分に分割されます。 最初のパーティション( 100Mib )は内部メタデータ用に予約されています。2番目のパーティションはワークロード用のデータボリュームとして残ります。 新規ボリュームのみがパーティション化され、古いバージョンの HPCR イメージではパーティション化されたボリュームを使用できません。 既存の暗号化ボリュームを使用したプロビジョニングも機能します。 違いは、既存のボリュームがパーティション化されないことです。このボリュームを使用して古いイメージに戻ることもできます。

ibm-hyper-protect-container-runtime-1-0-s390x-12 以降、デプロイヤーとプロバイダーは「シードのローリング」機能を使用できます。 シードをロールまたはローテーションしてセキュリティー態勢を強化するオプションが提供されています。また、シードが暗号漏えいした場合も提供されます。 デプロイヤーまたはプロバイダー、あるいはその両方がシードをロールする場合は、現在のシード情報を previousSeed パラメーターに指定し、新しいシード情報を seed パラメーターに指定する必要があります。

以下のスニペットは、volumes セクションの例です。

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

ibm-hyper-protect-container-runtime-1-0-s390x-13 以降、仮想サーバー・インスタンスを立ち上げるときに複数のボリュームを接続できるようになりました。 インスタンスが実行中の際に追加されたボリュームは無視されます。

以下のスニペットは、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"

env セクション

env セクションは、契約の最も重要なセクションの 1 つでもあります。 契約の env セクションは、クラウド環境に固有の情報を扱い、ワークロード・ペルソナには認識されません。 このセクションは、デプロイヤー・ペルソナによって作成されます。

env セクションのサブセクションは以下のとおりです。

  • type:環境 このサブセクションは必須です。
  • logging このサブセクションは必須です。
  • volumes このサブセクションは、データ・ボリュームが接続されている場合にのみ使用する必要があります。
  • signingKey このサブセクションは、契約署名を使用する場合にのみ使用する必要があります。
  • env このサブセクションは、 env 変数がワークロード・プロバイダーによって定義されている場合に、それらの変数の値を指定するために使用されます。

logging サブセクション

ICL

このセクションに最低限必要なサブセクションは logRouter です。 詳細については、VPCのHyper Protect Virtual Serversのログ記録 を参照してください。

以下のスニペットは、 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)

env- volumes サブセクション

このセクションを続行する前に、ワークロード・セクションの workload-volumes サブセクションをお読みください。 前述のように、接続されたデータ・ボリュームの自動ディスク暗号化の場合は、2 つのカスタマー・シードを指定する必要があります。1 つは workload- volumes サブセクションに、もう 1 つは env- volumes サブセクションに指定します。 シードは、任意のランダム・テキストにすることができます。

env- volumes のサブセクションの例をご覧ください

volumes:
  test:
    seed: "seed_value_with_minimum_15_characters"

「シードのローリング」機能を使用する場合は、以下のスニペットを例として使用できます。

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

複数のボリュームを使用する場合、デプロイヤーはボリュームが事前に作成されていることを確認する必要があります。また、契約ファイルにボリューム ID を指定する必要もあります。 それ以外の場合は、ボリューム名を指定し、同じ名前でボリュームを作成する必要があります。 両方が指定されていない場合、ボリュームキーがボリューム名と見なされ、仮想サーバーインスタンスの作成中または作成前に、同じ名前でボリュームを作成する必要があります。 以下のスニペットはその一例です:

 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"

ここで、

  • ボリューム名:VPC上でボリュームを作成した際に指定した名前です。
  • ボリューム ID: 作成されたボリュームのシステム生成ボリューム ID です。
  • ボリューム・キー: 各ボリュームの固有のボリューム名です。

ボリュームキーは 、ワークロードのボリュームサブセクション のキーと同じでなければなりません。

前述のように、 Hyper Protect Crypto Services と統合して、3 番目のシードを生成し、ルート鍵でラップすることができます。 以下の例を参照してください。 詳しくは、データの保護を参照してください。

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 サブセクション

signingKey の使用方法に関する詳細については、「 契約の署名 」を参照してください。

env サブセクション

  • ポッド記述子が workload セクションで使用されている場合は、以下のようにします。

    play サブセクション のテンプレート形式の例を参照してください。

  • workload セクションで docker compose ファイルを使用する場合は、以下のようにします。

    Docker Compose ファイルに環境セクションがある場合は、以下のスニペットを例として使用できます。

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

    Docker Composeファイルに環境セクションがある場合、前述の例のように、デプロイヤーの env セクションで値を渡すことができます。 以下の例は、 env 変数の値を指定する方法を示しています。

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

契約の暗号化

契約の内容を暗号化できます。 暗号化せずに 「ユーザー・データ」 を使用して契約を渡すこともできますが、契約を暗号化することをお勧めします。 また、最初にテスト目的で暗号化されていない契約を使用することをお勧めします。期待どおりに機能した後は、実稼働環境で暗号化された契約を使用できます。

契約のどのセクションで暗号化が必要かを決定できます。 例えば、 workload セクションのみを暗号化する か、 env セクションのみを暗号化する かを選択できます。

VPC インスタンスの Hyper Protect Virtual Servers がブートすると、ブート・ローダーは契約を暗号化解除します。 契約内の各セクションの値を取得し、暗号化されている場合は復号します。 セクションが暗号化されていないことが検出されると、暗号化解除されていないものと見なされます。 「ユーザー・データ」 セクションで入力として渡す前に、公開鍵を使用して契約を暗号化する必要があります。

暗号化および認証証明書は、 IBM の中間証明書によって署名されています。 IBM の中間証明書は、 IBM のDigicert中間証明書によって署名されており、さらにその中間証明書は、 DigiCert のTrusted Root G4 によって署名されています。 証明書の詳細については 、 DigiCert の「信頼されたルート認証局の証明書」 を参照してください。

暗号化証明書のダウンロードと公開鍵の抽出

  1. 証明書をダウンロードします。 以下の表は、イメージのバージョンごとに、暗号化証明書の有効期限およびイメージの非推奨日/廃止日を一覧にしたものです。
暗号化証明書の有効期限と画像の非推奨/廃止日
イメージのバージョン 証明書リンク 暗号化証明書の有効期限日付 非推奨日付
ibm-hyper-protect-container-runtime-1-0-s390x-29 証明書 2027年7月6日 2027年2月6日
ibm-hyper-protect-container-runtime-1-0-s390x-28 証明書 2027年2月24日 2026年9月24日
ibm-hyper-protect-container-runtime-1-0-s390x-26 証明書 2027年2月24日 2026年9月24日
ibm-hyper-protect-container-runtime-1-0-s390x-25 証明書 2026年8月6日 2026年3月31日

  • Deprecated- イメージを使用して IBM Cloud CLI からインスタンスを作成できます。 非推奨ステータスは、そのステータスがobsoleteに変更される前に、イメージの使用を思いとどまらせることができます。 イメージカタログは、常に最新の2つのイメージバージョンを保持します: n と n-1。 新しいバージョン( n+1 )が利用可能になると、システムは最も古いバージョン( n-1 )を非推奨とする。
  • 廃止 :イメージに関連付けられた証明書の有効期限が切れると、そのイメージはインスタンスのプロビジョニングに利用できなくなります。
  • 必ずイメージに対応する暗号化証明書をダウンロードし、契約を暗号化する。

イメージの非推奨状況または廃止状況を確認するには、 IBM Cloud イメージ・リスト・コマンドを使用することもできます。

イメージの状況を取得するためのイメージ・リスト・コマンドについては、 資料 を参照してください。

  1. 契約の暗号化証明書の検証トピック の手順に従って、暗号化証明書を検証します。

契約の暗号化された workload セクションの作成

契約の任意のセクションの値は、プレーン・テキストにすることも、暗号化することもできます。 契約で使用されるワークロードセクションを暗号化するには、 Ubuntu システム上で以下の手順を完了してください

  1. ワークロード要件に基づいて docker-compose.yaml ファイルを作成します。 以下に例を示します。

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

    詳しくは、 Docker Composeの概要 を参照してください。

  2. 契約の ワークロード・セクション を作成し、 workload.yaml ファイルに内容を追加します。

    以下は、 ​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. workload.yaml ファイルと 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. 次のコマンドを使用して、ランダムなパスワードを作成してください。 契約は、ランダムなパスワードと対称AESによって暗号化される。

    PASSWORD="$(openssl rand 32 | base64 -w0)"
    
  5. OpenSSL 3.0 以降、 OpenSSL rsautl サブコマンドは非推奨となり、 pkeyutl サブコマンドに置き換えられる。 パスワードを ibm-hyper-protect-container-runtime-1-0-s390x-29-encrypt.crt で暗号化するには、以下のコマンドのいずれかを使用する:

    • rsautl を使用(非推奨):
       ENCRYPTED_PASSWORD="$(echo -n "$PASSWORD" | base64 -d | openssl rsautl -encrypt -inkey $CONTRACT_KEY -certin | base64 -w0)"
    
    • pkeyutl (推奨):

      ENCRYPTED_PASSWORD="$(echo -n "$PASSWORD" | base64 -d | openssl pkeyutl -encrypt -inkey $CONTRACT_KEY -certin -pkeyopt rsa_padding_mode:pkcs1 | base64 -w0)"
      
  6. 以下のコマンドを使用して、ランダム・パスワードで workload.yaml ファイルを暗号化します。

    ENCRYPTED_WORKLOAD="$(echo -n "$PASSWORD" | base64 -d | openssl enc -aes-256-cbc -pbkdf2 -pass stdin -in "$WORKLOAD" | base64 -w0)"
    
  7. 契約の暗号化されたセクションを取得するには、以下のコマンドを使用します。

    echo "hyper-protect-basic.${ENCRYPTED_PASSWORD}.${ENCRYPTED_WORKLOAD}"
    
  8. ステップ 7 の出力を取得し、 user-data.yaml ファイルに追加します。

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

    接頭部 hyper-protect-basic は必須です。

契約の暗号化された env セクションの作成

契約書で使用される env セクションを暗号化するには、 Ubuntu システムで以下の手順を完了してください

  1. 契約の env セクション を作成し、 env.yaml ファイルに内容を追加します。

    以下は、 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. env.yaml ファイルと 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. ランダムなパスワードを作成するには、次のコマンドを実行してください:

    PASSWORD="$(openssl rand 32 | base64 -w0)"
    
  4. OpenSSL 3.0 以降、 OpenSSL rsautl サブコマンドは非推奨となり、 pkeyutl サブコマンドに置き換えられる。 パスワードを ibm-hyper-protect-container-runtime-1-0-s390x-29-encrypt.crt で暗号化するには、以下のコマンドのいずれかを使用する:

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

      ENCRYPTED_PASSWORD="$(echo -n "$PASSWORD" | base64 -d | openssl pkeyutl -encrypt -inkey $CONTRACT_KEY -certin -pkeyopt rsa_padding_mode:pkcs1 | base64 -w0)"
      
  5. 以下のコマンドを使用して、ランダム・パスワードで env.yaml を暗号化します。

    ENCRYPTED_ENV="$(echo -n "$PASSWORD" | base64 -d | openssl enc -aes-256-cbc -pbkdf2 -pass stdin -in "$ENV" | base64 -w0)"
    
  6. 契約の暗号化されたセクションを取得するには、以下のコマンドを使用します。

    echo "hyper-protect-basic.${ENCRYPTED_PASSWORD}.${ENCRYPTED_ENV}"
    
  7. ワークロード・セクションを暗号化するには、 契約の「暗号化された workload の作成」セクション を参照してください。

  8. ステップ 6 の出力を取得し、それを user-data.yaml ファイルに追加します。

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

契約署名

契約署名は、契約で使用できるオプション機能です。 入力として渡される前に契約に署名することを選択できます。 署名時に契約の有効期限を設定することもできます。 プレーン・テキストまたは暗号化された契約は署名できます。 契約署名の検証は、VPC イメージの Hyper Protect Virtual Servers によって行われます。 この署名機能の目的は、 workload セクションと env セクションが常に一緒に使用され、サード・パーティーによって改ざんされないようにすることです。 この機能は、契約の有効期限の設定もサポートします。 つまり、署名が期限切れとなった後にインスタンスが起動された場合、起動プロセスは失敗します。 workload セクションおよび env セクションのシグニチャーが、値として envWorkloadSignature セクションに追加されます。 以下は、契約署名の作成および追加時に関連する、契約内の 2 つのセクションです。

  • envWorkloadSignature:このセクションには、契約書の他のセクションの署名が追加されます。 このセクションは、署名されていない契約には必要ありません。
  • signingKey:この条項は、契約書の env セクションに追加する必要があります。 このサブセクションには、ユーザーが生成した公開鍵の値が格納されます。この公開鍵に対応する秘密鍵は、契約署名の作成に使用されました。 公開鍵または証明書は、 Base64 文字列として解析することもできます。

契約書への署名を作成するには、 Ubuntu システム上で以下の手順を完了してください

  1. 以下のコマンドを使用して、契約に署名するための鍵ペアを生成します (「test1234」は鍵を生成するためのパスフレーズであり、独自のパスフレーズを使用できます)。

    openssl genrsa -aes128 -passout pass:test1234 -out private.pem 4096
    openssl rsa -in private.pem -passin pass:test1234 -pubout -out public.pem
    
  2. 以下のコマンドは、署名鍵を取得する方法の例です。

    key=$(awk -vRS="\n" -vORS="\\\n" '1' public.pem)
    echo ${key%\\n}
    
  3. オプションとして、署名キーを次のように渡す場合は、Base64:

    key=$(cat public.pem | base64 -w 0)
    echo $key
    
  4. オプションとして、契約満了を有効にしたい場合は、以下の手順に従ってください

    1. 証明書要求を生成するには、次のコマンドを実行してください:
       openssl req -new -key private.pem -passin pass:test1234 -out csr.pem
    
    1. このコマンドは証明書を生成します。
      • CA用の秘密鍵を生成するには、次のコマンドを実行してください:
      openssl genrsa -out personal_ca.key 2048
      
      • 次のコマンドを使用して、自己署名型CA証明書を生成します
      openssl req -new -x509 -key personal_ca.key -out personal_ca.crt
      
      • 次のコマンドは、自己署名CA証明書とともに、証明書の有効期間の日数でCSRに署名します。 生成された証明書の終了日は、契約の有効期限日付です。
      openssl x509 -req -in csr.pem -CA personal_ca.crt -CAkey personal_ca.key -CAcreateserial -out certificate.pem -days 365
      
    2. 以下のコマンドは、証明書を取得する例です。
      certificate=$(awk -vRS="\n" -vORS="\\\n" '1' certificate.pem)
      echo ${certificate%\\n}
      
    3. オプションとして、証明書を取得するには、次のコマンドを例として使用します。Base64フォーマット:
       certificate=$(cat certificate.pem | base64 -w 0)
       echo $certificate
    
  5. env.yaml ファイルを作成します。 以下の例を参照してください。

    1. signingkey が公開鍵の場合:
       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. signingkey が証明書の場合:
         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. もし signingkey はBase64エンコードされた署名キーまたは証明書:
         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. env.yaml ファイルを作成します。 以下の例を参照してください。

     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. 以下のコマンドを使用して、 env.yaml および 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. ランダムなパスワードを作成するには、次のコマンドを実行してください:

    PASSWORD="$(openssl rand 32 | base64 -w0)"
    
  9. OpenSSL 3.0 以降、 OpenSSL rsautl サブコマンドは非推奨となり、 pkeyutl サブコマンドに置き換えられる。 パスワードを ibm-hyper-protect-container-runtime-1-0-s390x-29-encrypt.crt で暗号化するには、以下のコマンドのいずれかを使用する:

    • rsautl を使用(非推奨):
        ENCRYPTED_PASSWORD="$(echo -n "$PASSWORD" | base64 -d | openssl rsautl -encrypt -inkey $CONTRACT_KEY -certin | base64 -w0)"
        ```
    - `pkeyutl` (推奨):
    
    ```yaml {: pre}
        ENCRYPTED_PASSWORD="$(echo -n "$PASSWORD" | base64 -d | openssl pkeyutl -encrypt -inkey $CONTRACT_KEY -certin -pkeyopt rsa_padding_mode:pkcs1 | base64 -w0)"
        ```
    
  10. 以下のコマンドを使用して、ランダム・パスワードで env.yaml を暗号化します。

    ENCRYPTED_ENV="$(echo -n "$PASSWORD" | base64 -d | openssl enc -aes-256-cbc -pbkdf2 -pass stdin -in "$ENV" | base64 -w0)"
    
  11. 以下のコマンドを使用して、暗号化された env セクションを抽出します。

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

ステップ7~11は、 env セクションの暗号化に使用される。 このセクションを暗号化しないことを選択した場合は、これらのステップをスキップしてください。

契約の有効期限に関する通知がログサービスに送信されます。 通知のタイムラインは以下のとおりです。

  • 毎月の第 1 日
  • 毎日、有効期限まで 30 日間
  • 契約の有効期限が 7 日後に切れる場合は、4 時間ごとに 1 回
  • 契約満了または1日以内に満了する場合は1時間ごと

暗号化および認証証明書の期限切れ警告ログ

HPVS は、設定されたロギング・サービスに、暗号化証明書と認証証明書の期限切れと期限切 れに関する警告メッセージを記録します。

通知スケジュールは以下の通り:

  • 有効期限の30日前24時間に 1回、証明書の有効期限が1カ月後に切れることを知らせる警告メッセージが表示される。

    次に例を示します。

    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日前 :有効期限が近づくと 12時間ごとに警告メッセージが記録され、対策の必要性が強調されます。

    次に例を示します。

    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!!!
    
  • 証明書の期限切れ後証明書の有効期限が切れた場合、HPVS イメージがアップグレードされるまで、HPVS は 4 時間ごとに警告メッセージを記録します。

    次に例を示します。

    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.
    

「認証」セクションの準備

アテストは、契約時に使用できるオプション機能である。 attestationPublicKey は、アテステーション文書を暗号化するために使用される、ユーザーが提供する公開鍵です。 これは公開RSA鍵として提供することも、Base64契約の一部として公開 RSA キーをエンコードします。

  • yaml ファイル内の attestationPublicKey にプレーン・テキストの公開 RSA 鍵を使用する場合は、以下の例を使用します。

    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----"
    
  • を使用する場合Base64暗号化された署名キー attestationPublicKey yaml ファイルでは、次のコマンドと例を使用します。

    base64 -w0 <public RSA key file>
    

    <public RSA key file> は、実際の公開 RSA 鍵ファイルへのパスに置き換える必要があります。

    attestationPublicKey: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUJpRENDQVM2Z0F3SUJBZ0lSQUxCMXBPYlpEQlRRc09GSFlxazMzaWd3Q2dZSUtvWkl6ajBFQXdJd0tqRW8KTUNZR0ExVUVBeE1mZFhNdWFXTnlMbWx2TDNCeVlXSm9ZWFF4TWpNdmJYa3RhR0Z3Y205NGVUQWVGdzB5TWpBMApNVE14TURFd01ETmFGdzB6TWpBME1UQXhNREV3TUROYU1Db3hLREFtQmdOVkJBTVRIM1Z6TG1samNpNXBieTl3CmNtRmlhR0YwTVRJekwyMTVMV2hoY0hKdmVIa3dXVEFUQmdjcWhrak9QUUlCQmdncWhrak9QUU1CQndOQ0FBU1AKWGsrelE2MlFZNjI3MWQ1cTBMZHY3SGc3QzZkMGZOUlRsQmJXekhOWWFDZzlpU0piYnVNdjVBY0JmMjlqQi83eApqYzhzVitxMksyemtkTHV4QWxGWm96VXdNekFPQmdOVkhROEJBZjhFQkFNQ0JhQXdFd1lEVlIwbEJBd3dDZ1lJCkt3WUJCUVVIQXdNd0RBWURWUjBUQVFIL0JBSXdBREFLQmdncWhrak9QUVFEQWdOSUFEQkZBaUIzd0JTa0IxaXAKZHZZYlBMbFBmS3RZT0hsYnZzUllKa0FZM2hnY0xuNWhwQUloQUt6cmhsU3p4K1I5bmdtMTBlZVkyaFNCRmgrawpMWHp6SFkwaktTVzhyM1FhCi0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0K
    
  • yamlファイル内の attestationPublicKey を暗号化した場合は、 契約書の暗号化 で説明されている手順と同じ手順に従う必要があります。

    認証文書を暗号化解除するには、 認証文書の暗号化解除 の手順に従います。

署名の準備

署名の準備をするには、 Ubuntu システム上で以下の手順を完了してください

暗号化された user-data.yaml暗号化された workload 契約書のセクション暗号化された env 契約書のセクションのセクションについては、手順 3 に進みます。

  1. 暗号化された workload.yaml ファイルと暗号化された env.yaml ファイルを取得します。

  2. それらを user-data.yaml ファイルに追加します。

    workload: hyper-protect-basic.js7TGt77EQ5bgTIKk5C0pViFTRHqWtn..............
    env: hyper-protect-basic.VWg/5/SWE+9jLfhr8q4i.........
    
  3. contract.txt ファイルを作成します。 workload の値を最初に追加し、次に user-data.yaml ファイルから env の値を追加します。 workload の後と env の前にスペースや改行がないことを確認してください。 また、ファイルの最後に改行やスペースが追加されないようにしてください。 hexdump などのツールを使用して、 contract.txt ファイルのバイナリー・コンテンツをクロスチェックすることをお勧めします。 バイナリー・ファイル・ダンプで、 0a ASCII 値が最後の項目として表示されていないことを確認します。

    hyper-protect-basic.js7TGt77EQ5bgTIKk5C0pViFTRHqWtn..............hyper-protect-basic.VWg/5/SWE+9jLfhr8q4i.........
    
  4. 以下のコマンドを使用して、シグニチャーを生成します。

    echo $(cat contract.txt | tr -d "\n\r" | openssl dgst -sha256 -sign private.pem | openssl enc -base64) | tr -d ' '
    
  5. 署名を user-data.yaml ファイルに追加します。

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

VPC 契約のための単純な Hyper Protect Virtual Servers の概要

以下のコマンド例は、 Ubuntu システムで実行されます。

1. ロギング・インスタンスの詳細を取得する

IBM Log Analysis または汎用 syslog バックエンドを使用してロギングを構成できます。 この例では、 IBM Log Analysisを使用します。 さまざまなプランからお選びいただけます。 ホスト名やインジェクションキーなどの必要な詳細情報を取得する方法については、 VPCの Hyper Protect Virtual Servers のログ を参照してください。

2. env セクションを作成します。

プレーンテキストの契約書を使用している場合は、パイプ記号「|」を書き漏らさないようにしてください。 セクションの暗号化を計画している場合は必要ありません。

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

3. docker-compose ファイルを準備します。

ロギングの詳細があると仮定して、単純な Docker Compose ファイルを見つけます。 次の例では、 NGINX コンテナを公開している。 例を参考に docker-compose.yaml。

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

4. base64-encoded バージョンの docker-compose ファイルを取得します。

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

5. Compose セクションを作成する

  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. ワークロード・セクションへのデータの取り込み

プレーンテキストの契約書を使用している場合は、パイプ記号(|)を必ず入力してください。

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. 簡単な契約の準備ができました

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

次のステップ