engineering-design-and-analysis
Implementierung von Container Image Scanning als Teil des Entwicklungs-Workflows
Table of Contents
Einleitung: Warum Container-Bild-Scannen gehört in Ihrer Pipeline
Containerisierung hat die Softwareentwicklung durch das Verpacken von Anwendungen mit ihren Abhängigkeiten in leichte, tragbare Umgebungen verwandelt. Von lokalen Entwicklungs-Laptops bis hin zu weitläufigen Kubernetes-Clustern bieten Container Konsistenz, die das Problem "Es funktioniert auf meinem Computer" beseitigt. Die gleichen Eigenschaften, die Container leistungsfähig machen, bringen jedoch auch einzigartige Sicherheitsrisiken mit sich. Öffentliche Register hosten Basisbilder, die bekannte Schwachstellen enthalten können, und Entwickler legen häufig zusätzliche Pakete übereinander, was versehentlich Fehler einführt, die bereits im Host-Betriebssystem gepatcht wurden. Ein einzelnes anfälliges Bild, das in der Produktion eingesetzt wird, kann sensible Daten freilegen, laterale Bewegungen ermöglichen oder zu einem Standbein für Ransomware werden.
Unternehmen, die Containersicherheit als nachträglichen Einfall behandeln, finden sich oft in der Lage, Produktionsökosysteme zu patchen, wenn eine kritische Common Vulnerability and Exposure (CVE) bekannt gegeben wird. Ein weitaus effektiverer Ansatz ist die linksseitige Verschiebung der Sicherheit – die Integration von Containerbildscannern direkt in den Entwicklungsworkflow, so dass Schwachstellen erkannt werden, bevor Bilder jemals eine Registrierung erreichen. Dieser Artikel erweitert die Grundlagen des Containerbildscannens, untersucht konkrete Implementierungsstrategien für moderne CI / CD-Pipelines und skizziert Best Practices, um eine Sicherheitskultur aufzubauen, die mit Ihren containerisierten Anwendungen skaliert werden kann.
Container Image Scannen verstehen
Container-Image-Scanning ist der automatisierte Prozess der Inspektion der Ebenen eines Container-Images, um bekannte Sicherheitslücken, veraltete Softwarepakete, Fehlkonfigurationen und Compliance-Verstöße zu identifizieren. Scanner vergleichen den Inhalt eines Bildes - einschließlich des Basisbetriebssystems, Anwendungsabhängigkeiten und aller installierten Bibliotheken - gegen kuratierte Schwachstellendatenbanken wie die National Vulnerability Database (NVD), OSV oder herstellerspezifische Feeds. Die Ausgabe ist ein Bericht, der den Schweregrad jedes Problems, betroffener Pakete und oft Behebungshinweise auflistet, wie z.B. das Aktualisieren eines Pakets auf eine gepatchte Version.
Scan-Typen: Statisch vs. Dynamisch
Die meisten Container-Bildscanner arbeiten statisch. Sie analysieren das Bild ohne es auszuführen, was schnelle Scans ermöglicht, die in jeden Build integriert werden können. Statisches Scannen untersucht das Dateisystem und die Paketmanifeste (wie , , , oder ), um Software mit bekannten Sicherheitslücken zu identifizieren. Einige fortschrittliche Tools inspizieren auch die Konfiguration des Bildes auf Passwörter, API-Schlüssel oder übermäßig permissive Dateiberechtigungen. Dynamisches Scannen erfordert andererseits, dass der Container in einer Sandbox-Umgebung ausgeführt wird und sein Laufzeitverhalten beobachtet wird - dies ist in CI / CD-Pipelines aufgrund des Overheads und der Komplexität weniger üblich, aber es kann Probleme aufdecken, die beim statischen Scannen fehlen, wie exponierte Ports oder falsch konfigurierte Umgebungsvariablen.
Was Scanner suchen
- Known Vulnerabilities (CVEs) in Betriebssystempaketen, Sprachlaufzeiten und Anwendungsabhängigkeiten.
- Veraltete oder veraltete Software, die möglicherweise keine Sicherheitspatches mehr erhält.
- Missfigurationen wie Laufen als Wurzel, fehlende Gesundheitschecks oder aufgedeckte Geheimnisse.
- Compliance-Verstöße gegen Standards wie PCI DSS, HIPAA oder SOC 2, die eine spezifische Bildhärtung erfordern.
- Malware oder unerwartete Binärdateien in Basisbildern, die aus öffentlichen Registern entnommen wurden.
Die Rolle der Base Image Selection
Die Grundlage eines Container-Images ist die Basisschicht. Wenn Sie ein offizielles, minimales Basisbild aus einer vertrauenswürdigen Quelle auswählen (z. B. Alpine Linux, distroless-Images oder gehärtete Versionen von Ubuntu), wird die Angriffsfläche erheblich reduziert. Scanner können Ihr Basisbild mit dem neuesten Digest vergleichen und Sie warnen, wenn eine neuere, gepatchte Version verfügbar ist. Ohne Scannen können Teams unwissentlich ein Bild verwenden, das eine kritische Sicherheitslücke enthält, die vor Monaten behoben wurde.
Vorteile der Integration von Scanning in die Entwicklung
Das Verschieben des Container-Bild-Scans von einem Audit nach der Bereitstellung zu einem Routineschritt im Entwicklungs-Workflow bringt konkrete Vorteile, die sich im Laufe der Zeit verschlimmern.
Früherkennung von Schwachstellen
Das Auffangen einer Schwachstelle während einer Pull Request Review kostet Minuten. Das Auffinden des gleichen Problems in der Produktion erfordert ein Notfall-Rollback, eine Reaktion auf Vorfälle und oft einen neuen Deployment-Pipeline-Run. Die Früherkennung reduziert die mittlere Zeit bis zur Behebung (MTTR) und verhindert, dass anfällige Bilder jemals Staging- oder Produktionsumgebungen erreichen.
Automatisierte Sicherheitskontrollen ohne Engpässe
Sicherheitsteams sind oft unterbesetzt und können nicht jedes Containerbild, das Ihr Unternehmen produziert, manuell überprüfen. Durch die Automatisierung des Scannens innerhalb der CI/CD-Pipeline erzwingen Sie konsistente Prüfungen für jeden Build – ob es sich um einen experimentellen Zweig eines Entwicklers oder einen Release-Kandidaten handelt. Die Automatisierung stellt sicher, dass die Sicherheit nicht von menschlicher Wachsamkeit abhängt und sich mühelos skaliert, wenn Ihr Container-Fußabdruck wächst.
Compliance und Audit Readiness
Viele Compliance-Frameworks erfordern nun den Nachweis, dass Container-Images vor der Bereitstellung auf Schwachstellen gescannt werden. Automatisiertes Scannen erzeugt einen Audit-Trail – jedes Bild hat einen Bericht, der neben dem Artefakt gespeichert werden kann. Dies macht es einfach, die Sorgfaltspflicht während der Audits nachzuweisen. Darüber hinaus können Policy-as-Code-Tools Bereitstellungen basierend auf Scan-Ergebnissen gleiten und verhindern, dass nicht konforme Bilder automatisch vorwärts gehen.
Kosteneinsparungen durch Shift-Left Security
Die Behebung einer Sicherheitslücke während der Entwicklung kostet kaum mehr als eine Codeänderung und ein neu erstelltes Bild. Sobald dieses Bild über Dutzende oder Hunderte von Knoten bereitgestellt wird, eskalieren die Kosten: Sie müssen Patching koordinieren, rollende Neustarts verwalten und mögliche, auf den Kunden zugeschnittene Vorfälle bewältigen. Container-Bild-Scans verringern die Wahrscheinlichkeit von teuren Notfallbehebungen und den Reputationsschaden, der mit einem Verstoß einhergeht. Branchenforschungen zufolge sind die Kosten für die Behebung einer Sicherheitslücke in der Produktion 30 bis 100 Mal höher als die Behebung während der Entwicklung.
Implementierung von Container Image Scannen in der CI/CD Pipeline
Die Integration des Container-Image-Scannens in Ihren Entwicklungsworkflow erfordert die Auswahl der richtigen Tools, die Automatisierung des Scan-Schritts, die Definition von Richtlinien und die Sicherstellung, dass Entwickler reibungslos auf die Ergebnisse reagieren können.
Schritt 1: Wählen Sie ein Scan-Tool, das zu Ihrem Stapel passt
Das Container-Scan-Ökosystem bietet Open-Source- und kommerzielle Optionen. Zu den wichtigsten zu bewertenden Faktoren gehören die Unterstützung von Sprachökosystemen (Node.js, Python, Java, Go usw.), die Häufigkeit der Datenbankaktualisierung, Integrationsmöglichkeiten mit Ihren vorhandenen CI/CD-Tools und die Fähigkeit, politische Entscheidungen über ein einfaches Pass/Fail hinaus durchzusetzen. Beliebte Entscheidungen sind:
- Trivy (Aqua Security): Open-Source, schnell, unterstützt mehrere Sprachen und OS-Pakete und lässt sich problemlos in GitHub Actions, GitLab CI, Jenkins oder eine Docker-basierte Pipeline integrieren. Trivy ist aufgrund seiner Einfachheit und Genauigkeit weit verbreitet.
- Clair (Red Hat): Ein älterer, aber stabiler Open-Source-Scanner, der häufig mit CoreOS- und Quay-Registern verwendet wird. Er erfordert eine Datenbankeinrichtung und ist bei ephemeren CI-Läufern weniger einfach.
- Snyk (Snyk Ltd.): Eine kommerzielle Plattform, die eine umfassende Abhängigkeitsanalyse und kontinuierliche Überwachung bietet. Sie lässt sich tief in GitHub und GitLab integrieren und bietet eine entwicklerfreundliche Benutzeroberfläche.
- Docker Scout: Dockers eingebautes Scan-Tool, kostenlos für Docker Desktop-Benutzer und in Docker Hub integriert.
- Anchore Engine: Ein Open-Source-Scanner, der als eigenständiger Dienst bereitgestellt werden kann. Er unterstützt benutzerdefinierte Richtlinien und führt in Compliance-Workflows von Unternehmen ein.
Beispiel Integration mit Trivy in GitHub Aktionen: Fügen Sie einen Schritt nach dem Erstellen Ihres Docker-Images hinzu, das ausführt. Wenn Trivy kritische oder hochgradige Sicherheitslücken findet, schlägt der Build fehl, wodurch verhindert wird, dass das Bild in die Registry verschoben wird. Für eine detailliertere Kontrolle können Sie die Ergebnisse in eine JSON-Datei schreiben und Policy Engines wie OPA (Open Policy Agent) verwenden, um Governance-Entscheidungen zu treffen.
Schritt 2: Automatisieren Sie den Scan in Ihrer CI/CD-Pipeline
Wenn das Bild erstellt wird, bevor es in die Registry geschoben wird, wird sichergestellt, dass nur Bilder, die die Sicherheitskontrollen bestehen, in Ihre Speicher- und Bereitstellungszonen gelangen.
# Pseudocode for a typical CI/CD workflow
1. Checkout source code
2. Install dependencies and application code
3. Build container image using Dockerfile
4. Run container image scan with severity threshold
If FAIL: Notify developer, stop pipeline
If PASS: Continue to step 5
5. Push image to registry (with scan report metadata)
6. Deploy to staging environment
7. (Optional) Re-scan after deployment for runtime checks
Für GitLab CI könnte ein typischer Konfigurations-Snippet in wie folgt aussehen:
container_scan:
stage: security
image: docker:20.10.16
services:
- docker:20.10.16-dind
before_script:
- apk add --no-cache curl
- curl -sfL https://raw.githubusercontent.com/aquasecurity/trivy/main/scripts/get_helm.sh | sh
script:
- trivy image --exit-code 0 --severity LOW,MEDIUM --ignore-unfixed your-image:$CI_COMMIT_SHA
- trivy image --exit-code 1 --severity CRITICAL,HIGH --ignore-unfixed your-image:$CI_COMMIT_SHA
Beachten Sie die Verwendung von zwei Durchgängen: Der erste Durchlauf meldet nur niedrige und mittlere Probleme (Ausgangscode 0, so dass die Pipeline weitergeht), während der zweite Durchlauf die Pipeline bei kritischen und hohen Problemen nicht ausführt.
Schritt 3: Überprüfung und Handeln auf Ergebnisse
Raw-Scan-Ausgabe kann überwältigend sein, wenn ein Bild Hunderte von Ergebnissen mit geringem Schweregrad enthält. Um die Ergebnisse umsetzbar zu machen, konfigurieren Sie Ihr Tool so, dass es einen strukturierten Bericht (JSON oder SARIF) ausgibt und ihn in Ihr Entwickler-Dashboard integriert oder Kommentare von Anfragen abruft. Zum Beispiel können GitHub-Aktionen einen Kommentar zur PR hinzufügen, der die gefundenen Schwachstellen zusammen mit vorgeschlagenen Korrekturen auflistet. Teams sollten die Ergebnisse regelmäßig triagieren und überprüfen, ob falsch positive Punkte (wie Schwachstellen in Paketen, die im Container-Kontext nicht ausgenutzt werden können) durch Aktualisieren der Ausschlusskonfiguration des Scanners herausgefiltert werden.
Schritt 4: Sicherheitsrichtlinien festlegen und durchsetzen
Definieren Sie, was "Pass" für Ihre Organisation bedeutet.
- Keine kritischen oder hochgradigen Sicherheitslücken, die eine bekannte Korrektur haben (ignor-unfixed).
- Basisbilder müssen weniger als 30 Tage alt sein, oder der Build muss eine bestimmte gehärtete Basis verwenden.
- Nicht-Root-Benutzer müssen in der Dockerfile deklariert werden ().
- Keine aufgedeckten Geheimnisse oder fest codierten Anmeldeinformationen in irgendeiner Schicht.
Wenn ein Verstoß auftritt, sollte die Pipeline den Push blockieren und den Entwickler oder Teamleiter benachrichtigen. Bei Warnungen mit geringem Schweregrad können Sie die Pipeline erfolgreich machen, aber die Ergebnisse protokollieren und innerhalb einer definierten Anzahl von Tagen Abhilfe schaffen.
Best Practices für effektives Container-Bild-Scannen
Scannen allein reicht nicht aus – wie Sie den Prozess implementieren und pflegen, bestimmt seine Effektivität. Die Einhaltung dieser bewährten Praktiken hilft Ihnen, den Sicherheitswert Ihrer Scan-Bemühungen zu maximieren.
Früh und oft scannen
Beschränken Sie das Scannen nicht auf den finalen Release Build. Integrieren Sie einen leichten Scan in jeden Commit, der ein Container-Image erstellt. Dazu gehören Entwicklungszweige, Feature-Zweige und Pull Request Mergt. Je früher Sie eine anfällige Abhängigkeit finden, desto weniger Kontextwechsel ist erforderlich, um es zu beheben. Bei Basisbildern sollten Sie sie jedes Mal scannen, wenn die Upstream-Registrierung ein Update veröffentlicht - viele Tools unterstützen einen Webhook oder einen geplanten Scan für Registry-gespeicherte Bilder.
Halten Sie Ihre Scan-Tools und Datenbanken aktualisiert
Sicherheitslückendatenbanken werden täglich aktualisiert, manchmal stündlich. Ein Scanner, der veraltete Datenbanken ausführt, wird die neuesten CVEs verpassen. Konfigurieren Sie Ihre Pipeline, um die neueste Schwachstellendatenbank vor jedem Scan zu ziehen. Verwenden Sie für Trivy oder verlassen Sie sich auf die automatische Update-Funktion des Scanners. Stellen Sie bei kommerziellen Tools sicher, dass Sie auf der neuesten Version sind und dass die Datenbanksynchronisierung konfiguriert ist.
Verwenden Sie Minimal Base Images und Multi-Stage Builds
Je weniger Pakete in einem Bild vorhanden sind, desto weniger potenzielle Sicherheitslücken. Nehmen Sie distroless- oder alpine-basierte Basisbilder für die Produktion an. Verwenden Sie mehrstufige Dockerfiles, um Build-Time-Abhängigkeiten (z. B. Compiler, Test-Frameworks) von Laufzeit-Artefakten zu trennen. Erstellen Sie Ihre Anwendung beispielsweise in einem voll funktionsfähigen Node- oder Go-Bild und kopieren Sie dann nur die kompilierte Binärdatei in ein Scratch- oder distroless-Bild. Dies reduziert die Oberfläche für Sicherheitslücken drastisch.
# Example multi-stage build
FROM golang:1.21 AS builder
WORKDIR /app
COPY . .
RUN go build -o main
FROM gcr.io/distroless/base-debian12
COPY --from=builder /app/main /main
CMD ["/main"]
Scanner werden nur das endgültige Bild inspizieren, das minimale Pakete und damit weniger Befunde enthält.
Priorisieren Sie Fixes basierend auf der Auslastbarkeit
Nicht alle Sicherheitslücken sind gleichermaßen gefährlich. Beheben von Fehlern priorisieren, basierend darauf, ob das anfällige Paket tatsächlich zur Laufzeit verwendet wird, ob es einen bekannten Exploit gibt und ob das Bild als root läuft. Viele Scanner unterstützen jetzt die Analyse der Erreichbarkeit – sie können feststellen, ob die anfällige Funktion importiert oder im Anwendungscode aufgerufen wird. Konzentrieren Sie sich auf Schwachstellen, die sowohl kritisch als auch erreichbar sind.
Informieren Sie Entwickler über sichere Containerpraktiken
Automatisierung ist leistungsstark, aber sie kann kein Verständnis ersetzen. Dokumentation und Schulungen darüber bereitstellen, warum Container-Scans erzwungen werden, wie Scan-Ergebnisse interpretiert werden und wie häufige Probleme behoben werden. Entwickler ermutigen, Tools wie lokal zu verwenden, bevor Commits gepusht werden. Wenn Scans einen Build blockieren, stellen Sie sicher, dass die Fehlermeldung einen Link zu Ihrem internen Handbuch enthält, um die Sicherheitsanfälligkeit zu beheben.
Herausforderungen und Überlegungen
Die Vorteile des Container-Scannens sind klar, aber die Umsetzung ist nicht ohne Hindernisse. Sich der gemeinsamen Herausforderungen bewusst zu sein, hilft Ihnen, eine widerstandsfähigere Scanstrategie zu entwickeln.
Falsche Positive und Lärm
Scanner können Schwachstellen in Paketen markieren, die enthalten sind, aber nicht von der Anwendung verwendet werden. Zum Beispiel kann ein Node.js-Bild eine anfällige Version einer Bibliothek enthalten, die nur während des Testens verwendet wird. Im Laufe der Zeit können Teams für Rauschen desensibilisiert werden und beginnen, Scanergebnisse zu ignorieren. Beseitigen Sie dies, indem Sie den Scanner so konfigurieren, dass nicht behobene Schwachstellen (die ohne eine gepatchte Version) ignoriert werden, wenn das Risiko akzeptabel ist, oder indem Sie eine Policy-Engine verwenden, die auf der Grundlage der Erreichbarkeit filtert. Überprüfen Sie regelmäßig und schneiden Sie die Ignorierungsliste.
Performance Impact auf Build-Zeiten
Vollständige Scans können eine Minute oder mehr zu einer CI-Pipeline hinzufügen, insbesondere für große Bilder mit vielen Schichten. Um die Auswirkungen zu reduzieren, verwenden Sie inkrementelles Scannen - viele Tools speichern frühere Scanergebnisse zwischen und analysieren nur geänderte Schichten. Ziehen Sie auch in Betracht, nur während der Entwicklungs-Builds einen schnellen Scan auf kritischen Schweregrad und einen vollständigen Scan bei Release-Builds durchzuführen. Mit der Zeit, wenn sich Basisbilder stabilisieren, sinken die Scanzeiten tendenziell.
Umgang mit Geheimnissen und sensiblen Daten
Geheimnisse, die in Containerebenen landen, stellen ein Sicherheitsrisiko dar, das Scan-Tools häufig erkennen. Wenn jedoch ein Geheimnis in ein Bild eingebettet ist, erfordert das Entfernen des Bildes die Wiederherstellung des Bildes und die Ungültigerklärung aller zwischengespeicherten Ebenen. Verhindern Sie, dass Geheimnisse in Bilder eingegeben werden, indem Sie Build-Argumente, geheime Halterungen (Docker BuildKit) oder externe Geheimspeicher wie HashiCorp Vault verwenden. Scannen Sie Bilder nach Geheimnissen als separate Überprüfung und erzwingen Sie eine Richtlinie, die Bilder mit fest codierten Anmeldeinformationen blockiert.
Einhaltung mehrerer Regulierungsstandards
Organisationen, die PCI DSS, HIPAA oder FedRAMP unterliegen, müssen nachweisen, dass ihre Container-Images bestimmte Härteanforderungen erfüllen. Dies geht oft über das CVE-Scannen hinaus - es umfasst Prüfungen auf Benutzerberechtigungen, Dateisystem-Etiketten und Netzwerkkonfigurationen. Verwenden Sie eine Policy-Engine, die benutzerdefinierte Compliance-Regeln neben Schwachstellendaten auswerten kann. Tools wie Anchore Engine und OPA ermöglichen es Ihnen, Compliance-Prüfungen deklarativ zu schreiben.
Schlussfolgerung
Die Implementierung von Container-Image-Scanning als Standardbestandteil Ihres Entwicklungsworkflows ist kein einmaliges Projekt, sondern eine fortlaufende Praxis, die sich mit Ihrer Software-Lieferkette entwickelt. Durch die Auswahl des richtigen Scan-Tools, die Automatisierung von Scans innerhalb Ihrer CI/CD-Pipeline, die Einrichtung klarer Richtliniengates und die Förderung einer Kultur des Sicherheitsbewusstseins können Sie das Risiko der Bereitstellung anfälliger Container erheblich reduzieren. Die Vorabinvestitionen in die Pipeline-Konfiguration und Entwicklerausbildung zahlen sich aus, indem sie kostspielige Vorfälle verhindern, Compliance-Audits vereinfachen und Teams ermöglichen, sich schnell und vertrauensvoll zu bewegen.
Beginnen Sie mit einer minimalen Integration – fügen Sie einen Trivy-Schritt zu einer Ihrer Build-Pipelines hinzu, legen Sie einen kritischen Schweregrad-Schwellenwert fest und überprüfen Sie die Ergebnisse mit Ihrem Team. Iterieren Sie von dort aus und erweitern Sie ihn um Basisbildscans, Registrierungsüberwachung und Laufzeitrichtlinien. Sicherheit ist eine Reise, und Container-Bildscans sind einer der effektivsten Meilensteine, die Sie heute zu dieser Reise hinzufügen können.
Externe Ressourcen zum weiteren Lesen: