Wo Qualitäts-Gates in Ihrer Pipeline sitzen, ist wichtiger als was Sie scannen
Sie pushen einen Commit. Die Pipeline startet. Sie warten. Und warten. Nach fünfzehn Minuten schlägt die Pipeline fehl – wegen einer niedrigen Schwachstelle in einer Bibliothek, die Ihr Code nicht einmal verwendet. Sie beheben das Problem, pushen erneut und warten wieder fünfzehn Minuten.
Das ist der Preis, wenn jedes Qualitäts-Gate an derselben Stelle in der Pipeline sitzt. Die Alternative ist genauso frustrierend: Alle Scans laufen ganz am Ende, kurz vor der Produktion. Ihr Code besteht Build, Unit-Tests, Integrationstests und Staging. Dann schlägt er fehl, weil ein hartcodiertes Secret seit dem ersten Commit in einer Konfigurationsdatei lag. Sie haben Stunden an Pipeline-Zeit für etwas verschwendet, das in Sekunden hätte erkannt werden können.
Die Position jedes Gates bestimmt zwei Dinge: wie schnell Entwickler Feedback bekommen und wie viel Zeit und Rechenleistung Sie verschwenden, wenn etwas fehlschlägt. Dies richtig zu machen, bedeutet nicht, zwischen Geschwindigkeit und Sicherheit zu wählen. Es geht darum, Prüfungen so anzuordnen, dass beide zusammenarbeiten.
Schnell und leicht zuerst, schwer später
Das grundlegende Prinzip ist einfach: schnelle, leichte Prüfungen laufen früh in der Pipeline. Schwere Prüfungen, die mehr Kontext benötigen, laufen später. Aber es geht nicht darum, Scans in zwei Gruppen aufzuteilen. Jede Art von Scan hat einen natürlichen Platz, an dem sie den größten Nutzen bei geringster Reibung bietet.
Das folgende Diagramm ordnet jedes Gate seiner empfohlenen Pipeline-Stufe zu:
Secret Scan: Vor dem Build ausführen
Secrets sollten erkannt werden, bevor etwas gebaut wird. Sobald ein Secret in ein Container-Image oder Artefakt eingebettet ist, wird das Entfernen viel schwieriger. Das Image könnte bereits in eine Registry gepusht, von anderen Systemen gezogen oder in einer Umgebung deployed worden sein. Selbst wenn Sie das Image löschen, könnte das Secret irgendwo zwischengespeichert oder protokolliert sein.
Führen Sie den Secret-Scan direkt nach dem Code-Checkout aus, vor jedem Build-Schritt. Wenn die Pipeline einen hartcodierten API-Key oder ein Datenbankpasswort findet, erhält der Entwickler sofortiges Feedback. Er repariert die Datei, pusht erneut, und die Pipeline startet neu, ohne auf einen Build gewartet zu haben, der ohnehin verschwendet gewesen wäre.
Dependency Scan: Vor der Artefakterstellung
Dependency-Scans prüfen die Bibliotheken, die Ihr Projekt einbindet. Sie benötigen die Manifest-Datei der Abhängigkeiten, die direkt nach dem Checkout verfügbar ist. Der natürliche Platz für diesen Scan ist nach dem Checkout, aber bevor das Artefakt gebaut wird.
Wenn eine neu hinzugefügte Bibliothek eine kritische Schwachstelle aufweist, schlägt die Pipeline früh fehl. Der Entwickler wartet nicht auf Build, Unit-Tests oder Integrationstests. Er behebt die Abhängigkeit und pusht erneut. Das ist die Essenz von frühem Feedback: schnell scheitern bei Problemen, die billig zu beheben sind.
Manche Dependency-Scanner sind schnell genug, um vor dem Build zu laufen. Andere sind langsamer. Wenn Ihr Scanner mehrere Minuten benötigt, sollten Sie erwägen, ihn bei jedem Commit nur für den Hauptbranch auszuführen und bei Pull-Requests für Feature-Branches. So bleibt das Feedback für die tägliche Arbeit schnell, während Probleme dennoch erfasst werden, bevor sie die Produktion erreichen.
Container Image Scan: Nach dem Build, vor der Registry
Container-Image-Scans sind anders. Sie können ein Image erst scannen, wenn es existiert. Der richtige Platz ist nach dem Bau des Images, bevor es in eine Registry gepusht oder in einer Umgebung verwendet wird.
Wenn das Image Schwachstellen enthält, stoppt die Pipeline hier. Das Image erreicht nie Staging oder Produktion. Das ist wichtig, denn sobald ein Image in einer Registry ist, könnten andere Pipelines oder Teams es ziehen. Das Stoppen der Pipeline an dieser Stelle verhindert, dass verwundbare Images sich verbreiten.
Der Kompromiss ist, dass Image-Scans Zeit kosten. Wenn Ihr Team viele Commits pro Tag pusht, können vollständige Image-Scans bei jedem Commit die Pipeline erheblich verlangsamen. Ein gängiger Ansatz ist, bei jedem Commit einen schnellen Scan und bei Merges in den Hauptbranch einen vollständigen Scan durchzuführen. Ein anderer ist, Scan-Ergebnisse zwischenzuspeichern und nur erneut zu scannen, wenn sich das Basis-Image oder die Abhängigkeiten ändern.
IaC Scan und Policy Check: Zwei Orte, zwei Zwecke
Infrastructure-as-Code-Scans und Policy-Checks können an zwei verschiedenen Punkten ausgeführt werden, und jeder dient einem anderen Zweck.
Führen Sie sie erstens aus, wenn der Infrastrukturcode geschrieben wird. Das gibt Entwicklern schnelles Feedback, während sie noch an der Konfiguration arbeiten. Sie müssen nicht auf einen vollständigen Pipeline-Durchlauf warten, um zu wissen, dass eine Security-Group-Regel zu permissiv ist oder ein Storage-Bucket öffentlich zugänglich ist.
Zweitens führen Sie sie erneut aus, bevor die Konfiguration auf eine Umgebung angewendet wird. Das ist das Compliance-Gate. Selbst wenn der Entwickler die frühere Warnung ignoriert hat, erzwingt die Pipeline die Richtlinie, bevor Infrastrukturänderungen wirksam werden.
Das erste Gate dient der Bequemlichkeit des Entwicklers. Das zweite dient der Compliance-Sicherheit. Beide sind nötig, aber sie müssen nicht dieselben Prüfungen durchführen. Das frühe Gate kann leichtere Prüfungen ausführen, während das spätere Gate die vollständige Policy-Suite ausführt.
Was Sie vermeiden sollten: Ein großes Gate am Ende
Das schlechteste Muster ist, alle Scans in einem einzigen Block am Ende der Pipeline zu platzieren. Das erzeugt eine lange Feedback-Schleife für jede Art von Problem. Ein fehlendes Secret, eine verwundbare Abhängigkeit, eine falsch konfigurierte IaC-Datei und eine Container-Schwachstelle werden alle gleichzeitig gemeldet, nachdem der Entwickler auf Build, Unit-Tests, Integrationstests und Staging gewartet hat.
Dieses Muster macht die Pipeline auch anfällig. Ein langsamer Scan blockiert alle anderen. Wenn ein Scan fehlschlägt, muss der Entwickler das Problem beheben und die gesamte Pipeline erneut durchlaufen, einschließlich aller Schritte, die bereits bestanden haben.
Verteilen Sie Gates über die Pipeline, sodass jede Stufe eine klare Verantwortung hat. Die frühen Stufen fangen billige Probleme schnell ab. Die späteren Stufen fangen teure Probleme ab, bevor sie die Produktion erreichen.
Berücksichtigen Sie die Kosten des Scannens
Manche Scans sind teuer. Vollständige Dependency-Datenbankabfragen, tiefgehende Container-Analysen und umfassende Policy-Auswertungen können Minuten dauern und erhebliche Rechenressourcen verbrauchen. Diese bei jedem Commit für jeden Branch auszuführen, ist verschwenderisch.
Die Lösung ist nicht, die Scans auszulassen. Es geht darum, sie strategisch zu platzieren. Führen Sie teure Scans nur auf dem Hauptbranch oder auf Pull-Requests aus, die auf den Hauptbranch abzielen. Für Feature-Branches führen Sie nur die schnellen Prüfungen durch: Secret-Scan, schnellen Dependency-Scan und Syntax-Validierung. Das hält die Pipeline für die tägliche Arbeit schnell, während die Qualität dennoch sichergestellt wird, bevor Code die Produktion erreicht.
Praktische Checkliste
- Secret-Scan läuft vor dem Build, direkt nach dem Checkout.
- Dependency-Scan läuft vor der Artefakterstellung, unter Verwendung der Manifest-Datei.
- Container-Image-Scan läuft nach dem Build, vor dem Registry-Push.
- IaC-Scan läuft an zwei Punkten: während der Entwicklung und vor dem Environment-Apply.
- Teure Scans laufen nur auf dem Hauptbranch oder Merge-Zielen.
- Schnelle Scans laufen bei jedem Commit für alle Branches.
Das Fazit
Ein gut platziertes Gate fängt Probleme früh, wenn sie billig zu beheben sind. Ein schlecht platziertes Gate fängt Probleme spät, nachdem Zeit und Rechenleistung verschwendet wurden. Das Ziel ist nicht, überall alles zu scannen. Es geht darum, jeden Scan dort zu platzieren, wo er das schnellste Feedback für die Probleme gibt, die er erkennen soll. Wenn die Platzierung stimmt, bekommen Entwickler schnelle Erfolge, Compliance bekommt ihre Garantien, und die Pipeline bleibt schnell genug, dass niemand sie umgehen will.