ne_overview.rst 4.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495
  1. .. SPDX-License-Identifier: GPL-2.0
  2. ==============
  3. Nitro Enclaves
  4. ==============
  5. Overview
  6. ========
  7. Nitro Enclaves (NE) is a new Amazon Elastic Compute Cloud (EC2) capability
  8. that allows customers to carve out isolated compute environments within EC2
  9. instances [1].
  10. For example, an application that processes sensitive data and runs in a VM,
  11. can be separated from other applications running in the same VM. This
  12. application then runs in a separate VM than the primary VM, namely an enclave.
  13. An enclave runs alongside the VM that spawned it. This setup matches low latency
  14. applications needs. The resources that are allocated for the enclave, such as
  15. memory and CPUs, are carved out of the primary VM. Each enclave is mapped to a
  16. process running in the primary VM, that communicates with the NE driver via an
  17. ioctl interface.
  18. In this sense, there are two components:
  19. 1. An enclave abstraction process - a user space process running in the primary
  20. VM guest that uses the provided ioctl interface of the NE driver to spawn an
  21. enclave VM (that's 2 below).
  22. There is a NE emulated PCI device exposed to the primary VM. The driver for this
  23. new PCI device is included in the NE driver.
  24. The ioctl logic is mapped to PCI device commands e.g. the NE_START_ENCLAVE ioctl
  25. maps to an enclave start PCI command. The PCI device commands are then
  26. translated into actions taken on the hypervisor side; that's the Nitro
  27. hypervisor running on the host where the primary VM is running. The Nitro
  28. hypervisor is based on core KVM technology.
  29. 2. The enclave itself - a VM running on the same host as the primary VM that
  30. spawned it. Memory and CPUs are carved out of the primary VM and are dedicated
  31. for the enclave VM. An enclave does not have persistent storage attached.
  32. The memory regions carved out of the primary VM and given to an enclave need to
  33. be aligned 2 MiB / 1 GiB physically contiguous memory regions (or multiple of
  34. this size e.g. 8 MiB). The memory can be allocated e.g. by using hugetlbfs from
  35. user space [2][3]. The memory size for an enclave needs to be at least 64 MiB.
  36. The enclave memory and CPUs need to be from the same NUMA node.
  37. An enclave runs on dedicated cores. CPU 0 and its CPU siblings need to remain
  38. available for the primary VM. A CPU pool has to be set for NE purposes by an
  39. user with admin capability. See the cpu list section from the kernel
  40. documentation [4] for how a CPU pool format looks.
  41. An enclave communicates with the primary VM via a local communication channel,
  42. using virtio-vsock [5]. The primary VM has virtio-pci vsock emulated device,
  43. while the enclave VM has a virtio-mmio vsock emulated device. The vsock device
  44. uses eventfd for signaling. The enclave VM sees the usual interfaces - local
  45. APIC and IOAPIC - to get interrupts from virtio-vsock device. The virtio-mmio
  46. device is placed in memory below the typical 4 GiB.
  47. The application that runs in the enclave needs to be packaged in an enclave
  48. image together with the OS ( e.g. kernel, ramdisk, init ) that will run in the
  49. enclave VM. The enclave VM has its own kernel and follows the standard Linux
  50. boot protocol [6].
  51. The kernel bzImage, the kernel command line, the ramdisk(s) are part of the
  52. Enclave Image Format (EIF); plus an EIF header including metadata such as magic
  53. number, eif version, image size and CRC.
  54. Hash values are computed for the entire enclave image (EIF), the kernel and
  55. ramdisk(s). That's used, for example, to check that the enclave image that is
  56. loaded in the enclave VM is the one that was intended to be run.
  57. These crypto measurements are included in a signed attestation document
  58. generated by the Nitro Hypervisor and further used to prove the identity of the
  59. enclave; KMS is an example of service that NE is integrated with and that checks
  60. the attestation doc.
  61. The enclave image (EIF) is loaded in the enclave memory at offset 8 MiB. The
  62. init process in the enclave connects to the vsock CID of the primary VM and a
  63. predefined port - 9000 - to send a heartbeat value - 0xb7. This mechanism is
  64. used to check in the primary VM that the enclave has booted. The CID of the
  65. primary VM is 3.
  66. If the enclave VM crashes or gracefully exits, an interrupt event is received by
  67. the NE driver. This event is sent further to the user space enclave process
  68. running in the primary VM via a poll notification mechanism. Then the user space
  69. enclave process can exit.
  70. [1] https://aws.amazon.com/ec2/nitro/nitro-enclaves/
  71. [2] https://www.kernel.org/doc/html/latest/admin-guide/mm/hugetlbpage.html
  72. [3] https://lwn.net/Articles/807108/
  73. [4] https://www.kernel.org/doc/html/latest/admin-guide/kernel-parameters.html
  74. [5] https://man7.org/linux/man-pages/man7/vsock.7.html
  75. [6] https://www.kernel.org/doc/html/latest/x86/boot.html