Adding secure NTP

This commit is contained in:
Audiobuzz
2026-07-11 17:32:05 +09:30
parent 8325818c1b
commit fbb8100ecd
16 changed files with 929 additions and 71 deletions
+35 -13
View File
@@ -14,16 +14,32 @@ flipped back for a secure/production build (consolidated as item #8):
- `nvmet_traddr` / CI `NVMET_TRADDR="192.168.50.10"` → hardcoded IP (should be a
per-env DNS name like `nvme.fleet.lab` once DNS-at-boot is trusted).
- Unsigned UKI (`sb_key`/`sb_cert` not passed) → Secure Boot must be OFF on the
test target. Production needs CI/HSM signing.
- `enable_kiosk=true`; `boot_splash=true`; NTP via DHCP→serving-host chrony.
- **`enable_stig` / CI `ENABLE_STIG="false"` RIGHT NOW** — temporarily disabled
to get a working box while the STIG regressions were diagnosed (now fixed,
below). **Flip back to `true`** and bench-verify the hardened build.
- **`debug_shell=true` (DEBUG HOLE — passwordless root on tty2). REMOVE before
prod** (`-var debug_shell=false`). Note: it didn't actually come up on tty2 in
testing; diagnosis ended up done via offline `rootfs.erofs` mount + SMBIOS
`enforcing=0`. SMBIOS cmdline-extra works on Proxmox only after a full VM
**stop/start** (not `reset`).
test target. Production needs CI/HSM signing. **NOTE (2026-07-11, `poam-hardening`):
the main CI now fails closed** — a "Production build gate" aborts unless
`SB_KEY`/`SB_CERT`/`FLEET_CA` are set, so an unsigned/placeholder-CA build is no
longer producible via CI (only a local `packer build` without keys still yields
the lab warning). The `fleet-ipxe` build is gated the same way.
- `enable_kiosk=true`; `boot_splash=true`.
- **`secure_ntp` — DONE (2026-07-11, `secure-ntp`).** NTP is now **NTS
(CA-authenticated)** by default: the host verifies the serving NTP server's
fleet-signed NTS-KE cert against `radius-ca.pem` (closes F-03/P-18;
docs/secure-ntp-design.md). **No baked FQDN** — the NM dispatcher derives the
server name from the DHCP domain at runtime (`ntp.<domain>`), so a site-domain
change needs no rebuild. `secure_ntp=false` reverts to the legacy unauthenticated
DHCP option-42 path. Serving needs `serving/chrony/nts-cert.sh` (DNS SAN
`ntp.<domain>`), DHCP option-15 domain handout, + tcp/4460 open. **BENCH-VERIFY**
`chronyc -N authdata` (NTS cookies) + `$DHCP4_DOMAIN_NAME` populated.
- **`enable_stig` — DONE (2026-07-11, `poam-hardening`).** CI `ENABLE_STIG="true"`
and, more importantly, the Packer template now **enforces** `enable_stig=true`
via variable validation — a build with it false fails `packer validate`/`build`.
There is no unhardened build path anymore. (Was temporarily off during the STIG
regression diagnosis; that escape hatch is gone.)
- **`debug_shell` — REMOVED (2026-07-11, `poam-hardening`).** The DEBUG HOLE
(passwordless root shell) and its `debug_shell` variable are deleted from the
template entirely; no build can bake it (closes POA&M P-02 / R-02). Offline
diagnosis via `rootfs.erofs` mount + SMBIOS `enforcing=0` remains the supported
path (SMBIOS cmdline-extra works on Proxmox only after a full VM **stop/start**,
not `reset`).
- **Admin SSH key MUST be ECDSA or RSA, NOT ed25519**, when STIG is on — the STIG
crypto policy drops ed25519 from sshd's accepted pubkey algorithms. Set the
`SSH_AUTHORIZED_KEY` CI secret to an ECDSA/RSA key (see #2).
@@ -154,7 +170,8 @@ was incomplete:**
gtls+x509+CA and broke the plaintext `2f` forward → unselected in the
tailoring; production TLS offload tracked under #8.
- Diagnosis tooling notes: SMBIOS cmdline-extra works only after a Proxmox VM
**stop/start** (not `reset`); the debug-shell-on-tty2 never came up — the
**stop/start** (not `reset`); the debug-shell-on-tty2 never came up (and is now
removed from the template — see the build-posture section) — the
decisive diagnosis was **offline `rootfs.erofs` mount** + `ssh -vvv` +
`enforcing=0`.
@@ -190,8 +207,9 @@ pass / N/A.
`TYPE=sysadm_t ROLE=sysadm_r NOPASSWD:ALL` and maps the admin to **`staff_u`**
(`semanage login`) so the sudo role transition is authorized. ⚠ **TWO BENCH
GATES:** (a) admin SSH login + sudo + privileged ops must work under `staff_u`
confinement (escape hatch: `enable_stig=false` → reverts to a justified
deviation); (b) **reproducibility** — `semanage` rebuilds the policy store;
confinement (if it locks out, waive the offending rule in the tailoring as a
justified deviation — `enable_stig=false` is no longer available, STIG is
enforced-true); (b) **reproducibility** — `semanage` rebuilds the policy store;
confirm the verity hash is stable across two builds (normalize in 2d if it
drifts). Needs `policycoreutils-python-utils` (installed in 2c-STIG if absent).
@@ -408,6 +426,10 @@ Path to getting here (don't re-discover):
stripped from `/etc/chrony.conf`. Result: the workstation syncs time only
from the lab server — no external NTP egress. BENCH-VERIFY: on a booted host
`chronyc sources` shows the lab server (the DHCP one), not a public pool.
**SUPERSEDED (2026-07-11, `secure-ntp`) by `secure_ntp=true`:** the DHCP
option-42 path is now the *unauthenticated fallback*; the default is
NTS/CA-authenticated time (the DHCP source is no longer mixed in). See the
build-posture note above + docs/secure-ntp-design.md.
- **Image size:** Chromium+Mesa add hundreds of MB to the *uncompressed* erofs —
feeds the "shrink the rootfs" concern (and #7); reconsider whether a lighter
browser/render path is viable.