Merge remote-tracking branch 'origin/main' into poam-hardening

# Conflicts:
#	CLAUDE.md
This commit is contained in:
Audiobuzz
2026-07-12 05:54:41 +00:00
18 changed files with 1277 additions and 84 deletions
+42 -15
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).
@@ -158,7 +174,8 @@ was incomplete:**
tailoring; production TLS offload tracked under #8. **(DONE 2026-07-12 — 2f is
now gtls/6514 and the three waivers are dropped; see #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`.
@@ -194,8 +211,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).
@@ -297,8 +315,13 @@ and cleanup.
"Permissions 640 too open" and refused to start). RHEL's `sshd-keygen@.service`
regenerates them into the overlay before sshd starts. **⚠ Caveat:** the
ephemeral overlay means they regenerate **every boot** → the host key changes
per reboot (clients warn). Follow-up for a stable host identity: persist the
host keys or derive them from the TPM (ties to the hostnqn/identity model).
per reboot (clients warn). **RESOLVED (F-02/P-17, bench-verified 2026-07-11 on
comet-beacon-54):** rather than persist a key, each per-boot key is signed into
an OpenSSH host certificate by the fleet SSH CA via the enrol-broker host plane
at boot (`files/ssh-hostcert` → `fleet-ssh-hostcert`); admins trust one
`@cert-authority` line instead of TOFU. See
[ssh-host-certificate-design.md](ssh-host-certificate-design.md). Bench-surfaced
fixes on branch `poam-hardening` (`28d31e4`).
## [ ] 3. Roll the errata into design doc v3
@@ -416,6 +439,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.