Zum Inhalt springen
Category: Hardening9 Min. Lesezeit

CI/CD-Pipelines gegen Kompromittierung haerten

Por Lucas Andrade ·

Verteidiger-Leitfaden zur CI/CD-Sicherheit: Angriffsflaeche, wie Kompromittierung ablaeuft, Erkennungssignale und eine Haertungs-Checkliste fuer Runner.

In diesem Artikel

Eine Pipeline fuer kontinuierliche Integration und Auslieferung ist eines der maechtigsten Systeme jeder Ingenieurorganisation. Sie haelt Zugangsdaten zur Produktion, kann Code an Millionen von Nutzern ausrollen und laeuft weitgehend unbeaufsichtigt. Diese Kombination macht sie zum bevorzugten Ziel: Wer die Pipeline einmal kompromittiert, erbt ihre Reichweite. Dieser Artikel richtet sich an Verteidiger, Plattform-Ingenieure und Release-Verantwortliche. Er erklaert, warum CI/CD ein so wertvolles Ziel ist, wie eine Kompromittierung konzeptionell ablaeuft und — der Groszteil des Textes — welche Erkennungssignale und Haertungskontrollen Ihren Build- und Deploy-Pfad vertrauenswuerdig halten. Der Rahmen ist durchweg defensiv: das Risiko verstehen, um es zu schlieszen, nicht um es auszunutzen.

Warum CI/CD ein wertvolles Ziel ist

Eine Pipeline buendelt Privilegien auf eine Weise, wie es wenige andere Systeme tun. Sie haelt typischerweise Bereitstellungs-Zugangsdaten, Cloud-Rollen, Paketregister-Token, Signaturschluessel und Zugriff auf die Quelle der Wahrheit fuer Ihren Code. Sie fuehrt auszerdem naturgemaesz beliebigen Code aus — jeder Build fuehrt aus, was das Repository ihm vorgibt. Ein Angreifer, der beeinflusst, was laeuft, oder der stiehlt, was die Pipeline erreichen kann, gewinnt einen direkten Weg zur Produktion, der viele der die Anwendung schuetzenden Kontrollen umgeht. Schlimmer noch: Aenderungen, die ueber den Build eingebracht werden, werden von nachgelagerten Konsumenten vertraut — ein manipuliertes Artefakt wird signiert, veroeffentlicht und mit dem Ruf der Organisation im Ruecken ausgerollt. Das ist der Kern eines Lieferketten-Risikos, und darum verdient Pipeline-Sicherheit dieselbe Strenge wie Produktionszugriff.

Wie eine Pipeline-Kompromittierung typischerweise ablaeuft

Auf hoher Ebene sollten Verteidiger einige wiederkehrende Pfade verstehen, um dagegen instrumentieren zu koennen. Ein Pfad ist die boesartige oder kompromittierte Aenderung: Ein Angreifer, der Commit-Zugriff erlangt oder eine Aenderung an der Pruefung vorbeischleust, veraendert die Build-Definition, um Geheimnisse zu exfiltrieren oder Code einzuschleusen. Ein zweiter ist die vergiftete Abhaengigkeit: Ein Paket, das der Build hereinzieht, ist stromaufwaerts oder per Typosquatting hintertuert und laeuft mit den Rechten der Pipeline. Ein dritter ist das offengelegte Geheimnis: ein langlebiges Token, das ins Repository committet, in einem Log ausgegeben oder von einem Pull-Request-Build aus einem nicht vertrauenswuerdigen Fork lesbar ist. Ein vierter ist der kompromittierte Runner: eine geteilte oder selbstgehostete Build-Maschine, die Zustand zwischen Jobs behaelt, sodass ein Job den naechsten manipulieren kann. Diese Formen zu kennen sagt Ihnen genau, wo Kontrollen und Telemetrie zu platzieren sind.

Die Angriffsflaeche der Pipeline

Kartieren Sie die Flaeche, bevor Sie sie verteidigen. Sie umfasst das Quellcodeverwaltungssystem (Branch-Schutz, wer pushen und mergen darf, wer Workflow-Dateien aendern darf), die CI-Konfiguration selbst (die Code ist und wie Code gepruft werden muss), die Build-Runner (gehostet oder selbstgehostet, kurzlebig oder persistent), die Geheimnisse und Zugangsdaten, die die Pipeline lesen kann, die Abhaengigkeiten und Basis-Images, die zur Build-Zeit gezogen werden, das Artefakt-Register, in dem Ausgaben gespeichert werden, und das Bereitstellungsziel, das die Pipeline erreichen kann. Drittanbieter-Actions, Plugins und Orbs gehoeren ebenfalls zu dieser Flaeche, denn sie fuehren innerhalb Ihres Builds mit Ihren Rechten aus. Jede davon ist ein Ort, an dem Vertrauen fehl am Platz sein kann, und jede verdient eine ausdrueckliche Kontrolle statt einer stillschweigenden Sicherheitsannahme.

Quelle und Aenderungsprozess absichern

Die Pipeline ist nur so vertrauenswuerdig wie der Code, den sie baut, beginnen Sie also beim Repository. Erzwingen Sie Branch-Schutz auf Release-Branches: Verlangen Sie Pull Requests, mindestens eine unabhaengige Pruefung und bestandene Statuschecks vor dem Merge, ohne direkte Pushes und ohne Force-Push. Verlangen Sie signierte Commits oder verifizierte Urheberschaft, damit Identitaet nicht gefaelscht werden kann. Behandeln Sie die CI-Konfigurationsdateien als geschuetzten Code — eine Aenderung an einem Workflow sollte dieselbe Pruefung verlangen wie eine Aenderung an der Produktionslogik, denn sie kann mehr anrichten. Beschraenken Sie, wer Pipeline-Definitionen aendern und wer Bereitstellungen genehmigen darf, und trennen Sie diese Aufgaben, wo Sie koennen. Schuetzen Sie schlieszlich die Konten selbst mit starker Mehrfaktor-Authentifizierung und phishing-resistenten Methoden, denn eine gestohlene Maintainer-Sitzung ist ein direkter Weg in den Build.

Geheimnisse und Zugangsdaten absichern

Geheimnisse sind die Beute, minimieren Sie also sowohl ihre Zahl als auch ihre Macht. Bevorzugen Sie kurzlebige Workload-Identitaets-Zugangsdaten — OpenID-Connect-Foederation von der Pipeline zu Ihrem Cloud-Anbieter — gegenueber langlebigen statischen Schluesseln, damit es kein dauerhaftes Geheimnis zu stehlen gibt. Beschraenken Sie jedes Anmeldeinformationselement auf das geringste Privileg und die engste benoetigte Ressource, und gewaehren Sie einem Build niemals breite Administratorrechte 'zur Sicherheit'. Speichern Sie verbleibende Geheimnisse in einem verwalteten Tresor und injizieren Sie sie zur Laufzeit; committen Sie sie nie und konfigurieren Sie die Plattform so, dass sie Geheimnisse in Logs maskiert, damit ein unachtsames echo sie nicht leaken kann. Entscheidend: Legen Sie Bereitstellungsgeheimnisse niemals Builds offen, die durch Pull Requests aus Forks ausgeloest werden und nicht vertrauenswuerdigen Code ausfuehren. Rotieren Sie Zugangsdaten planmaeszig und sofort bei jedem Verdacht und protokollieren Sie jeden Geheimniszugriff, damit Sie pruefen koennen, wer was gelesen hat.

Build-Runner haerten und isolieren

Runner fuehren standardmaeszig nicht vertrauenswuerdigen Code aus, isolieren Sie sie also entsprechend. Bevorzugen Sie kurzlebige Runner, die fuer jeden Job frisch erstellt und danach zerstoert werden, sodass kein Zustand von einem Job zum naechsten weitergegeben wird. Wenn Sie selbstgehostete Runner nutzen muessen, halten Sie sie fern von jedem Netzwerkpfad zu sensiblen Systemen, betreiben Sie sie als unprivilegierte Nutzer in isolierten Containern oder virtuellen Maschinen und teilen Sie niemals einen persistenten selbstgehosteten Runner zwischen vertrauenswuerdigen und nicht vertrauenswuerdigen Arbeitslasten — der Pull Request eines oeffentlichen Forks darf nicht auf derselben Maschine landen, die Produktions-Zugangsdaten haelt. Pinnen Sie das Runner-Image und patchen Sie es kontinuierlich. Beschraenken Sie den ausgehenden Netzwerkzugriff, damit ein kompromittierter Build nicht frei Daten exfiltrieren kann, und deaktivieren Sie nicht benoetigte Funktionen. Das Ziel: Selbst ein voellig feindlicher Job gewinnt nichts Dauerhaftes und erreicht nichts Sensibles.

Lieferkette: Abhaengigkeiten und Artefakt-Integritaet

Das meiste, was ein Build ausfuehrt, ist Code, den Sie nicht geschrieben haben. Verteidigen Sie diese Grenze bewusst. Pinnen Sie Abhaengigkeiten auf exakte Versionen mit einer Lockfile und pruefen Sie Integritaets-Hashes, damit ein Austausch stromaufwaerts nicht stillschweigend aendert, was Sie kompilieren. Ziehen Sie Drittanbieter-CI-Actions per unveraenderlichem Commit-Digest statt eines veraenderlichen Tags, da ein Tag auf boesartigen Code umgebogen werden kann. Scannen Sie Abhaengigkeiten auf bekannte Schwachstellen und verdaechtige Aenderungen und pflegen Sie, wo praktikabel, eine Allowlist vertrauenswuerdiger Quellen. Auf der Ausgabeseite: Erzeugen Sie eine Software-Stueckliste, damit Sie genau wissen, was ausgeliefert wurde, und signieren Sie Ihre Artefakte und Container-Images, damit nachgelagerte Systeme Integritaet und Herkunft vor dem Ausrollen pruefen koennen. Streben Sie eine Herkunftsattestierung an — einen ueberpruefbaren Nachweis, wie und woraus ein Artefakt gebaut wurde — damit eine manipulierte Ausgabe die Pruefung nicht besteht, statt ausgeliefert zu werden.

Erkennung — Signale und Telemetrie

Haertung senkt die Wahrscheinlichkeit; Erkennung faengt, was durchrutscht. Senden Sie Build-Logs, Runner-Audit-Ereignisse und Quellcodeverwaltungs-Audit-Logs an Ihr SIEM und achten Sie auf konkrete Signale. Auf der Quellseite: Aenderungen an geschuetzten Workflow-Dateien, neue oder geaenderte Pipeline-Geheimnisse, hinzugefuegte Deploy-Schluessel, deaktivierter Branch-Schutz und Pushes auszerhalb der ueblichen Zeiten oder von unbekannten Identitaeten. Auf der Build-Seite: unerwartete ausgehende Netzwerkverbindungen von einem Runner, ein Job, der Geheimnisse liest, die er nie zuvor brauchte, neue zur Build-Zeit geholte Werkzeuge oder Pakete und anomale Build-Dauer oder Ressourcennutzung. Auf der Ausgabeseite: ein Artefakt, das ohne passenden signierten Herkunftsnachweis veroeffentlicht wird, oder eine Bereitstellung, die nicht aus einem genehmigten Pipeline-Lauf stammt. Behandeln Sie das Deaktivieren einer Sicherheitskontrolle — eines Scans, einer erforderlichen Pruefung, der Log-Weiterleitung — als Alarm hoher Schwere, denn Angreifer schalten routinemaeszig ab, was sie fangen wuerde.

Haeufige Fallstricke

Teams untergraben gute Pipelines auf vertraute Weise. Ueberprivilegierte Pipeline-Zugangsdaten sind am haeufigsten: Ein einziges breites Token, ueberall verwendet, macht jede kleine Kompromittierung zu einer vollstaendigen. Veraenderlichen Referenzen vertrauen — schwebende Tags an Actions und Basis-Images — erlaubt Angreifern, Ihren Build zu aendern, ohne Ihr Repository zu beruehren. Fork-Pull-Requests mit Geheimnissen auszufuehren uebergibt nicht vertrauenswuerdigem Code Ihre Schluessel. Persistente geteilte Runner lassen einen Job einen anderen vergiften. Die CI-Konfiguration nicht als Code zu behandeln bedeutet, dass Workflow-Aenderungen ohne Pruefung ausgeliefert werden. Und Geheimnisse zu protokollieren — ueber Debug-Ausgaben oder ausfuehrliche Fehlerbehandlung — leakt still Zugangsdaten an Orte, die viele lesen koennen. Jeder davon ist ein bequemer Standard, der viel Sicherheit gegen wenig Bequemlichkeit tauscht, und jeder hat eine geradlinige sicherere Alternative.

Haertungs-Checkliste

Nutzen Sie dies als Basislinie. Quelle: Branch-Schutz mit erforderlicher Pruefung, geschuetzte Workflow-Dateien, signierte Commits und starke MFA auf allen Maintainer-Konten. Geheimnisse: kurzlebige OIDC-Zugangsdaten statt statischer Schluessel, Least-Privilege-Beschraenkung, Tresor-Speicherung, Log-Maskierung, keine Geheimnisse in Fork-Builds und planmaeszige Rotation. Runner: standardmaeszig kurzlebig, unprivilegiert und isoliert, nie ueber Vertrauensgrenzen geteilt, gepatcht und image-gepinnt, mit beschraenktem Ausgang. Lieferkette: gepinnte Abhaengigkeiten mit Hash-Pruefung, per Digest gepinnte Actions, Schwachstellen-Scanning, eine Stueckliste pro Build und signierte Artefakte mit Herkunft. Erkennung: alle Pipeline- und Quell-Audit-Logs weiterleiten, bei Kontrollaenderungen und anomalem Build-Verhalten alarmieren und signierte Herkunft vor dem Deploy verlangen. Prozess: die Aufgaben Committen, Genehmigen und Bereitstellen trennen und diese Kontrollen nach jeder wesentlichen Pipeline-Aenderung pruefen.

Haeufig gestellte Fragen

Sind gehostete Runner sicherer als selbstgehostete? Oft ja, weil gehostete Runner typischerweise kurzlebig und vom Anbieter verwaltet sind, was die Buerde von persistentem Zustand und Patching entfernt. Selbstgehostete Runner koennen abgesichert werden, verlangen aber disziplinierte Isolation, Kurzlebigkeit und Netzwerksegmentierung und duerfen nie zwischen vertrauenswuerdigen und nicht vertrauenswuerdigen Arbeitslasten geteilt werden. Waehlen Sie selbstgehostet nur bei echtem Bedarf und mit der Betriebsreife, sie sicher zu betreiben.

Warum CI-Actions per Commit-Digest statt per Versions-Tag pinnen? Weil ein Tag veraenderlich ist: Wer die Action kontrolliert, kann denselben Tag auf neuen, moeglicherweise boesartigen Code umbiegen, und Ihr Build wuerde ihn still ziehen. Ein unveraenderlicher Commit-Digest benennt exakten Inhalt, der sich unter Ihnen nicht aendern kann, sodass eine Kompromittierung stromaufwaerts nicht aendern kann, was Ihre Pipeline ausfuehrt, ohne eine sichtbare, pruefbare Aenderung auf Ihrer Seite.

Fazit

Ihre CI/CD-Pipeline sitzt im Zentrum eines groszen Vertrauens: Sie kann die Produktion erreichen, haelt maechtige Zugangsdaten, und ihren Ausgaben wird von allen Nachgelagerten geglaubt. Sie zu verteidigen ist nicht eine Kontrolle, sondern eine geschichtete Haltung — Quelle und Aenderungsprozess schuetzen, Geheimnisse minimieren und ihre Lebensdauer verkuerzen, Runner isolieren, damit kein Job dem naechsten schaden kann, alles pruefen, was der Build hereinzieht, alles signieren und attestieren, was er produziert, und den gesamten Pfad instrumentieren, damit Manipulation in Ihrer Telemetrie auftaucht. Keiner dieser Schritte ist exotisch, und jeder schlieszt einen Weg, den echte Eindringlinge genutzt haben. Behandeln Sie die Pipeline als Produktionsinfrastruktur, halten Sie sie an denselben Standard, und Sie verweigern Angreifern einen der maechtigsten Ansatzpunkte einer modernen Softwareorganisation.

Related posts

No comments yet

Be the first to comment.

Leave a comment

Sign in with your Canverly account to comment. You can use the same account on any site in the network.

Sign in with Canverly