14 — DevSecOps
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.
14.1 Sicherheit als Flaschenhals
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.
14.2 Die vier Prüfverfahren
| 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.
14.3 Lieferkette und Stückliste
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.
14.4 Abhängigkeiten pflegen
# 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.
14.5 Umgang mit Befunden
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:
- Basislinie ziehen. Alle bestehenden Befunde werden zunächst dokumentiert, aber nicht blockierend gestellt.
- Ab jetzt keine neuen. Die Pipeline wird rot bei neuen Befunden ab „hoch“. Das ist die entscheidende Regel — sie verhindert Verschlechterung ohne den Betrieb lahmzulegen.
- Bestand abarbeiten. Ein festes Kontingent pro Sprint, nach Risiko sortiert.
- Ausnahmen befristen. Jede Ausnahme bekommt Begründung, Verantwortlichen und Ablaufdatum.
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"
- .trivyignore
# 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.
14.6 Bedrohungsmodellierung
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:
- Woran arbeiten wir? (Ein Bild reicht.)
- Was kann schiefgehen?
- Was tun wir dagegen?
- Haben wir gute Arbeit geleistet?
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.
14.7 Lab: Die abgesicherte Pipeline
- .gitlab-ci.yml
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:
- Bring alle Stufen zum Laufen. Wie lange dauert die Pipeline jetzt insgesamt?
- Baue absichtlich einen SQL-String per Zeichenkettenverkettung. Findet
banditihn? - Trage ein Passwort in eine Datei ein und committe. Findet
gitleakses? Nimm den Commit zurück — und wechsle das Passwort trotzdem. - Erzeuge die Stückliste und suche darin eine Bibliothek, von deren Existenz du nichts wusstest.
- Setze eine Ausnahme in
.trivyignoremit Begründung und Ablaufdatum. - Ergänze in der Ausrollstufe eine Signaturprüfung, die verhindert, dass unsignierte Images starten.
14.8 Anti-Pattern
| 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 |
14.9 Reflexionsfrage
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
