initial tpm broker

This commit is contained in:
Audiobuzz
2026-06-28 10:33:14 +00:00
parent 3bcf16e384
commit 9e1dbd3ef7
17 changed files with 1584 additions and 19 deletions
+20 -3
View File
@@ -982,9 +982,26 @@ UKI + isolated VLAN + read-back verify.**
[tpm-enrolment-design.md](tpm-enrolment-design.md)** — unifies this item with the
fleet-manager (the broker = the fleet-manager's one unauthenticated bootstrap
endpoint; approval births the inventory record) and the full identity lifecycle
(enrol / renew / alert). **v1 decision: fingerprint-only OOB assurance**; TPM
attestation (ACME `device-attest-01`) is the documented later upgrade. The notes
below are retained as the originating decisions; the design note is canonical.
(enrol / renew / alert). **v1 decisions (2026-06-28):** fingerprint-only OOB
assurance (TPM attestation via ACME `device-attest-01` is the documented later
upgrade); **inline single-UKI** vehicle for now (empty-NV early-boot branch — keeps
provisioning network-boot-only, no USB; a separate provisioning UKI behind an
`enrol_mode` build flag is the planned later upgrade); enrolment transport is plain
**stdlib HTTP/JSON** (Go, the one unauthenticated edge — gRPC reserved for the
steady-state agent path). The notes below are retained as the originating decisions;
the design note is canonical.
**Broker BUILT (server side, 2026-06-28): [serving/enrol-broker/](../serving/enrol-broker/)**
— Go/stdlib; public unauth `POST /request`+`GET /status/{id}` (behind the serving
nginx `/enrol/`) + admin **mTLS web UI** (`/`, `/pending`, `/approve|deny/{id}`)
with a **dedicated admin CA** (`admin-pki.sh`); wordlist fingerprint, time-boxed
store, per-IP rate limit; signs via `step` (dev `mock` signer). Ships in
`serving/dot1x-bench/docker-compose.yml`; end-to-end smoke-tested (CSR → mTLS
approve → cert). **BENCH-VERIFY:** run against real step-ca (`bootstrap.sh` root +
`enrol` provisioner password readable by the broker) and confirm an issued cert
authenticates EAP-TLS. **REMAINING:** the host-side inline empty-NV dracut branch
(generate key/CSR → POST → Plymouth fingerprint → poll → NV write → reboot) +
`tpm2-openssl` in the image.
How a host gets its **802.1X EAP-TLS client identity** the first time — the key at
TPM handle `0x81010001` + cert at NV `0x01800001` that invariant #1 says must come