關於合約
適用於 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) 來重新部署工作負載。 有關資料遷移的資訊,請參閱 遷移指南。 如需詳細資訊,請參閱 服務廢止公告。
當您使用 IBM Hyper Protect Container Runtime (HPCR) 映像建立 VPC 執行個 Hyper Protect Virtual ServersIBM Cloud 體時,必須在「使用者資料」欄位中指定合約作為其組成部分。
什麼是合約?
合約是 YAML 格式的定義檔,專用於 VPC 實例的 Hyper Protect Virtual Servers。 此檔案必須由雲端使用者建立,作為建立實例的必要條件。 建立此檔案之後,當建立實例時,必須將它當作 使用者資料 欄位的一部分來傳遞。 您無法建立沒有有效合約的實例。 如果您建立沒有合約的實例,則部署會啟動然後失敗,且實例會進入關閉狀態。 合約是針對 VPC 實例建立 Hyper Protect Virtual Servers 的特定合約,並且是 IBM Secure Execution technology by Hyper Protect 的延伸。
如果工作負載透過 SSH 或 REST API 公開已解密的令牌,則解密資料包含工作負載和環境機密。 但是,它不包含用於加密卷的種子。
合約區段
合約檔案可以具有下列四個有效的高階區段,其中 workload 及 env 區段是必要的。
workload是必要區段。env是必要區段。attestationPublicKey是選用區段。 您可以提供公開 RSA 金鑰作為合約的一部分,用於加密認證文件,且屬性必須命名為attestationPublicKey。envWorkloadSignature是選用區段,包含合約其他區段的簽章。
合約中的兩個主要區段是 workload 及 env 區段。 需要這兩個區段,因為新增至合約的資訊來自兩個不同的角色,即「工作量」和「部署者」角色。
工作量角色提供需要在 VPC 實例的 Hyper Protect Virtual Servers 上啟動之儲存器 (或工作量) 的相關資訊。 它包括有關容器名稱、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。此子區段是選用的。
下列 Snippet 顯示合約工作量區段的高階範例。 工作量區段需要的最小值是編寫區段。 其他區段可以根據需求來新增。
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/
下列 Snippet 顯示 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
確保 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 小節,您可以透過定義工作負載 Pod 描述符。 每一個 Pod 都可以包含一或多個儲存器定義。 可以使用下列其中一種方式來提供描述子:
-
在
play的resources子區段中,採用一般 YAML 格式。 本節是描述子陣列,並支援兩種類型的描述子: Pod 和 ConfigMaps。下列範例說明如何使用
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以下範例說明如何使用
initcontainers與resources區段:workload: | type: workload play: resources: - apiVersion: v1 kind: Pod metadata: name: busybox spec: initContainers: - name: attest image: ... volumeMounts: - mountPath: /var/hyperprotect name: datavolume containers: - name: main image: ... command: - printenv envFrom: - configMapRef: name: contract.config.map optional: false restartPolicy: Never -
在裡面
archive的小節play,存檔是Base64編碼、gzip 壓縮的 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 -
在
play的templates子區段中採用範本格式。 本節是 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 }}表示式參照REGISTRY環境變數,在此範例中,此環境變數定義在合約的env區段中。範本必須是有效的 YAML,因此如果取代表示式顯示為字串的第一部分,則必須跳出它。 否則會與 區塊映射句法。 這與 helm 模板不同,其中表達式應用於文件的文本表示而不是模型表示。
- 環境: 此物件包含在工作量與環境區段之間合併的環境變數。 該物件以
環境變數
在合約中,您可以在 workload 及 env 區段中定義環境變數。 這兩組變數會合併在一起,並以 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 的世界中,這並非良好的實務作法,此處應改用服務來實現。明確指定
hostPort和containerPort。 如果您只指定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 儲存器執行時期,磁區由合約中的 磁區 區段管理。 根據此信息,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 子區段
Docker Docker Content Trust (DCT) 宣布退休。 由於 DCT 是建基於傳統的 Notary v1 架構,而該架構現在已不再積極維護,因此不被視為未來就緒或可持續的影像簽署與驗證解決方案。 因此,我們鼓勵客戶捨棄 DCT,採用符合 OCI 的影像簽章與驗證技術,以符合目前的供應鏈安全標準。 您可以將容器影像遷移到 IBM Cloud Container Registry (ICR)。 ICR 整合 Red Hat Signing Service (RHS) 作為其可信賴的簽章根,提供供應商支援的信任模式,並符合當代集裝箱安全與供應鏈最佳實務。 如需詳細資訊,請參閱 Retiring Docker Content Trust。
images 子區段僅適用於已簽署的映像檔。
Docker Compose 所說明的映像檔
可以使用 Docker Content Trust (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
對於未簽署的映像檔,映像檔子區段中不需要任何項目。 不過,對於未簽署的映像檔,需要摘要。 請按照以下步驟取得摘要:
- 登入 Container Registry 儀表板。
- 開啟映像檔。
- 按一下 標籤,然後按一下 摘要。
取得摘要之後,請在 docker-compose.yaml 檔案中新增此摘要。 請參閱下列範例:
services:
<imagename>:
image: s390x/redis@sha256:db467ab5c53bdeef65762a7534e26fecb94a0f218bd38afd2eaba1a670c472b1
Pod 描述子所說明的映像檔
由 Pod 描述符描述的容器影像可透過 Red Hat Simple Signing 進行驗證。
如果映像檔由摘要參照,則服務容許使用它,而不需要其他檢查。
沒有摘要的映像檔需要驗證 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 子區段中「種子」欄位提供的種子來加密該資料磁區。 因此必須提供兩個種子,一個透過 workload 區段 (由工作量角色),另一個透過 env 區段 (由部署人員角色)。 這兩個種子會在內部轉換成
UTF8 序列,然後連結。 稍後,連結序列的雜湊 (SHA256) 會計算為 hexdigest,用來作為 LUKS 通行詞組,以加密資料磁區。
目前,env 和 workload 種子要求的最小長度為 3 個字元。 自 2026 年 3 月起,此最低字元數目將增加至 15 個字元。 2026 年 3 月之後, 任何種子值若短於 15 個字元,可能會導致錯誤或部署失敗。 為避免中斷,請儘快更新所有種子值,使其長度至少達
15 個字元。 規則的定義如下。
自 2026 年 3 月起,您必須遵循這些規則才能製作種子:
- 不容許空格。
- 必須至少有
15字元。 以下是允許使用的字元:- 小寫字母
(a-z) - 大寫字母
(A-Z) - 數字
(0-9) - 特殊字元
!@#$%^&*(),.?":{}|<>_-
- 小寫字母
您可以使用以下指令來驗證十六進位摘要:
echo -n "seed1seed2" | sha256sum
在這裡,您可以瞭解如何在合約的工作量區段中提供「種子」。 如需如何透過 env 區段提供「種子」輸入的相關資訊,請參閱 env 區段。 必須同時提供加密的種子。 如果只提供其中一個種子實例關閉,則加密會失敗。
透過與整合 Hyper Protect Crypto Services,您可為靜態資料增添更高層級的加密保護與控制。 從 開始,您可以使用 生成一個 ibm-hyper-protect-container-runtime-1-0-s390x-11 隨機值作為第三 Hyper Protect Crypto Services 個種子,並用您的根金鑰進行封裝。 LUKS 通行詞組是透過使用 三個 種子來產生-meta 資料分割區中的種子,以及合約中的兩個種子。
如需相關資訊,請參閱 保護資料安全。
下列 Snippet 是 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 資料卷,其資料卷將被分割為兩部分。 第一個分區 ( 100Mib ) 保留給內部元數據使用;第二個分區則作為工作負載的數據卷。 只會分割新的磁區,而且您無法將分割的磁區與舊版 HPCR 映像檔搭配使用。 使用現有加密磁區佈建也可以運作。 差異是現有磁區未分割,您也可以使用此磁區回到較舊的映像檔。
從 ibm-hyper-protect-container-runtime-1-0-s390x-12 開始,部署人員和提供者可以使用「滾動種子」特性。 提供了用於滾動或旋轉種子以增加安全狀態的選項,或者如果種子已受損。 當部署人員及/或提供者想要捲動種子時,必須在 previousSeed 參數中指定現行種子資訊,且必須在 seed 參數中指定新的種子資訊。
下列 Snippet 是 volumes 區段的範例:
volumes:
test:
filesystem: ext4
mount: /mnt/data
seed: "workload_phrase1"
previousSeed: "workload_phrase"
從 ibm-hyper-protect-container-runtime-1-0-s390x-13 開始,您可以在啟動虛擬伺服器實例時連接多個磁區。 在實體執行時附加的磁碟區會被忽略。
下列 Snippet 是 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 區段也是合約中最重要的區段之一。 合約的 env 區段會處理雲端環境特有且工作量角色不知道的資訊。 此區段由部署人員 persona 建立。
env 區段的子區段如下:
type: 環境。 此子區段是必要的。logging。此子區段是必要的。volumes。只有在連接資料磁區時,才必須使用此子區段。signingKey。只有在您想要使用合約簽章時,才必須使用此子區段。env。如果env變數由工作量提供者定義,則此子區段用於指定這些變數的值。
logging 子區段
ICL
本節所需的最小小節是logRouter。 有關更多信息,請參閱 VPC 的Hyper Protect Virtual Servers日誌記錄。
下列 Snippet 是 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 子區段中,另一個在 env- volumes 子區段中。 種子可以是您選擇的任何隨機文字。
請參閱以下 env- volumes 小節的範例:
volumes:
test:
seed: "seed_value_with_minimum_15_characters"
當您使用「種子滾動」特性時,您可以使用下列 Snippet 作為範例:
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 整合,以產生第三個種子並使用根金鑰包裝它。 請參閱下列範例。 如需相關資訊,請參閱 保護資料安全。
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區段中使用 Pod 描述子:請參閱
play子區段 中的範本格式範例。 -
如果在
workload區段中使用 Docker Compose 檔案:如果 Docker Compose 檔案具有環境區段,您可以使用下列 Snippet 作為範例:
environment: KEY1: "${Value1}" KEY2: "${Value2}"當 docker compose 檔案有環境部分時,就像前面的範例所示,你可以在部署程式的
env部分傳送值。 下列範例顯示如何指定env變數的值:env: value1: "abc" value2: "xyz"
合約加密
您可以加密合約的內容。 雖然您也可以在不加密的情況下透過 使用者資料 傳入合約,但建議您加密合約。 也建議您一開始嘗試使用非加密合約來進行測試,且在它如預期般運作之後,您可以在正式作業環境中使用加密合約。
您可以決定合約的哪些區段需要加密。 例如,您可以選擇 只加密 workload 區段,或 只加密 env 區段。
當 Hyper Protect Virtual Servers for VPC 實例開機時,開機載入器會解密合約。 它會採用合約中每一個區段的值,並在加密時將它解密。 如果發現區段未加密,它會將它視為沒有任何解密。 在透過 使用者資料 區段傳遞合約作為輸入之前,您必須使用公開金鑰來加密合約。
加密和認證憑證由 IBM 中介憑證簽署。 IBM 中繼憑證由 IBM Digicert 中繼憑證簽署,而中繼憑證又由 DigiCert Trusted Root G4 簽署。 有關憑證的詳細資訊,請參閱 DigiCert Trusted Root Authority Certificates。
下載加密憑證並擷取公開金鑰
- 下載憑證。 下表列出了根據映像檔版本所對應的加密憑證到期日期,以及映像檔的停用/過時日期。
| 映像檔版本 | 憑證鏈結 | 加密憑證到期日 | 淘汰日期 |
|---|---|---|---|
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 日 |
附注
- 已棄用 - 您可以使用映像從 IBM Cloud CLI 建立實體。 在映像的狀態變更為廢棄之前,廢棄狀態可能會減低使用該映像的意願。 影像目錄總是維護兩個最新的影像版本:n 和 n-1。 當有新版本 ( n+1 ) 時,系統會廢棄最舊的版本 ( n-1 )。
- 過期:與映像關聯的憑證過期後,映像就無法用於配置實體。
- 務必下載與影像對應的加密憑證,並加密合約。
若要檢查映像檔淘汰或已作廢狀態,您也可以使用 IBM Cloud 映像檔清單指令。
您可以參閱映像檔清單指令的 文件,以取得映像檔的狀態。
- 依照驗證 合約加密證書主題中的說明來驗證 加密證書。
建立合約的已加密 workload 區段
合約中任何區段的值可以是純文字或加密。 在 Ubuntu 系統上完成以下步驟,對合約中使用的工作量部分進行加密:
-
根據工作量需求建立
docker-compose.yaml檔案。 例如,services: redisnode01: image: s390x/redis@sha256:db467ab5c53bdeef65762a7534e26fecb94a0f218bd38afd2eaba1a670c472b1 ports: - "6379:6379"如需相關資訊,請參閱 Docker Compose概觀。
-
建立合約的 工作量區段,並在
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" -
匯出
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>" -
請使用以下指令來建立一個隨機密碼。 合約透過對稱 AES 加密,並隨機設定密碼。
PASSWORD="$(openssl rand 32 | base64 -w0)" -
從 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)"
- 使用
-
使用下列指令,以隨機密碼來加密
workload.yaml檔案:ENCRYPTED_WORKLOAD="$(echo -n "$PASSWORD" | base64 -d | openssl enc -aes-256-cbc -pbkdf2 -pass stdin -in "$WORKLOAD" | base64 -w0)" -
使用下列指令來取得合約的已加密區段:
echo "hyper-protect-basic.${ENCRYPTED_PASSWORD}.${ENCRYPTED_WORKLOAD}" -
取得步驟 7 的輸出,並將它新增至
user-data.yaml檔案。workload: hyper-protect-basic.js7TGt77EQ5bgTIKk5C0pViFTRHqWtn..............字首
hyper-protect-basic是必要的。
建立合約的已加密 env 區段
在 Ubuntu 系統上完成下列步驟,以加密合約中使用的 env 部分:
-
建立合約的
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" -
匯出
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>" -
請使用以下指令來建立一個隨機密碼:
PASSWORD="$(openssl rand 32 | base64 -w0)" -
從 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)"
-
使用下列指令,以隨機密碼來加密
env.yaml:ENCRYPTED_ENV="$(echo -n "$PASSWORD" | base64 -d | openssl enc -aes-256-cbc -pbkdf2 -pass stdin -in "$ENV" | base64 -w0)" -
使用下列指令來取得合約的已加密區段:
echo "hyper-protect-basic.${ENCRYPTED_PASSWORD}.${ENCRYPTED_ENV}" -
若要加密工作量區段,請參閱 建立合約的已加密
workload區段。 -
取得步驟 6 的輸出,並將它新增至
user-data.yaml檔案。env: hyper-protect-basic.VWg/5/SWE+9jLfhr8q4i.........
合約簽章
合約簽章是您可以在合約中使用的選購功能。 您可以選擇在合約作為輸入傳遞之前簽署合約。 您也可以在簽約時設定合約的到期日。 可以簽署純文字或已加密的合約。 合約簽章的驗證由 VPC 映像檔的 Hyper Protect Virtual Servers 完成。 此簽章特性的目的是確保 workload 和 env 區段一律一起使用,且不會被協力廠商竄改。 此特性也支援設定合約期限。 也就是說,如果在簽章過期後啟動實體,啟動程序會失敗。
workload 和 env 區段的簽章會作為值新增至 envWorkloadSignature 區段。 下列是合約中在建立及新增合約簽章時相關的兩個區段:
envWorkloadSignature:此部分是加入合約其他部分簽名的地方。 未簽署的合約不需要此區段。signingKey:本小节必须添加到合同的env部分。 本小节保存用户生成的公钥的值,其对应的私钥用于创建合同签名。 公開金鑰或憑證也可以解析為 Base64 字串。
在 Ubuntu 系統上完成下列步驟,以建立合約簽章:
-
使用下列指令來產生金鑰組以簽署合約 (請注意,"test1234" 是用來產生金鑰的通行詞組,您可以使用自己的金鑰):
openssl genrsa -aes128 -passout pass:test1234 -out private.pem 4096 openssl rsa -in private.pem -passin pass:test1234 -pubout -out public.pem -
下列指令是如何取得簽署金鑰的範例:
key=$(awk -vRS="\n" -vORS="\\\n" '1' public.pem) echo ${key%\\n} -
或者,如果您想將簽名金鑰傳遞為Base64:
key=$(cat public.pem | base64 -w 0) echo $key -
如果要啟用合約到期,請遵循下列步驟:
- 使用下列指令來產生憑證申請:
openssl req -new -key private.pem -passin pass:test1234 -out csr.pem- 指令會產生憑證。
- 使用下列指令為 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 - 下列指令是取得憑證的範例:
certificate=$(awk -vRS="\n" -vORS="\\\n" '1' certificate.pem) echo ${certificate%\\n} - (可選)使用以下命令作為範例來取得證書Base64格式:
certificate=$(cat certificate.pem | base64 -w 0) echo $certificate -
建立名為
env.yaml的檔案。 請參閱下列範例:- 如果
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----"- 如果
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-----"- 如果
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 - 如果
-
建立名為
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----" -
請使用下列指令來匯出
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>" -
請使用以下指令來建立一個隨機密碼:
PASSWORD="$(openssl rand 32 | base64 -w0)" -
從 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)" ``` - 使用
-
使用下列指令,以隨機密碼來加密
env.yaml:ENCRYPTED_ENV="$(echo -n "$PASSWORD" | base64 -d | openssl enc -aes-256-cbc -pbkdf2 -pass stdin -in "$ENV" | base64 -w0)" -
使用下列指令來解壓縮已加密的
env區段:echo "hyper-protect-basic.${ENCRYPTED_PASSWORD}.${ENCRYPTED_ENV}"
步驟 7 - 11 用於加密 env 部分。 如果您選擇不加密此區段,請跳過這些步驟。
有關合約到期的通知將發送到您的日誌服務。 通知的時間表如下:
- 每個月的第一天
- 每天在到期之前 30 天
- 如果合約即將在 7 天內到期,則每 4 小時一次
- 如果合約已到期或即將在 1 天內到期,則每小時一次
加密與認證憑證到期警告記錄
HPVS 會將警告訊息記錄至已設定的記錄服務,內容涉及即將到期和已過期的加密與驗證憑證。
以下是通知時間表:
-
到期前 30 天:每 24 小時產生一次警告訊息,通知證書將在一個月後到期。
範例:
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 會記錄警告訊息 每 4 小時,直到 HPVS 映像升級為止。
範例:
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。
-
取得已加密的
workload.yaml及已加密的env.yaml檔案。 -
將它們新增至
user-data.yaml檔案。workload: hyper-protect-basic.js7TGt77EQ5bgTIKk5C0pViFTRHqWtn.............. env: hyper-protect-basic.VWg/5/SWE+9jLfhr8q4i......... -
建立名為
contract.txt的檔案。 先加入workload的值,然後再加入user-data.yaml檔案中env的值。 請確定workload之後及env之前沒有空格或新行。 此外,請確定檔案末端沒有新增任何行或空格。 建議使用工具 (例如hexdump) 交叉檢查contract.txt檔案的二進位內容。 在二進位檔傾出中,請確定您沒有看到0aASCII 值作為最後一個項目。hyper-protect-basic.js7TGt77EQ5bgTIKk5C0pViFTRHqWtn..............hyper-protect-basic.VWg/5/SWE+9jLfhr8q4i......... -
請使用下列指令來產生簽章:
echo $(cat contract.txt | tr -d "\n\r" | openssl dgst -sha256 -sign private.pem | openssl enc -base64) | tr -d ' ' -
將簽章新增至
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。 您可以選擇不同的計劃。 若要瞭解如何取得所需的詳細資訊,例如主機名稱和擷取金鑰,請參閱 Hyper Protect Virtual Servers for VPC 的記錄。
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. 取得 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-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==