qemu-devel.nongnu.org archive mirror
 help / color / mirror / Atom feed
From: Paolo Bonzini <pbonzini@redhat.com>
To: qemu-devel@nongnu.org
Cc: Dorjoy Chowdhury <dorjoychy111@gmail.com>,
	Alexander Graf <graf@amazon.com>
Subject: [PULL 26/49] docs/nitro-enclave: Documentation for nitro-enclave machine type
Date: Thu, 31 Oct 2024 18:51:50 +0100	[thread overview]
Message-ID: <20241031175214.214455-27-pbonzini@redhat.com> (raw)
In-Reply-To: <20241031175214.214455-1-pbonzini@redhat.com>

From: Dorjoy Chowdhury <dorjoychy111@gmail.com>

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>
---
 MAINTAINERS                        |  1 +
 docs/system/i386/nitro-enclave.rst | 78 ++++++++++++++++++++++++++++++
 docs/system/target-i386.rst        |  3 +-
 tests/qtest/libqtest.c             |  3 +-
 4 files changed, 83 insertions(+), 2 deletions(-)
 create mode 100644 docs/system/i386/nitro-enclave.rst

diff --git a/MAINTAINERS b/MAINTAINERS
index 5d3501ac289..4e5018a5e19 100644
--- a/MAINTAINERS
+++ b/MAINTAINERS
@@ -1842,6 +1842,7 @@ F: hw/core/eif.c
 F: hw/core/eif.h
 F: hw/i386/nitro_enclave.c
 F: include/hw/i386/nitro_enclave.h
+F: docs/system/i386/nitro-enclave.rst
 
 Machine core
 M: Eduardo Habkost <eduardo@habkost.net>
diff --git a/docs/system/i386/nitro-enclave.rst b/docs/system/i386/nitro-enclave.rst
new file mode 100644
index 00000000000..73e3edefe5b
--- /dev/null
+++ b/docs/system/i386/nitro-enclave.rst
@@ -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.
diff --git a/docs/system/target-i386.rst b/docs/system/target-i386.rst
index 23e84e3ba76..ab7af1a75d6 100644
--- a/docs/system/target-i386.rst
+++ b/docs/system/target-i386.rst
@@ -14,8 +14,9 @@ Board-specific documentation
 .. toctree::
    :maxdepth: 1
 
-   i386/microvm
    i386/pc
+   i386/microvm
+   i386/nitro-enclave
 
 Architectural features
 ~~~~~~~~~~~~~~~~~~~~~~
diff --git a/tests/qtest/libqtest.c b/tests/qtest/libqtest.c
index 9d07de1fbd4..817fd7aac52 100644
--- a/tests/qtest/libqtest.c
+++ b/tests/qtest/libqtest.c
@@ -1648,7 +1648,8 @@ void qtest_cb_for_every_machine(void (*cb)(const char *machine),
         /* Ignore machines that cannot be used for qtests */
         if (!strncmp("xenfv", machines[i].name, 5) ||
             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;
         }
         if (!skip_old_versioned ||
-- 
2.47.0



  parent reply	other threads:[~2024-10-31 17:58 UTC|newest]

Thread overview: 58+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2024-10-31 17:51 [PULL 00/49] i386, qom, build changes for 2024-10-31 Paolo Bonzini
2024-10-31 17:51 ` [PULL 01/49] stubs: avoid duplicate symbols in libqemuutil.a Paolo Bonzini
2024-10-31 17:51 ` [PULL 02/49] tests: add 'rust' and 'bindgen' to CI package list Paolo Bonzini
2024-10-31 17:51 ` [PULL 03/49] ci: enable rust in the Fedora system build job Paolo Bonzini
2024-10-31 17:51 ` [PULL 04/49] target/i386: fix CPUID check for LFENCE and SFENCE Paolo Bonzini
2024-11-04 18:17   ` Michael Tokarev
2024-11-04 18:31     ` Paolo Bonzini
2024-10-31 17:51 ` [PULL 05/49] scripts: remove erroneous file that breaks git clone on Windows Paolo Bonzini
2024-10-31 17:51 ` [PULL 06/49] configure: detect 64-bit MIPS Paolo Bonzini
2024-10-31 17:51 ` [PULL 07/49] configure, meson: deprecate 32-bit MIPS Paolo Bonzini
2024-10-31 17:51 ` [PULL 08/49] MAINTAINERS: Add myself as a reviewer of x86 general architecture support Paolo Bonzini
2024-10-31 17:51 ` [PULL 09/49] accel: remove dead statement and useless assertion Paolo Bonzini
2024-10-31 17:51 ` [PULL 10/49] i386/cpu: Drop the check of phys_bits in host_cpu_realizefn() Paolo Bonzini
2024-10-31 17:51 ` [PULL 11/49] qom: remove unused function Paolo Bonzini
2024-10-31 17:51 ` [PULL 12/49] qom: use object_new_with_class when possible Paolo Bonzini
2024-10-31 17:51 ` [PULL 13/49] qom: centralize module-loading functionality Paolo Bonzini
2024-10-31 17:51 ` [PULL 14/49] qom: let object_new use a module if the type is not present Paolo Bonzini
2024-10-31 17:51 ` [PULL 15/49] qom: allow user-creatable classes to be in modules Paolo Bonzini
2024-10-31 17:51 ` [PULL 16/49] target/i386: Fix minor typo in NO_NESTED_DATA_BP feature bit Paolo Bonzini
2024-10-31 17:51 ` [PULL 17/49] target/i386: Add PerfMonV2 " Paolo Bonzini
2024-10-31 17:51 ` [PULL 18/49] target/i386: Expose bits related to SRSO vulnerability Paolo Bonzini
2024-10-31 17:51 ` [PULL 19/49] target/i386: Expose new feature bits in CPUID 8000_0021_EAX/EBX Paolo Bonzini
2024-10-31 17:51 ` [PULL 20/49] target/i386/hvf: fix handling of XSAVE-related CPUID bits Paolo Bonzini
2024-10-31 17:51 ` [PULL 21/49] tests/lcitool: Update libvirt-ci and add libcbor dependency Paolo Bonzini
2024-10-31 17:51 ` [PULL 22/49] device/virtio-nsm: Support for Nitro Secure Module device Paolo Bonzini
2024-10-31 17:51 ` [PULL 23/49] hw/core: Add Enclave Image Format (EIF) related helpers Paolo Bonzini
2024-11-05 11:43   ` Peter Maydell
2024-11-05 12:51     ` Paolo Bonzini
2024-11-05 13:56       ` Dorjoy Chowdhury
2024-11-05 15:37         ` Alexander Graf
2024-11-05 16:22           ` Dorjoy Chowdhury
2024-10-31 17:51 ` [PULL 24/49] core/machine: Make create_default_memdev machine a virtual method Paolo Bonzini
2024-10-31 17:51 ` [PULL 25/49] machine/nitro-enclave: New machine type for AWS Nitro Enclaves Paolo Bonzini
2024-10-31 17:51 ` Paolo Bonzini [this message]
2024-10-31 17:51 ` [PULL 27/49] ci: always invoke meson through pyvenv Paolo Bonzini
2024-10-31 17:51 ` [PULL 28/49] target/i386: use tcg_gen_ext_tl when applicable Paolo Bonzini
2024-10-31 17:51 ` [PULL 29/49] target/i386: Tidy cc_op_str usage Paolo Bonzini
2024-10-31 17:51 ` [PULL 30/49] target/i386: remove CC_OP_CLR Paolo Bonzini
2024-10-31 17:51 ` [PULL 31/49] target/i386: Rearrange CCOp Paolo Bonzini
2024-10-31 17:51 ` [PULL 32/49] target/i386: Introduce cc_op_size Paolo Bonzini
2024-10-31 17:51 ` [PULL 33/49] target/i386: Wrap cc_op_live with a validity check Paolo Bonzini
2024-10-31 17:51 ` [PULL 34/49] target/i386: optimize computation of ZF from CC_OP_DYNAMIC Paolo Bonzini
2024-10-31 17:51 ` [PULL 35/49] target/i386: optimize TEST+Jxx sequences Paolo Bonzini
2024-10-31 17:52 ` [PULL 36/49] target/i386: add a few more trivial CCPrepare cases Paolo Bonzini
2024-10-31 17:52 ` [PULL 37/49] target/i386: add a note about gen_jcc1 Paolo Bonzini
2024-10-31 17:52 ` [PULL 38/49] target/i386: make flag variables unsigned Paolo Bonzini
2024-10-31 17:52 ` [PULL 39/49] target/i386: use compiler builtin to compute PF Paolo Bonzini
2024-10-31 17:52 ` [PULL 40/49] target/i386: use higher-precision arithmetic to compute CF Paolo Bonzini
2024-10-31 17:52 ` [PULL 41/49] target/i386: use + to put flags together Paolo Bonzini
2024-10-31 17:52 ` [PULL 42/49] target/i386: cpu: set correct supported XCR0 features for TCG Paolo Bonzini
2024-10-31 17:52 ` [PULL 43/49] target/i386: do not rely on ExtSaveArea for accelerator-supported XCR0 bits Paolo Bonzini
2024-10-31 17:52 ` [PULL 44/49] target/i386: return bool from x86_cpu_filter_features Paolo Bonzini
2024-10-31 17:52 ` [PULL 45/49] target/i386: add AVX10 feature and AVX10 version property Paolo Bonzini
2024-10-31 17:52 ` [PULL 46/49] target/i386: add CPUID.24 features for AVX10 Paolo Bonzini
2024-10-31 17:52 ` [PULL 47/49] target/i386: Add feature dependencies " Paolo Bonzini
2024-10-31 17:52 ` [PULL 48/49] target/i386: Add AVX512 state when AVX10 is supported Paolo Bonzini
2024-10-31 17:52 ` [PULL 49/49] target/i386: Introduce GraniteRapids-v2 model Paolo Bonzini
2024-11-04 10:47 ` [PULL 00/49] i386, qom, build changes for 2024-10-31 Peter Maydell

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20241031175214.214455-27-pbonzini@redhat.com \
    --to=pbonzini@redhat.com \
    --cc=dorjoychy111@gmail.com \
    --cc=graf@amazon.com \
    --cc=qemu-devel@nongnu.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).