HashiCorp Vault + External Secrets Operator: Zero-Trust Secrets Management
TL;DR Secrets in Git, klassische Kubernetes-Secrets und manuelle Verfahren reichen für …
Diese Serie erklärt systematisch, wie moderne Software compliant entwickelt und betrieben wird – von EU-Regulierungen bis zur technischen Umsetzung.
Für moderne, regulierungskonforme Softwarelieferung ist eine saubere CI/CD-Pipeline nicht „nice to have“, sondern das technische Organigramm Ihrer Organisation. In vielen Unternehmen übernimmt GitLab diese Rolle – in der ayedo Plattform ist es der erste Schritt im End-to-End-Workflow.
Ein Application-Repository sollte die spätere Automatisierung bereits widerspiegeln:
src/ für eine Django-App).gitlab-ci.yml, die den gesamten Lebenszyklus der Anwendung abbildetWichtig ist dabei weniger die exakte Ordnerstruktur als die klare Trennung von Verantwortlichkeiten: Code, Infrastruktur-Definition und Delivery-Logik bleiben unterscheidbar. Das erleichtert Audits und reduziert das Risiko von „versteckten“ Konfigurationen.
Eine typische Pipeline für eine Django-Anwendung lässt sich in vier Hauptstages gliedern:
Diese Trennung schafft Transparenz: Ein Auditor oder ein neuer Teamlead erkennt auf einen Blick, an welcher Stelle Tests stattfinden, wann Images unveränderlich werden und wo Sicherheitsprüfungen greifen.
Darüber hinaus lassen sich Genehmigungsprozesse entlang dieser Stages einziehen: etwa, dass nur auf dem main-Branch vollständige Pipelines bis einschließlich package und deploy laufen, während Feature-Branches auf test und eventuell build begrenzt sind. So verbinden Sie Entwicklerproduktivität mit klaren Kontrollpunkten.
Die Zeiten, in denen ein privilegierter Docker-Daemon im CI-Runner lief, sollten vorbei sein – nicht nur aus Sicherheitsgründen, sondern auch, weil viele Compliance-Rahmenwerke den Betrieb privilegierter Services in Shared-Umgebungen kritisch sehen.
Sowohl Kaniko als auch Buildah sind darauf ausgelegt, Container-Images ohne laufenden Docker-Daemon und ohne Root-Rechte im Container zu bauen:
Kaniko
Buildah
Beide Ansätze reduzieren die Angriffsfläche Ihrer Runner erheblich. Das ist besonders relevant, wenn Sie perspektivisch den Anforderungen von NIS2 (mit Wirkung ab dem 18.10.2024) entsprechen wollen, wo sichere Betriebsprozesse und Risikominimierung explizit gefordert sind.
Ein sicheres Image beginnt nicht beim Scanner, sondern im Dockerfile. Für eine Django-Anwendung haben sich unter anderem folgende Prinzipien bewährt:
Diese Muster sind keine stilistische Frage, sondern erleichtern die Sicherheitsbewertung erheblich: Weniger Pakete bedeuten weniger potenzielle CVEs, und klare Versionsangaben machen es einfacher, auf advisories und Scans zu reagieren.
Ein weiterer Baustein in Richtung regulierungskonformer Lieferkette ist die Software Bill of Materials (SBOM). Sie beschreibt, welche Komponenten (z. B. Python-Packages, Systembibliotheken) in einem Image enthalten sind.
In der Pipeline sollte der SBOM-Schritt eng mit dem Container-Build verzahnt sein:
Damit schaffen Sie eine Grundlage, um auf zukünftige regulatorische Anforderungen zu reagieren – etwa, wenn Kunden oder Aufsichtsbehörden im Rahmen des Cyber Resilience Act detaillierte Auskünfte zur Komponentenliste Ihrer Software haben möchten.
Eine moderne Registry wie Harbor ist deutlich mehr als ein Ort, an dem latest-Tags „geparkt“ werden. In einer gut gestalteten CI/CD-Landschaft wird Harbor zum Security- und Compliance-Gateway zwischen Build und Deployment.
Im Build-Stage der Pipeline wird das Image mit Kaniko oder Buildah erzeugt und anschließend in ein dediziertes Projekt in Harbor gepusht. Üblicherweise entsteht dabei mindestens ein unveränderlicher Tag (z. B. Commit-Hash oder Build-Nummer) und optional ein „beweglicher“ Tag wie latest.
Dieser Push ist ein klarer Übergabepunkt: Vorher ist das Image ein temporäres Ergebnis eines Builds, danach ein versioniertes Artefakt, das von Produktionssystemen genutzt werden darf – allerdings erst, wenn es die definierten Kontrollen in Harbor bestanden hat.
Harbor integriert Schwachstellenscanner und führt nach jedem Push automatisch ein Image-Scanning durch. Für eine Django-App, die auf einem Python- oder Debian/Ubuntu-Base-Image aufsetzt, werden damit sowohl OS-Pakete als auch Laufzeitbibliotheken erfasst.
Die entscheidende Stärke liegt in den Policies:
So bauen Sie eine Brücke zwischen Security-Team und Delivery-Teams: Nicht jedes Finding blockiert sofort die Pipeline, aber nichts geht stillschweigend durch.
Neben dem Scanning gewinnt Image Signing stark an Bedeutung. Harbor unterstützt moderne Signaturmechanismen (z. B. Notary v2, cosign) und kann Signaturen als Voraussetzung für bestimmte Aktionen erzwingen.
Ein praxisnahes Modell:
Damit schaffen Sie eine kryptographisch abgesicherte Kette: Nur Images, die tatsächlich aus Ihrer GitLab-Pipeline stammen, erreichen die Produktionscluster. Das ist ein zentraler Baustein, um Supply-Chain-Angriffe wie das Einbringen fremder Images wirksam zu erschweren.
Auch wenn dieser erste Teil der Reihe beim Push nach Harbor endet, gehört das Thema Secrets schon in diesen Abschnitt – sonst landen Zugangsdaten unnötig in GitLab-Variablen oder sogar in Repositories.
HashiCorp Vault dient in der ayedo Plattform als zentrale Drehscheibe für:
Statt feste Benutzername/Passwort-Paare in GitLab zu hinterlegen, bezieht die Pipeline kurzlebige Tokens oder dynamic credentials aus Vault. Das reduziert das Risiko geleakter Secrets erheblich und erfüllt gleichzeitig gängige Vorgaben zu Least Privilege und Rotation.
Der External Secrets Operator ist das Bindeglied zwischen Vault und Ihrem /kubernetes/-Cluster. Er synchronisiert Secrets aus Vault automatisiert in native Kubernetes-Secrets, die dann von Deployments genutzt werden können.
Auch wenn der eigentliche Rollout in dieser Artikelserie erst im zweiten Teil mit ArgoCD behandelt wird, sollten Sie bereits jetzt sicherstellen:
So entsteht eine Lieferkette, in der Artefakte (Images, Charts) und Konfiguration (Secrets) klar getrennt, aber technisch sauber integriert sind.
Wie sieht das nun konkret – aber ohne YAML – für eine Django-App aus?
In der Test-Stage laufen typischerweise:
Wichtig ist, dass diese Stage auf allen relevanten Branches läuft und schnell genug bleibt, um Entwicklerfeedback nicht zu bremsen.
Die Build-Stage übernimmt:
Am Ende dieser Stage existiert ein eindeutig identifizierbares, signiertes und mit SBOM versehenes Image in Harbor – die Grundlage für jede weitere Nutzung.
Für Django-Anwendungen, die über Helm/ohMyHelm deployt werden, übernimmt die Package-Stage:
appVersion) entsprechend dem Image-TagDamit entsteht ein zweites, höherstufiges Artefakt: das Anwendungs-Paket, das im nächsten Schritt von ArgoCD konsumiert werden kann.
Im ersten Teil unseres Workflows verstehen wir „deploy“ bewusst als Übergabe an die Plattform, noch nicht als Rollout in einen Cluster. Mögliche Aufgaben dieser Stage:
Der eigentliche /kubernetes/-Rollout erfolgt dann im zweiten Teil der Serie über GitOps mit ArgoCD; an dieser Stelle stellen wir sicher, dass alle benötigten Artefakte und Informationen vollständig und überprüft in Harbor vorliegen.
Beide Werkzeuge sind praxistauglich. In vielen Organisationen ist Kaniko die erste Wahl, wenn GitLab-Runner ohnehin auf /kubernetes/ laufen und ein möglichst schlanker, standardisierter Weg gesucht wird. Buildah spielt seine Stärken aus, wenn bereits Podman/Buildah-Erfahrung vorhanden ist oder komplexere Build-Szenarien (z. B. non-Dockerfile-basierte Builds) erforderlich sind.
Strategisch wichtig ist weniger die konkrete Wahl, sondern dass Sie konsequent auf rootless, daemonlose Builds setzen und diesen Ansatz in Ihren Sicherheits- und Architektur-Dokumenten verankern.
Zu strenge Policies blockieren Releases, zu laxe bringen Sie in Erklärungsnot. Bewährt hat sich ein abgestuftes Modell:
Wichtig ist eine enge Abstimmung zwischen Security, Plattform-Team und Entwicklung. Harbor liefert die technische Grundlage, die eigentliche Governance definieren Sie organisatorisch.
Der Übergang muss nicht „Big Bang“ erfolgen. Ein mögliches Vorgehen:
So reduzieren Sie das Risiko, ohne Ihre bestehende CI/CD-Infrastruktur zu destabilisieren.
Weitere Fragen? Siehe unsere FAQ
Die beschriebenen Bausteine – GitLab CI/CD, sichere Container-Builds, Harbor als Compliance-Gateway und Vault/ESO für Secrets – ergeben zusammen einen robusten, auditierbaren Workflow. In vielen Organisationen scheitert die Umsetzung jedoch weniger an der Technik als an der Integration: Wer betreibt Harbor? Wer verantwortet Vulnerability-Policies? Wer pflegt Vault-Rollen und ESO-Konfigurationen? Und wie übersetzen wir all das in konkrete Pipelines für reale Anwendungen wie eine Django-App?
Genau hier setzt ayedo an. Auf unserer /platform/ bündeln wir GitLab, Harbor, HashiCorp Vault und den External Secrets Operator zu einer integrierten Software Delivery Plattform – inklusive Betriebsverantwortung, Security-Guardrails und klaren Schnittstellen zu Ihren Entwicklungsteams. Anstatt jedes Tool isoliert zu betreiben, erhalten Sie einen durchgängig gedachten Workflow vom Commit bis zum registrierten, geprüften Image.
Für GitLab CI/CD stellen wir praxiserprobte Templates bereit, die genau die in diesem Artikel beschriebenen Prinzipien abbilden: rootless Container-Builds mit Kaniko oder Buildah, SBOM-Generierung, automatisches CVE-Scanning und Signing in Harbor sowie die Vorbereitung für ein GitOps-basiertes Deployment mit ArgoCD im zweiten Teil der Reihe. Diese Templates sind bewusst so gestaltet, dass sie eine solide Basis für Compliance-Anforderungen bieten, ohne Ihre Teams mit unnötiger Komplexität zu überfordern.
Wenn Sie Ihre bestehenden Pipelines schrittweise in diese Richtung entwickeln oder einen neuen, regulatorisch belastbaren Delivery-Workflow aufbauen möchten, ist ein gemeinsamer Einstieg über ein GitLab CI/CD Template oft der pragmatischste Weg.
TL;DR Secrets in Git, klassische Kubernetes-Secrets und manuelle Verfahren reichen für …
TL;DR Eine moderne Container Registry ist heute ein zentrales Compliance-Werkzeug – insbesondere im …
TL;DR Klassische Container-Builds mit Docker Daemon, Root-Rechten und docker.sock im CI-System sind …