feat(pipeline): network reachability probe, machine layout diagram and Defender switch-status table #18
Loading…
Reference in a new issue
No description provided.
Delete branch "fm/dse-security-reports-network-probe-layout"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Summary
The reachability probe of 2026-10-27, the machine layout and the Defender switch states existed only in conversation and chat history. This change captures all three as reproducible pipeline stages: a committed, deterministic network probe recipe with its unreachable-vs-closed rule and control-host gate, a deterministically generated Mermaid layout diagram (source committed, rendered asset embedded like the logo), and an authenticated Defender-for-Cloud configuration fetch cached once so the report renders switch and plan tables offline and byte-identically.
What changed
scripts/network_probe.sh+Justfile(just network-probe): bounded, read-only reachability probe per unit from the workstation (one ICMP echo, 20 TCP connects with 3 s timeout, name resolution) into.local/network/<machine>.jsonplus_context.json(method record, port set, control/auxiliary hosts). A silent host isunreachable, neverclosed; a closed-port finding requires a demonstrable answer; the control-host gate (two public estate endpoints from the committed mapping plus the corporate DNS server) aborts without writing a cache when nothing answers. Units without a committed endpoint (ASP-DSE-PROD-MISC) get an explicitnot-attemptedfile.scripts/derive_findings.py+src/dse_security_reports/derive.py(mirrored,just py-crosscheckgreen):load_network/network_aggregatejoining the probe cache with the same fixture-only gate as the evidence cache, covering the same unit union as the locations aggregate;load_defender_config/defender_config_aggregatefor the configuration cache; the covered-machines union is factored into_covered_machines(locations output preserved byte-for-byte).scripts/fetch_defender_config.sh+Justfile(just defender-config): integration switches, auto-provisioning, pricing plans (viaaz rest— this az CLI build rejectsaz security pricing list --scope, recorded in the script header) and the WindowsDefenderATP service-principal facts (role assignments, Graph grants), cached once to.local/defender-config.json; failed queries leave explicit unknowns with their reason.scripts/gen_layout_diagram.py+reports/machine-layout.mmd/.svg+Justfile(just layout): diagram generated deterministically fromconfig/systems.jsonand the derived locations/network aggregates, rendered with pinned mmdr 0.3.1 into the committed, cache-like SVG; the committed facts layer (PTR sweep, second subscription, ASP VNet) carries its provenance; the environment DSE cannot read appears as an explicitly unread external boundary.reports/defender-triage.typ: three new sections — Netzwerk-Reichweite der Einheiten (per-unit states, never a blank cell), Maschinen- und Ressourcen-Layout (embedded SVG with source attribution) and Defender-Konfigurationsstatus (switch and plan tables with the read date; unknowns with reason, never off/none; absent cache stated as a gap) — plus Grundlagen/Reproduzierbarkeit updates.tests/test_derive.py: network aggregate states, cache gating next to the fixture, and real-shaped joins proving both lanes stay byte-identical with the live caches.AGENTS.md: durable notes (probe rule, az CLI quirk, mmdr layout limits) and the extended published-round restore list.Behaviour change
unreachable, names NXDOMAIN on the reachable corporate DNS), the eight Linux units answered on their open ports, controls answered, ASP-DSE-PROD-MISC is explicitly not measured.just reproproves byte-identical PDFs on the fixture and on the real round.artifacts/superseded/, the 2026-10-26 set untouched), withnetwork-2026-10-27/anddefender-config-2026-10-27.jsonadded so the round stays restorable.Validation:
just all,just repro(byte-identical, both reports, fixture and real data),just test(33),just lint,just py-crosscheck,just py-reprogreen.Instructions-PR: none