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.
51 lines
2.1 KiB
Bash
51 lines
2.1 KiB
Bash
#!/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
|