mirror of
https://github.com/Motorhead1991/qemu.git
synced 2025-08-24 02:21:52 -06:00
docs/nitro-enclave: Documentation for nitro-enclave machine type
Signed-off-by: Dorjoy Chowdhury <dorjoychy111@gmail.com> Reviewed-by: Alexander Graf <graf@amazon.com> Link: https://lore.kernel.org/r/20241008211727.49088-7-dorjoychy111@gmail.com Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
This commit is contained in:
parent
f1826463d2
commit
05bad41ba9
4 changed files with 83 additions and 2 deletions
|
@ -1842,6 +1842,7 @@ F: hw/core/eif.c
|
||||||
F: hw/core/eif.h
|
F: hw/core/eif.h
|
||||||
F: hw/i386/nitro_enclave.c
|
F: hw/i386/nitro_enclave.c
|
||||||
F: include/hw/i386/nitro_enclave.h
|
F: include/hw/i386/nitro_enclave.h
|
||||||
|
F: docs/system/i386/nitro-enclave.rst
|
||||||
|
|
||||||
Machine core
|
Machine core
|
||||||
M: Eduardo Habkost <eduardo@habkost.net>
|
M: Eduardo Habkost <eduardo@habkost.net>
|
||||||
|
|
78
docs/system/i386/nitro-enclave.rst
Normal file
78
docs/system/i386/nitro-enclave.rst
Normal file
|
@ -0,0 +1,78 @@
|
||||||
|
'nitro-enclave' virtual machine (``nitro-enclave``)
|
||||||
|
===================================================
|
||||||
|
|
||||||
|
``nitro-enclave`` is a machine type which emulates an *AWS nitro enclave*
|
||||||
|
virtual machine. `AWS nitro enclaves`_ is an Amazon EC2 feature that allows
|
||||||
|
creating isolated execution environments, called enclaves, from Amazon EC2
|
||||||
|
instances which are used for processing highly sensitive data. Enclaves have
|
||||||
|
no persistent storage and no external networking. The enclave VMs are based
|
||||||
|
on Firecracker microvm with a vhost-vsock device for communication with the
|
||||||
|
parent EC2 instance that spawned it and a Nitro Secure Module (NSM) device
|
||||||
|
for cryptographic attestation. The parent instance VM always has CID 3 while
|
||||||
|
the enclave VM gets a dynamic CID. Enclaves use an EIF (`Enclave Image Format`_)
|
||||||
|
file which contains the necessary kernel, cmdline and ramdisk(s) to boot.
|
||||||
|
|
||||||
|
In QEMU, ``nitro-enclave`` is a machine type based on ``microvm`` similar to how
|
||||||
|
AWS nitro enclaves are based on `Firecracker`_ microvm. This is useful for
|
||||||
|
local testing of EIF files using QEMU instead of running real AWS Nitro Enclaves
|
||||||
|
which can be difficult for debugging due to its roots in security. The vsock
|
||||||
|
device emulation is done using vhost-user-vsock which means another process that
|
||||||
|
can do the userspace emulation, like `vhost-device-vsock`_ from rust-vmm crate,
|
||||||
|
must be run alongside nitro-enclave for the vsock communication to work.
|
||||||
|
|
||||||
|
``libcbor`` and ``gnutls`` are required dependencies for nitro-enclave machine
|
||||||
|
support to be added when building QEMU from source.
|
||||||
|
|
||||||
|
.. _AWS nitro enclaves: https://docs.aws.amazon.com/enclaves/latest/user/nitro-enclave.html
|
||||||
|
.. _Enclave Image Format: https://github.com/aws/aws-nitro-enclaves-image-format
|
||||||
|
.. _vhost-device-vsock: https://github.com/rust-vmm/vhost-device/tree/main/vhost-device-vsock
|
||||||
|
.. _Firecracker: https://firecracker-microvm.github.io
|
||||||
|
|
||||||
|
Using the nitro-enclave machine type
|
||||||
|
------------------------------------
|
||||||
|
|
||||||
|
Machine-specific options
|
||||||
|
~~~~~~~~~~~~~~~~~~~~~~~~
|
||||||
|
|
||||||
|
It supports the following machine-specific options:
|
||||||
|
|
||||||
|
- nitro-enclave.vsock=string (required) (Id of the chardev from '-chardev' option that vhost-user-vsock device will use)
|
||||||
|
- nitro-enclave.id=string (optional) (Set enclave identifier)
|
||||||
|
- nitro-enclave.parent-role=string (optional) (Set parent instance IAM role ARN)
|
||||||
|
- nitro-enclave.parent-id=string (optional) (Set parent instance identifier)
|
||||||
|
|
||||||
|
|
||||||
|
Running a nitro-enclave VM
|
||||||
|
~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||||
|
|
||||||
|
First, run `vhost-device-vsock`__ (or a similar tool that supports vhost-user-vsock).
|
||||||
|
The forward-cid option below with value 1 forwards all connections from the enclave
|
||||||
|
VM to the host machine and the forward-listen (port numbers separated by '+') is used
|
||||||
|
for forwarding connections from the host machine to the enclave VM.
|
||||||
|
|
||||||
|
__ https://github.com/rust-vmm/vhost-device/tree/main/vhost-device-vsock#using-the-vsock-backend
|
||||||
|
|
||||||
|
$ vhost-device-vsock \
|
||||||
|
--vm guest-cid=4,forward-cid=1,forward-listen=9001+9002,socket=/tmp/vhost4.socket
|
||||||
|
|
||||||
|
Now run the necessary applications on the host machine so that the nitro-enclave VM
|
||||||
|
applications' vsock communication works. For example, the nitro-enclave VM's init
|
||||||
|
process connects to CID 3 and sends a single byte hello heartbeat (0xB7) to let the
|
||||||
|
parent VM know that it booted expecting a heartbeat (0xB7) response. So you must run
|
||||||
|
a AF_VSOCK server on the host machine that listens on port 9000 and sends the heartbeat
|
||||||
|
after it receives the heartbeat for enclave VM to boot successfully. You should run all
|
||||||
|
the applications on the host machine that would typically be running in the parent EC2
|
||||||
|
VM for successful communication with the enclave VM.
|
||||||
|
|
||||||
|
Then run the nitro-enclave VM using the following command where ``hello.eif`` is
|
||||||
|
an EIF file you would use to spawn a real AWS nitro enclave virtual machine:
|
||||||
|
|
||||||
|
$ qemu-system-x86_64 -M nitro-enclave,vsock=c,id=hello-world \
|
||||||
|
-kernel hello-world.eif -nographic -m 4G --enable-kvm -cpu host \
|
||||||
|
-chardev socket,id=c,path=/tmp/vhost4.socket
|
||||||
|
|
||||||
|
In this example, the nitro-enclave VM has CID 4. If there are applications that
|
||||||
|
connect to the enclave VM, run them on the host machine after enclave VM starts.
|
||||||
|
You need to modify the applications to connect to CID 1 (instead of the enclave
|
||||||
|
VM's CID) and use the forward-listen (e.g., 9001+9002) option of vhost-device-vsock
|
||||||
|
to forward the ports they connect to.
|
|
@ -14,8 +14,9 @@ Board-specific documentation
|
||||||
.. toctree::
|
.. toctree::
|
||||||
:maxdepth: 1
|
:maxdepth: 1
|
||||||
|
|
||||||
i386/microvm
|
|
||||||
i386/pc
|
i386/pc
|
||||||
|
i386/microvm
|
||||||
|
i386/nitro-enclave
|
||||||
|
|
||||||
Architectural features
|
Architectural features
|
||||||
~~~~~~~~~~~~~~~~~~~~~~
|
~~~~~~~~~~~~~~~~~~~~~~
|
||||||
|
|
|
@ -1648,7 +1648,8 @@ void qtest_cb_for_every_machine(void (*cb)(const char *machine),
|
||||||
/* Ignore machines that cannot be used for qtests */
|
/* Ignore machines that cannot be used for qtests */
|
||||||
if (!strncmp("xenfv", machines[i].name, 5) ||
|
if (!strncmp("xenfv", machines[i].name, 5) ||
|
||||||
g_str_equal("xenpv", machines[i].name) ||
|
g_str_equal("xenpv", machines[i].name) ||
|
||||||
g_str_equal("xenpvh", machines[i].name)) {
|
g_str_equal("xenpvh", machines[i].name) ||
|
||||||
|
g_str_equal("nitro-enclave", machines[i].name)) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
if (!skip_old_versioned ||
|
if (!skip_old_versioned ||
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue