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.
This commit is contained in:
Thore Cimbal
2026-08-21 12:00:00 +00:00
parent b989987d69
commit 386b65a9e0
2 changed files with 35 additions and 37 deletions
-29
View File
@@ -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
+35 -8
View File
@@ -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