Teil E — Wie man absichert. Zurück zur Übersicht.
Lernziel
Nach diesem Kapitel kennst du die Prüfverfahren SAST, DAST, SCA und IaC-Scanning mit ihren jeweiligen Stärken, kannst eine Lieferkette absichern und weißt, warum ein Scanner ohne Bearbeitungsverfahren wertlos ist. Der KFZ-Rechner hat eine abgesicherte Pipeline mit Stückliste und Signatur.
Der klassische Ablauf: Die Anwendung ist fertig, dann kommt die Sicherheitsprüfung. Sie dauert drei Wochen, findet vierzig Befunde, und die Hälfte davon lässt sich nur mit erheblichem Umbau beheben. Der Termin steht aber. Also werden Ausnahmen genehmigt, und man nimmt sich vor, das später zu beheben — wobei „später„ ein Fachbegriff für „nie“ ist.
DevSecOps überträgt das Shift-Left-Prinzip aus Kapitel 4 auf die Sicherheit: Prüfungen finden fortlaufend und automatisiert statt, nicht als Torwächter am Ende.
Der wichtigste Satz dieses Kapitels: Sicherheit, die den Fluss blockiert, wird umgangen. Nicht aus Böswilligkeit, sondern weil der Liefertermin ebenfalls eine Vorgabe ist.
Ein Sicherheitsprozess, der drei Wochen dauert, erzeugt Ausnahmegenehmigungen. Einer, der drei Minuten in der Pipeline dauert, erzeugt behobene Befunde. Die zweite Variante findet weniger Einzelfälle, verhindert aber mehr.
| Verfahren | Prüft | Zeitpunkt | Findet | Findet nicht |
|---|---|---|---|---|
| SAST | Quellcode | beim Commit | Injektionen, unsichere Aufrufe | Konfigurationsfehler, Laufzeitprobleme |
| SCA | Abhängigkeiten | beim Bauen | bekannte Schwachstellen in Bibliotheken | eigene Fehler |
| DAST | laufende Anwendung | in der Testumgebung | Fehlkonfiguration, Authentifizierungslücken | Fehler in selten genutzten Pfaden |
| IaC-Scan | Infrastrukturcode | beim Commit | offene Ports, fehlende Verschlüsselung | Anwendungsfehler |
Dazu kommen Secret Scanning (Zugangsdaten im Repository) und Container-Scanning (Schwachstellen im Image).
Keines dieser Verfahren ersetzt die anderen. SAST kennt den Code, aber nicht die Umgebung. DAST kennt die Umgebung, aber nicht den Code. SCA kennt beides nicht, dafür aber die Schwachstellendatenbanken — und der überwiegende Teil der ausnutzbaren Lücken in typischen Anwendungen steckt nicht im Eigenanteil, sondern in den mitgebrachten Bibliotheken.
Eine moderne Anwendung besteht zu einem großen Teil aus fremdem Code. Eine mittelgroße Python- oder JavaScript-Anwendung bringt schnell mehrere hundert Pakete mit, die überwiegend niemand je angesehen hat.
Ein SBOM (Software Bill of Materials) ist die Stückliste dazu: eine maschinenlesbare Aufstellung aller enthaltenen Komponenten mit Version und Herkunft.
# SBOM erzeugen syft packages dir:. -o cyclonedx-json > sbom.json # Gegen bekannte Schwachstellen prüfen grype sbom:sbom.json # Image signieren cosign sign --key cosign.key registry.intern/kfz-rechner:2.5.0 # Signatur prüfen - vor dem Ausrollen cosign verify --key cosign.pub registry.intern/kfz-rechner:2.5.0
Der praktische Wert eines SBOM zeigt sich am Tag einer neuen kritischen Schwachstelle.
Die Frage lautet dann: „Sind wir betroffen?„ Ohne Stückliste beginnt eine Suchaktion über alle Systeme, die Tage dauert und deren Ergebnis niemand garantieren kann. Mit Stückliste ist es eine Abfrage von Sekunden — und die Antwort ist belastbar.
Wer die Log4j-Woche im Dezember 2021 miterlebt hat, braucht keine weitere Begründung. Wer nicht, dem sei gesagt: Der überwiegende Teil des Aufwands entfiel damals nicht auf das Patchen, sondern auf die Frage, wo das Ding überhaupt überall steckte.
# Versionen festnageln - reproduzierbare Builds pip-compile requirements.in --generate-hashes -o requirements.txt
Automatische Aktualisierungswerkzeuge wie Renovate oder Dependabot legen Pull Requests für neue Versionen an. Zusammen mit einer belastbaren Testsuite aus Kapitel 4 wird daraus ein funktionierendes Verfahren: Der Pull Request kommt automatisch, die Pipeline prüft, ein Mensch führt zusammen.
Die Gegenrichtung ist eine Falle. Automatische Aktualisierungen ohne Tests bedeuten, dass fremder Code ungeprüft in die eigene Anwendung wandert. Angriffe über kompromittierte Pakete sind real und nehmen zu — von der übernommenen Bibliothek bis zum Tippfehler-Paket, das dem echten zum Verwechseln ähnlich sieht.
Merke: Automatische Aktualisierung braucht automatische Prüfung. Sonst tauscht man ein bekanntes Risiko gegen ein unbekanntes.
Der häufigste Fehler beim Einführen von Scannern: Man schaltet sie ein, bekommt 1.400 Befunde und schaltet sie wieder aus.
Ein tragfähiges Vorgehen:
schwachstellen: stage: scannen script: # Bestand: nur berichten - trivy image --exit-code 0 --severity LOW,MEDIUM "$IMAGE:$TAG" # Neue kritische Befunde: Pipeline rot - trivy image --exit-code 1 --severity HIGH,CRITICAL --ignorefile .trivyignore "$IMAGE:$TAG"
# Befristete Ausnahmen - jede mit Begründung und Ablaufdatum! # CVE-2024-12345 bis 2026-09-30, Fix erfordert Umstieg auf lib 4.x, # Ticket SEC-231, nicht erreichbar (kein Netzwerkpfad) CVE-2024-12345
Nicht jeder Befund ist ein Risiko. Eine Schwachstelle in einer Bibliothek, deren betroffene Funktion die Anwendung gar nicht aufruft, ist real vorhanden und praktisch bedeutungslos. Umgekehrt kann ein mittelschwerer Befund an einer exponierten Stelle dringlicher sein als ein kritischer im Innern. Bewertung braucht Kontext, und der Scanner hat ihn nicht.
Werkzeuge finden bekannte Muster. Konstruktionsfehler finden sie nicht — dafür braucht es ein Gespräch, und zwar vor dem Bauen.
Vier Fragen, die für den Anfang genügen:
Als Gedankenstütze für die zweite Frage dient STRIDE:
| Buchstabe | Bedrohung | Beim KFZ-Rechner |
|---|---|---|
| Spoofing | Identitätsvortäuschung | Kann jemand fremde Vertragsdaten abrufen? |
| Tampering | Manipulation | Kann die berechnete Prämie verändert werden? |
| Repudiation | Abstreitbarkeit | Ist nachweisbar, wer welche Berechnung veranlasst hat? |
| Information Disclosure | Informationsabfluss | Landen Vertragsdaten in Logs? |
| Denial of Service | Verfügbarkeit | Was passiert bei 10.000 Anfragen pro Sekunde? |
| Elevation of Privilege | Rechteausweitung | Kann ein Anwender Verwaltungsfunktionen erreichen? |
Eine Stunde mit einem Whiteboard zu Beginn ersetzt keine Werkzeuge, findet aber die Sorte Fehler, die kein Werkzeug je findet.
stages: [pruefen, testen, bauen, scannen, ausrollen] # ---------- schnelle Prüfungen ---------- geheimnisse: stage: pruefen image: zricethezav/gitleaks:latest script: - gitleaks detect --source . --redact --verbose sast: stage: pruefen image: python:3.12-slim script: - pip install --quiet bandit - bandit -r src/ -f json -o bandit.json || true - bandit -r src/ -ll # blockiert ab Schweregrad "medium" artifacts: paths: [bandit.json] when: always iac-scan: stage: pruefen image: bridgecrew/checkov:latest script: - checkov -d ansible/ --compact --quiet - checkov -f Containerfile --framework dockerfile # ---------- Abhängigkeiten ---------- sca: stage: testen image: python:3.12-slim script: - pip install --quiet pip-audit - pip-audit -r requirements.txt --strict # ---------- Stückliste und Signatur ---------- sbom: stage: bauen image: anchore/syft:latest script: - syft "$IMAGE:$TAG" -o cyclonedx-json > sbom.json artifacts: paths: [sbom.json] expire_in: 1 year # für die Nachweisführung aufbewahren signieren: stage: bauen image: gcr.io/projectsigstore/cosign:latest script: - echo "$COSIGN_KEY" > /tmp/cosign.key - cosign sign --key /tmp/cosign.key "$IMAGE:$TAG" after_script: - shred -u /tmp/cosign.key # ---------- Container prüfen ---------- container-scan: stage: scannen image: aquasec/trivy:latest script: - trivy image --exit-code 0 --severity LOW,MEDIUM "$IMAGE:$TAG" - trivy image --exit-code 1 --severity HIGH,CRITICAL "$IMAGE:$TAG"
Aufgaben:
bandit ihn?gitleaks es? Nimm den Commit zurück — und wechsle das Passwort trotzdem..trivyignore mit Begründung und Ablaufdatum.| Anti-Pattern | Folge | Abhilfe |
|---|---|---|
| Sicherheitsprüfung erst am Ende | Befunde kommen, wenn ihre Behebung teuer ist | Shift-Left |
| Scanner ohne Bearbeitungsverfahren | 1.400 Befunde, die niemand ansieht | Basislinie, dann keine neuen |
| Alles blockierend stellen | Pipeline dauerhaft rot, wird umgangen | nach Schweregrad staffeln |
| Unbefristete Ausnahmen | „temporär„ wird dauerhaft | Ablaufdatum verpflichtend |
| Automatische Updates ohne Tests | fremder Code ungeprüft in Produktion | Tests als Voraussetzung |
| Geheimnisse im Repository | Kompromittierung | Secret Scanning, Tresor |
| Kein SBOM | „Sind wir von X betroffen?“ bleibt tagelang offen | Stückliste je Build |
| Sicherheit als eigene Abteilung mit Vetorecht | Umgehung, Schattenprozesse | Security Champions in den Teams |
Wenn morgen früh eine kritische Schwachstelle in einer weit verbreiteten Bibliothek bekannt wird — wie lange braucht ihr für die Antwort auf die Frage, ob und wo ihr betroffen seid?
Weiter mit Kapitel 15 — DORA-Metriken, SLI, SLO und Error Budget