Fixed the secure boot enrollment script
This commit is contained in:
+69
-28
@@ -15,10 +15,10 @@
|
||||
|---|---|
|
||||
| System name | Diskless Fleet Boot System ("the fleet") |
|
||||
| Document type | System Security Plan (SSP) |
|
||||
| Version | 0.1 (DRAFT — pre-assessment) |
|
||||
| Date | 2026-06-19 |
|
||||
| Version | 0.2 (DRAFT — pre-assessment) |
|
||||
| Date | 2026-06-20 |
|
||||
| Author / maintainer | System Owner (delegate) |
|
||||
| Status | Lab / pre-production. Secure path (802.1X/MACsec) not yet bench-verified. |
|
||||
| Status | Lab / pre-production. STIG hardening applied + bench-verified (unsigned, Secure Boot OFF); secure path (802.1X/MACsec) not yet bench-verified. |
|
||||
| Companion documents | [Annex A — ISM control cross-reference & residual risk](ssp-annex-a-ism-residual-risk.md); [Architecture design v2](diskless-fleet-design-v2.pdf); [Design errata](design-v2-errata.md); [STIG deviation register](stig-deviations.md); [Backlog / POA&M source](TODO.md) |
|
||||
|
||||
> **Currency caveat (read before relying on control numbers).** This SSP and its
|
||||
@@ -72,8 +72,19 @@ manifest. One commit = one release = one digest = one manifest entry.
|
||||
|
||||
### 2.2 Boot and trust chain (control flow)
|
||||
|
||||
1. **UEFI Secure Boot** measures and verifies the UKI signature (vendor/Secure
|
||||
Boot key) before execution.
|
||||
> **Boot transport (two paths, auto-selected):** HTTP-boot-capable firmware
|
||||
> fetches the UKI directly over UEFI HTTP boot. Firmware **without** HTTP boot
|
||||
> (e.g. HP EliteBook 820 G4) falls back to **PXE → iPXE → HTTP** (dnsmasq serves
|
||||
> iPXE over TFTP, which chainloads the same UKI). Both land on the same signed
|
||||
> UKI. **Lab status:** Secure Boot is currently **OFF** and the UKI/iPXE are
|
||||
> **unsigned** — signing is wired in CI and the key procedure is documented
|
||||
> ([secure-boot-keys.md](secure-boot-keys.md)) but not yet enforced (residual
|
||||
> R-03/signing in Annex A).
|
||||
|
||||
1. **UEFI Secure Boot** (when enabled) measures and verifies the UKI signature
|
||||
against the enrolled `db` key before execution. On the PXE/iPXE path the iPXE
|
||||
binary is likewise verified against `db`; only the fleet's own `db` need be
|
||||
enrolled (no Microsoft CA / shim).
|
||||
2. **UKI (systemd-stub)** carries the kernel, the `--no-hostonly` initramfs, and
|
||||
an **immutable, signed kernel command line** (includes the dm-verity root
|
||||
hash and STIG kernel parameters). No GRUB.
|
||||
@@ -102,7 +113,9 @@ the tmpfs overlay, the TPM-backed identity, and the hardened OS configuration.
|
||||
The boundary's external interfaces are: (a) the **access link** (802.1X-controlled
|
||||
port, MACsec-encrypted); (b) the **NVMe/TCP** root storage session; (c)
|
||||
**outbound audit log** forwarding; (d) the **kiosk application** endpoint the
|
||||
browser renders. Each crossing is a control point addressed in Annex A.
|
||||
browser renders; (e) the **boot transport** (UEFI HTTP boot, or PXE/TFTP→iPXE)
|
||||
that delivers the UKI; and (f) **USB/peripheral** ports, now mediated by USBGuard
|
||||
(§5.2). Each crossing is a control point addressed in Annex A.
|
||||
|
||||
### 2.4 Data and classification
|
||||
|
||||
@@ -151,12 +164,19 @@ This system follows the ISM A&A lifecycle:
|
||||
Milestones (POA&M)** (this repo's [TODO.md](TODO.md) is the working POA&M
|
||||
source).
|
||||
|
||||
**Current status:** Pre-assessment **DRAFT**. The system is functional in a lab
|
||||
configuration. Several controls are **partial or deferred** and are tracked as
|
||||
residual risks with treatment plans (Annex A §3). The security-critical path
|
||||
(802.1X/MACsec) is **implemented but not yet bench-verified end-to-end** and is
|
||||
currently disabled in test builds (`disable_dot1x=true`) — this is the single
|
||||
largest gate on a production authorisation.
|
||||
**Current status:** Pre-assessment **DRAFT (v0.2)**. The system is functional in a
|
||||
lab configuration. **Progress since v0.1 (2026-06-20):** DISA STIG hardening
|
||||
applied and **bench-verified** on a real build (kiosk, key-only SSH, audit
|
||||
offload, DHCP-named host, NVMe/verity root all good with hardening on); USBGuard
|
||||
device control enabled + verified; admin confined to `staff_u`; UKI signing wired
|
||||
in CI + Secure Boot key/enrolment procedure documented; both **HTTP-boot and
|
||||
PXE/iPXE** boot paths working (the latter verified on an EliteBook 820 G4).
|
||||
Several controls remain **partial or deferred**, tracked as residual risks with
|
||||
treatments (Annex A §3). The two largest gates on a production ATO: (a) the
|
||||
secure path (**802.1X/MACsec**) is implemented but **not yet bench-verified** and
|
||||
is disabled in test builds (`disable_dot1x=true`, R-01); (b) the lab runs
|
||||
**unsigned with Secure Boot OFF** (R-13) and with a lab-only **passwordless-root
|
||||
debug shell** that must be removed (R-02).
|
||||
|
||||
## 5. Security control implementation — by ISM cyber security principle
|
||||
|
||||
@@ -180,23 +200,43 @@ summarises the implementation posture.
|
||||
- **Boot & OS integrity:** **Secure Boot** + **signed UKI** with an **immutable
|
||||
cmdline**; **dm-verity** read-only root (continuous cryptographic integrity);
|
||||
**erofs** immutable filesystem; **reproducible** build (verity hash is a pure
|
||||
function of inputs).
|
||||
- **System hardening:** **DISA STIG** baseline via OpenSCAP/SSG with a documented
|
||||
tailoring; **SELinux enforcing**; **fapolicyd** application allow-listing (the
|
||||
exec guard for the writable RAM overlay that dm-verity cannot cover);
|
||||
**key-only SSH**, root login disabled, hardened ciphers/MACs/KEX; **kiosk
|
||||
lockdown** (single locked browser, no shell/navigation).
|
||||
function of inputs). Signing is **wired in CI** (`sbsign`/ukify via
|
||||
`SB_KEY`/`SB_CERT` secrets) with a documented PK/KEK/db key + enrolment
|
||||
procedure ([secure-boot-keys.md](secure-boot-keys.md)) and a baked, efitools-free
|
||||
enrolment helper (`fleet-sb-enroll`); **not yet enforced in the lab** (SB OFF,
|
||||
unsigned — see Annex A).
|
||||
- **System hardening (DISA STIG applied + bench-verified 2026-06-20):** STIG
|
||||
baseline via OpenSCAP/SSG with a documented tailoring + per-build deviations
|
||||
report; all REVIEW rows triaged. **SELinux enforcing**; **fapolicyd**
|
||||
application allow-listing (the exec guard for the writable RAM overlay dm-verity
|
||||
cannot cover); **USBGuard enforcing** (`ImplicitPolicyTarget=block` + a
|
||||
hardware-independent HID/hub allowlist + LinuxAudit — verified blocks USB mass
|
||||
storage while keeping console input; device/removable-media control); **key-only
|
||||
SSH**, root login disabled, hardened ciphers/MACs/KEX (note: STIG crypto policy
|
||||
drops ed25519 → admin key must be ECDSA/RSA); **kiosk lockdown** (single locked
|
||||
browser, no shell/navigation); **postfix removed** (no local MTA — audit-failure
|
||||
notification rides the remote offload, not email).
|
||||
- **Privileged access:** single **key-only `wheel` admin**, root locked. The admin
|
||||
is now **confined to the `staff_u` SELinux user** with a sudoers role/type
|
||||
transition (`sysadm_r`/`sysadm_t`) so privilege elevation re-labels the SELinux
|
||||
context (STIG `selinux_context_elevation_for_sudo`). Still **NOPASSWD** (the
|
||||
account is passwordless/key-only) and fleet-generic — see R-05.
|
||||
- **No persistent attack surface:** diskless; overlay discarded each boot; no
|
||||
per-host secrets in the image.
|
||||
- *Gaps / decisions:* **FIPS OFF** (lab phase); **host firewall disabled**;
|
||||
NVMe/TCP and audit offload **plaintext on the isolated LAN**; NOPASSWD key-only
|
||||
admin; **placeholder RADIUS CA**. See Annex A residual risks.
|
||||
- *Gaps / decisions:* **FIPS OFF** (lab phase); **host firewall disabled** (the
|
||||
workstation; the serving host's ufw is configured); NVMe/TCP and audit offload
|
||||
**plaintext on the isolated LAN**; NOPASSWD admin; **placeholder RADIUS CA**;
|
||||
signing not yet enforced (SB OFF). See Annex A residual risks.
|
||||
|
||||
### 5.3 Detect
|
||||
- **auditd** enabled with STIG audit rules; kernel `audit=1` +
|
||||
`audit_backlog_limit` in the signed cmdline.
|
||||
`audit_backlog_limit` in the signed cmdline. USBGuard device events logged via
|
||||
the LinuxAudit backend. auditd `space_left_action` repointed to **syslog**
|
||||
(no local MTA), so audit-volume alerts ride the remote offload.
|
||||
- **Centralised log offload** via rsyslog (`audisp-syslog` → rsyslog `omfwd`,
|
||||
disk-assisted queue) to a dedicated **audit collector** (`serving/audit-collector/`).
|
||||
**Bench-verified end-to-end 2026-06-20** (records reach the collector,
|
||||
per-source-host files).
|
||||
- *Gaps:* offload currently **plaintext** (TLS planned, R-07); offload is
|
||||
**local site only**; no SIEM correlation/alerting defined yet.
|
||||
|
||||
@@ -215,11 +255,11 @@ AO will expect a maturity view:
|
||||
|
||||
| Mitigation | Posture | Notes |
|
||||
|---|---|---|
|
||||
| Application control | **Strong** | fapolicyd allow-listing + immutable verified root; only RPM-trusted (plus one trusted kiosk binary) executables run. |
|
||||
| Application control | **Strong** | fapolicyd allow-listing + immutable verified root; only RPM-trusted (plus two trusted local binaries: kiosk-session, fleet-sb-enroll) executables run. USBGuard enforces device control on USB ports. |
|
||||
| Patch applications | **Process** | Patching = rebuild + re-sign + redeploy a new digest; cadence/SLA to be defined. |
|
||||
| Configure MS Office macros | **N/A** | No office suite; kiosk is a locked browser. |
|
||||
| User application hardening | **Strong (kiosk)** | Chromium locked down via enterprise policy; no plugins/shell/nav. |
|
||||
| Restrict admin privileges | **Partial** | Single key-only `wheel` admin (NOPASSWD, see R-05); no per-host/rotatable model yet. |
|
||||
| Restrict admin privileges | **Partial** | Single key-only `wheel` admin, root locked, now **SELinux-confined to `staff_u`** with a sudo role/type transition (NOPASSWD, see R-05); no per-host/rotatable model or admin-MFA yet. |
|
||||
| Patch operating systems | **Process** | Same rebuild/redeploy model; immutable image means uniform, atomic OS updates. |
|
||||
| Multi-factor authentication | **Strong (machine)** | Host auth is certificate + TPM-bound key (something-the-machine-has, non-exportable). Human admin MFA to be addressed for the management plane. |
|
||||
| Regular backups | **N/A (by design)** | Diskless, stateless hosts hold nothing to back up; recoverability is re-provisioning from a pinned digest. Backup applies to serving-side state, out of scope here. |
|
||||
@@ -234,13 +274,14 @@ production ATO:
|
||||
|---|---|---|---|
|
||||
| R-01 | Secure path (802.1X/MACsec) not yet bench-verified; currently disabled in test builds. | **High** | Treat — verify before production authorisation. |
|
||||
| R-02 | `debug_shell=true` bakes a **passwordless root shell** on a tty. | **High** | Treat — must be removed before production (lab-only). |
|
||||
| R-03 | STIG hardening temporarily **report-only / disabled in CI** (`enable_stig=false`). | **Medium** | Treat — re-enable before assessment. |
|
||||
| R-03 | STIG hardening **applied + bench-verified** (2026-06-20); residual is that CI ships **unsigned, Secure Boot OFF** and `enable_stig` must be confirmed on for production builds. | **Medium** | Treat — confirm `enable_stig=true` in CI + enforce signing/SB before assessment. |
|
||||
| R-04 | NVMe/TCP root traffic **plaintext** on the lab LAN. | **Medium** | Accept (isolated LAN) / treat for production. |
|
||||
| R-05 | NOPASSWD key-only admin; no per-host or rotatable access model. | **Medium** | Accept with compensating controls / roadmap. |
|
||||
| R-05 | NOPASSWD key-only admin (now `staff_u`-confined); no per-host/rotatable access model or admin-MFA. | **Medium** | Accept with compensating controls / roadmap. |
|
||||
| R-06 | **FIPS off**; ASD-approved-cryptography conformance not yet asserted. | **Medium** | Treat — required for PROTECTED+; revisit with signing. |
|
||||
| R-07 | Audit-log offload **plaintext**, single-site, no SIEM alerting. | **Medium** | Treat — TLS offload + monitoring on roadmap. |
|
||||
| R-07 | Audit-log offload **plaintext** (bench-verified working), single-site, no SIEM alerting. | **Medium** | Treat — TLS offload + monitoring on roadmap. |
|
||||
| R-08 | **Placeholder RADIUS CA** in the repo; real trust anchor not yet provisioned. | **Medium** | Treat — environment-specific, before production. |
|
||||
| R-09 | Host **firewall disabled**. | **Low–Medium** | Accept (isolated LAN) / treat with explicit allow-rules. |
|
||||
| R-09 | Host **firewall disabled** (workstation). | **Low–Medium** | Accept (isolated LAN) / treat with explicit allow-rules. |
|
||||
| R-13 | **Boot chain unsigned / Secure Boot OFF** in the lab (UKI + iPXE); CI signing wired but not enforced. | **Medium** | Treat — enrol `db`, enforce SB + sign UKI & iPXE before production. |
|
||||
|
||||
Each is detailed, ISM-cross-referenced, rated and assigned a treatment in Annex A.
|
||||
|
||||
|
||||
Reference in New Issue
Block a user