diff --git a/monitoring/README.md b/monitoring/README.md index e37a711..1e0dc21 100644 --- a/monitoring/README.md +++ b/monitoring/README.md @@ -62,7 +62,9 @@ Dashboard-JSONs innerhalb eines bestehenden Providers werden laufend nachgezogen | `alloy/config.alloy` | Docker-Log-Collection -> Loki, node-exporter -> Prometheus | | `grafana/provisioning/` | Datasources (feste UIDs!) und Dashboard-Provider | | `grafana/dashboards//*.json` | Dashboards, je Unterordner ein Grafana-Ordner | -| `cve/images.txt` | Liste der real deployten Images, Inventur aus dem Cluster | +| `cve/targets.py` | Bildet die Soll-Menge der Scan-Ziele aus Cluster, Betriebs-Host und Registry | +| `cve/test_targets.py` | Zusicherungen dazu, je mit Gegenprobe (`python3 test_targets.py`) | +| `cve/test_scan_loop.sh` | Zusicherungen fuer die Scan-Schleife (`sh cve/test_scan_loop.sh`) | | `cve/scan-loop.sh` | Trivy-Scan-Schleife (24h), schreibt JSON-Reports | | `cve/cve-exporter.py` | Reports -> Prometheus-Metriken, mit First-Seen-State | @@ -90,7 +92,7 @@ Datei-Update verloren. ## CVE-Pipeline (gitops#47) -`cve-scan` scannt alle 24h die Images aus `cve/images.txt` mit Trivy und legt +`cve-scan` scannt alle 24h die Ziele aus `/targets/targets.txt` mit Trivy und legt JSON-Reports in ein Volume; `cve-exporter` serviert sie als Metriken auf `:9101`, Prometheus scraped sie als Job `cve_exporter`. Dashboard: **Security / CVE-Uebersicht (Trivy)**. @@ -100,8 +102,36 @@ State (`cve_exporter_state`-Volume) -- daher kommt die Spalte "erstmals gesehen". Verschwindet ein Finding, faellt der Eintrag raus (= "geschlossen"). -Bei Stack-Aenderungen `cve/images.txt` nachziehen, sonst scannt die Pipeline -an der Realitaet vorbei. +### Die Zielmenge wird abgeleitet, NICHT gepflegt (#0106, ADR-0026) + +Bis zum 2026-08-21 stand die Zielliste in `cve/images.txt` und musste bei +Stack-Aenderungen von Hand nachgezogen werden. Sie wurde es nicht: Gemessen an +dem Tag deckte sie **27 von 51** laufenden Images ab (52 %). Ungescannt blieben +unter anderem der Web-Client, den jeder Nutzer laedt, **beide** Traefik-Schichten +und die Registry selbst; gleichzeitig lief ein Scan gegen ein Image, das +nirgends mehr laeuft. + +**Es gibt daher nichts mehr nachzuziehen.** Der `cve-exporter` bildet die +Soll-Menge bei jeder Herleitung neu aus drei Quellen und schreibt sie nach +`/targets/targets.txt` (Volume `cve_targets`, fuer den Scanner nur lesbar): + +| Quelle | woher | +|---|---| +| Cluster | `kube_pod_container_info` aus dem eigenen Prometheus | +| Betriebs-Host | `container_last_seen{job="operating_cadvisor"}` — schliesst `gameserver_cadvisor` aus | +| Registry | rohana `/v2`, anonymer Token; die letzten drei Fassungen je Repo | + +Ein Ziel, das aus der Menge faellt, verliert seinen Bericht — sonst meldete ein +ausgemustertes Image weiter. + +⚠️ **Faellt eine Quelle aus, wird die Soll-Menge kleiner — und die Deckung sieht +dadurch BESSER aus, nicht schlechter.** Deshalb traegt jede Quelle einen +Frische-Zeitstempel (`cve_target_source_stale`), auf dem eine Alarmregel steht. +Wer hier etwas aendert, darf diese Absicherung nicht wegkuerzen; ohne sie ist +ein Ausfall der Herleitung von Erfolg nicht zu unterscheiden. + +Deckung im Blick: `cve_target_coverage_ratio`, `cve_targets_missing`, +`cve_targets_orphaned` — im Dashboard *Security / CVE-Uebersicht*. ### Alarm-Zustellung (frueher stummgeschaltet — seit gitops#51 wieder scharf) diff --git a/monitoring/docker-compose.yml b/monitoring/docker-compose.yml index 8da4833..7eaa8b4 100644 --- a/monitoring/docker-compose.yml +++ b/monitoring/docker-compose.yml @@ -88,7 +88,8 @@ services: - traefik # CVE-Pipeline (gitops#47), Teil 1: Trivy scannt die real deployten Images - # (cve/images.txt - Inventur aus dem Cluster, bei Stack-Aenderungen nachziehen) + # (Ziele aus /targets/targets.txt - abgeleitet vom cve-exporter, NICHT von Hand + # pflegen: #0106 / ADR-0026) cve-scan: image: aquasec/trivy:0.58.2 container_name: cve-scan