Dieser Inhalt ist in der von Ihnen ausgewählten Sprache nicht verfügbar.
Chapter 7. 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.
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.
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.
- Update the peer pods config map.
- 
					Delete the KataConfigcustom resource (CR).
- Update the peer pods secret.
- 
					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.
- Configure Trustee values, policies, and secrets.
- 
					Create the KbsConfigCR.
- Verify the Trustee configuration.
- Verify the attestation process.
7.1. Installing the Confidential compute attestation Operator
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-system- Copy 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.yaml- Copy 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.yaml- Copy 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.yaml- Copy 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-system- Copy 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-system- Copy to Clipboard Copied! - Toggle word wrap Toggle overflow - Example output - NAME DISPLAY PHASE trustee-operator.v0.1.0 Trustee Operator 0.1.0 Succeeded - NAME DISPLAY PHASE trustee-operator.v0.1.0 Trustee Operator 0.1.0 Succeeded- Copy to Clipboard Copied! - Toggle word wrap Toggle overflow 
7.2. Enabling the Confidential Containers feature gate
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.yaml- Copy to Clipboard Copied! - Toggle word wrap Toggle overflow 
7.3. Creating the route for Trustee
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-system- Copy to Clipboard Copied! - Toggle word wrap Toggle overflow Note- Note: 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_HOST- Copy 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.io- Copy to Clipboard Copied! - Toggle word wrap Toggle overflow 
7.4. Updating the peer pods config map
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 host name of the Trustee route.
 
- Create the config map by running the following command: - oc apply -f peer-pods-cm.yaml - $ oc apply -f peer-pods-cm.yaml- Copy to Clipboard Copied! - Toggle word wrap Toggle overflow 
- Restart the - peerpodconfig-ctrl-caa-daemondaemon set by running the following command:- oc set env ds/peerpodconfig-ctrl-caa-daemon \ -n openshift-sandboxed-containers-operator REBOOT="$(date)" - $ oc set env ds/peerpodconfig-ctrl-caa-daemon \ -n openshift-sandboxed-containers-operator REBOOT="$(date)"- Copy to Clipboard Copied! - Toggle word wrap Toggle overflow 
7.5. Deleting the KataConfig custom resource
				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-kataconfig- Copy 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-kataconfig- Copy to Clipboard Copied! - Toggle word wrap Toggle overflow - Example output - No example-kataconfig instances exist - No example-kataconfig instances exist- Copy 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.
7.6. Updating the peer pods secret
When the peer pods secret is empty and the Cloud Credential Operator (CCO) is installed, the OpenShift sandboxed containers Operator uses the CCO to retrieve the secret. If you have uninstalled the CCO, you must create the peer pods secret for Confidential Containers manually or the peer pods will fail to operate.
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.
- 
						HKD_CRT. 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.yaml- Copy to Clipboard Copied! - Toggle word wrap Toggle overflow 
7.7. Re-creating the KataConfig custom resource
				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 installkata-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.yaml- Copy to Clipboard Copied! - Toggle word wrap Toggle overflow - The new - KataConfigCR is created and installs- kata-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 - kataNodesis- installedand the condition- InProgressis- Falsewithout specifying a reason, the- kata-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-operator- Copy 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 the- UPDATEDstate, when- UPDATEDMACHINECOUNTequals- MACHINECOUNT, by running the following command:- watch oc get mcp/kata-oc - $ watch oc get mcp/kata-oc- Copy 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/peerpodconfig-ctrl-caa-daemon - $ oc get -n openshift-sandboxed-containers-operator ds/peerpodconfig-ctrl-caa-daemon- Copy to Clipboard Copied! - Toggle word wrap Toggle overflow 
- Verify the runtime classes by running the following command: - oc get runtimeclass - $ oc get runtimeclass- Copy 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 152m- Copy to Clipboard Copied! - Toggle word wrap Toggle overflow 
7.8. Creating the Trustee authentication secret
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 > privateKey- Copy 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 publicKey- Copy 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-system- Copy 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-system- Copy to Clipboard Copied! - Toggle word wrap Toggle overflow 
7.9. Creating the Trustee config map
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.yaml- Copy to Clipboard Copied! - Toggle word wrap Toggle overflow 
7.10. Configuring the IBM Secure Execution certificates and keys
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
- 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.sh- Copy 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-files- Copy 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-files- Copy 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-hdr- Copy to Clipboard Copied! - Toggle word wrap Toggle overflow 
- Make the tool executable by running the following command: - chmod +x pvextract-hdr - $ chmod +x pvextract-hdr- Copy 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.py- Copy 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.sh- Copy to Clipboard Copied! - Toggle word wrap Toggle overflow 
- Run the script: - ./GetRvps.sh - $ ./GetRvps.sh- Copy 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: 2- Copy 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-pp- Copy 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 theLIBVIRT_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-vol- Copy 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/certs- Copy 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.crt- Copy 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.crt- Copy 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/crls- Copy 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.crl- Copy 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.crl- Copy 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.crl- Copy 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 the- hdrdirectory 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/hkds- Copy 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 4096- 1 - 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/rsa- Copy 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.pub- Copy 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.pem- Copy 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/ibmse- Copy 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/ ibmse- Copy 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>:/tmp- 1 - 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>:/tmp- 1 - 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 
 
7.11. Creating the persistent storage components
				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.yaml- Copy 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.yaml- Copy to Clipboard Copied! - Toggle word wrap Toggle overflow 
7.12. Configuring Trustee values, policies, and secrets
You can configure the following values, policies, and secrets for Trustee:
- Optional: Reference values for the Reference Value Provider Service.
- Attestation policy for IBM Secure Execution.
- Optional: Secret for custom keys for Trustee clients.
- Optional: 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.
7.12.1. Configuring reference values
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.yaml- Copy to Clipboard Copied! - Toggle word wrap Toggle overflow 
7.12.2. Creating the attestation policy for IBM Secure Execution
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 
- Create the attestation policy config map by running the following command: - oc apply -f attestation-policy.yaml - $ oc apply -f attestation-policy.yaml- Copy to Clipboard Copied! - Toggle word wrap Toggle overflow 
7.12.3. Creating a secret with custom keys for clients
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-system- Copy to Clipboard Copied! - Toggle word wrap Toggle overflow - 1
- Specify a custom key.
 - The - kbsres1secret is specified in the- spec.kbsSecretResourceskey of the- KbsConfigcustom resource.
7.12.4. Creating a secret for container image signature verification
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-system- Copy 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.
7.12.5. Creating the container image signature verification policy
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 - 1
- Specify the image repository fortransport, for example,"docker":. For more information, see containers-transports 5.
- 2
- Specify the container registry and image, for example, "quay.io/my-image".
- 3
- Specify the type and tag of the container image signature verification secret that you created, for example,img-sig/pub-key.
 
 
- 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-system- Copy 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 the- spec.kbsSecretResourceskey of the- KbsConfigcustom resource.
7.12.6. Creating the resource access policy
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 - 1
- The name of the resource policy,policy.rego, must match the resource policy defined in the Trustee config map.
- 2
- The resource policy follows the Open Policy Agent specification. This example allows the retrieval of all resources when the TEE is not the sample attester.
 
- Create the resource policy config map by running the following command: - oc apply -f resourcepolicy-configmap.yaml - $ oc apply -f resourcepolicy-configmap.yaml- Copy to Clipboard Copied! - Toggle word wrap Toggle overflow 
7.13. Creating the KbsConfig custom resource
				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 - 1
- Optional: Specify thetypevalue of the container image signature verification secret if you created the secret, for example,img-sig. If you did not create the secret, set thekbsSecretResourcesvalue to["kbsres1", "security-policy"].
 
- Create the - KbsConfigCR by running the following command:- oc apply -f kbsconfig-cr.yaml - $ oc apply -f kbsconfig-cr.yaml- Copy to Clipboard Copied! - Toggle word wrap Toggle overflow 
7.14. Verifying the Trustee configuration
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-system- Copy 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-system- Copy 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 59m- Copy 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_NAME- Copy 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-system- Copy 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 23h- Copy 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-deployment- Copy 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 2m32s- Copy to Clipboard Copied! - Toggle word wrap Toggle overflow 
- Obtain the worker node IP address by running the following command: - oc get pod trustee-deployment-d746679cd-plq82 -o custom-columns="NODE-IP:.status.hostIP" - $ oc get pod trustee-deployment-d746679cd-plq82 -o custom-columns="NODE-IP:.status.hostIP"- Copy to Clipboard Copied! - Toggle word wrap Toggle overflow - Example output - NODE-IP 192.168.122.36 - NODE-IP 192.168.122.36- Copy to Clipboard Copied! - Toggle word wrap Toggle overflow - The URL to access the Trustee is - http://<worker_node_ip>:<node_port>, for example,- http://192.168.122.36:31862.
- Verify that the - AA_KBC_PARAMSvalue in the- peer-pods-cmconfig map is the same as the Trustee URL by running the following command:- oc get cm peer-pods-cm -n openshift-sandboxed-containers-operator -o yaml | grep AA_KBC_PARAMS - $ oc get cm peer-pods-cm -n openshift-sandboxed-containers-operator -o yaml | grep AA_KBC_PARAMS- Copy to Clipboard Copied! - Toggle word wrap Toggle overflow - Example output - AA_KBC_PARAMS: cc_kbc::http://192.168.122.36:31862 - AA_KBC_PARAMS: cc_kbc::http://192.168.122.36:31862- Copy to Clipboard Copied! - Toggle word wrap Toggle overflow 
7.15. Verifying the attestation process
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.yaml- Copy 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/sh- Copy 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/key1- Copy 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' saved- Copy to Clipboard Copied! - Toggle word wrap Toggle overflow 
- Display the - key1value by running the following command:- cat key1 - $ cat key1- Copy to Clipboard Copied! - Toggle word wrap Toggle overflow - Example output - res1val1/ # - res1val1/ #- Copy to Clipboard Copied! - Toggle word wrap Toggle overflow