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