#!/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