s390 Secure IPL

Secure IPL, also known as secure boot, enables s390-ccw virtual machines to verify the integrity of guest kernels.

For technical details of this feature, see the specs document.

This document explains how to use secure IPL with s390x in QEMU. It covers the command line options for providing certificates and enabling secure IPL, the different IPL modes (Normal, Audit, and Secure), and system requirements.

A quickstart guide is provided to demonstrate how to generate certificates, sign images, and start a guest in Secure Mode.

Secure IPL Command Line Options

The s390-ccw-virtio machine type supports secure IPL. These parameters allow users to provide certificates and enable secure IPL directly via the command line.

Providing Certificates

The certificate store can be populated by supplying a list of X.509 certificate file paths or directories containing certificate files on the command-line:

Note: certificate files must have a .pem extension.

qemu-system-s390x -machine s390-ccw-virtio,boot-certs.0.path=/.../qemu/certs,boot-certs.1.path=/another/path/cert.pem ...

Enabling Secure IPL

Secure IPL is enabled by explicitly setting secure-boot=on; if not specified, secure boot is considered off.

qemu-system-s390x -machine s390-ccw-virtio,secure-boot=on|off

IPL Modes

Multiple IPL modes are available to differentiate between the various IPL configurations. These modes are mutually exclusive and enabled based on specific combinations of the secure-boot and boot-certs options on the QEMU command line.

Normal Mode

The absence of both certificates and the secure-boot option will attempt to IPL a guest without secure IPL operations. No checks are performed, and no warnings/errors are reported. This is the default mode, and can be explicitly enabled with secure-boot=off.

Configuration:

qemu-system-s390x -machine s390-ccw-virtio ...

Audit Mode

When the certificate store is populated with at least one certificate and no additional secure IPL parameters are provided on the command line, then secure IPL will proceed in “audit mode”. All secure IPL operations will be performed with signature verification errors reported as non-disruptive warnings.

Configuration:

qemu-system-s390x -machine s390-ccw-virtio,boot-certs.0.path=/.../qemu/certs,boot-certs.1.path=/another/path/cert.pem ...

Secure Mode

When the secure-boot=on option is set and certificates are provided, a secure boot is performed with error reporting enabled. The boot process aborts if any error occurs.

Configuration:

qemu-system-s390x -machine s390-ccw-virtio,secure-boot=on,boot-certs.0.path=/.../qemu/certs,boot-certs.1.path=/another/path/cert.pem ...

Constraints

The following constraints apply when attempting to boot an s390x guest in secure mode:

  • z16 or “qemu” CPU model

  • certificates must be in X.509 PEM format

  • only support for SCSI scheme of virtio-blk/virtio-scsi devices

  • a boot device must be specified

  • any unsupported devices (e.g., ECKD and VFIO) or non-eligible devices (e.g., network) will cause the entire boot process to terminate early, with an error logged to the console.

Secure IPL Quickstart

Build QEMU with gnutls enabled

./configure  --enable-gnutls

Generate certificate (e.g. via certtool)

A private key is required before generating a certificate. This key must be kept secure and confidential.

Use an RSA private key for signing.

certtool --generate-privkey > key.pem

A self-signed certificate requires the organization name. Use the cert.info template to pre-fill values and avoid interactive prompts from certtool.

cat > cert.info <<EOF
cn = "My Name"
expiration_days = 365
cert_signing_key
EOF

certtool --generate-self-signed \
         --load-privkey key.pem \
         --template cert.info \
         --hash=SHA256 \
         --outfile cert.pem

Sign Images (e.g. via sign-file)

  • signing must be performed on a guest filesystem

  • sign-file script used in the example below is located within the kernel source repo

./sign-file sha256 key.pem cert.pem /boot/vmlinuz-…
./sign-file sha256 key.pem cert.pem /usr/lib/s390-tools/stage3.bin

Note: re-signing a component will not verify correctly; the existing signature must be stripped before a new one is applied.

Run zipl with secure boot enabled

  • zipl must be performed on a guest filesystem

zipl --secure 1 -V

Command line options for starting the guest

qemu-system-s390x -machine s390-ccw-virtio,secure-boot=on,boot-certs.0.path=cert.pem ...