Files
threadnet-operating/monitoring/cve/scan-loop.sh
T

51 lines
2.1 KiB
Bash
Raw Normal View History

#!/bin/sh
# 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
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 < "$TARGETS"
echo "runde fertig: ${anzahl} Ziele, schlafe ${INTERVAL}s"
sleep "$INTERVAL"
done