From 57fb5c3a3e63b6d1a5dd85724fe08dbdd14ee5a5 Mon Sep 17 00:00:00 2001 From: Audiobuzz Date: Fri, 10 Jul 2026 22:56:34 +0000 Subject: [PATCH] =?UTF-8?q?docs(ssp):=20v0.3=20=E2=80=94=20add=20the=20fle?= =?UTF-8?q?et-management=20plane=20+=20July=20hardening=20changes?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The SSP (v0.2, 2026-06-27) and annex predated the entire management/enrolment plane and the July hardening work. Bring both to v0.3 (2026-07-10): SSP: - Scope/boundary: on-host fleet-agent now IN scope; server-side manager/broker/ step-ca/InfluxDB named as connected systems; new host interface (g) = outbound mTLS to the management plane. Boot chain gains step 8 (post-switch-root agent). - Data: management telemetry (operational metadata, mTLS-encrypted, no per-host secret); the agent stream is the one non-plaintext transit path. - §5.2 Protect: agent reuses the TPM identity for mTLS; WebAuthn-passkey admin MFA (first human-admin MFA); 3 local SELinux modules; the 2026-07-04 fapolicyd overlay watch_fs fix (app-control was inactive on the root until then). - §5.3 Detect: operational health telemetry signal (distinct from auditd/Wazuh). - §6 Essential Eight: MFA + admin rows updated (passkeys now enforced on mgmt UI). - §7: new R-14 (mgmt plane = connected system pending authorisation) + R-15 (deferred agent actuators = future remote-mutation channel); R-05 MFA clause met. Annex: - §2.3 hardening: fapolicyd overlay-effectiveness fix + residual; 3 local SELinux allow modules on the MAC row. - §2.4 auth: agent mTLS on the machine-auth row; MFA row now Implemented for the mgmt UI (passkeys), Partial for host SSH. - §2.5 mgmt: new rows for TPM enrolment lifecycle (broker) and server-authoritative management plane. §2.6: operational health-monitoring row. §2.7: mgmt-plane segmentation (OPNsense L3, outbound-only). §2.9: agent mTLS, fleet CA (step-ca), cert-lifecycle auto-renewal. - §3 register: R-14, R-15 added; R-05 updated; heatmap + note + 3 new assessor notes (scope the mgmt plane, witness fapolicyd deny, confirm actuators inert). --- docs/ssp-annex-a-ism-residual-risk.md | 88 +++++++++++------ docs/ssp.md | 134 ++++++++++++++++++++------ 2 files changed, 166 insertions(+), 56 deletions(-) diff --git a/docs/ssp-annex-a-ism-residual-risk.md b/docs/ssp-annex-a-ism-residual-risk.md index 4d4c725..635f1af 100644 --- a/docs/ssp-annex-a-ism-residual-risk.md +++ b/docs/ssp-annex-a-ism-residual-risk.md @@ -9,15 +9,23 @@ > **A&A framework:** ASD *Information Security Manual* (ISM) — engagement target > **May 2026 release**. > -> **Annex version:** 0.2 (updated 2026-06-22). v0.2 reflects: STIG hardening -> applied + bench-verified, USBGuard device control enabled, admin `staff_u` -> confinement, audit offload verified, PXE/iPXE boot path added, and **UEFI Secure -> Boot signing verified enforcing on real hardware** (VM HTTP + 820 PXE) — R-13 -> reduced from Medium to Low (residual is making signed + SB-on the standing -> default); and (2026-06-27) a **Wazuh SIEM** (dedicated multi-node, agentless) -> now decodes + alerts on the fleet auditd stream — "event log analysis/alerting" -> moves Planned → Implemented, R-07 reduced toward Low (residual = TLS transport + -> retention). +> **Annex version:** 0.3 (updated 2026-07-10). v0.3 adds the **fleet-management +> plane**: the in-image **`fleet-agent`** (health telemetry over TPM-mTLS — +> bench-verified on hardware 2026-07-10; new host interface (g)), the server-side +> manager with **WebAuthn-passkey admin MFA** (first human-admin MFA — updates the +> §2.4 MFA row and R-05), the **TPM enrolment broker** + **step-ca fleet CA**, and +> InfluxDB health telemetry. It also records the **three local SELinux policy +> modules** (§2.3) and the **fapolicyd overlay exec-guard fix (2026-07-04)** that +> made application control actually effective on the root. New residual risks +> **R-14** (management plane = connected system, not yet separately authorised) and +> **R-15** (deferred agent actuators = future remote-mutation channel). The +> server-side plane is a **connected system** carrying its own authorisation. +> +> v0.2 (2026-06-22/27) reflected: STIG hardening applied + bench-verified, USBGuard +> device control, admin `staff_u` confinement, audit offload verified, PXE/iPXE +> boot path, **UEFI Secure Boot signing verified enforcing on real hardware** (R-13 +> Medium→Low), and a **Wazuh SIEM** (agentless) decoding + alerting on the auditd +> stream (R-07 reduced toward Low). --- @@ -85,13 +93,13 @@ ISM/PSPF style). Ratings are **pre-treatment** unless stated; the AO accepts the | Topic | ISM (rep.) | Requirement intent | System implementation | Status | Residual | |---|---|---|---|---|---| | Hardened OS to ASD/vendor guidance | ISM-1407*, ISM-1408* | Apply a recognised hardening baseline. | **DISA STIG** (SSG `profile_stig`, RHEL 9) via `oscap --remediate` + documented tailoring + per-build deviations report ([stig-deviations.md](stig-deviations.md)); **applied + bench-verified 2026-06-20**, all REVIEW rows triaged. | Partial | R-03 (CI must ship `enable_stig=true` + signed/SB-on) | -| Application control / allow-listing | ISM-0843*, ISM-1490*, ISM-1657* | Only approved executables run. | **fapolicyd** (RPM-trust + two trusted local binaries: kiosk-session, fleet-sb-enroll) + immutable dm-verity root. | Implemented | — | +| Application control / allow-listing | ISM-0843*, ISM-1490*, ISM-1657* | Only approved executables run. | **fapolicyd** (RPM-trust + trusted local binaries: kiosk-session, fleet-sb-enroll, fleet-agent) + immutable dm-verity root. **Effectiveness fix 2026-07-04:** the diskless root is `overlayfs`, which was missing from fapolicyd's `watch_fs` → the guard was **inactive on the root**; adding `overlay` turned allow-listing on for the whole root (verified: novel `/tmp` binary denied). | Implemented | R (residual): path-trust doesn't catch a *modified trusted path* via copy-up — TODO #15 (`integrity=sha256` option); see [stig-deviations #15](stig-deviations.md) | | Device / removable-media control | ISM-0341*, ISM-1551* | Control USB / peripheral devices. | **USBGuard enforcing** (`ImplicitPolicyTarget=block` + hardware-independent HID/hub allowlist + LinuxAudit). Verified: USB mass storage blocked, console input preserved. | Implemented | — | | Software / OS integrity | ISM-1493* | Detect unauthorised modification. | **dm-verity** continuous block-level verification of the read-only root against a signed hash; **reproducible** build. | Implemented | — | | Disable unneeded functionality | ISM-0380*, ISM-1416* | Minimise installed software/services. | `@^minimal` install; scanner tooling removed post-scan; FROM-scratch artifact image; kiosk = single app. | Implemented | — | | Hardened user applications (browser) | ISM-1486*, ISM-1412* | Lock down high-risk apps. | Chromium enterprise lockdown policy; weston kiosk; no shell/nav/plugins. | Implemented | — | | Memory/exploit mitigations | ISM-1341*, ISM-1342* | Enable platform exploit mitigations. | UKI cmdline: `slub_debug=P`, `page_poison=1`, `init_on_alloc/free=1`, `vsyscall=none`. | Implemented | — | -| Mandatory access control | ISM-1416* | MAC enforced. | **SELinux enforcing**; labels preserved into erofs (asserted at build). | Implemented | — | +| Mandatory access control | ISM-1416* | MAC enforced. | **SELinux enforcing**; labels preserved into erofs (asserted at build). Three **local allow modules** for architecture-specific paths (`chrony_dhcp_dispatcher`, `fapolicyd_tmpfs`, `fleet_agent_chronylog`), each minimal + read/monitoring-only and documented ([stig-deviations #14–16](stig-deviations.md)); **no permissive domains**. | Implemented | — | | Host-based intrusion prevention / file integrity (AIDE) | ISM-1288* | File integrity monitoring. | **N/A** — superseded by dm-verity (read-only, signed, continuous). | N/A (justified) | — | | Antivirus / endpoint scanning | ISM-1417* | Malware protection on endpoints. | **N/A/compensated** — immutable verified root + allow-listing means no persistent writable executable surface; overlay is RAM-only, discarded each boot. | N/A (justified) | — | @@ -99,11 +107,11 @@ ISM/PSPF style). Ratings are **pre-treatment** unless stated; the AO accepts the | Topic | ISM (rep.) | Requirement intent | System implementation | Status | Residual | |---|---|---|---|---|---| -| Strong machine authentication | ISM-1546*, ISM-0974* | Mutual, certificate-based auth. | **802.1X EAP-TLS**, client key non-exportable in **TPM** (`0x81000100`), cert in TPM NV. | Partial | R-01 (not bench-verified; disabled in test builds), R-08 (placeholder CA) | +| Strong machine authentication | ISM-1546*, ISM-0974* | Mutual, certificate-based auth. | **802.1X EAP-TLS**, client key non-exportable in **TPM** (`0x81000100`), cert in TPM NV. The **management-plane agent reuses the same TPM identity** for mTLS (`RequireAndVerifyClientCert` to the fleet CA; server keys inventory off the verified cert serial). One non-exportable key = 802.1X + NVMe hostnqn + agent stream. | Partial | R-01 (not bench-verified; disabled in test builds), R-08 (placeholder CA), R-14 (mgmt plane = connected system) | | Privileged access restricted | ISM-1507*, ISM-0445* | Limit & control admin access. | Single key-only `wheel` admin; root login disabled; admin **confined to `staff_u`** with a sudo `sysadm_r`/`sysadm_t` role/type transition (SELinux context elevates on privilege use). | Partial | R-05 | | Secure remote administration | ISM-1506*, ISM-1232* | Hardened admin channel. | SSH **key-only**, password & keyboard-interactive off, hardened ciphers/MACs/KEX (STIG crypto policy; ECDSA/RSA keys — ed25519 excluded by policy). | Implemented | — | | No default/shared credentials | ISM-1304* | No baked credentials. | No per-host secrets in any artifact; identity from TPM at runtime; `machine-id` empty; host keys regenerated at first boot. | Implemented | — | -| MFA for privileged users | ISM-1173*, ISM-1504* | MFA on privileged access. | Machine auth is cert+TPM (strong). **Human admin MFA on the management plane not yet enforced.** | Partial | R-05 | +| MFA for privileged users | ISM-1173*, ISM-1504* | MFA on privileged access. | Machine auth is cert+TPM (strong). **Human admin MFA on the management-plane UI now enforced via WebAuthn passkeys** (phishing-resistant, origin-bound, hardware-backed — the manager's admin plane, v0.3). Host **SSH** admin remains key-only (no separate human MFA). | Partial (host SSH) / Implemented (mgmt UI) | R-05 | | Passwordless appliance accounts | — (STIG #10) | Account lockout/aging. | `kiosk`/`fleetadmin` are key-only; password aging/faillock **exempted for these two only**, full policy system-wide otherwise. | Implemented | R-05 (folds into rotatable-access roadmap) | ### 2.5 Guidelines for System Management @@ -115,6 +123,8 @@ ISM/PSPF style). Ratings are **pre-treatment** unless stated; the AO accepts the | Protect build/signing key material | ISM-0501*, ISM-1233* | Protect keys. | Signing keys CI/HSM-held; **never** in repo or build VM; never logged. | Implemented | — | | Privileged actions logged | ISM-1509* | Admin actions auditable. | auditd rules capture privileged/admin events. | Implemented | R-07 (offload protection) | | Disable debug/back-door access | ISM-1491* | No undocumented access paths. | `debug_shell=true` currently bakes a **passwordless root tty** (lab debugging). | Partial | **R-02 (must remove before prod)** | +| Device enrolment & identity lifecycle | ISM-1195*, ISM-0475* | Controlled device onboarding. | **TPM enrolment broker** (v0.3): the host generates a key in-TPM, submits a CSR to the one *unauthenticated pre-auth* endpoint; an admin verifies an **OOB fingerprint** and **approves over mTLS**, then **step-ca** signs the leaf into TPM NV and the manager births the inventory record (cert-serial = key). No auto-approval; identity is human-anchored. Server-side = connected system. | Partial (connected system) | R-14 | +| Server-authoritative management plane | ISM-1483*, ISM-1509* | Controlled remote management. | `fleet-agent` streams telemetry + receives desired-state over mTLS; **v1 logs commands but does not act** (no host mutation). Inventory/desired-state is server-authoritative. Reconcile actuators deferred. | Partial | R-14, **R-15 (actuators = future remote-mutation channel)** | ### 2.6 Guidelines for System Monitoring (event logging) @@ -125,13 +135,14 @@ ISM/PSPF style). Ratings are **pre-treatment** unless stated; the AO accepts the | Protect logs in transit | ISM-1432*, ISM-0407* | Encrypt/authenticate log transport. | **Plaintext** on both hops (host→collector, collector→Wazuh across a routed mgmt LAN); rsyslog TLS rules waived (see [STIG #6](stig-deviations.md)). | Waived (lab) | **R-07** | | Log retention & integrity | ISM-0859*, ISM-1815* | Retain & protect logs. | Per-source-host files on collector; Wazuh indexer available for retention/ISM but **archival/retention policy not yet configured**. | Planned | R-07 | | Event log analysis / alerting | ISM-0109*, ISM-1228* | Review logs; alert on incidents. | **Wazuh SIEM** with a custom **`fleet-auditd`** decoder + severity-tiered rules (`fleet_audit` group; auth, privilege/`USER_CMD`, SELinux). **Decode + alert bench-verified 2026-06-27** (`wazuh-logtest` + live `sudo` in the dashboard). Detection content to expand. | Implemented (content to mature) | R-07 | +| Operational health monitoring | ISM-1228*, ISM-1526* | Monitor system health/availability. | **fleet-agent → fleet-manager** health telemetry over mTLS (v0.3): resource pressure, NVMe-root/auth/**SELinux state**/chrony/kiosk, uptime → InfluxDB time-series + admin dashboard flags (version-drift, **SELinux-permissive**, reboot-pending). Complements the auditd/Wazuh security-event path (operational, not security-event, data). Store/dashboard = connected system; host side = read-only probe + mTLS stream. | Partial (connected system) | R-14 | ### 2.7 Guidelines for Networking | Topic | ISM (rep.) | Requirement intent | System implementation | Status | Residual | |---|---|---|---|---|---| | Network access control (802.1X) | ISM-0520*, ISM-1182* | Authenticate devices to the network. | **802.1X** port-based control; unauthenticated port = no access. | Partial | R-01 | -| Network segmentation | ISM-1181*, ISM-1532* | Segregate & control traffic. | VLAN assignment post-auth; isolated boot LAN; serving stack separated. | Partial | R-09 | +| Network segmentation | ISM-1181*, ISM-1532* | Segregate & control traffic. | VLAN assignment post-auth; isolated boot LAN; serving stack separated. **Management plane (v0.3):** the agent reaches the manager on `:9600` **only via an OPNsense L3 rule** (authenticated host VLAN → `:9600`; never the boot LAN); the admin UI (`:443`, passkey) is on the management network only; enrolment/boot/NVMe/NTP stay on the boot LAN. Agent is **outbound-only** (no inbound host port). | Partial | R-09, R-14 | | Host-based firewall | ISM-1416*, ISM-1416a* | Restrict host network exposure. | **firewalld disabled** (risk to NVMe/TCP & NM during bring-up). | Waived (lab) | **R-09** | | Disable unused network functionality | ISM-1296* | Minimise network services. | Minimal services; no extraneous listeners; kiosk has no inbound. | Implemented | — | @@ -146,8 +157,9 @@ ISM/PSPF style). Ratings are **pre-treatment** unless stated; the AO accepts the | Topic | ISM (rep.) | Requirement intent | System implementation | Status | Residual | |---|---|---|---|---|---| | ASD-Approved Cryptographic Algorithms (AACA) | ISM-0471*, ISM-1446* | Use approved algorithms. | STIG crypto policy (modern ciphers/MACs/KEX); EAP-TLS, MACsec-GCM. **Conformance to ISM AACA not formally asserted; FIPS off.** | Partial | **R-06** | -| ASD-Approved Cryptographic Protocols (AACP) | ISM-1139*, ISM-1453* | Use approved protocols (TLS 1.2+/1.3). | EAP-TLS, NVMe/TCP & log transport currently plaintext on LAN. | Partial | R-04, R-06, R-07 | -| Key protection / non-exportability | ISM-0501*, ISM-1091* | Protect keys in hardware where feasible. | EAP-TLS private key **non-exportable in TPM**; UKI signing keys in HSM/CI. | Implemented | — | +| ASD-Approved Cryptographic Protocols (AACP) | ISM-1139*, ISM-1453* | Use approved protocols (TLS 1.2+/1.3). | EAP-TLS; **management-plane agent stream is mTLS 1.2+** (fleet CA) — encrypted, unlike NVMe/TCP & log transport which remain plaintext on the LAN. | Partial | R-04, R-06, R-07 | +| Key protection / non-exportability | ISM-0501*, ISM-1091* | Protect keys in hardware where feasible. | EAP-TLS **and management-plane** private key **non-exportable in TPM** (one key, three uses); UKI signing keys in HSM/CI. The **fleet CA (step-ca)** that signs host/agent certs is a **connected-system** trust anchor — its key protection is assessed there. | Implemented (host) / R-14 (CA) | R-14 | +| Certificate lifecycle | ISM-1091*, ISM-0501* | Managed cert issuance/renewal. | Host identity cert minted at enrolment (step-ca, into TPM NV). The manager's **agent-plane server cert auto-renews** from the co-located CA (`step ca renew --daemon` + in-process hot-reload) — preserves SANs, no 90-day lapse. Server-side = connected system. | Partial (connected system) | R-14 | | Cryptographic equipment / module evaluation | ISM-0467*, ISM-1277* | Use evaluated crypto modules. | TPM 2.0 hardware; module-evaluation status to confirm; FIPS module not enabled. | Partial | R-06 | ### 2.10 Guidelines for ICT Equipment & Media @@ -178,7 +190,7 @@ asked to accept. Treatments map to [docs/TODO.md](TODO.md) (working POA&M). | **R-02** | `debug_shell=true` bakes a **passwordless root shell** on a tty — an undocumented privileged access path. | 2.5 (ISM-1491*) | Possible × Severe → **High** | Lab-only; physical access required; isolated environment. | Set `debug_shell=false` for all non-lab builds; assert absent in CI. | **Low** | Platform team — *before production* | | **R-03** | STIG hardening **applied + bench-verified** (2026-06-20, all REVIEW rows triaged); residual is ensuring **CI ships `enable_stig=true`** for production builds (it was toggled off during bring-up). | 2.3 (ISM-1407*/1408*) | Possible × Moderate → **Medium** | Tailoring + register + per-build report; SELinux/fapolicyd/USBGuard on; verified on a real hardened build. | Confirm `ENABLE_STIG="true"` in CI; keep the 0-eval guard; re-run the deviations report on the assessed build. | **Low** | Platform team — *before assessment* | | **R-04** | NVMe/TCP **root traffic plaintext** on the LAN — exposure of OS content / injection if the segment is compromised. | 2.9 (ISM-1139*/1453*) | Unlikely × Major → **Medium** | Isolated boot LAN; MACsec on the access link (once R-01 done) protects the first hop; dm-verity makes injected root blocks fail verification (integrity preserved even if confidentiality isn't). | Production: TLS/IPsec for the storage transport, or rely on MACsec end-to-end across the fabric; document the decision. | **Low–Medium** | Platform/network — *production* | -| **R-05** | **NOPASSWD key-only admin**; no per-host or rotatable access model; human admin MFA on the mgmt plane not enforced. | 2.4 (ISM-1507*/1173*) | Possible × Moderate → **Medium** | Single fleet-generic admin, key-only, root disabled, ECDSA/RSA key, **now SELinux-confined to `staff_u`** with sudo role/type elevation, fully audited; no interactive password to attack. | Per-host/rotatable access (SSH CA / config-agent) + admin MFA on the management plane. | **Low–Medium** | Platform team — *roadmap* | +| **R-05** | **NOPASSWD key-only host admin**; no per-host or rotatable access model. (Management-plane admin MFA is now **enforced** via WebAuthn passkeys — v0.3; residual is the *host SSH* access model.) | 2.4 (ISM-1507*/1173*) | Possible × Moderate → **Medium** | Single fleet-generic admin, key-only, root disabled, ECDSA/RSA key, **SELinux-confined to `staff_u`** with sudo role/type elevation, fully audited; no interactive password to attack. Mgmt-plane admin actions now behind a phishing-resistant passkey. | Per-host/rotatable **host** access (SSH CA / config-agent); the mgmt-plane MFA clause is now met. | **Low–Medium** | Platform team — *roadmap* | | **R-06** | **FIPS off**; ISM **AACA/AACP conformance not formally asserted**; crypto-module evaluation status unconfirmed. | 2.9 (ISM-0471*/1139*/1277*) | Possible × Major → **Medium** | Modern STIG crypto policy; non-exportable TPM key; no deliberately weak algorithms. Acceptable at OFFICIAL; **mandatory to resolve for PROTECTED+.** | Assert AACA/AACP conformance; decide on FIPS module / evaluated crypto alongside Secure Boot signing. | **Low** (at appropriate classification) | Security + Platform — *before PROTECTED+* | | **R-07** | Audit-log **offload plaintext** on both hops (host→collector, collector→Wazuh) and **log retention/archival not yet configured** — logs interceptable in transit and retention/tamper-protection undefined. (**SIEM analysis + alerting now in place** — Wazuh, decode+alert bench-verified 2026-06-27; transport bench-verified 2026-06-20.) | 2.6 (ISM-1432*/0109*/0859*) | Possible × Moderate → **Low–Medium** | Isolated/mgmt LAN; disk-assisted queue (no loss on collector/SIEM blip); auditd local copy; per-source files; **Wazuh now actively decodes + alerts** (`fleet_audit`). | rsyslog **TLS** (gtls/6514) on both hops + bundle CA in image (re-select the 3 waived `rsyslog_encrypt_offload_*` rules); configure Wazuh **retention/archival** (ISM) + rotate default creds + restrict dashboard/API. | **Low** | Platform/SecOps — *production* | | **R-13** | **Boot-chain signing not yet the standing default** — signing + Secure Boot enforcement are **verified end-to-end on real hardware** (VM HTTP UKI 2026-06-20; 820 PXE signed iPXE→UKI 2026-06-22, SB enforcing, `db` enrolled), but unsigned/SB-OFF lab builds remain possible (CI signs only when `SB_KEY`/`SB_CERT` are set) and not every host has `db` enrolled, so a substituted artifact could still boot on an un-enrolled/unsigned host. | 2.10 (ISM-1542*/0312*) | Unlikely × Major → **Low** | Capability **proven on hardware**; dm-verity rejects a tampered *root* regardless; isolated lab LAN. | Make signed + Secure-Boot-on the **default for all production builds/hosts**: keep `SB_KEY`/`SB_CERT` CI secrets set; enrol `db` fleet-wide; treat an unsigned build as lab-only. | **Low** | Platform team — *before production* | @@ -187,19 +199,21 @@ asked to accept. Treatments map to [docs/TODO.md](TODO.md) (working POA&M). | **R-10** | **Patch SLA undefined** — no documented cadence for rebuilding/redeploying against new CVEs. | 2.5 (ISM-1144*/1472*) | Likely × Moderate → **Medium** | Atomic rebuild/redeploy model makes patching fast & uniform; reproducible builds. | Define patch cadence & critical-CVE SLA; automate rebuild triggers. | **Low** | Platform team — *roadmap* | | **R-11** | **No remote attestation** of TPM boot measurements — a compromised boot can't be detected centrally. | 2.10 (ISM-1542*) | Unlikely × Major → **Low–Medium** | Secure Boot + signed UKI + dm-verity already prevent unsigned/modified boot; measurements exist locally. | Implement remote attestation (TPM quote → verifier) gating network/storage access. | **Low** | Platform team — *roadmap* | | **R-12** | **No formal Incident Response Plan**; volatile RAM overlay complicates live forensics. | 2.1, 2.6 (ISM-0043*/0109*) | Possible × Moderate → **Medium** | Inherent recovery (reboot → verified state; revert digest); centralised logs survive host wipe. | Author IRP + log-retention + break-glass/forensics procedure suited to stateless hosts. | **Low** | SecOps — *before production* | +| **R-14** | **Management/enrolment plane is a connected system, built but not yet separately authorised.** The host now trusts + streams to the fleet-manager and enrols via the broker + **step-ca fleet CA** (a new trust anchor + key material); the broker exposes **one unauthenticated pre-auth CSR endpoint**; InfluxDB holds telemetry + a bearer token. These server-side controls (CA key protection, broker hardening, admin-plane exposure, data-at-rest) are outside this SSP's boundary. | 2.4, 2.5, 2.6, 2.9 (ISM-1546*/1483*/0501*) | Possible × Moderate → **Medium** | Host-side exposure is limited: **outbound-only** mTLS, TPM-bound identity, **read-only** telemetry (no user data), and **commands logged-not-applied in v1**. Broker enrolment is human-anchored (OOB fingerprint + admin mTLS approve; no auto-approval). Mgmt-plane admin UI behind passkey MFA. | Author a **separate SSP/authorisation** for the management plane (CA key protection, broker endpoint hardening + rate-limiting, InfluxDB token/data protection, admin-plane network exposure); TLS everywhere is already in place on this plane. | **Low–Medium** | Platform/SecOps — *before the mgmt plane is production* | +| **R-15** | **Deferred agent reconcile actuators.** v1 receives `DesiredState`/`Command` but **only logs** them; when actuation (apply `kiosk_url` / `reboot` / drain) is built, `fleet-agent` becomes a **remote host-mutation channel**. | 2.5 (ISM-1483*/1509*) | Rare × Moderate → **Low** (v1) | v1 performs **no host mutation** — the receive path is inert; the command authZ path (server-authoritative desired-state, verified over mTLS) is designed but not exercised. | At build time, assess the command/authZ path (who can set desired-state, replay/authZ, blast radius of `reboot`/drain) before enabling actuators; keep it behind an explicit flag. | **Low** | Platform team — *at actuator build* | ### 3.1 Risk heatmap (post-treatment targets) ``` -Consequence → Minor Moderate Major Severe +Consequence → Minor Moderate Major Severe Likelihood ↓ - Certain - Likely R-10 R-01* - Possible R-05 R-07 R-03 R-02* - R-12 R-06 R-08 - Unlikely R-04 - R-11 R-09 - Rare + Certain + Likely R-10 R-01* + Possible R-05 R-07 R-03 R-02* + R-12 R-14 R-06 R-08 + Unlikely R-04 + R-11 R-09 + Rare R-15 ( * = currently High pre-treatment; all targeted to Low after treatment ) ``` @@ -208,10 +222,14 @@ Low–Medium. The AO is asked to authorise on the basis that **R-01, R-02, R-08, R-12 and R-13** (and confirming R-03's `enable_stig=true`) are **closed before production**, and R-04/R-05/R-06/R-07/R-09/R-10/R-11 are either accepted with compensating controls (isolated-LAN lab) or carried on the POA&M with target -dates. Newly strengthened in v0.2: device control (USBGuard, now Implemented), -admin SELinux confinement (R-05), STIG applied+verified (R-03 reduced), and -**Secure Boot signing verified enforcing on real hardware (R-13 reduced -Medium→Low)**.* +dates. Newly recorded in v0.3: **R-14** (the management/enrolment plane is a +connected system requiring its own authorisation) and **R-15** (deferred agent +actuators — a future remote-mutation channel, inert in v1). Newly *strengthened* +in v0.3: **human-admin MFA on the management plane** via WebAuthn passkeys +(improves R-05's MFA clause), and **application control made effective on the +overlay root** (the 2026-07-04 fapolicyd `watch_fs` fix). Carried from v0.2: +USBGuard device control, admin SELinux confinement, STIG applied+verified, and +Secure Boot signing verified enforcing on real hardware (R-13 Medium→Low).* --- @@ -238,6 +256,18 @@ Medium→Low)**.* PXE/iPXE SB-OFF cmdline workaround is a no-op once SB is on. 8. **Witness device control** (USBGuard): a USB mass-storage device is blocked and logged, console HID still works. +9. **Scope the management plane (R-14).** Confirm whether the server-side + fleet-manager / enrol-broker / step-ca / InfluxDB are assessed under a **separate + authorisation**, and that the host↔plane boundary (outbound-only mTLS, TPM + identity, telemetry-only v1) is as described. Witness: an agent mTLS session is + rejected for a serial not in inventory; the broker will not sign without the OOB + fingerprint + admin-mTLS approval; the admin UI requires a passkey. +10. **Confirm application control is effective on the root** (post-2026-07-04 fix): + on an enforcing build, a **novel non-RPM binary in `/tmp` is denied** (fapolicyd + `FAN_DENY`) — proving the `overlay` `watch_fs` entry took (earlier builds silently + did not guard the overlay root). +11. **Confirm actuators are inert (R-15):** the assessed build's `fleet-agent` + **logs but does not apply** desired-state/commands (telemetry-only v1). --- diff --git a/docs/ssp.md b/docs/ssp.md index fb5e584..d8814ef 100644 --- a/docs/ssp.md +++ b/docs/ssp.md @@ -15,11 +15,11 @@ |---|---| | System name | Diskless Fleet Boot System ("the fleet") | | Document type | System Security Plan (SSP) | -| Version | 0.2 (DRAFT — pre-assessment) | -| Date | 2026-06-27 | +| Version | 0.3 (DRAFT — pre-assessment) | +| Date | 2026-07-10 | | Author / maintainer | System Owner (delegate) | -| Status | Lab / pre-production. STIG hardening applied + bench-verified; **UEFI Secure Boot signing verified enforcing on real hardware** (VM HTTP + EliteBook 820 PXE); 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) | +| Status | Lab / pre-production. STIG hardening applied + bench-verified; **UEFI Secure Boot signing verified enforcing on real hardware** (VM HTTP + EliteBook 820 PXE); secure path (802.1X/MACsec) not yet bench-verified. **v0.3 adds the fleet-management plane** (on-host `fleet-agent` telemetry over TPM-mTLS — bench-verified on hardware 2026-07-10; server-side manager with **WebAuthn-passkey** admin MFA + TPM enrolment broker) and July hardening changes (three local SELinux modules; fapolicyd overlay exec-guard fix). | +| 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); [Fleet-management design](fleet-management-design.md); [TPM enrolment design](tpm-enrolment-design.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 > annex are drafted against the ISM structure as understood to a January 2026 @@ -45,14 +45,20 @@ decision. **In scope:** the boot chain (UEFI HTTP boot → signed UKI → dracut initramfs → network authentication → encrypted root mount → verified read-only OS), the -runtime workstation OS image, the host's cryptographic identity (TPM), and the -hardening baseline applied to the image. +runtime workstation OS image, the host's cryptographic identity (TPM), the +hardening baseline applied to the image, and the **on-host `fleet-agent`** (the +in-image telemetry client that streams host health to the management plane over +TPM-mTLS — new in v0.3; `files/agent/`). -**Out of scope (separately authorised):** the lab serving stack (DHCP/HTTP/ -NVMe-oF target, audit collector — `serving/`), the 802.1X authenticator/RADIUS -infrastructure, the certificate enrolment authority, the network fabric, and -physical security of the facility. These are dependencies referenced here but -carry their own security documentation and authorisation. +**Out of scope (separately authorised — connected systems):** the lab serving +stack (DHCP/HTTP/NVMe-oF target, audit collector — `serving/`); the **server-side +fleet-management plane** (`serving/fleet-manager/` — the control-plane hub, its +admin web UI, the InfluxDB metrics store, and the Traefik ingress); the **TPM +enrolment broker** (`serving/enrol-broker/`) and the **step-ca fleet certificate +authority** it signs against; the 802.1X authenticator/RADIUS infrastructure; the +network fabric; and physical security of the facility. These are dependencies the +host connects to and are described here where the host interacts with them, but +each carries its own security documentation and authorisation. ## 2. System description @@ -104,18 +110,28 @@ manifest. One commit = one release = one digest = one manifest entry. 7. `switch-root` into the real system; NetworkManager renews the DHCP lease so the network-mounted root stays alive; the host derives its NVMe `hostnqn` from the TPM certificate serial and (kiosk builds) launches the locked-down kiosk. +8. **Post-boot management (v0.3):** the hardened **`fleet-agent`** service dials + the management plane and identifies with the **same TPM key/cert** used for + 802.1X and the NVMe `hostnqn` ("one identity, three stages"), streaming host + health over mTLS. It is telemetry-only in v1 — it receives desired-state / + commands but **only logs** them (no host mutation). It is a + **post-switch-root** component only (not in the initramfs). ### 2.3 Authorisation boundary The authorisation boundary is the **running workstation host**: the UKI, the initramfs and its custom 802.1X/MACsec dracut module, the verified erofs root, -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; (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. +the tmpfs overlay, the TPM-backed identity, the hardened OS configuration, and the +in-image **`fleet-agent`**. 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; (e) the **boot transport** (UEFI HTTP +boot, or PXE/TFTP→iPXE) that delivers the UKI; (f) **USB/peripheral** ports, now +mediated by USBGuard (§5.2); and (g) the **management plane** — an *outbound-only* +mTLS gRPC session from `fleet-agent` to the fleet-manager (`manager.fleet.lab:9600`, +across the OPNsense L3 hop from the host VLAN to the management network; no inbound +host port), authenticated with the host's TPM identity cert. Each crossing is a +control point addressed in Annex A. ### 2.4 Data and classification @@ -127,7 +143,16 @@ that delivers the UKI; and (f) **USB/peripheral** ports, now mediated by USBGuar CI/HSM-held and **never enter the build VM or the repository**. - **Data in transit:** access link protected by **MACsec**; NVMe/TCP root and audit-log offload currently **plaintext on an isolated lab LAN** (see residual - risk R-04, R-07 in Annex A). + risk R-04, R-07 in Annex A). The **management-plane** telemetry stream is + **mTLS-encrypted** (fleet CA) end-to-end — unlike the NVMe/audit hops, it is not + plaintext. +- **Management telemetry (v0.3):** the agent sends host **health** (load/cpu/temp/ + memory/tmpfs, uptime, NVMe-root state, 802.1X/MACsec + SELinux state, chrony + clock health, kiosk state) and **inventory facts** (image version, kernel, + cert-serial). This is **operational metadata, not user data**, and it carries **no + per-host secret** (identity is the reused TPM cert; the private key never leaves + the TPM). It is retained server-side (InfluxDB) — a **connected-system** + responsibility (see §1, R-14). - **Data at rest in the overlay:** ephemeral, RAM-only, discarded at power-off. The **system's data classification governs this SSP's marking and the required @@ -164,8 +189,27 @@ 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 (v0.2, updated 2026-06-27)**. The system -is functional in a lab configuration. **Progress since v0.1 (2026-06-20):** DISA +**Current status:** Pre-assessment **DRAFT (v0.3, updated 2026-07-10)**. The system +is functional in a lab configuration. + +**Progress since v0.2 (2026-07-10):** the **fleet-management plane** was built and, +on the host side, **bench-verified end-to-end on real hardware** (`comet-beacon-54`): +the in-image **`fleet-agent`** streams health to the server over **mTLS using the +reused TPM identity** (telemetry-only — desired-state/commands are received but only +logged, zero host mutation). The server-side manager adds a **WebAuthn-passkey** +(phishing-resistant, origin-bound) admin plane — the first **human-admin MFA** on the +management plane — and a **TPM enrolment broker** (unauthenticated pre-auth CSR → OOB +fingerprint → admin-mTLS approve → step-ca sign) that births the per-host inventory +record. Its server-side server cert now **auto-renews** from the co-located CA. Host +hardening also advanced: **three local SELinux policy modules** were added (all +documented deviations — [stig-deviations.md](stig-deviations.md) #14–16), and a +**material fapolicyd finding was fixed (2026-07-04)** — the app-allow-listing exec +guard was effectively *inactive on the overlay root* (`overlay` missing from +`watch_fs`) and is now enforcing across the whole root (see §5.2). The server-side +plane (manager/broker/InfluxDB/step-ca) is a **connected system** pending its own +authorisation (R-14). + +**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`; **UEFI @@ -201,7 +245,18 @@ summarises the implementation posture. ### 5.2 Protect - **Identity & authentication:** mutual **802.1X EAP-TLS** with a - **non-exportable TPM key**; network access controlled at the switch port. + **non-exportable TPM key**; network access controlled at the switch port. The + **management-plane agent reuses the same TPM identity** for mTLS to the + fleet-manager (one non-exportable key backs 802.1X, the NVMe `hostnqn`, and the + agent stream — "one identity, three stages"), and the server keys inventory off + the verified cert serial, so a host can only ever report as itself. +- **Management-plane admin MFA (v0.3):** the server-side admin web UI enforces + **WebAuthn passkeys** — phishing-resistant, origin-bound, hardware-backed + MFA — behind a Traefik ingress that terminates a Let's Encrypt cert (DNS-01). + This is the first human-admin MFA in the system (the manager/broker admin planes + are a **connected system**, but the control is noted here as it closes the + long-standing "no admin MFA" gap for management operations; host SSH admin + remains key-only — R-05). - **Link protection:** **MACsec** on the access link. - **Boot & OS integrity:** **Secure Boot** + **signed UKI** with an **immutable cmdline**; **dm-verity** read-only root (continuous cryptographic integrity); @@ -221,7 +276,21 @@ summarises the implementation posture. 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). + notification rides the remote offload, not email). Three **local SELinux policy + modules** are shipped for architecture-specific allows, each a documented + deviation ([stig-deviations.md](stig-deviations.md) #14–16): `chrony_dhcp_dispatcher` + (NM-dispatcher chrony reload), `fapolicyd_tmpfs` (statfs the overlay upper), and + `fleet_agent_chronylog` (agent reads chrony's tracking log). No blanket + permissive domains; SELinux stays enforcing. +- **Application-control effectiveness fix (2026-07-04):** a bench finding showed + fapolicyd's exec guard was **effectively inactive on the root** — the diskless + root is `overlayfs`, which was **absent from fapolicyd's `watch_fs`**, so + fapolicyd marked no mounts and intercepted no exec on `/`, `/usr` or `/tmp`. + Adding `overlay` to `watch_fs` turned app-allow-listing **on for the whole + overlay root for the first time** — verified: a novel non-RPM binary in `/tmp` + is now denied (`FAN_DENY`), nothing legitimate broke. (Residual: path-based trust + doesn't catch a *modified trusted path* via copy-up — tracked as TODO #15 / + the `integrity=sha256` option — noted in stig-deviations #15.) - **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 @@ -252,7 +321,16 @@ summarises the implementation posture. 2026-06-27** (`wazuh-logtest` + a live `sudo` surfacing `USER_CMD`/`CRED_*` in the dashboard). Config is declarative (`serving/siem/`, mounted via `/wazuh-config-mount`). -- *Gaps:* both offload hops (host→collector, collector→Wazuh) currently +- **Fleet health telemetry (v0.3):** the `fleet-agent` streams host health + (resource pressure, NVMe-root/auth/SELinux/chrony/kiosk state, uptime) to the + manager over mTLS; the manager persists a time-series (InfluxDB) and flags + version-drift, SELinux-permissive, and reboot-pending in an admin dashboard. This + is an **operational-health** signal (complements the auditd/Wazuh **security-event** + path — different purpose, different data): e.g. a host reporting `SELinux: + permissive` or overlay RAM exhaustion is surfaced for the operator. The store and + dashboard are a **connected system** (server-side); the host-side contribution is + the read-only probe + mTLS stream. +- *Gaps:* both audit-offload hops (host→collector, collector→Wazuh) currently **plaintext** (TLS planned, R-07); **log retention/archival** (ISM) not yet configured; default Wazuh credentials to be rotated before production. @@ -275,9 +353,9 @@ AO will expect a maturity view: | 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, 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. | +| 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); **management-plane** admin actions now require a **WebAuthn passkey** (v0.3). Still no per-host/rotatable *host* access model. | | 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. | +| Multi-factor authentication | **Strong (machine) + admin passkey** | Host auth is certificate + TPM-bound key (something-the-machine-has, non-exportable). **Human admin MFA is now enforced on the management-plane UI via WebAuthn passkeys** (phishing-resistant, origin-bound) — v0.3. Host SSH admin remains key-only (no separate human MFA — R-05). | | 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. | ## 7. Residual risk summary @@ -292,12 +370,14 @@ production ATO: | 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 **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 (now `staff_u`-confined); no per-host/rotatable access model or admin-MFA. | **Medium** | Accept with compensating controls / roadmap. | +| R-05 | NOPASSWD key-only **host** admin (now `staff_u`-confined); no per-host/rotatable access model. (Management-plane admin MFA now enforced via WebAuthn passkeys — v0.3.) | **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** on both hops (host→collector, collector→Wazuh); **log retention not yet configured**. SIEM **analysis + alerting now in place** (Wazuh, decode+alert bench-verified 2026-06-27). | **Low–Medium** | Treat — TLS both hops + ISM retention/archival + rotate Wazuh creds before production. | | 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** (workstation). | **Low–Medium** | Accept (isolated LAN) / treat with explicit allow-rules. | | R-13 | **Boot-chain signing not yet the standing default.** Signing + Secure Boot enforcement **verified end-to-end on hardware** (VM HTTP UKI 2026-06-20; 820 PXE signed iPXE→UKI 2026-06-22), but unsigned/SB-OFF lab builds are still possible (CI signs only when `SB_KEY`/`SB_CERT` are set) and not all hosts have `db` enrolled. | **Low** | Treat — make signed + Secure-Boot-on the default for all production builds/hosts (set CI secrets; enrol `db` fleet-wide). | +| R-14 | **Management/enrolment plane is a connected system, built but not yet separately authorised.** The host now trusts + streams to the fleet-manager and enrols via the broker/**step-ca fleet CA** (a new trust anchor + key material) whose one **unauthenticated pre-auth CSR endpoint** is a new server-side surface. Host-side exposure is limited (outbound-only mTLS, read-only telemetry, commands logged-not-applied in v1). | **Medium** | Treat — separate SSP/authorisation for the management plane (CA key protection, broker endpoint hardening, InfluxDB token/data, admin-plane exposure). | +| R-15 | **Deferred agent reconcile actuators.** v1 receives `DesiredState`/`Command` but only logs them; when actuation (apply kiosk_url / reboot / drain) is built, the agent becomes a **remote host-mutation channel** needing re-assessment. | **Low** (v1) | Treat at build time — assess the command/authZ path before enabling actuators. | Each is detailed, ISM-cross-referenced, rated and assigned a treatment in Annex A.