diff --git a/Cargo.toml b/Cargo.toml index 7ec7bd99d..c432d12ff 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -19,6 +19,7 @@ members = [ "confidential-data-hub/storage", "image-rs", "ocicrypt-rs", + "tdm" ] [workspace.dependencies] diff --git a/README.md b/README.md index 0d2c87ecf..035440010 100644 --- a/README.md +++ b/README.md @@ -1,9 +1,9 @@ -# Confidential Container Tools and Components +# Confidential Container Tools and Components [![FOSSA Status](https://app.fossa.com/api/projects/git%2Bgithub.com%2Fconfidential-containers%2Fimage-rs.svg?type=shield)](https://app.fossa.com/projects/git%2Bgithub.com%2Fconfidential-containers%2Fimage-rs?ref=badge_shield) This repository includes tools and components for confidential container images. -## +## [Attestation Agent](attestation-agent) An agent for facilitating attestation protocols. @@ -18,5 +18,8 @@ Rust implementation of the OCI image encryption library. [api-server-rest](api-server-rest) CoCo Restful API server. +[Trusted Device Manager](tdm) +A TEE-IO (a.k.a. trusted-IO) devices manager for confidential guests. + ## License [![FOSSA Status](https://app.fossa.com/api/projects/git%2Bgithub.com%2Fconfidential-containers%2Fimage-rs.svg?type=large)](https://app.fossa.com/projects/git%2Bgithub.com%2Fconfidential-containers%2Fimage-rs?ref=badge_large) diff --git a/tdm/Cargo.toml b/tdm/Cargo.toml new file mode 100644 index 000000000..6c8d65e4d --- /dev/null +++ b/tdm/Cargo.toml @@ -0,0 +1,11 @@ +[package] +name = "tdm" +version = "0.1.0" +description = "A TEE-IO device manager for confidential guests" +repository = "https://github.com/confidential-containers/guest-components/tree/main/tdm" +readme = "README.md" +license = "Apache-2.0" +authors = ["The Trusted Device Manager Authors"] +edition = "2021" + +[dependencies] diff --git a/tdm/README.md b/tdm/README.md new file mode 100644 index 000000000..f81626892 --- /dev/null +++ b/tdm/README.md @@ -0,0 +1,4 @@ +# Trusted Device Manager + +The Trusted Device Manager (TDM) is a confidential guest component for handling +trusted IO operations. diff --git a/tdm/docs/architecture.md b/tdm/docs/architecture.md new file mode 100644 index 000000000..f6c74dc42 --- /dev/null +++ b/tdm/docs/architecture.md @@ -0,0 +1,289 @@ +# Trusted Device Manager Architecture + +This is an architecture document for the Trusted Device Manager (TDM), a +confidential guest, userspace component for implementing trusted I/O. + +## Goals + +In order to achieve high performance Input/Output (I/O) operations, confidential +VMs must extend their trust boundary to include a composition of directly +assigned, TEE-IO-capable devices/functions. Without this ability, confidential +VMs have to resort to using para-virtualized I/O using non-confidential memory +regions, which has performance impacts due to memory copies and negates the use +of directly assigned devices. + +Silicon vendors and device manufacturers provide TEE-IO compliant hardware +implementations. Intel TDX Connect, AMD SEV-TIO and RISC-V CoVE-IO for example, +rely on device manufacturers to support the TDISP, SPDM and PCIe IDE protocols +to give confidential guests access to trusted MMIO and secure DMA between them +and devices which trustworthiness is verifiable. + +The TEE-IO security model is built on top of this hardware support but also on +the ability for confidential guests to ultimately decide if they accept or +reject TEE-IO compliant devices into their TCB. The TDM, as a confidential guest +user space component, supports the Linux guest kernel with making that decision +and then communicating it to the Trusted Security Manager (TSM). + +Upon request from the guest kernel, the TDM will attest to the assigned device +trustworthiness through a remote or local attestation process. It then +communicates the attestation results back to the guest kernel, which can then +accept or reject the device respectively into or from its TCB. The kernel then +notifies the TSM about its decision, which implictly transitions the assigned +device into the next TDISP operational state. + +## Scope + +## Architectural Overview + +High-level view: + + +
``` + ┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓ + ┃ Confidential Guest ┃ + ┃ ╔═════════════════════════════╗ ┃ + ┃ ║ Trusted Device Manager ║ ┃ + ┃ ║ ║ ┃ + ┃ ║ ┌─────────────────────┐ ║ ┃ + ┃ ║ │ Attestation Module │ ║ ┃ + ┃ ║ └─────────────────────┘ ║ ┃ + ┃ ║ ║ ┃ + ┃ ║ ║ ┃ + ┃ ║╔═══════════╗ ╔════════╗ ║ ┃ + ┃ ╚╣ CoCo ╠═════╣ Device ╠═╝ ┃ + ┃ ┌─▷║ Module ║──┐ ║ Plugin ║ ┃ + ┃ │ ╚═══════════╝ │ ╚════════╝ ┃ + ┃ │ │ △ ┃ + ┃Attestation Attestation │ ┃ + ┃ Request Results │ ┃ + ┃ │ │ │ ┃ + ┃ └────┐ ┌────┘ │ ┃ + ┃ │ │ │ ┃ + ┃ │ │ ▽ ┃ + ┃ ┌─┴───────▽┐ ┌──────────┐ ┃ + ┃ ┌──┤ CoCo ABI ├─────┤Device ABI├──┐ ┃ + ┃ │ └──────────┘ └──────────┘ │ ┃ + ┃ │ Linux Guest Kernel │ ┃ + ┃ └─────────────────────────────────┘ ┃ + ┗━━━━━━━━━━━━━━━━━━━━━━△━━━━━━━━━━━━━━━━━━━━━━┛ + │ + │ + TEE Guest ABI + │ + │ + ▽ +┏━━━━━━━━━━━━━━━━━━━━━━━┓ ┏━━━━━━━━━━━━━━━━━━━━━━━┓ +┃ Host VMM/Hypervisor ┃ ┃ Trusted Security ┃ +┃ (KVM+QEMU/CLH) ┃◁────TEE Host ABI──▷┃ Manager ┃ +┃ ┃ ┃(TDX Module, ASP, etc) ┃ +┗━━━━━━━━━━━━━━━━━━━━━━━┛ ┗━━━━━━━━━━━━━━━━━━━━━━━┛ + △ + ┃ + PCIe Bus + ┃ + ┃ + ▽ +┏━━━━━━━━━━━━━━━━━━━━━━━┓ +┃ TEE-IO Compliant PCIe ┃ +┃ Device ┃ +┗━━━━━━━━━━━━━━━━━━━━━━━┛ + +``` + +Essentially, the TDM is a userspace helper for the guest kernel to attest to +detected PCIe devices. It is part of a hybrid architecture where the guest +kernel and the TDM together verify that an assigned TEE-IO device is trustworthy +or not. + +After scanning the host VMM emulated PCIe topology, the guest kernel detects +assigned TEE-IO devices. For each detected device, it must verify and challenge +its authenticity with the TSM support. The last step of the TDISP recommended +device verification flow is about attesting to the device trustworthiness. The +guest kernel relies on a registered TDM to run this attestation step. The TDM +eventually provides the guest kernel with an attestation result, and the guest +kernel can use this result to decide if it accepts or rejects the assigned +device repectively into or from its TCB. + +In order for the TDM to achieve the above described goals, it must be able to: + +As described above, an VMM-assigned PCIe device verification process is split +between the guest kernel and the TDM. They will go through the following steps: + +1. The TDM registers itself against the guest kernel through the Linux kernel + generic confidential computing (CoCo) userspace ABI. The TDM waits for the + guest kernel notifications and requests. +2. The **guest kernel** detects VMM-assigned PCIe devices. Those devices are + part of the guest PCIe topology, which is emulated by the host VMM. In other + words, a confidential guest must not trust a device detected in this PCIe + topology. Those devices must be verified before being probed and accepted + into the guest's TCB. +4. The **guest kernel** verifies the detected device state, as tracked by the + TSM. In particular, it must verify that the device's TDISP state, and its + SPDM and TDISP configuration. +5. The **guest kernel** verifies the detected device authenticity. This relies + on the TSM providing a certificate chain for the device through a + vendor-specific ABI. The guest kernel verify the certificate chain validity + and authenticates it against a provisioned trust anchor. +6. The **guest kernel** retrieves the detected device attestation evidence, + typically from the device certificate chain or through another + vendor-specific ABI for requesting the TSM to provide such evidence. +7. The **guest kernel** requests the previously registered TDM to attest the + assigned device. The device attestation evidence is added to the attestation + request message sent by the guest kernel to the TDM. +8. The **TDM** runs the assigned device attestation and provide attestation + results back to the guest kernel. +9. The **guest kernel** parses the provided attestation results and decides to + accept or reject the assigned device. +10. The **guest kernel** notifies the TSM about its decision. When the guest + kernel accepts the device, the TSM will would enable all memory mapped and + DMA IO between the TVM and the assigned device. +11. When accepting the assigned device, the **guest kernel** probes it and binds + it to a kernel driver. + +The TDM software architecture is composed of 2 modules: + +1. The **TDI Management** module serves attestation requests coming in from the + guest kernel. This module registers against the Linux kernel CoCo ABI and + waits for attestation requests. Each such requests is responded to + synchronously, i.e. the TDI Management module waits for the Device Attesation + module to verify the provided attestation evidence before replying to the + request. The attestation request reply contains the attestation results + provided by the Device Attestation module. +2. The **Device Attestation** module is responsible for verifying a device + attestation evidence, which can be achieved through local or remote + attestation. It provides attestation results back to the TDI management + module. + +``` + ┌────────────────────────┐ + │ Trusted Device Manager │ + ┌──────────────────────────┴────────────────────────┴───────────────────────────┐ + │ ┌ ─ ─ ─ ─ ─ ─ ─ ─ ┐ │ + │ ┌───────────┐ ┌─────────────┐ ┌───────────┐ │ + │ │ Local │ │ │ Attester │ │ │Attestation│ │ + │ │Attestation│─────▷│ Crate │──────▷│ Service │◁─┐ │ + │ └───────────┘ │ └─────────────┘ │ │ Crate │ │ │ + │ ┌────────────┐ △ └───────────┘ │ │ + │ │ Device │ │ │ │ ┌─────────┐ │ │ + │ │Attestation │◁──Attestation │Policies │───┘ │ + │ │ Module │ Token │ │ │ ┌──┴─────────┴───┐ │ + │ └────────────┘ ▽ │Reference Values│ │ + │ △ ┌───────────┐ │ ┌─────────────┐ │ └────────────────┘ │ ┌─────────────┐ + │ │ │ Remote │ │ Attestation │ │ │ │ + │ │ │Attestation│────┼▷│ Agent ├─┼──────────────────────┼─────▷│Relying Party│ + │ │ └───────────┘ │ Crate │ │ │ │ + │ └──────────┐ │ └─────────────┘ │ │ └─────────────┘ + │ │ │ + │ │ │ Attestation │ │ + │ │ Agent │ + │ │ └ ─ ─ ─ ─ ─ ─ ─ ─ ┘ │ + │ ▽ │ + │┌────────────────────────────────────┐ │ + ││ TDI Management Module │ │ + │├───────────┬┬───────────────────────┤ │ + ││ ││ Device Vendor Plugins │ │ + ││ CoCo ││┌──────┐ ┌──────┐ ┌───┐│ │ + ││ Module │││NVIDIA│ │ BCOM │ │...││ │ + ││ ││└──────┘ └──────┘ └───┘│ │ + │└─▲───────┳─┘└───────────┳───────────┘ │ + └──╋───────╋──────────────╋─────────────────────────────────────────────────────┘ + ┃ ┃ ┃ +Attestation ┃ ┃ + Request ┃ Device ABI + ┃ ┃ ┃ + ┃ Attestation ┃ + ┃ Results ┃ + ┃ ┃ ┃ + ┌─┻───────▼──────────────▼────────────┐ + │ Linux Guest Kernel │───────┐ + └─────┬─────────────────────────┬─────┘ │ + │ │ │ + Accept/Reject Authenticate │ + │ │ │ + └───────────┬─────────────┘ │ + │ Detects + │ and + │ Enables + ▽ │ + ┏━━━━━━━━━━━━━━━━━━━━━━━━━━━┓ │ ┏━━━━━━━━━━━━━━━━━━━━━━━┓ + ┃ Trusted Security Manager ┃ │ ┃TEE-IO Device Interface┃ + ┃ (TDX Module, ASP, etc) ┃ └───────▶┃ (TDI) ┃ + ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━┛ ┗━━━━━━━━━━━━━━━━━━━━━━━┛ + │ ▲ + │ + └ ─ ─ ─ ─ ─ ─ ─ ─ ─Via VMM─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ + +``` + +### TDI Management + +The TDI Management module is the interface between the TDM and the guest kernel, +and it's main responsibility is to serve incoming attestation requests with +attestation results. + +This modules relies on the guest kernel to provide the following capabilities +through the Linux CoCo ABI: + +- Accept TDM registration. The TDM must be able to register itself against the + guest kernel as a device attestation service provider. +- Send device attestation requests to the registered TDM, when the kernel + requires device to be attested before accepting it, i.e. before probing it. +- Receive device attestation results from the registered TDM in order to decide + if a device can be accepted into the guest TCB or not. + +#### Attestation Request + +#### Attestation Results + +TODO (sameo) Define attestation results payload content format: Use +[IETF EAT Attestation Results][EAR] (Serialized [AR4SI][AR4SI]). + +#### Vendor Plugins + +### Device Attestation + +#### Local Attestation + +#### Remote Attestation + +## Theory of Operations + +TODO (sameo): Elaborate + +### TDI Detection + +1. Guest kernel detects the TDI +2. Guest kernel verifies the TDI state +3. Guest kernel verifies the TDI authenticity +4. Guest kernel requests TDM to attest to the TDI + +### TDI Attestation + +1. TDM runs TDI attestation +2. TDM replies with TDI attestation results + +### TDI Acceptance + +1. Guest kernel parses the TDI attestation results. +2. Guest kernel notifies the TSM that it accepts the TDI +3. Guest kernel probes the TDI and binds it to a driver. + +## Glossary + +| Term | Acronym | Definition | +|:-----|:-------:|------------| +| Confidential Computing | CoCo | The protection of data in use by performing computation in a Hardware-based TEE. +| Confidential VM | CVM | A confidential computing virtual machine. Same as a TVM. +| Device Security Manager | DSM | A DSM is a logical entity on a TEE-IO device that enforces the TDISP security policies, attributes and states. +| Integrity and Data Encryption | IDE | Extended PCIe capability for integrity, confidentiality and replay protection of PCIe Transport Layer Packets (TLP). +| Security Protocol and Data Model | SPDM | A DMTF defined specification for exchanging messages between devices over a variety of transports and physical media. SPDM is used to exchange TDISP and IDE Key Management messages over PCIe DOE mailboxes. +| TEE Device Interface Security Protocol | TDISP | An architecture for trusted I/O virtualization. +| TEE Input and Output | TEE-IO | A PCIe-defined conceptual framework for establishing and managing trust relationships between a PCIe device and a TEE. +| TEE I/O Device Interface | TDI | The unit of assignment for a trusted I/O capable device. For example, a TDI can be a Virtual Function (VF) or a Physical Function (PF). +| TEE VM | TVM | A VM instantiation of an confidential workload. +| Trusted Device Manager | TDM | A confidential guest TEE-IO device manager, responsible for verifying, attesting and accepting CoVE-IO devices into a TVM TCB. This is a TVM guest software stack component. + +## References + +[EAR]: https://datatracker.ietf.org/doc/html/draft-fv-rats-ear-02 +[AR4SI]: https://datatracker.ietf.org/doc/html/draft-ietf-rats-ar4si-05 diff --git a/tdm/src/main.rs b/tdm/src/main.rs new file mode 100644 index 000000000..e7a11a969 --- /dev/null +++ b/tdm/src/main.rs @@ -0,0 +1,3 @@ +fn main() { + println!("Hello, world!"); +}