IBM Cloud Docs
关于合同

关于合同

使用 IBM Hyper Protect Container Runtime (HPCR) 映像为 VPC 实例创建 IBM Cloud Hyper Protect Virtual Servers 时,必须在 用户数据 字段中指定合同。

什么是合同?

合同是特定于 VPC 实例的 Hyper Protect Virtual Servers 的 YAML 格式的定义文件。 此文件必须由云用户创建,作为创建实例的先决条件。 创建此文件后,在创建实例时,必须将其作为输入作为 用户数据 字段的一部分传递。 您无法在没有有效合同的情况下创建实例。 如果在没有合同的情况下创建实例,那么部署将启动,然后失败,并且实例将进入关闭状态。 该合同特定于为 VPC 实例创建 Hyper Protect Virtual Servers,是 Hyper Protect 对 IBM Secure Execution 技术的扩展。

如果工作量通过SSH或REST API公开了解密的令牌,则解密的数据将同时包含工作量和环境密钥。 但是,它不包含用于批量加密的种子。

合同部分

合同文件可以具有以下四个有效的高级部分,其中 workloadenv 部分是必需的。

  • workload 是必需部分。
  • env 是必需部分。
  • attestationPublicKey 是可选部分。 您可以在合同中提供公用 RSA 密钥,此密钥用于加密认证文档,并且属性必须命名为 attestationPublicKey
  • envWorkloadSignature 是可选部分,包含合同的其他部分的签名。

合同中的两个主要部分是 workloadenv 部分。 需要这两个部分,因为添加到合同中的信息来自两个不同的角色,即“工作负载”和“部署者”角色。

工作负载角色提供有关需要在 Hyper Protect Virtual Servers for VPC 实例上启动的容器 (或工作负载) 的信息。 它包括容器名称、容器所在的 Container Registry、Container Registry 的凭证、镜像摘要、公证服务器信息(镜像验证所需的)、需要传递给容器的环境变量,以及包含容器信息的 docker compose 文件或 Pod 描述符等信息。

如果使用 docker compose 文件,那么仅支持一个容器。 Pod 描述符支持一个或多个容器。

部署者角色与 IBM Cloud紧密协作。 此角色从工作负载角色接收工作负载信息 (最好是加密的工作负载部分)。 然后,部署者将创建合同的 env 部分。 env 部分包含特定于 IBM Cloud 环境的信息。 通常,它是工作负载角色没有且不需要知道的信息。 例如,在将信息添加到合同的 env 部分之前,有关部署者角色创建的 IBM Cloud 日志记录实例的信息。

工作负载部分

本部分是合同中最重要的部分之一。 workload 部分可以有多个子部分,这些子部分的目的是提供启动工作负载所需的信息。 workload 节是可以具有以下子节的父节:

  • type:工作量。 此子节是必需的。
  • auths。此子节是可选的。
  • compose (对于单个容器) 或 play (对于单个容器或多个容器)。 它们是互斥的; 其中一个部分必须存在。
  • images。此子节是可选的。
  • volumes。此子节是可选的。

以下片段显示合同的工作负载部分的高级样本。 工作负载部分需要的最小部分是组合部分。 可以根据需求添加其他部分。

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 子节。 此子节没有任何图像信息,如以下样本中所示。 此子节需要包含映像注册表的名称以及相同映像注册表的凭证 (例如用户名-密码)。 键值必须是 Container Registry 的主机名,或者默认 docker 注册表的以下字符串:

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

以下片段显示了 IBM Cloud Registry 的示例。 有关使用 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

确保撰写的 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 小节中,您可以通过 Pod 描述符来定义工作量。 每个 pod 都可以包含一个或多个容器定义。 可以通过下列其中一种方式提供描述符:

  • playresources 子节中采用纯 YAML 格式。 此部分是描述符的数组,支持两种类型的描述符: PodConfigMaps

    以下示例说明如何使用 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
    
  • archiveplay 小节中,归档文件是一个 Base64 编码的压缩 tar 文件。 Pod 或 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 charts的模板语法相同,因此可以轻松地与 k8s交换模板。 我们支持以下 Built-In 对象:

    • 环境: 此对象包含在工作负载和环境部分之间合并的环境变量。 该对象以 {{ .Env }} 形式提供。

    示例:

    workload: |
      type: workload
      auths:
       docker.io:
        password: <password>
        username: test
      play:
        templates:
          - apiVersion: v1
            kind: Pod
            metadata:
              name: busybox
            spec:
              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-4685-8839-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,因此如果替换表达式显示为字符串的第一部分,那么必须对其进行转义。 否则,就会与 块映射 语法相冲突。 这与 helm 模板不同,其中表达式应用于文档的文本表示而不是模型表示。

环境变量

在合同中,可以在 workloadenv 部分中定义环境变量。 这两组变量都与优先顺序为 workload 的变量合并在一起。 Pod 使用 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

Pod 通信

  • 容器到容器

    一个 Pod 中的容器通过 localhost 相互通信。 每个容器需要监听不同的端口,因为它们在设计上共享一个IP地址。

  • 要托管的 pod

    通常情况下,Pod需要至少将其一个容器暴露给主机,以便通过主机上的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
    
  • Pod 到 Pod

    要从一个 Pod 到达另一个 Pod,请在目标 Pod 上公开 hostPort。 然后,源 Pod 可以向公开端口上的主机发出请求,以到达目标 Pod。

    源 Pod 可以通过以下命令找到主机的 IP 地址:

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

对于 Hyper Protect Container Runtime,卷由合同中的 volumes 部分管理。 根据这些信息,HPCR 会对主机上的外部块设备进行加密和挂载。 要将这些卷安装到 pod 中,请在卷上使用 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 字段定义要安装到 pod 中的主机上的数据。 它与 HPCR 合同中的 volumes 不同。

images 子节

images 子节仅适用于已签名的图像。

Docker compose 描述的图像

可以使用 Docker 内容信任 (DCT) 对 docker-compose 文件中列出的容器映像进行签名或不签名。

下面的示例显示了一个图像 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 描述符描述的图像

Pod描述符描述的容器镜像可通过 Red Hat 简单签名进行验证。

如果映像由摘要引用,那么服务允许其使用而不进行其他检查。

没有摘要的图像需要验证 GPG 密钥。 钥匙以可创建的 Base64 编码二进制格式传输。 请参阅以下示例:

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

该关键字通过 rhs 部分的 images 小节传达。 此部分是在 publicKey 字段中使用图像标识作为键和 GPG 键的映射:

示例:

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

workload- volumes 子节

仅当创建时将数据卷附加到实例时,才需要在合同中提供 volumes 部分。 本部分提供的信息用于安装附加的数据卷(由用户提供),随后使用 workloadenv 部分提供的“种子”进行加密。 您可以为 "mount" 字段提供您选择的任何路径。 用户提供的路径用于在内部安装数据卷。 合同中提供的装载路径必须与 docker-compose.yaml 文件卷部分提供的路径一致,以便与容器工作负载相关的所有数据都存储在此数据卷中。

volumes 子节支持使用用户提供的种子对数据卷进行自动加密。 如果将数据卷附加到 Hyper Protect Virtual Servers 实例,那么将使用通过合同的 volumes 子部分中的“种子”字段提供的种子自动对其进行加密。 因此,必须提供两个种子,一个通过 workload 部分 (由工作负载角色提供),另一个通过 env 部分 (由部署者角色提供)。 这两个种子在内部转换为 UTF8 序列,然后并置。 稍后,并置序列的散列 (SHA256) 将计算为十六进制数,用作 LUKS 口令以加密数据卷。

您可以使用以下命令验证十六进制数:

echo -n "seed1seed2" | sha256sum

在这里您可以了解如何在合同的工作负载部分提供“种子”。 有关如何通过 env 部分提供“种子”输入的更多信息,请参阅 env 部分。 必须同时提供用于加密的种子。 如果仅提供其中一个种子的实例关闭,那么加密将失败。

您可以通过与 Hyper Protect Crypto Services集成,向静态数据添加更高级别的加密保护和控制。 从 ibm-hyper-protect-container-runtime-1-0-s390x-11 开始,您可以使用 Hyper Protect Crypto Services 生成随机值作为第三个种子,并使用根密钥将其合并。 LUKS 口令是使用 三个 种子 (元数据分区中的种子和合同中的两个种子) 生成的。 有关更多信息,请参阅 保护数据安全

以下片段是卷部分的示例:

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,数据卷分为两个部分。 第一个分区 (100Mib) 保留用于内部元数据; 第二个分区保留作为工作负载的数据卷。 仅会对新卷进行分区,并且不能将分区卷与较旧版本的 HPCR 映像配合使用。 使用现有加密卷进行供应也有效。 不同的是,现有卷不会进行分区,您还可以返回到具有此卷的较旧映像。

ibm-hyper-protect-container-runtime-1-0-s390x-12 开始,部署者和提供者可以使用“种子滚动”功能。 提供了一个选项,用于滚动或旋转种子以增加安全态势,或者如果种子受到损害。 当部署者和/或提供者想要滚动种子时,必须在 previousSeed 参数中指定当前种子信息,并且必须在 seed 参数中指定新的种子信息。

以下片段是卷部分的示例:

volumes:
  test:
    filesystem: ext4
    mount: /mnt/data
    seed: "workload phrase1"
    previousSeed: "workload phrase"

ibm-hyper-protect-container-runtime-1-0-s390x-13 开始,您可以在启动虚拟服务器实例时连接多个卷。 实例运行时附加的卷将被忽略。

以下片段是卷部分的示例:

volumes:
  test1:
    filesystem: "ext4"
    mount: "/mnt/data"
    seed: "seed1"
  test2:
    filesystem: "ext4"
    mount: "/mnt/test2"
    seed: "seed2"
  test3:
    filesystem: "ext4"
    mount: "/mnt/test3"
    seed: "seed3"

env 部分

env 部分也是合同中最重要的部分之一。 合同的 env 部分处理特定于云环境且对于工作负载角色未知的信息。 此部分由部署者角色创建。

env 部分的子部分为:

  • type:环境 此子节是必需的。
  • logging。此子节是必需的。
  • volumes。仅当连接了数据卷时,才必须使用此子节。
  • signingKey。仅当要使用合同签名时,才必须使用此子节。
  • env。如果 env 变量由工作负载提供程序定义,那么此子节用于指定这些变量的值。

logging 子节

LogDNA

LogDNA 已过时,自 2025 年 3 月 30 日起将不再支持。 该支持计划将持续到2025年3月,同时 支持 IBM Cloud 日志

本节所需的最小分节是 logDNA 分节。 有关详细信息,请参阅 Logging for Hyper Protect Virtual Servers for VPC

以下片段是 logDNA 子节的示例:

logging:
  logDNA:
    hostname: <host name of the Log Analysis instance>
    ingestionKey: <ingestion Key of the Log Analysis instance>
    port: <port default-6514>
    tags: ["custom tag name 1", "custom tag name 2"]

ICL

本节所需的最小分节为 logRouter。 有关详细信息,请参阅 Logging for Hyper Protect Virtual Servers for VPC

以下片段是 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 子部分,然后再继续此部分。 如前所述,对于附加数据卷的自动磁盘加密,必须提供两个客户种子,一个在 workload- volumes 子节中,另一个在 env- volumes 子节中。 种子可以是您选择的任何随机文本。

请参阅以下 env- volumes 分节的示例:

volumes:
  test:
    seed: "env phrase"

使用“种子滚动”功能时,可以使用以下片段作为示例:

volumes:
  test:
    seed: "env phrase1"
    previousSeed: "env phrase"

使用多个卷时,部署者必须确保预先创建卷,并在合同文件中指定卷标识。 否则,必须指定卷名,并且必须使用相同的名称创建卷。 如果两者都没有指定,则音量键被视为音量名称,必须在创建虚拟服务器实例时或之前创建具有相同名称的音量。 下面的代码段就是一个例子:

 env: |
   logging:
     logRouter:
       hostname: 34be57c7-6ff2-4685-8839-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: "seed1"
     test2:
       apiKey: "L4SsSE32xxxxxjAgfHCVkdW8xl_CiqMn4Lpc1dzTD"
       volumeName: "volume2"
       seed: "seed2"
     test3:
       apiKey: "L4SsSE32xxxxxjAgfHCVkdW8xl_CiqMn4Lpc1dzTD"
       seed: "seed3"

其中:

  • 卷名称:您在VPC上创建卷时指定的名称。
  • 卷标识: 是系统生成的已创建卷的卷标识。
  • 卷键: 是每个卷的唯一卷名。

音量键必须与 工作量-音量子部分 中的键相同。

如前所述,您可以与 Hyper Protect Crypto Services 集成,以生成第三个种子,并使用根密钥将其打包。 请参阅以下示例。 有关更多信息,请参阅 保护数据安全

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: "seed1"
   apiKey: "**********************"
   kmsTimeout: 10

signingKey 子节

有关如何使用 signingKey 的更多信息,请参阅 合同签名

env 子节

  • 如果在 workload 部分中使用 Pod 描述符:

    请参阅 play 子节 中的模板格式示例。

  • 如果在 workload 部分中使用了 docker compose 文件:

    如果 docker compose 文件具有环境部分,那么可以使用以下片段作为示例:

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

    当docker的compose文件包含环境部分时(如前例所示),您可以在deployer的 env 部分传递值。 以下示例显示如何指定 env 变量的值:

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

合同加密

您可以对合同内容进行加密。 虽然您还可以通过 用户数据 传递合同而无需加密,但建议您对合同进行加密。 还建议您最初尝试将非加密合同用于测试目的,在按预期工作后,可以将加密合同用于生产环境。

您可以决定合同的哪些部分需要加密。 例如,您可以选择 仅加密 workload 部分,或者 仅加密 env 部分

当 Hyper Protect Virtual Servers for VPC 实例引导时,引导装入程序将解密合同。 它采用合同中每个部分的值,并在加密后对其进行解密。 如果发现某个部分未加密,那么会将其视为未进行任何解密。 在通过 用户数据 部分将合同作为输入传递之前,必须使用公用密钥对合同进行加密。

加密证书和认证证书由 IBM 中间证书签署。 IBM 中级证书由 IBM Digicert中级证书签署,而后者则由 DigiCert Trusted Root G4 签署。 如需了解证书的更多信息,请参阅 DigiCert 可信根证书

下载加密证书并解压缩公用密钥

  1. 下载证书。 下表根据映像的版本列出了加密证书到期日期和映像废弃/废弃日期。

    从 2025 年 3 月 25 日起,证书链接将发生变化。

    加密证书到期日期和图像废弃/过时日期
    映像版本 证书链接 加密证书到期日期 弃用日期 过时日期
    ibm-hyper-protect-container-runtime-1-0-s390x-23 证书 2026年2月26日
    ibm-hyper-protect-container-runtime-1-0-s390x-22 证书 2026年2月26日
    ibm-hyper-protect-container-runtime-1-0-s390x-21 证书 2026年2月26日
    ibm-hyper-protect-container-runtime-1-0-s390x-20 证书 2025 年 9 月 02 日
    ibm-hyper-protect-container-runtime-1-0-s390x-19 证书 2025 年 9 月 02 日
    ibm-hyper-protect-container-runtime-1-0-s390x-18 证书 2025 年 7 月 4 日
    ibm-hyper-protect-container-runtime-1-0-s390x-17 证书 2025 年 7 月 4 日

    注:

    • Deprecated: 您可以使用图像从 IBM Cloud CLI 创建实例。 在图像状态更改为“废弃”之前,使用“废弃”状态可能会阻止图像的使用。
    • 已过时:您不能使用该图像创建实例。 如果您尝试使用过时的图像创建实例,您会收到一条消息,提示您不能使用该图像创建实例。
    • 始终下载与映像相对应的加密证书,并对合同进行加密。

    要检查映像废弃或废弃状态,还可以使用 IBM Cloud 映像列表命令。

    您可以参阅 文档 以获取映像列表命令,以获取映像的状态。

  2. 请按照 “验证合同加密证书”主题 中的说明验证加密证书。

创建合同的加密 workload 部分

合同中任何部分的值都可以是纯文本或加密的。 在 Ubuntu 系统上完成以下步骤,对合同中使用的工作量部分进行加密:

  1. 根据工作负载需求创建 docker-compose.yaml 文件。 例如

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

    有关更多信息,请参阅 Docker Compose

  2. 创建合同的 工作负载部分,并在 workload.yaml 文件中添加内容。

  3. 导出 workload.yaml 文件和 ibm-hyper-protect-container-runtime-1-0-s390x-23-encrypt.crt 的完整路径:

    WORKLOAD="<PATH to workload.yaml>"
    CONTRACT_KEY="<PATH to ibm-hyper-protect-container-runtime-1-0-s390x-23-encrypt.crt>"
    
  4. 使用以下命令创建一个随机密码(合同通过对称AES加密,并使用随机密码):

    PASSWORD="$(openssl rand 32 | base64 -w0)"
    
  5. 使用以下命令通过 ibm-hyper-protect-container-runtime-1-0-s390x-23-encrypt.crt 加密密码:

    ENCRYPTED_PASSWORD="$(echo -n "$PASSWORD" | base64 -d | openssl rsautl -encrypt -inkey $CONTRACT_KEY -certin | 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 部分

在 Ubuntu 系统上完成以下步骤,对合同中使用的 env 部分进行加密:

  1. 创建合同的 env 部分,并在 env.yaml 文件中添加内容。

  2. 导出 env.yaml 文件和 ibm-hyper-protect-container-runtime-1-0-s390x-23-encrypt.crt 的完整路径:

    ENV="<PATH to env.yaml>"
    CONTRACT_KEY="<PATH to ibm-hyper-protect-container-runtime-1-0-s390x-23-encrypt.crt>"
    
  3. 使用以下命令创建随机密码:

    PASSWORD="$(openssl rand 32 | base64 -w0)"
    
  4. 使用以下命令通过 ibm-hyper-protect-container-runtime-1-0-s390x-23-encrypt.crt 加密密码:

    ENCRYPTED_PASSWORD="$(echo -n "$PASSWORD" | base64 -d | openssl rsautl -encrypt -inkey $CONTRACT_KEY  -certin | 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.........
    

合同签名

合同签名是可与合同配合使用的可选功能。 您可以选择在将合同作为输入传递之前对其进行签名。 您也可以在签署合同时设置合同到期时间。 可以签署纯文本或加密的合同。 合同签名的验证由 Hyper Protect Virtual Servers for VPC 映像完成。 此签名功能的目的是确保 workloadenv 部分始终一起使用,并且不会被第三方篡改。 此功能还支持设置合同到期时间。 也就是说,如果实例在签名过期后启动,启动过程将失败。 workloadenv 部分的特征符将作为值添加到 envWorkloadSignature 部分。 以下是合同中在创建和添加合同签名时相关的两个部分:

  • 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
      
    2. 此命令将生成证书。
      • 使用以下命令为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
      
    3. 以下命令是获取证书的示例:
      certificate=$(awk -vRS="\n" -vORS="\\\n" '1' certificate.pem)
      echo ${certificate%\\n}
      
    4. 可选择使用以下命令作为示例,获取 Base64 格式的证书:
      certificate=$(cat certificate.pem | base64 -w 0)
      echo $certificate
      
  5. 创建 env.yaml 文件。 请参阅以下示例:

    1. 如果 signingkey 是公用密钥:

      env: |
        type: env
        logging:
          logRouter:
            hostname: 34be57c7-6ff2-4685-8839-903921e90ab9.ingress.jp-tok.logs.cloud.ibm.com
            iamApiKey: <iamApiKey of the service instance> / xxxx
            port: 443
        volumes:
          test:
          seed: "hogwarts"
        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----"
      
    2. 如果 signingkey 是证书:

        env: |
          type: env
          logging:
            logRouter:
              hostname: 34be57c7-6ff2-4685-8839-903921e90ab9.ingress.jp-tok.logs.cloud.ibm.com
              iamApiKey: <iamApiKey of the service instance> / xxxx
              port: 443
          volumes:
            test:
            seed: "hogwarts"
          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-----"
      
    3. 如果 singingkey 是 Base64 编码的签名密钥或证书:

        env: |
          type: env
          logging:
            logRouter:
              hostname: 34be57c7-6ff2-4685-8839-903921e90ab9.ingress.jp-tok.logs.cloud.ibm.com
              iamApiKey: <iamApiKey of the service instance> / xxxx
              port: 443
          volumes:
            test:
            seed: "hogwarts"
          signingKey: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tXG5NSUlGRVRDQ0F2a0NGQkFNeHlPNkNsN0JOS0JHeHRsQXpIcEkyb2lOTUEwR0NTcUdTSWIzRFFFQkN3VUFNRVV4XG5DekFKQmdOVkJBWVRBa0ZWTVJNd0VRWURWUVFJREFwVGIyMWxMVk4wWVhSbE1TRXdId1lEVlFRS0RCaEpiblJsXG5jbTVsZENCWGFXUm5hWFJ6SUZCMGVTQk1kR1F3SGhjTk1qUXdNVE13TURNMU9ETXpXaGNOTWpRd05UQTVNRE0xXG5PRE16V2pCRk1Rc3dDUVlEVlFRR0V3SkJWVEVUTUJFR0ExVUVDQXdLVTI5dFpTMVRkR0YwWlRFaE1COEdBMVVFXG5DZ3dZU1c1MFpYSnVaWFFnVjJsa1oybDBjeUJRZEhrZ1RIUmtNSUlDSWpBTkJna3Foa2lHOXcwQkFRRUZBQU9DXG5BZzhBTUlJQ0NnS0NBZ0VBdjVoNmk3Rm4xRE1VTSszQW5QUFpVTk1lMXNzM0tML0FtVW1wdHdsQVBFclZvSDFrXG5haXFUVXNTTmpYY3RqK25rOTVJK2UybnVndy9IbGFWVDFlUmdFdHZqc3NoZVhLYm9Gbit6Vy9pMzFOcTlVU2dRXG5aQTMyNVZ0Y2hZbGdKTFhNUGFIL3VrQlVyMFVJNExuakMvZE5kQVF6S3dXUE5GMkpsdjV3S1g4T0JWT1FPOURmXG5FeFZtY0VrS0RvaDBuWms1ZU9BOHZ6SkdoZnI4VHZReDlGUUZzUDRPWFR3UWdjZFpWMjZtTG0wYk1rcUV0M281XG44T1NwaXNxTkdZMVhuTUhqT1dOcVNiRXJrcGJJS0VGQVFTbldtekV2SmRIc1FYKzdlVEY3Q2lzSEpSRXNlVDRzXG5VU3VJRkJaS1hiUzNxcTZFTC9FWXZpdTBFR25ZL3JrSkpjSVJiOGh5Y3FIUmdvSVRUMmJXVDdQU01VeVhvWDNHXG5WS2ZwL3hLRmhrWXpvUkRTYjVTMGxoOHN1Z21vUmtpb0FrdzZHNTZDUDJoYWJsUFpSVU1tVUtjZUZmT0cvazRMXG5laThxSnRiZlFKOUJsQ05SUHBqcVkzc0dTZGVYSTR6ZWZ5UTh4eGN1czlTbDV3WFpWODZsejJsTy9mejNDdnBkXG4wZUt2ZnY1dVh5dkYzTzM2bHJsRUVSbVN1a2FaWWFFSkVDanhPVWVhZmM3RTFEVnlJYU1wYzJTT3VtMWNyd01HXG5SS2huVTFKU2hET04weUNsbktPbEFDZmpGSXBkcEVNcEU0bExwczF4K1BYVit4MjF6R0JNVXZYWWE0eHBieVdSXG5LMWdmTVdtdXZHT2l2bDl5MG1QU0lleUo5Ui83YlNSQWJjWUpSNE45OVRydFd4WlUxeVFpN0hTUlY1Y0NBd0VBXG5BVEFOQmdrcWhraUc5dzBCQVFzRkFBT0NBZ0VBZzAwNnpKNFpLd1Q4bW9PT2wzUGRUaEZVY2Y4cnJJbGVjOUl5XG5xUGNXU3F0NVVUZVlMSWU1OG9HaGhRbWNhSVJVT1FhaWI1SnFIMnVrenFwbytnc0ozelpiM2VJbjRGQjdjS2VmXG5McWFpZW1PdmVFZTEvcVN3QUdxTVp5WkVMc3NpT2ZsaG5KZHp1WVNSV084RE82UTZKTXFRdGhEY3cyMGJ1ZGpPXG56UDRuaFhRcVQrczhsanpxU0pXNzdoRGJyTkFlelR6LzBTSkZEdGFNQnM1VXdlWC8vNy80c1h0SjhrQklCU3hkXG43eTR3OHR1dXhVYVhPdFlNak5ySkFZTHdGVmVlTzhDRlVScGJFdXY3QUJUMGs4VTRFOEM2ajRVNEp5c3g0WFZQXG5aajM2cklBdHZjdGNoaDB5QWhIejh3aFhlMXR2YUZ3OXd6UkRBVG5UaEZBdUpHNFowN0syL3JsRFA5a085d21uXG5nOGhIeEtlcVFNSkRwMjllMHNHa3o4b0RpNk16MjRrOUNxRkpKMENVejFudHo3cnJEa0EzUXdRYkZSems5Mzh5XG4zclNmZVBPNXFYbFVROW1tMDVoWXIxRUtLY2VUTEVvd2M0WE9vdU5MbFVXR2lSc2hSUjFzek13NUMyOXByRkoyXG55WXVWOXRCYUZZa3E3ZG5oOEpubXJyZUV2QW5zS3l5RUN4TW10Vi9XNzAxT1NVWUJjVGh3Z0FvK2hrRWVPSisvXG53ck9TN3lvSnFERjF5KzVMTFFKbVVsckxDUFhlbTNaVGE0VU1lMXAyZzdnZTdEZzZadWQ5TkRCY01pZ2RIQnl0XG5KUC9pOVBjSlNFV3JjY1dKMWFqVG9VQ1owd3FmSjNaNEtxb0VkMGZhZFFoYjMyQXVEVWJ1N0UxMkVVRk5QR0lIXG44clFLYkRVPVxuLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLVxu
      
  6. 创建 env.yaml 文件。 请参阅以下示例:

     env: |
       type: env
       logging:
         logRouter:
           hostname: 34be57c7-6ff2-4685-8839-903921e90ab9.ingress.jp-tok.logs.cloud.ibm.com
           iamApiKey: <iamApiKey of the service instance> / xxxx
           port: 443
       volumes:
         test:
         seed: "hogwarts"
       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.yamlibm-hyper-protect-container-runtime-1-0-s390x-23-encrypt.crt 的完整路径:

    ENV="<PATH to env.yaml>"
    CONTRACT_KEY="<PATH to ibm-hyper-protect-container-runtime-1-0-s390x-23-encrypt.crt>"
    
  8. 使用以下命令创建随机密码:

    PASSWORD="$(openssl rand 32 | base64 -w0)"
    
  9. 使用以下命令通过 ibm-hyper-protect-container-runtime-1-0-s390x-23-encrypt.crt. 加密密码:

    ENCRYPTED_PASSWORD="$(echo -n "$PASSWORD" | base64 -d | openssl rsautl -encrypt -inkey $CONTRACT_KEY  -certin | base64 -w0)"
    
  10. 使用以下命令使用随机密码对 env.yaml 进行加密:

ENCRYPTED_ENV="$(echo -n "$PASSWORD" | base64 -d | openssl enc -aes-256-cbc -pbkdf2 -pass stdin -in "$ENV" | base64 -w0)"
  1. 使用以下命令来抽取已加密的 env 部分:
echo "hyper-protect-basic.${ENCRYPTED_PASSWORD}.${ENCRYPTED_ENV}"

步骤 4-8 用于加密 env 部分。 如果选择不加密此部分,请跳过这些步骤。

合同到期通知将发送至您的登录服务。 通知的时间安排如下:

  • 每个月的第一个
  • 每天在到期前 30 天
  • 如果合同将在 7 天内到期,那么每 4 小时一次
  • 如果合同已经到期或即将到期,每小时

准备认证部分

认证是可用于合同的可选功能。 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----"
    
  • 如果在 yaml 文件中的 attestationPublicKey 使用 Base64 编码的签名密钥,请使用以下命令和示例。

    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 的值。 确保在 workloadenv 之间没有空格或新行。 此外,请确保文件末尾没有添加新的行或空格。 建议使用诸如 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 .....
    

简单 Hyper Protect Virtual Servers for VPC 合同入门

以下命令示例在 Ubuntu 系统上运行。

1。获取日志记录实例的详细信息

您可以使用 IBM Log Analysis 或通用 syslog 后端来配置日志记录。 此示例使用 IBM Log Analysis。 您可以选择不同的计划。 要了解如何获取所需详细信息(如主机名和提取密钥),请参阅 VPC 中的 Hyper Protect Virtual Servers 日志

2. 创建 env 部分

如果您使用的是纯文本合同,请务必不要漏掉管道符号“|”。 如果计划对该部分进行加密,那么不需要执行此操作。

env: |
  type: env
  logging:
    logRouter:
      hostname: 34be57c7-6ff2-4685-8839-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. 获取 docker-compose 文件的 base64-encoded 版本

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

5. 使用它创建组合部分

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

后续步骤