Files
Yaya48 cf256aa081 Import QEMU upstream snapshot d2e570c
Upstream: https://gitlab.com/qemu-project/qemu.git

Upstream-Commit: d2e570cc0f97b936902a5b1b86b73c0f5998b475
2026-08-31 02:15:30 +02:00

185 lines
5.2 KiB
ReStructuredText

.. SPDX-License-Identifier: GPL-2.0-or-later
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
:doc:`specs document </specs/s390x-secure-ipl>`.
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.
.. code-block:: shell
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.
.. code-block:: shell
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:
.. code-block:: shell
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:
.. code-block:: shell
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:
.. code-block:: shell
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
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.. code-block:: shell
./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.
.. code-block:: shell
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.
.. code-block:: shell
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
.. code-block:: shell
./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
.. code-block:: shell
zipl --secure 1 -V
Command line options for starting the guest
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.. code-block:: shell
qemu-system-s390x -machine s390-ccw-virtio,secure-boot=on,boot-certs.0.path=cert.pem ...