From 386b65a9e0afce6dd3837dcabc97077621a886fe Mon Sep 17 00:00:00 2001 From: Thore Cimbal Date: Fri, 21 Aug 2026 12:00:00 +0000 Subject: [PATCH] cve: the scanner reads the derived set, images.txt is gone (#0106) Criterion one of this piece of work was that the hand-maintained list stops existing and is not replaced by another maintained file. It is deleted here; the scanner reads what the exporter derives. Without a usable list the loop does nothing at all and retries in a minute rather than sleeping out the full day, because after a deploy the exporter only writes the file on its next scrape. The old file staying put during a failed derivation is deliberate: the loop then keeps working from the last known state instead of running into nothing. Probed rather than assumed, with trivy stubbed: no list skips the round, an empty list skips the round, and a list with a comment header scans exactly its two entries. --- monitoring/cve/images.txt | 29 ------------------------- monitoring/cve/scan-loop.sh | 43 ++++++++++++++++++++++++++++++------- 2 files changed, 35 insertions(+), 37 deletions(-) delete mode 100644 monitoring/cve/images.txt diff --git a/monitoring/cve/images.txt b/monitoring/cve/images.txt deleted file mode 100644 index 2c246eb..0000000 --- a/monitoring/cve/images.txt +++ /dev/null @@ -1,29 +0,0 @@ -clamav/clamav:1.5.3 -coturn/coturn:latest -docker.io/grafana/alloy:v1.7.5 -docker.io/library/haproxy:3.2-alpine -docker.io/library/postgres:17.9-bookworm -docker.io/livekit/livekit-server:v1.10.0 -docker.io/postgres:17-alpine -docker.io/prometheuscommunity/postgres-exporter:v0.18.1 -ghcr.io/element-hq/ess-helm/matrix-tools:0.7.3 -ghcr.io/element-hq/matrix-authentication-service:1.15.0 -ghcr.io/fluxcd/helm-controller:v1.5.3 -ghcr.io/fluxcd/kustomize-controller:v1.8.3 -ghcr.io/fluxcd/notification-controller:v1.8.3 -ghcr.io/fluxcd/source-controller:v1.8.2 -ghcr.io/goauthentik/server:2026.2.3 -gnuxie/draupnir:v3.1.0 -nginx:1.26-alpine -oci.element.io/element-admin:0.1.11 -oci.element.io/lk-jwt-service:0.4.2 -oci.element.io/synapse:v1.151.0-ess.1 -quay.io/jetstack/cert-manager-cainjector:v1.14.0 -quay.io/jetstack/cert-manager-controller:v1.14.0 -quay.io/jetstack/cert-manager-webhook:v1.14.0 -quay.io/prometheus-operator/prometheus-config-reloader:v0.81.0 -registry.k8s.io/kube-state-metrics/kube-state-metrics:v2.15.0 -rohana.axion1337.de/sorb/axion-backup:v2 -rohana.axion1337.de/sorb/axion-secret-rotation:v1 -rohana.axion1337.de/sorb/clamav-http-scanner:v1.0.0 -rohana.axion1337.de/sorb/threadnet-web:v0.3.0 diff --git a/monitoring/cve/scan-loop.sh b/monitoring/cve/scan-loop.sh index 5751e4b..47658f9 100644 --- a/monitoring/cve/scan-loop.sh +++ b/monitoring/cve/scan-loop.sh @@ -1,23 +1,50 @@ #!/bin/sh -# Trivy-Scan-Schleife (gitops#47): scannt alle 24h die Liste der real deployten -# Images (cve/images.txt, aus dem Cluster inventarisiert) und legt die -# JSON-Reports fuer den cve-exporter ab. Kein Abbruch bei Einzelfehlern - -# ein nicht mehr pullbares Image darf den Rest nicht verhindern (der Exporter -# alarmiert ueber trivy_last_scan_timestamp, wenn ein Report veraltet). +# Trivy-Scan-Schleife (gitops#47, seit #0106 mit abgeleiteter Zielmenge). +# +# Die Ziele standen bis 2026-08-21 in cve/images.txt und wurden von Hand +# nachgezogen. Gemessen an dem Tag: 27 von 51 laufenden Images, also 52 % - +# nicht gescannt wurden unter anderem der Web-Client, den jeder Nutzer laedt, +# beide Traefik-Schichten und die Registry selbst. Gleichzeitig lief ein Scan +# gegen threadnet-web:v0.3.0, ein Image, das nirgends mehr laeuft. +# +# Seitdem schreibt der cve-exporter die Soll-Menge nach /targets/targets.txt +# (Quellen: Cluster-Metriken, cAdvisor des Betriebs-Hosts, Registry). Diese +# Datei wird NICHT von Hand gepflegt - siehe ADR-0026. +# +# Kein Abbruch bei Einzelfehlern: Ein nicht mehr pullbares Image darf den Rest +# nicht verhindern; der Exporter alarmiert ueber trivy_last_scan_timestamp, +# wenn ein Report veraltet. set -u RESULTS=/results -IMAGES=/config/images.txt +TARGETS="${TARGETS_FILE:-/targets/targets.txt}" INTERVAL="${SCAN_INTERVAL_SECONDS:-86400}" +# ⚠️ Kurze Wartezeit, wenn die Zielliste (noch) fehlt: Beim ersten Start nach +# einem Ausrollen schreibt der Exporter sie erst beim naechsten Scrape. Mit dem +# vollen 24h-Intervall stuende der Scanner deswegen einen Tag still. +WARTEZEIT="${WARTE_INTERVAL_SECONDS:-60}" while true; do + # ⚠️ Ohne brauchbare Zielliste wird NICHTS getan. Der Exporter schreibt sie + # nur, wenn mindestens eine Quelle geliefert hat - faellt die Herleitung + # ganz aus, bleibt die alte Datei stehen und diese Schleife arbeitet + # weiter mit dem letzten bekannten Stand, statt ins Leere zu laufen. + if [ ! -s "$TARGETS" ]; then + echo "warte: $TARGETS fehlt oder ist leer - keine Runde" + sleep "$WARTEZEIT" + continue + fi + + anzahl=0 while IFS= read -r img; do case "$img" in ""|\#*) continue;; esac + anzahl=$((anzahl + 1)) safe=$(echo "$img" | tr '/:@' '___') echo "scan: $img" trivy image --scanners vuln --format json --output "$RESULTS/$safe.json.tmp" "$img" \ && mv "$RESULTS/$safe.json.tmp" "$RESULTS/$safe.json" \ || echo "FEHLER bei $img (Report bleibt auf altem Stand)" - done < "$IMAGES" - echo "runde fertig, schlafe ${INTERVAL}s" + done < "$TARGETS" + + echo "runde fertig: ${anzahl} Ziele, schlafe ${INTERVAL}s" sleep "$INTERVAL" done