Este contenido no está disponible en el idioma seleccionado.
Chapter 8. Deploying Confidential Containers on IBM Z and IBM LinuxONE
You can deploy Confidential Containers on IBM Z® and IBM® LinuxONE after you deploy OpenShift sandboxed containers.
Confidential Containers on IBM Z® and IBM® LinuxONE is a Technology Preview feature only. Technology Preview features are not supported with Red Hat production service level agreements (SLAs) and might not be functionally complete. Red Hat does not recommend using them in production. These features provide early access to upcoming product features, enabling customers to test functionality and provide feedback during the development process.
For more information about the support scope of Red Hat Technology Preview features, see Technology Preview Features Support Scope.
IBM® Hyper Protect Confidential Container (HPCC) for Red Hat OpenShift Container Platform is now production-ready. HPCC enables Confidential Computing technology at the enterprise scale by providing a multiparty Hyper Protect Contract, deployment attestation, and validation of container runtime and OCI image integrity.
HPCC is supported by IBM Z17® and IBM® LinuxONE Emperor 5 and is compatible with OpenShift sandboxed containers 1.9 and later. For more information, see the IBM HPCC documentation.
Cluster requirements
- You have installed Red Hat OpenShift Container Platform 4.15 or later on the cluster where you are installing the Confidential compute attestation Operator.
LPAR requirements
- You have LinuxONE Emperor 4.
- You have enabled Secure Unpack Facility on your Logical Partition (LPAR), which is necessary for the IBM Secure Execution. For more information, see Enabling the KVM host for IBM Secure Execution.
You deploy Confidential Containers by performing the following steps:
- Install the Confidential compute attestation Operator.
- Create the route for Trustee.
- Enable the Confidential Containers feature gate.
- Create initdata.
- Update the peer pods config map.
- Optional: Customize the Kata agent policy.
-
Delete the
KataConfigcustom resource (CR). - Update the peer pods secret.
- Optional: Select a custom peer pod VM image.
-
Re-create the
KataConfigCR. - Create the Trustee authentication secret.
- Create the Trustee config map.
- Obtain the IBM Secure Execution (SE) header.
- Configure the SE certificates and keys.
- Create the persistent storage components.
- Configure Trustee values, policies, and secrets.
-
Create the
KbsConfigCR. - Verify the Trustee configuration.
- Verify the attestation process.
8.1. Installing the Confidential compute attestation Operator Copiar enlaceEnlace copiado en el portapapeles!
You can install the Confidential compute attestation Operator on IBM Z® and IBM® LinuxONE by using the CLI.
Prerequisites
-
You have installed the OpenShift CLI (
oc). -
You have access to the cluster as a user with the
cluster-adminrole.
Procedure
Create a
trustee-namespace.yamlmanifest file:apiVersion: v1 kind: Namespace metadata: name: trustee-operator-system
apiVersion: v1 kind: Namespace metadata: name: trustee-operator-systemCopy to Clipboard Copied! Toggle word wrap Toggle overflow Create the
trustee-operator-systemnamespace by running the following command:oc apply -f trustee-namespace.yaml
$ oc apply -f trustee-namespace.yamlCopy to Clipboard Copied! Toggle word wrap Toggle overflow Create a
trustee-operatorgroup.yamlmanifest file:Copy to Clipboard Copied! Toggle word wrap Toggle overflow Create the operator group by running the following command:
oc apply -f trustee-operatorgroup.yaml
$ oc apply -f trustee-operatorgroup.yamlCopy to Clipboard Copied! Toggle word wrap Toggle overflow Create a
trustee-subscription.yamlmanifest file:Copy to Clipboard Copied! Toggle word wrap Toggle overflow Create the subscription by running the following command:
oc apply -f trustee-subscription.yaml
$ oc apply -f trustee-subscription.yamlCopy to Clipboard Copied! Toggle word wrap Toggle overflow Verify that the Operator is correctly installed by running the following command:
oc get csv -n trustee-operator-system
$ oc get csv -n trustee-operator-systemCopy to Clipboard Copied! Toggle word wrap Toggle overflow This command can take several minutes to complete.
Watch the process by running the following command:
watch oc get csv -n trustee-operator-system
$ watch oc get csv -n trustee-operator-systemCopy to Clipboard Copied! Toggle word wrap Toggle overflow Example output
NAME DISPLAY PHASE trustee-operator.v0.3.0 Trustee Operator 0.3.0 Succeeded
NAME DISPLAY PHASE trustee-operator.v0.3.0 Trustee Operator 0.3.0 SucceededCopy to Clipboard Copied! Toggle word wrap Toggle overflow
8.2. Enabling the Confidential Containers feature gate Copiar enlaceEnlace copiado en el portapapeles!
You must enable the Confidential Containers feature gate.
Prerequisites
- You have subscribed to the OpenShift sandboxed containers Operator.
Procedure
Create a
cc-feature-gate.yamlmanifest file:Copy to Clipboard Copied! Toggle word wrap Toggle overflow Create the config map by running the following command:
oc apply -f cc-feature-gate.yaml
$ oc apply -f cc-feature-gate.yamlCopy to Clipboard Copied! Toggle word wrap Toggle overflow
8.3. Creating the route for Trustee Copiar enlaceEnlace copiado en el portapapeles!
You can create a secure route with edge TLS termination for Trustee. External ingress traffic reaches the router pods as HTTPS and passes on to the Trustee pods as HTTP.
Prerequisites
- You have installed the Confidential compute attestation Operator.
Procedure
Create an edge route by running the following command:
oc create route edge --service=kbs-service --port kbs-port \ -n trustee-operator-system
$ oc create route edge --service=kbs-service --port kbs-port \ -n trustee-operator-systemCopy to Clipboard Copied! Toggle word wrap Toggle overflow NoteNote: Currently, only a route with a valid CA-signed certificate is supported. You cannot use a route with self-signed certificate.
Set the
TRUSTEE_HOSTvariable by running the following command:TRUSTEE_HOST=$(oc get route -n trustee-operator-system kbs-service \ -o jsonpath={.spec.host})$ TRUSTEE_HOST=$(oc get route -n trustee-operator-system kbs-service \ -o jsonpath={.spec.host})Copy to Clipboard Copied! Toggle word wrap Toggle overflow Verify the route by running the following command:
echo $TRUSTEE_HOST
$ echo $TRUSTEE_HOSTCopy to Clipboard Copied! Toggle word wrap Toggle overflow Example output
kbs-service-trustee-operator-system.apps.memvjias.eastus.aroapp.io
kbs-service-trustee-operator-system.apps.memvjias.eastus.aroapp.ioCopy to Clipboard Copied! Toggle word wrap Toggle overflow
8.4. About initdata Copiar enlaceEnlace copiado en el portapapeles!
The initdata specification provides a flexible way to initialize a peer pod with sensitive or workload-specific data at runtime, avoiding the need to embed such data in the virtual machine (VM) image. This enhances security by reducing exposure of confidential information and improves flexibility by eliminating custom image builds. For example, initdata can include three configuration settings:
- An X.509 certificate for secure communication.
- A cryptographic key for authentication.
-
An optional Kata Agent
policy.regofile to enforce runtime behavior when overriding the default Kata Agent policy.
You can apply an initdata configuration by using one of the following methods:
- Globally by including it in the peer pods config map, setting a cluster-wide default for all pods.
For a specific pod when configuring a pod workload object, allowing customization for individual workloads.
The
io.katacontainers.config.runtime.cc_init_dataannotation you specify when configuring a pod workload object overrides the globalINITDATAsetting in the peer pods config map for that specific pod. The Kata runtime handles this precedence automatically at pod creation time.
The initdata content configures the following components:
- Attestation Agent (AA), which verifies the trustworthiness of the peer pod by sending evidence to the Trustee for attestation.
- Confidential Data Hub (CDH), which manages secrets and secure data access within the peer pod VM.
- Kata Agent, which enforces runtime policies and manages the lifecycle of the containers inside the pod VM.
8.5. Creating initdata Copiar enlaceEnlace copiado en el portapapeles!
Create a TOML file with initdata and convert it to a Base64-encoded string. Use this string to specify the value in the peer pods config map, in the peer pod manifest, or in the busybox.yaml file.
You must delete the kbs_cert setting if you configure insecure_http = true in the Trustee config map.
Procedure
Obtain the Trustee IP address by running the following command:
oc get node $(oc get pod -n trustee-operator-system -o jsonpath='{.items[0].spec.nodeName}') -o jsonpath='{.status.addresses[?(@.type=="InternalIP")].address}'$ oc get node $(oc get pod -n trustee-operator-system -o jsonpath='{.items[0].spec.nodeName}') -o jsonpath='{.status.addresses[?(@.type=="InternalIP")].address}'Copy to Clipboard Copied! Toggle word wrap Toggle overflow Example output
192.168.122.22
192.168.122.22Copy to Clipboard Copied! Toggle word wrap Toggle overflow Obtain the Trustee port by running the following command:
oc get svc kbs-service -n trustee-operator-system
$ oc get svc kbs-service -n trustee-operator-systemCopy to Clipboard Copied! Toggle word wrap Toggle overflow Example output
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE kbs-service NodePort 172.30.116.11 <none> 8080:32178/TCP 12d
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE kbs-service NodePort 172.30.116.11 <none> 8080:32178/TCP 12dCopy to Clipboard Copied! Toggle word wrap Toggle overflow Create the
initdata.tomlconfiguration file:Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 1
- Specify the Trustee IP address and the port, for example,
https://192.168.122.22:32178. - 2
- Specify the Base64-encoded TLS certificate for the attestation agent. This is not required for testing purposes, but it is recommended for production systems.
- 3
- Delete the
kbs_certsetting if you configureinsecure_http = truein the Trustee config map. - 4
- Specify the Base64-encoded TLS certificate for the Trustee instance.
- 5
- Optional: You can specify a custom Kata Agent policy.
Convert the
initdata.tomlfile to a Base64-encoded string in a text file by running the following command:base64 -w0 initdata.toml > initdata.txt
$ base64 -w0 initdata.toml > initdata.txtCopy to Clipboard Copied! Toggle word wrap Toggle overflow
8.6. Updating the peer pods config map Copiar enlaceEnlace copiado en el portapapeles!
You must update the peer pods config map for Confidential Containers.
Set Secure Boot to true to enable it by default. The default value is false, which presents a security risk.
Procedure
Create a
peer-pods-cm.yamlmanifest file according to the following example:Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 1
- Specify the maximum number of peer pods that can be created per node. The default value is
10. - 2
- Specify the libvirt pool. If you have manually configured the libvirt pool, use the same name as in your KVM host configuration.
- 3
- Specify the libvirt volume name. If you have manually configured the libvirt volume, use the same name as in your KVM host configuration.
- 4
- Specify the libvirt directory for storing virtual machine disk images, such as
.qcow2, or.rawfiles. To ensure libvirt has read and write access permissions, use a subdirectory of the libvirt storage directory. The default is/var/lib/libvirt/images/. - 5
- Optional: Specify a libvirt network if you do not want to use the default network.
- 6
- Specify the Base64-encoded string you created in the
initdata.txtfile.
Create the config map by running the following command:
oc apply -f peer-pods-cm.yaml
$ oc apply -f peer-pods-cm.yamlCopy to Clipboard Copied! Toggle word wrap Toggle overflow Restart the
ds/osc-caa-dsdaemon set by running the following command:oc set env ds/osc-caa-ds \ -n openshift-sandboxed-containers-operator REBOOT="$(date)"
$ oc set env ds/osc-caa-ds \ -n openshift-sandboxed-containers-operator REBOOT="$(date)"Copy to Clipboard Copied! Toggle word wrap Toggle overflow
8.7. Customizing the Kata agent policy Copiar enlaceEnlace copiado en el portapapeles!
The Kata agent policy is a security mechanism that controls agent API requests for pods running with the Kata runtime. Written in Rego and enforced by the Kata agent within the pod virtual machine (VM), this policy determines which operations are allowed or denied.
By default, the Kata agent policy disables the exec and log APIs, as they might transmit or receive unencrypted data through the control plane, which is insecure.
You can override the default policy with a custom one for specific use cases, such as development and testing where security is not a concern. For example, you might run in an environment where the control plane can be trusted. You can apply a custom policy in several ways:
- Embedding it in the pod VM image.
- Patching the peer pods config map.
- Adding an annotation to the workload pod YAML.
For production systems, the preferred method is to use initdata to override the Kata agent policy. The following procedure applies a custom policy to an individual pod using the io.katacontainers.config.agent.policy annotation. The policy is provided in Base64-encoded Rego format. This approach overrides the default policy at pod creation without modifying the pod VM image.
Enabling the exec or log APIs in Confidential Containers workloads might expose sensitive information. Do not enable these APIs in production environments.
A custom policy replaces the default policy entirely. To modify only specific APIs, include the full policy and adjust the relevant rules.
Procedure
Create a
policy.regofile with your custom policy. The following example shows all configurable APIs, withexecandlogenabled for demonstration:Copy to Clipboard Copied! Toggle word wrap Toggle overflow This policy enables the
exec(ExecProcessRequest) andlog(ReadStreamRequest) APIs. Adjust thetrueorfalsevalues to customize the policy further based on your needs.Convert the
policy.regofile to a Base64-encoded string by running the following command:base64 -w0 policy.rego
$ base64 -w0 policy.regoCopy to Clipboard Copied! Toggle word wrap Toggle overflow Save the output for use in the yaml file.
Add the Base64-encoded policy to a
my-pod.yamlpod specification file:Copy to Clipboard Copied! Toggle word wrap Toggle overflow Apply the pod manifest by running the following command:
oc apply -f my-pod.yaml
$ oc apply -f my-pod.yamlCopy to Clipboard Copied! Toggle word wrap Toggle overflow
8.8. Deleting the KataConfig custom resource Copiar enlaceEnlace copiado en el portapapeles!
You can delete the KataConfig custom resource (CR) by using the command line.
Prerequisites
-
You have installed the OpenShift CLI (
oc). -
You have access to the cluster as a user with the
cluster-adminrole.
Procedure
Delete the
KataConfigCR by running the following command:oc delete kataconfig example-kataconfig
$ oc delete kataconfig example-kataconfigCopy to Clipboard Copied! Toggle word wrap Toggle overflow Verify that the custom resource was deleted by running the following command:
oc get kataconfig example-kataconfig
$ oc get kataconfig example-kataconfigCopy to Clipboard Copied! Toggle word wrap Toggle overflow Example output
No example-kataconfig instances exist
No example-kataconfig instances existCopy to Clipboard Copied! Toggle word wrap Toggle overflow
When uninstalling OpenShift sandboxed containers deployed using a cloud provider, you must delete all of the pods. Any remaining pod resources might result in an unexpected bill from your cloud provider.
8.9. Updating the peer pods secret Copiar enlaceEnlace copiado en el portapapeles!
You must update the peer pods secret.
The secret stores credentials for creating the pod virtual machine (VM) image and peer pod instances.
By default, the OpenShift sandboxed containers Operator creates the secret based on the credentials used to create the cluster. However, you can manually create a secret that uses different credentials.
Prerequisites
-
REDHAT_OFFLINE_TOKEN. You have generated this token to download the RHEL image at Red Hat API Tokens. -
HOST_KEY_CERTS. The Host Key Document (HKD) certificate enables secure execution on IBM Z®. For more information, see Obtaining a host key document from Resource Link in the IBM documentation.
Procedure
Create a
peer-pods-secret.yamlmanifest file according to the following example:Copy to Clipboard Copied! Toggle word wrap Toggle overflow Create the secret by running the following command:
oc apply -f peer-pods-secret.yaml
$ oc apply -f peer-pods-secret.yamlCopy to Clipboard Copied! Toggle word wrap Toggle overflow
8.10. Selecting a custom peer pod VM image Copiar enlaceEnlace copiado en el portapapeles!
You can select a custom peer pod virtual machine (VM) image, tailored to your workload requirements by adding an annotation to the pod manifest. The custom image overrides the default image specified in the peer pods config map. You create a new libvirt volume in your libvirt pool and upload the custom peer pod VM image to the new volume. Then, you update the pod manifest to use the custom peer pod VM image.
Prerequisites
- The ID of the custom pod VM image to use, compatible with the cloud provider or hypervisor, is available.
Procedure
Set the name of the libvirt pool by running the following command:
export LIBVIRT_POOL=<libvirt_pool>
$ export LIBVIRT_POOL=<libvirt_pool>1 Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 1
- Specify the existing libvirt pool name.
Set the name of the new libvirt volume by running the following command:
export LIBVIRT_VOL_NAME=<new_libvirt_volume>
$ export LIBVIRT_VOL_NAME=<new_libvirt_volume>Copy to Clipboard Copied! Toggle word wrap Toggle overflow Create a libvirt volume for the pool by running the following command:
Copy to Clipboard Copied! Toggle word wrap Toggle overflow Upload the custom peer pod VM image to the libvirt volume:
virsh -c qemu:///system vol-upload \ --vol $LIBVIRT_VOL_NAME <custom_podvm_image.qcow2> \ --pool $LIBVIRT_POOL --sparse
$ virsh -c qemu:///system vol-upload \ --vol $LIBVIRT_VOL_NAME <custom_podvm_image.qcow2> \1 --pool $LIBVIRT_POOL --sparseCopy to Clipboard Copied! Toggle word wrap Toggle overflow - 1
- Specify the custom peer pod VM image name.
Create a
pod-manifest.yamlmanifest file according to the following example:Copy to Clipboard Copied! Toggle word wrap Toggle overflow Create the pod by running the following command:
oc apply -f pod-manifest.yaml
$ oc apply -f pod-manifest.yamlCopy to Clipboard Copied! Toggle word wrap Toggle overflow
8.11. Re-creating the KataConfig custom resource Copiar enlaceEnlace copiado en el portapapeles!
You must re-create the KataConfig custom resource (CR) for Confidential Containers.
Creating the KataConfig CR automatically reboots the worker nodes. The reboot can take from 10 to more than 60 minutes. Factors that impede reboot time are as follows:
- A larger OpenShift Container Platform deployment with a greater number of worker nodes.
- Activation of the BIOS and Diagnostics utility.
- Deployment on a hard disk drive rather than an SSD.
- Deployment on physical nodes such as bare metal, rather than on virtual nodes.
- A slow CPU and network.
Prerequisites
-
You have access to the cluster as a user with the
cluster-adminrole.
Procedure
Create an
example-kataconfig.yamlmanifest file according to the following example:Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 1
- Optional: If you have applied node labels to install
kata-remoteon specific nodes, specify the key and value, for example,cc: 'true'.
Create the
KataConfigCR by running the following command:oc apply -f example-kataconfig.yaml
$ oc apply -f example-kataconfig.yamlCopy to Clipboard Copied! Toggle word wrap Toggle overflow The new
KataConfigCR is created and installskata-remoteas a runtime class on the worker nodes.Wait for the
kata-remoteinstallation to complete and the worker nodes to reboot before verifying the installation.Monitor the installation progress by running the following command:
watch "oc describe kataconfig | sed -n /^Status:/,/^Events/p"
$ watch "oc describe kataconfig | sed -n /^Status:/,/^Events/p"Copy to Clipboard Copied! Toggle word wrap Toggle overflow When the status of all workers under
kataNodesisinstalledand the conditionInProgressisFalsewithout specifying a reason, thekata-remoteis installed on the cluster.Verify that you have built the peer pod image and uploaded it to the libvirt volume by running the following command:
oc describe configmap peer-pods-cm -n openshift-sandboxed-containers-operator
$ oc describe configmap peer-pods-cm -n openshift-sandboxed-containers-operatorCopy to Clipboard Copied! Toggle word wrap Toggle overflow Example output
Copy to Clipboard Copied! Toggle word wrap Toggle overflow Monitor the
kata-ocmachine config pool progress to ensure that it is in theUPDATEDstate, whenUPDATEDMACHINECOUNTequalsMACHINECOUNT, by running the following command:watch oc get mcp/kata-oc
$ watch oc get mcp/kata-ocCopy to Clipboard Copied! Toggle word wrap Toggle overflow Verify the daemon set by running the following command:
oc get -n openshift-sandboxed-containers-operator ds/osc-caa-ds
$ oc get -n openshift-sandboxed-containers-operator ds/osc-caa-dsCopy to Clipboard Copied! Toggle word wrap Toggle overflow Verify the runtime classes by running the following command:
oc get runtimeclass
$ oc get runtimeclassCopy to Clipboard Copied! Toggle word wrap Toggle overflow Example output
NAME HANDLER AGE kata kata 152m kata-remote kata-remote 152m
NAME HANDLER AGE kata kata 152m kata-remote kata-remote 152mCopy to Clipboard Copied! Toggle word wrap Toggle overflow
8.12. Creating the Trustee authentication secret Copiar enlaceEnlace copiado en el portapapeles!
You must create the authentication secret for Trustee.
Prerequisites
-
You have installed the OpenShift CLI (
oc). -
You have access to the cluster as a user with the
cluster-adminrole.
Procedure
Create a private key by running the following command:
openssl genpkey -algorithm ed25519 > privateKey
$ openssl genpkey -algorithm ed25519 > privateKeyCopy to Clipboard Copied! Toggle word wrap Toggle overflow Create a public key by running the following command:
openssl pkey -in privateKey -pubout -out publicKey
$ openssl pkey -in privateKey -pubout -out publicKeyCopy to Clipboard Copied! Toggle word wrap Toggle overflow Create a secret by running the following command:
oc create secret generic kbs-auth-public-key --from-file=publicKey -n trustee-operator-system
$ oc create secret generic kbs-auth-public-key --from-file=publicKey -n trustee-operator-systemCopy to Clipboard Copied! Toggle word wrap Toggle overflow Verify the secret by running the following command:
oc get secret -n trustee-operator-system
$ oc get secret -n trustee-operator-systemCopy to Clipboard Copied! Toggle word wrap Toggle overflow
8.13. Creating the Trustee config map Copiar enlaceEnlace copiado en el portapapeles!
You must create the config map to configure the Trustee server.
The following configuration example turns off security features to enable demonstration of Technology Preview features. It is not meant for a production environment.
Prerequisites
- You have created a route for Trustee.
Procedure
Create a
kbs-config-cm.yamlmanifest file:Copy to Clipboard Copied! Toggle word wrap Toggle overflow Create the config map by running the following command:
oc apply -f kbs-config-cm.yaml
$ oc apply -f kbs-config-cm.yamlCopy to Clipboard Copied! Toggle word wrap Toggle overflow
8.14. Configuring the IBM Secure Execution certificates and keys Copiar enlaceEnlace copiado en el portapapeles!
You must configure the IBM Secure Execution (SE) certificates and keys for your worker nodes.
Prerequisites
- You have the IP address of the bastion node.
- You have the internal IP addresses of the worker nodes.
Procedure
Generate the Key Broker Service (KBS) certificate and key by performing the following steps:
Create the
kbs.confconfiguration file according to the following example:Copy to Clipboard Copied! Toggle word wrap Toggle overflow Generate the KBS key and self-signed certificate by running the following command:
Copy to Clipboard Copied! Toggle word wrap Toggle overflow Copy the KBS key to the
ibmsedirectory by running the following command:cp kbs.key /tmp/ibmse/kbs.key
$ cp kbs.key /tmp/ibmse/kbs.keyCopy to Clipboard Copied! Toggle word wrap Toggle overflow Copy the KBS certificate to the
ibmsedirectory by running the following command:cp kbs.crt /tmp/ibmse/kbs.crt
$ cp kbs.crt /tmp/ibmse/kbs.crtCopy to Clipboard Copied! Toggle word wrap Toggle overflow
Obtain the attestation policy fields by performing the following steps:
Create a directory to download the
GetRvps.shscript by running the following command:mkdir -p Rvps-Extraction/
$ mkdir -p Rvps-Extraction/Copy to Clipboard Copied! Toggle word wrap Toggle overflow Download the script by running the following command:
wget https://github.com/openshift/sandboxed-containers-operator/raw/devel/scripts/rvps-extraction/GetRvps.sh -O $PWD/GetRvps.sh
$ wget https://github.com/openshift/sandboxed-containers-operator/raw/devel/scripts/rvps-extraction/GetRvps.sh -O $PWD/GetRvps.shCopy to Clipboard Copied! Toggle word wrap Toggle overflow Create a subdirectory by running the following command:
mkdir -p Rvps-Extraction/static-files
$ mkdir -p Rvps-Extraction/static-filesCopy to Clipboard Copied! Toggle word wrap Toggle overflow Go to the
static-filesdirectory by running the following command:cd Rvps-Extraction/static-files
$ cd Rvps-Extraction/static-filesCopy to Clipboard Copied! Toggle word wrap Toggle overflow Download the
pvextract-hdrtool by running the following command:wget https://github.com/openshift/sandboxed-containers-operator/raw/devel/scripts/rvps-extraction/static-files/pvextract-hdr -O $PWD/pvextract-hdr
$ wget https://github.com/openshift/sandboxed-containers-operator/raw/devel/scripts/rvps-extraction/static-files/pvextract-hdr -O $PWD/pvextract-hdrCopy to Clipboard Copied! Toggle word wrap Toggle overflow Make the tool executable by running the following command:
chmod +x pvextract-hdr
$ chmod +x pvextract-hdrCopy to Clipboard Copied! Toggle word wrap Toggle overflow Download the
se_parse_hdr.pyscript by running the following command:wget https://github.com/openshift/sandboxed-containers-operator/raw/devel/scripts/rvps-extraction/static-files/se_parse_hdr.py -O $PWD/se_parse_hdr.py
$ wget https://github.com/openshift/sandboxed-containers-operator/raw/devel/scripts/rvps-extraction/static-files/se_parse_hdr.py -O $PWD/se_parse_hdr.pyCopy to Clipboard Copied! Toggle word wrap Toggle overflow Copy your Host Key Document (HKD) certificate to the
static-filesdirectory by running the following command:cp ~/path/to/<hkd_cert.crt> .
$ cp ~/path/to/<hkd_cert.crt> .Copy to Clipboard Copied! Toggle word wrap Toggle overflow The
static-filesdirectory contains the following files:-
HKD.crt -
pvextract-hdr -
se_parse_hdr.py
-
Go to the
Rvps-Extractiondirectory by running the following command:cd ..
$ cd ..Copy to Clipboard Copied! Toggle word wrap Toggle overflow Make the
GetRvps.shscript executable by running the following command:chmod +x GetRvps.sh
$ chmod +x GetRvps.shCopy to Clipboard Copied! Toggle word wrap Toggle overflow Run the script:
./GetRvps.sh
$ ./GetRvps.shCopy to Clipboard Copied! Toggle word wrap Toggle overflow Example output
Copy to Clipboard Copied! Toggle word wrap Toggle overflow Enter
2to generate the Reference Value Provider Service from the volume:Please enter your choice: 2
Please enter your choice: 2Copy to Clipboard Copied! Toggle word wrap Toggle overflow Enter
fa-ppfor the libvirt pool name:Enter the Libvirt Pool Name: fa-pp
Enter the Libvirt Pool Name: fa-ppCopy to Clipboard Copied! Toggle word wrap Toggle overflow Enter the libvirt gateway URI:
Enter the Libvirt URI Name: <libvirt-uri>
Enter the Libvirt URI Name: <libvirt-uri>1 Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 1
- Specify the
LIBVIRT_URIvalue that you used to create the peer pods secret.
Enter
fa-pp-volfor the libvirt volume name:Enter the Libvirt Volume Name: fa-pp-vol
Enter the Libvirt Volume Name: fa-pp-volCopy to Clipboard Copied! Toggle word wrap Toggle overflow Example output
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
Obtain the certificates and certificate revocation lists (CRLs) by performing the following steps:
Create a temporary directory for certificates by running the following command:
mkdir /tmp/ibmse/certs
$ mkdir /tmp/ibmse/certsCopy to Clipboard Copied! Toggle word wrap Toggle overflow Download the
ibm-z-host-key-signing-gen2.crtcertificate by running the following command:wget https://www.ibm.com/support/resourcelink/api/content/public/ibm-z-host-key-signing-gen2.crt -O /tmp/ibmse/certs/ibm-z-host-key-signing-gen2.crt
$ wget https://www.ibm.com/support/resourcelink/api/content/public/ibm-z-host-key-signing-gen2.crt -O /tmp/ibmse/certs/ibm-z-host-key-signing-gen2.crtCopy to Clipboard Copied! Toggle word wrap Toggle overflow Download the
DigiCertCA.crtcertificate by running the following command:wget https://www.ibm.com/support/resourcelink/api/content/public/DigiCertCA.crt -O /tmp/ibmse/certs/DigiCertCA.crt
$ wget https://www.ibm.com/support/resourcelink/api/content/public/DigiCertCA.crt -O /tmp/ibmse/certs/DigiCertCA.crtCopy to Clipboard Copied! Toggle word wrap Toggle overflow Create a temporary directory for the CRLs by running the following command:
mkdir /tmp/ibmse/crls
$ mkdir /tmp/ibmse/crlsCopy to Clipboard Copied! Toggle word wrap Toggle overflow Download the
ibm-z-host-key-gen2.crlfile by running the following command:wget https://www.ibm.com/support/resourcelink/api/content/public/ibm-z-host-key-gen2.crl -O /tmp/ibmse/crls/ibm-z-host-key-gen2.crl
$ wget https://www.ibm.com/support/resourcelink/api/content/public/ibm-z-host-key-gen2.crl -O /tmp/ibmse/crls/ibm-z-host-key-gen2.crlCopy to Clipboard Copied! Toggle word wrap Toggle overflow Download the
DigiCertTrustedRootG4.crlfile by running the following command:wget http://crl3.digicert.com/DigiCertTrustedRootG4.crl -O /tmp/ibmse/crls/DigiCertTrustedRootG4.crl
$ wget http://crl3.digicert.com/DigiCertTrustedRootG4.crl -O /tmp/ibmse/crls/DigiCertTrustedRootG4.crlCopy to Clipboard Copied! Toggle word wrap Toggle overflow Download the
DigiCertTrustedG4CodeSigningRSA4096SHA3842021CA1.crlfile by running the following command:wget http://crl3.digicert.com/DigiCertTrustedG4CodeSigningRSA4096SHA3842021CA1.crl -O /tmp/ibmse/crls/DigiCertTrustedG4CodeSigningRSA4096SHA3842021CA1.crl
$ wget http://crl3.digicert.com/DigiCertTrustedG4CodeSigningRSA4096SHA3842021CA1.crl -O /tmp/ibmse/crls/DigiCertTrustedG4CodeSigningRSA4096SHA3842021CA1.crlCopy to Clipboard Copied! Toggle word wrap Toggle overflow Create a temporary directory for the
hdr.binfile by running the following command:mkdir -p /tmp/ibmse/hdr/
$ mkdir -p /tmp/ibmse/hdr/Copy to Clipboard Copied! Toggle word wrap Toggle overflow Copy the
hdr.binfile to thehdrdirectory by running the following command:cp /root/Rvps-Extraction/output-files/hdr.bin /tmp/ibmse/hdr/
$ cp /root/Rvps-Extraction/output-files/hdr.bin /tmp/ibmse/hdr/Copy to Clipboard Copied! Toggle word wrap Toggle overflow Create a temporary directory for Host Key Document (HKD) certificate by running the following command:
mkdir -p /tmp/ibmse/hkds
$ mkdir -p /tmp/ibmse/hkdsCopy to Clipboard Copied! Toggle word wrap Toggle overflow Copy your HKD certificate to the
hkdsdirectory by running the following command:cp ~/path/to/<hkd_cert.crt> /tmp/ibmse/hkds/
$ cp ~/path/to/<hkd_cert.crt> /tmp/ibmse/hkds/Copy to Clipboard Copied! Toggle word wrap Toggle overflow
Generate the RSA keys:
Generate an RSA key pair by running the following command:
openssl genrsa -aes256 -passout pass:<password> -out /tmp/encrypt_key-psw.pem 4096
$ openssl genrsa -aes256 -passout pass:<password> -out /tmp/encrypt_key-psw.pem 40961 Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 1
- Specify the RSA key password.
Create a temporary directory for the RSA keys by running the following command:
mkdir -p /tmp/ibmse/rsa
$ mkdir -p /tmp/ibmse/rsaCopy to Clipboard Copied! Toggle word wrap Toggle overflow Create an
encrypt_key.pubkey by running the following command:openssl rsa -in /tmp/encrypt_key-psw.pem -passin pass:<password> -pubout -out /tmp/ibmse/rsa/encrypt_key.pub
$ openssl rsa -in /tmp/encrypt_key-psw.pem -passin pass:<password> -pubout -out /tmp/ibmse/rsa/encrypt_key.pubCopy to Clipboard Copied! Toggle word wrap Toggle overflow Create an
encrypt_key.pemkey by running the following command:openssl rsa -in /tmp/encrypt_key-psw.pem -passin pass:<password> -out /tmp/ibmse/rsa/encrypt_key.pem
$ openssl rsa -in /tmp/encrypt_key-psw.pem -passin pass:<password> -out /tmp/ibmse/rsa/encrypt_key.pemCopy to Clipboard Copied! Toggle word wrap Toggle overflow
Verify the structure of the
/tmp/ibmsedirectory by running the following command:tree /tmp/ibmse
$ tree /tmp/ibmseCopy to Clipboard Copied! Toggle word wrap Toggle overflow Example output
Copy to Clipboard Copied! Toggle word wrap Toggle overflow Copy these files to the OpenShift Container Platform worker nodes by performing the following steps:
Create a compressed file from the
/tmp/ibmsedirectory by running the following command:tar -czf ibmse.tar.gz -C /tmp/ ibmse
$ tar -czf ibmse.tar.gz -C /tmp/ ibmseCopy to Clipboard Copied! Toggle word wrap Toggle overflow Copy the
.tar.gzfile to the bastion node in your cluster by running the following command:scp /tmp/ibmse.tar.gz root@<ocp_bastion_ip>:/tmp
$ scp /tmp/ibmse.tar.gz root@<ocp_bastion_ip>:/tmp1 Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 1
- Specify the IP address of the bastion node.
Connect to the bastion node over SSH by running the following command:
ssh root@<ocp_bastion_ip>
$ ssh root@<ocp_bastion_ip>Copy to Clipboard Copied! Toggle word wrap Toggle overflow Copy the
.tar.gzfile to each worker node by running the following command:scp /tmp/ibmse.tar.gz core@<worker_node_ip>:/tmp
$ scp /tmp/ibmse.tar.gz core@<worker_node_ip>:/tmp1 Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 1
- Specify the IP address of the worker node.
Extract the
.tar.gzon each worker node by running the following command:ssh core@<worker_node_ip> 'sudo mkdir -p /opt/confidential-containers/ && sudo tar -xzf /tmp/ibmse.tar.gz -C /opt/confidential-containers/'
$ ssh core@<worker_node_ip> 'sudo mkdir -p /opt/confidential-containers/ && sudo tar -xzf /tmp/ibmse.tar.gz -C /opt/confidential-containers/'Copy to Clipboard Copied! Toggle word wrap Toggle overflow Update the
ibmsefolder permissions by running the following command:ssh core@<worker_node_ip> 'sudo chmod -R 755 /opt/confidential-containers/ibmse/'
$ ssh core@<worker_node_ip> 'sudo chmod -R 755 /opt/confidential-containers/ibmse/'Copy to Clipboard Copied! Toggle word wrap Toggle overflow
Create the secrets in the cluster with the KBS key and certificate by performing the following steps:
Create a
kbs-https-certificate.yamlmanifest file according to the following example:Copy to Clipboard Copied! Toggle word wrap Toggle overflow Create the secret with the KBS certificate by running the following command:
oc apply -f kbs-https-certificate.yaml
$ oc apply -f kbs-https-certificate.yamlCopy to Clipboard Copied! Toggle word wrap Toggle overflow Create a
kbs-https-key.yamlmanifest file according to the following example:Copy to Clipboard Copied! Toggle word wrap Toggle overflow Create the secret with the KBS key by running the following command:
oc apply -f kbs-https-key.yaml
$ oc apply -f kbs-https-key.yamlCopy to Clipboard Copied! Toggle word wrap Toggle overflow
8.15. Creating the persistent storage components Copiar enlaceEnlace copiado en el portapapeles!
You must create persistent storage components, persistent volume (PV) and persistent volume claim (PVC) to mount the ibmse folder to the Trustee pod.
Procedure
Create a
persistent-volume.yamlmanifest file:Copy to Clipboard Copied! Toggle word wrap Toggle overflow Create the persistent volume by running the following command:
oc apply -f persistent-volume.yaml
$ oc apply -f persistent-volume.yamlCopy to Clipboard Copied! Toggle word wrap Toggle overflow Create a
persistent-volume-claim.yamlmanifest file:Copy to Clipboard Copied! Toggle word wrap Toggle overflow Create the persistent volume claim by running the following command:
oc apply -f persistent-volume-claim.yaml
$ oc apply -f persistent-volume-claim.yamlCopy to Clipboard Copied! Toggle word wrap Toggle overflow
8.16. Configuring Trustee values, policies, and secrets Copiar enlaceEnlace copiado en el portapapeles!
You can configure the following values, policies, and secrets for Trustee:
- Reference values for the Reference Value Provider Service.
- Attestation policy for IBM Secure Execution.
- Secret for custom keys for Trustee clients.
- Secret for container image signature verification.
- Container image signature verification policy. This policy is mandatory. If you do not use container image signature verification, you must create a policy that does not verify signatures.
- Resource access policy.
8.16.1. Configuring reference values Copiar enlaceEnlace copiado en el portapapeles!
You can configure reference values for the Reference Value Provider Service (RVPS) by specifying the trusted digests of your hardware platform.
The client collects measurements from the running software, the Trusted Execution Environment (TEE) hardware and firmware and it submits a quote with the claims to the Attestation Server. These measurements must match the trusted digests registered to the Trustee. This process ensures that the confidential VM (CVM) is running the expected software stack and has not been tampered with.
Procedure
Create an
rvps-configmap.yamlmanifest file:Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 1
- Leave this value empty.
Create the RVPS config map by running the following command:
oc apply -f rvps-configmap.yaml
$ oc apply -f rvps-configmap.yamlCopy to Clipboard Copied! Toggle word wrap Toggle overflow
8.16.2. Creating the attestation policy for IBM Secure Execution Copiar enlaceEnlace copiado en el portapapeles!
You must create the attestation policy for IBM Secure Execution.
Procedure
Create an
attestation-policy.yamlmanifest file:Copy to Clipboard Copied! Toggle word wrap Toggle overflow - default.rego
- Do not modify the policy name.
- <se.attestation_phkh>
-
Replace this with the attestation policy fields you obtained by running the
se_parse_hdr.pyscript.
Create the attestation policy config map by running the following command:
oc apply -f attestation-policy.yaml
$ oc apply -f attestation-policy.yamlCopy to Clipboard Copied! Toggle word wrap Toggle overflow
8.16.3. Creating a secret with custom keys for clients Copiar enlaceEnlace copiado en el portapapeles!
You can create a secret that contains one or more custom keys for Trustee clients.
In this example, the kbsres1 secret has two entries (key1, key2), which the clients retrieve. You can add additional secrets according to your requirements by using the same format.
Prerequisites
- You have created one or more custom keys.
Procedure
Create a secret for the custom keys according to the following example:
oc apply secret generic kbsres1 \ --from-literal key1=<custom_key1> \ --from-literal key2=<custom_key2> \ -n trustee-operator-system
$ oc apply secret generic kbsres1 \ --from-literal key1=<custom_key1> \1 --from-literal key2=<custom_key2> \ -n trustee-operator-systemCopy to Clipboard Copied! Toggle word wrap Toggle overflow - 1
- Specify a custom key.
The
kbsres1secret is specified in thespec.kbsSecretResourceskey of theKbsConfigcustom resource.
8.16.4. Creating a secret for container image signature verification Copiar enlaceEnlace copiado en el portapapeles!
If you use container image signature verification, you must create a secret that contains the public container image signing key.
The Confidential compute attestation Operator uses the secret to verify the signature, ensuring that only trusted and authenticated container images are deployed in your environment.
You can use Red Hat Trusted Artifact Signer or other tools to sign container images.
Procedure
Create a secret for container image signature verification by running the following command:
oc apply secret generic <type> \ --from-file=<tag>=./<public_key_file> \ -n trustee-operator-system
$ oc apply secret generic <type> \1 --from-file=<tag>=./<public_key_file> \2 -n trustee-operator-systemCopy to Clipboard Copied! Toggle word wrap Toggle overflow -
Record the
<type>value. You must add this value to thespec.kbsSecretResourceskey when you create theKbsConfigcustom resource.
8.16.5. Creating the container image signature verification policy Copiar enlaceEnlace copiado en el portapapeles!
You create the container image signature verification policy because signature verification is always enabled. If this policy is missing, the pods will not start.
If you are not using container image signature verification, you create the policy without signature verification.
For more information, see containers-policy.json 5.
Procedure
Create a
security-policy-config.jsonfile according to the following examples:Without signature verification:
Copy to Clipboard Copied! Toggle word wrap Toggle overflow With signature verification:
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
Create the security policy by running the following command:
oc apply secret generic security-policy \ --from-file=osc=./<security-policy-config.json> \ -n trustee-operator-system
$ oc apply secret generic security-policy \ --from-file=osc=./<security-policy-config.json> \ -n trustee-operator-systemCopy to Clipboard Copied! Toggle word wrap Toggle overflow Do not alter the secret type,
security-policy, or the key,osc.The
security-policysecret is specified in thespec.kbsSecretResourceskey of theKbsConfigcustom resource.
8.16.6. Creating the resource access policy Copiar enlaceEnlace copiado en el portapapeles!
You configure the resource access policy for the Trustee policy engine. This policy determines which resources Trustee can access.
The Trustee policy engine is different from the Attestation Service policy engine, which determines the validity of TEE evidence.
Procedure
Create a
resourcepolicy-configmap.yamlmanifest file:Copy to Clipboard Copied! Toggle word wrap Toggle overflow - policy.rego
-
The name of the resource policy,
policy.rego, must match the resource policy defined in the Trustee config map. - package policy
- The resource policy follows the Open Policy Agent specification.
Create the resource policy config map by running the following command:
oc apply -f resourcepolicy-configmap.yaml
$ oc apply -f resourcepolicy-configmap.yamlCopy to Clipboard Copied! Toggle word wrap Toggle overflow
8.17. Creating the KbsConfig custom resource Copiar enlaceEnlace copiado en el portapapeles!
You create the KbsConfig custom resource (CR) to launch Trustee.
Then, you check the Trustee pods and pod logs to verify the configuration.
Procedure
Create a
kbsconfig-cr.yamlmanifest file:Copy to Clipboard Copied! Toggle word wrap Toggle overflow Create the
KbsConfigCR by running the following command:oc apply -f kbsconfig-cr.yaml
$ oc apply -f kbsconfig-cr.yamlCopy to Clipboard Copied! Toggle word wrap Toggle overflow
8.18. Verifying the Trustee configuration Copiar enlaceEnlace copiado en el portapapeles!
You verify the Trustee configuration by checking the Trustee pods and logs.
Procedure
Set the default project by running the following command:
oc project trustee-operator-system
$ oc project trustee-operator-systemCopy to Clipboard Copied! Toggle word wrap Toggle overflow Check the Trustee pods by running the following command:
oc get pods -n trustee-operator-system
$ oc get pods -n trustee-operator-systemCopy to Clipboard Copied! Toggle word wrap Toggle overflow Example output
NAME READY STATUS RESTARTS AGE trustee-deployment-8585f98449-9bbgl 1/1 Running 0 22m trustee-operator-controller-manager-5fbd44cd97-55dlh 2/2 Running 0 59m
NAME READY STATUS RESTARTS AGE trustee-deployment-8585f98449-9bbgl 1/1 Running 0 22m trustee-operator-controller-manager-5fbd44cd97-55dlh 2/2 Running 0 59mCopy to Clipboard Copied! Toggle word wrap Toggle overflow Set the
POD_NAMEenvironmental variable by running the following command:POD_NAME=$(oc get pods -l app=kbs -o jsonpath='{.items[0].metadata.name}' -n trustee-operator-system)$ POD_NAME=$(oc get pods -l app=kbs -o jsonpath='{.items[0].metadata.name}' -n trustee-operator-system)Copy to Clipboard Copied! Toggle word wrap Toggle overflow Check the pod logs by running the following command:
oc logs -n trustee-operator-system $POD_NAME
$ oc logs -n trustee-operator-system $POD_NAMECopy to Clipboard Copied! Toggle word wrap Toggle overflow Example output
Copy to Clipboard Copied! Toggle word wrap Toggle overflow Verify that the
kbs-serviceis exposed on a node port by running the following command:oc get svc kbs-service -n trustee-operator-system
$ oc get svc kbs-service -n trustee-operator-systemCopy to Clipboard Copied! Toggle word wrap Toggle overflow Example output
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE kbs-service NodePort 198.51.100.54 <none> 8080:31862/TCP 23h
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE kbs-service NodePort 198.51.100.54 <none> 8080:31862/TCP 23hCopy to Clipboard Copied! Toggle word wrap Toggle overflow Obtain the Trustee deployment pod name by running the following command:
oc get pods -n trustee-operator-system | grep -i trustee-deployment
$ oc get pods -n trustee-operator-system | grep -i trustee-deploymentCopy to Clipboard Copied! Toggle word wrap Toggle overflow Example output
NAME READY STATUS RESTARTS AGE trustee-deployment-d746679cd-plq82 1/1 Running 0 2m32s
NAME READY STATUS RESTARTS AGE trustee-deployment-d746679cd-plq82 1/1 Running 0 2m32sCopy to Clipboard Copied! Toggle word wrap Toggle overflow
8.19. Verifying the attestation process Copiar enlaceEnlace copiado en el portapapeles!
You can verify the attestation process by creating a BusyBox pod. The pod image deploys the confidential workload where you can retrieve the key.
This procedure is an example to verify that attestation is working. Do not write sensitive data to standard I/O because the data can be captured by using a memory dump. Only data written to memory is encrypted.
Procedure
Create a
busybox.yamlmanifest file:Copy to Clipboard Copied! Toggle word wrap Toggle overflow Create the pod by running the following command:
oc create -f busybox.yaml
$ oc create -f busybox.yamlCopy to Clipboard Copied! Toggle word wrap Toggle overflow Log in to the pod by running the following command:
oc exec -it busybox -n default -- /bin/sh
$ oc exec -it busybox -n default -- /bin/shCopy to Clipboard Copied! Toggle word wrap Toggle overflow Get the secret key by running the following command:
wget http://127.0.0.1:8006/cdh/resource/default/kbsres1/key1
$ wget http://127.0.0.1:8006/cdh/resource/default/kbsres1/key1Copy to Clipboard Copied! Toggle word wrap Toggle overflow Example output
Connecting to 127.0.0.1:8006 (127.0.0.1:8006) saving to 'key1' key1 100% |*******************************************| 8 0:00:00 ETA 'key1' saved
Connecting to 127.0.0.1:8006 (127.0.0.1:8006) saving to 'key1' key1 100% |*******************************************| 8 0:00:00 ETA 'key1' savedCopy to Clipboard Copied! Toggle word wrap Toggle overflow Display the
key1value by running the following command:cat key1
$ cat key1Copy to Clipboard Copied! Toggle word wrap Toggle overflow Example output
res1val1/ #
res1val1/ #Copy to Clipboard Copied! Toggle word wrap Toggle overflow