Aikido

Absicherung von Docker-Images

Verfasst von
Nicholas Thomson

Ein Docker-Image besteht aus einem Stapel von Schichten (Layers), bei denen es sich um unveränderliche, schreibgeschützte Dateisystemänderungen handelt, die auf den darunterliegenden aufbauen. Ganz unten befindet sich das Basis-Betriebssystem, darauf folgen die für den Betrieb erforderlichen Pakete und schließlich ganz oben Ihr eigener Code. Die Absicherung von Docker-Images bedeutet zu kontrollieren, was in sie hineinfließt, und sie nach der Bereitstellung auf dem neuesten Stand zu halten.

Die meisten Schwachstellen eines Containers stammen von Open-Source-Paketen und -Bibliotheken, die mitgeliefert werden. Einige davon, wie cURL oder eine Shell, ruft Ihre App nach dem Start des Containers möglicherweise nie wieder auf und können daher aus dem Image entfernt werden. Andere, wie glibc, sind für die Funktion Ihrer App unerlässlich und können nicht entfernt werden. Die übrigen Schwachstellen sind meist das Resultat menschlicher Fehler, wie etwa ein in einer Schicht hinterlegtes Secret oder ein Container, der mit Root-Rechten läuft.

Dieser Beitrag behandelt, woher die Risiken in einem Docker-Image stammen, wie die Aufrechterhaltung härteter Images (Hardened Images) ein Problem des Schwachstellenmanagements ist, die drei Methoden, mit denen Tools ein Basis-Image gepatcht halten, und wie Aikido die Images, die Sie bereits ausführen, härtet und patcht.

{{cta}}

TL;DR

Die Absicherung von Docker-Images umfasst das Entfernen ungenutzter Pakete und das Patchen von Schwachstellen im verbleibenden Code. Das Herauszuscheiden nicht genutzter Pakete beseitigt lediglich Schwachstellen in Dingen, die Sie nicht benötigen. Ein anfälliges Paket, auf das Ihre App tatsächlich angewiesen ist, muss dennoch gepatcht werden, und selbst ein minimiertes Image häuft kontinuierlich neue Schwachstellen an. Darüber hinaus erfordert die Annahme gehärteter Images oft die Migration zu einer anderen Distribution und die Aktualisierung im Takt eines anderen Anbieters. Aikido stellt neue, gepatchte Builds derselben Basis-Image-Versionen bereit, die über PR ausgeliefert werden. Wenn Sie eine Version fixiert (gepinnt) haben, können Sie auf dieser Version bleiben, ohne dass es zu Breaking Changes kommt oder auf ein neues Image gewechselt werden muss.

Woher die Risiken in einem Docker-Image stammen 

Der FROM -Zeile ist die erste Anweisung in einem Dockerfile, die das Basis-Image angibt, auf dem Sie aufbauen. Ein FROM node:24 legt das offizielle Node.js-24-Image als Ihre Basis fest, welches zusammen mit der Node.js-Laufzeitumgebung und einem vollständigen Debian-System im Hintergrund ausgeliefert wird. Dazu gehören eine Shell, ein Paketmanager und Systembibliotheken, von denen jede Schwachstellen enthalten kann, die Sie erben, bevor Sie auch nur eine Zeile Ihres eigenen Codes geschrieben haben.

Jede Dockerfile-Anweisung fügt eine Schicht auf die vorherige hinzu, und Schichten sind unveränderlich. Das Löschen von etwas in einer späteren Schicht versteckt es lediglich, sodass alles, was das Basis-Image mitgeliefert hat, im Image verbleibt, unabhängig davon, ob Ihre App es nutzt oder nicht. Ihre App ruft das Meiste von dem, was in der Basis enthalten ist, niemals auf, aber jedes Paket darin stellt eine Angriffsfläche dar.

Beispielsweise war CVE-2023-4911 („Looney Tunables“) eine lokale Schwachstelle zur Privilegienerweiterung im dynamischen Lader von glibc, einer Komponente, die sich in der Basisschicht nahezu jedes gängigen Linux-Images befindet. glibc wurde mit der Distribution geliefert, und jeder Container, der auf einer betroffenen Basis aufgebaut war, enthielt sie. 

Verschiedene Basen, unterschiedliche Risiken

Nicht jedes Basis-Image liefert dieselbe Menge an Daten aus. Ein vollständiges Distributions-Image liefert weit mehr mit, als Ihre App benötigt, einschließlich einer Shell und eines Paketmanagers, die sie wahrscheinlich niemals verwenden wird. Eine Slim-Variante reduziert einen Teil davon. Ein distroloses Image lässt die Shell und den Paketmanager komplett weg und behält nur das bei, was eine Laufzeitumgebung benötigt. Alpine ist von Haus aus klein und war aufgrund der Tatsache, dass es auf musl statt auf glibc basiert, nicht einmal Looney Tunables ausgesetzt.

Basis-Image-Typ Lieferumfang Relative Angriffsfläche
Vollständige Distro (z. B. Debian, Ubuntu) Shell, Paketmanager, umfassende Systembibliotheken Am größten
Slim (z. B. python:3.12-slim) Reduziertes Paketset, weiterhin mit Shell Kleiner
Alpine Minimale libc und Hilfsprogramme, musl statt glibc Klein
Distroless Nur Laufzeit und App, keine Shell oder Paketmanager Am kleinsten

Die Absicherung von Images ist eine Herausforderung beim Schwachstellenmanagement

Ein gehärtetes Image ist an dem Tag, an dem Sie es erstellen, sauber, driftet jedoch mit der Zeit ab, während in bereits darin enthaltenen Paketen neue Schwachstellen entdeckt werden. Es sicher zu halten bedeutet, das Image so zu behandeln, dass es kontinuierlich gegen neue Offenlegungen abgeglichen und erneut gepatcht wird. Die manuelle Variante umfasst die Verfolgung von Offenlegungen über jedes Paket in jeder Basis sowie das manuelle Backporting oder Aktualisieren der einzelnen Fixes.

Das Festlegen auf eine vertrauenswürdige Version (Pinning) ist sinnvoll, wenn Sie diese Version tatsächlich getestet haben und weiterführen möchten, Sie müssen jedoch dennoch neue Offenlegungen überwachen. Ein festgeschriebenes und vergessenes Image häuft neu entdeckte Schwachstellen an. Wenn dieses Image das Ende seines Lebenszyklus (End-of-Life) erreicht und keine Patches mehr vom Upstream erhält, wächst seine Liste bekannter, ungesampelter Mängel. Beispielsweise hat Node.js 20 am 30. April 2026 sein End-of-Life erreicht, sodass ein Container, der weiterhin an node:20 gebunden ist, zwar läuft, aber jede seitdem gegen diesen Zweig veröffentlichte Schwachstelle ungepatcht bleibt und kein Fix mehr folgt.

Der entgegengesetzte Instinkt, immer sofort zur neuesten Version zu springen, ist genauso fehleranfällig. Beispielsweise ist das xz-utils-Backdoor eine Komprimierungsbibliothek, die in den meisten Linux-Basis-Images enthalten ist. Sie befand sich in zwei spezifischen aktuellen Versionen, 5.6.0 und 5.6.1, und Teams, die noch die ältere 5.4-Linie verwendeten, waren niemals betroffen. Die CISA-Empfehlung lautete danach, ein Downgrade durchzuführen, kein Upgrade. 

Was Sie tatsächlich schützt, sind sorgfältige Entscheidungen bezüglich der von Ihnen verwendeten Versionen. Nehmen wir ein Team, das debian:bookworm festlegt, dokumentiert, dass es sich gegenüber der neuesten Version dafür entschieden hat, weil es sie getestet hat und sie stabil ist, und sie bei neuen Offenlegungen überprüft. Wenn eine neue CVE für ein Paket in diesem Image bekannt wird, wissen sie bereits, dass sie es verwenden und warum. Das ermöglicht ihnen, die tatsächliche Gefährdung gegen die Kosten einer Änderung abzuwägen.

So sichern Sie Docker-Images ab

Angriffsfläche verkleinern

Beginnen Sie mit einem minimalen oder vorab gehärteten Basis-Image. Das Basis-Image bestimmt den Großteil dessen, was Sie erben, weshalb dies die wirkungsvollste Entscheidung ist, die Sie treffen können. (Wird im nächsten Abschnitt näher erläutert)

Verwenden Sie Multi-Stage-Builds, um Build-Tools aus dem finalen Image herauszuhalten. Der Image-Build zieht in der Regel einen Compiler, Entwicklungs-Header und einen Paketmanager heran, um Ihre App zu kompilieren und deren Abhängigkeiten zu installieren. Bei einem Single-Stage-Build verbleibt all dies im finalen Image, obwohl die laufende App es niemals verwendet. Ein Multi-Stage-Build erstellt das Artefakt in einer frühen Phase und kopiert nur dieses in eine saubere finale Phase, sodass keines der Build-Tools mit ausgeliefert wird.

Entfernen Sie Pakete, die die laufende App nicht benötigt. Sie benötigen höchstwahrscheinlich keine Shell, da die meisten Apps ihren Prozess direkt starten und zur Laufzeit niemals eine aufrufen. Hilfsprogramme wie cURL oder wget sind beim Bauen nützlich, aber Sie benötigen sie wahrscheinlich nicht zur Laufzeit, da Ihre App ihre Netzwerkaufrufe über eigene Bibliotheken abwickelt. Und alles, was cURL während des Builds abgerufen hat, ist zum Zeitpunkt der Auslieferung bereits im Image enthalten, sodass nichts mehr übrig ist, was es herunterladen müsste. 

Berechtigungen korrekt konfigurieren

Führen Sie den Container als Non-Root-User aus. Wenn ein Angreifer Code in Ihrer Anwendung ausführt, erhält er genau die Berechtigungen, mit denen der Container läuft. Ein Non-Root-User verringert den potenziellen Schaden eines Einbruchs.

Verwenden Sie ein schreibgeschütztes Root-Dateisystem. Dies hindert einen Angreifer, der bereits eingedrungen ist, daran, Dateien zu schreiben, Tools zu platzieren oder den Container zur Laufzeit zu modifizieren. Alles, was zwingend Schreibrechte benötigt, kann stattdessen einen spezifischen beschreibbaren Mount erhalten.

Entfernen Sie Linux-Capabilities, die Sie nicht nutzen. Container starten mit einer Reihe von Kernel-Capabilities, die die meisten Anwendungen niemals benötigen. CAP_NET_RAWermöglicht es einem Prozess beispielsweise, Netzwerkpakete zu fälschen, und ist standardmäßig aktiviert. Eine typische Webanwendung benötigt dies jedoch nie, während ein eingedrungener Angreifer es nutzen könnte, um Datenverkehr in Ihrem Netzwerk zu spoofing. Entfernen Sie die Capabilities, die Sie nicht brauchen, und fügen Sie nur das hinzu, was erforderlich ist. Das Entziehen dieser Capabilities (und das gezielte Hinzufügen von dem, was Sie benötigen) schließt privilegierte Operationen aus, die einem Angreifer andernfalls zur Verfügung stünden.

Halten Sie Secrets und verirrte Dateien aus dem Image fern

Halten Sie Secrets aus Layern heraus. Ein Secret, das über ARG oder COPY eingebunden wird, verbleibt in der Image-Historie, selbst wenn ein späterer Layer es löscht. Jeder, der das Image abruft, kann die Layer entpacken und das Secret lesen. Nutzen Sie stattdessen Secret-Mounts oder SSH-Mounts um einem einzelnen Build-Schritt ein Secret zur Verfügung zu stellen, ohne es in einen Layer zu schreiben.

Ein Secret aus den Layern herauszuhalten ist nur die halbe Miete. Der laufende Container benötigt den Wert nach wie vor. Injizieren Sie ihn daher zur Laufzeit aus einem dedizierten Secrets-Manager (Vault, einem Cloud-Secrets-Manager oder Kubernetes-Secrets), der als Datei gemountet oder in die Umgebung injiziert wird, und rotieren Sie ihn regelmäßig, anstatt langlebige Anmeldedaten irgendwo fest einzubauen.

Verwenden Sie eine .dockerignore Datei. Sie steuert, was überhaupt erst in den Build-Kontext gelangt, sodass .gitlokale Konfigurationen und verirrte Anmeldedaten niemals durch einen zu breit gefassten COPY -Anweisung.

Gezielt pinnen

Pinnen Sie das Base-Image über den Digest und nicht über das Tag. FROM node:24 wird im Laufe der Zeit neu aufgelöst, sodass zwei Builds im Abstand von einem Monat unterschiedliche Images abrufen können und ein kompromittiertes Base-Image unbemerkt eingeschleust werden kann. Das Pinnen über den Digest (@sha256:...) macht das Base-Image deterministisch, sodass genau das Image gebaut wird, das Sie getestet haben. Beachten Sie jedoch, dass ein gepinnter Digest auch Korrekturen zurückhält, falls Ihr Patching-Modell Fixes als neue Images bereitstellt. Wenn Sie stattdessen einen gepatchten Build derselben Version erhalten können, die Sie gepinnt haben, umgehen Sie dieses Problem und bleiben sicher.

Verlassen Sie sich nicht auf latest. Manche gehen davon aus, dass dies das neueste und stabilste Release bedeutet, aber in Docker ist es lediglich das Standard-Label, das dem letzten Image zugewiesen wird, das ohne explizites Versions-Tag gepusht wurde. Es kann auf ein älteres Image verweisen als erwartet und sich zwischen Builds unbemerkt ändern.

Überprüfen und Warten

Generieren Sie für jedes Image eine SBOM. Eine Software-Stückliste ist das vollständige Inventar dessen, was sich im Image befindet, einschließlich jedes Pakets und jeder Version. Damit können Sie die Frage „Sind wir betroffen?“ in dem Moment beantworten, in dem eine neue Schwachstelle bekannt wird. 

Signieren Sie jedes Image bei der Erstellung und verifizieren Sie diese Signatur vor der Ausführung mit einem Admission Controller, der unsignierte Container abweist. Diese Kette verhindert, dass ein manipuliertes oder nicht genehmigtes Image in die Production gelangt, selbst wenn sich jemand Zugriff auf Ihre Registry verschafft.

Behandeln Sie laufende Container als unveränderlich (immutable). Sobald ein Image deployed ist, sollten Sie den laufenden Container weder patchen noch umkonfigurieren. Erstellen Sie stattdessen ein neues Image, testen Sie es und führen Sie ein erneutes Deployment durch. Was dann läuft, entspricht immer dem, was Sie erstellt, getestet und signiert haben. Das verhindert Konfigurationsdrift und macht Rollbacks so einfach wie das erneute Deployment des vorherigen Images.

Überprüfen Sie Images kontinuierlich. Ein Image, das letzte Woche noch sauber gescannt wurde, kann heute eine kritische Schwachstelle aufweisen, da täglich neue Schwachstellen für darin enthaltene Pakete bekannt werden. Eine Prüfung zum Zeitpunkt des Build reicht daher nicht aus. 

Drei Wege, um ein Basis-Image gehärtet zu halten

Ein Basis-Image beim Bekanntwerden neuer Schwachstellen gehärtet zu halten, ist eine fortlaufende Aufgabe, die auf drei verschiedene Arten gelöst werden kann.

In Eigenregie (Do it yourself)

Pflegen Sie Ihre eigene gehärtete Basis. Wählen Sie ein minimales Image, entfernen Sie alles, was Sie nicht benötigen, und bauen Sie es jedes Mal neu, wenn ein Paket darin eine Schwachstelle aufweist. Sie behalten die vollständige Kontrolle, aber dies erfordert kontinuierliche Arbeit und Wartung. Sie müssen Veröffentlichungen für jedes Paket in der Basis nachverfolgen und jeden Fix manuell backporten oder aktualisieren. Multiplizieren Sie das mit jeder Basis für jeden Service, und es zehrt an allem anderen, was Sie eigentlich entwickeln könnten.

Zu einer neu gebauten Distribution eines Anbieters wechseln

Einige Plattformen liefern gehärtete Images aus, die auf ihrer eigenen Distribution neu aufgebaut wurden. Sie migrieren Ihre Services auf deren Basis, testen sie erneut auf Fehler und richten sich dann nach deren Release-Zyklus, wobei Sie bei jedem Fix auf einen neuen Digest aktualisieren. Damit sind zwei Kostenfaktoren verbunden. Die Migration selbst kann Funktionen beschädigen, auf die sich Ihre App verlassen hat und die der Anbieter entfernt hat. Und das Patchen birgt dieselbe Upgrade-Falle, die auch bei Aktualisierungen von Abhängigkeiten auftritt, bei denen eine neue Major-Version Paketpfade verschieben, Standards ändern und ein funktionierendes Dockerfile beschädigen kann. Wenn Sie einen Digest für die Stabilität festlegen (pinnen), erhalten Sie nicht die Patches, wegen derer Sie das Tool überhaupt eingeführt haben.

Ein Tool die bereits verwendete Basis patchen lassen

Einige Anbieter ermöglichen es Ihnen, Ihre Version beizubehalten, indem sie gepatchte Builds derselben Version bereitstellen, anstatt auf ein neues Image zu wechseln. Sie erhalten einen frischen Build derselben Version mit gepatchtem CVE, den Sie wie jede andere Änderung durch Überprüfung und Merging übernehmen, anstatt das laufende Image zu bearbeiten. Auf diese Weise bleiben Sie auf der bereits getesteten Version und beseitigen dennoch die Schwachstelle.

Wie Aikido Docker-Images absichert

Aikido Security stellt neue gepatchte Builds für genau die Basis-Image-Versionen bereit, die Sie bereits verwenden.

Aikido Images ist eine Registry mit über 2.000 Drop-In-Ersatz-Images, bei denen die bekannten kritischen und schwerwiegenden Schwachstellen in der Basis bereits gepatcht sind. Jedes einzelne wird während des Builds neu erstellt, gepatcht, minimiert und gehärtet, sodass Sie eine kleinere Angriffsfläche und abgesicherte Standardeinstellungen auf der Basis erhalten, die Sie bereits ausführen.

Während ein Tool mit neu aufgebauter Distribution den Patch als neues Image ausliefert, zu dem Sie migrieren müssen, backportet Aikido den Fix auf die von Ihnen festgelegte Version. Es übernimmt den Fix aus dem neueren Release und wendet ihn auf die von Ihnen verwendete Version an, sodass die Änderung klein bleibt und sich das Image wie gewohnt verhält. Wenn ein sauberer Backport nicht möglich ist, aktualisiert oder baut Aikido die Komponente stattdessen neu. Der Austausch erfolgt nahtlos als Drop-in, das AutoFix als Pull Request vorschlägt, und jeder Pull von docker.aikido.io enthält eine SBOM, VEX und SLSA-Provenienz.

Es patcht Versionen auch dann weiter, wenn Upstream-Entwickler diese bereits aufgegeben haben, einschließlich Bases, die das End-of-Life erreicht haben. So können Sie eine ältere Version beibehalten, ohne deren bekannte Mängel mitzuschleppen, und müssen kein Upgrade durchführen, nur um geschützt zu bleiben.

Ein wachsender Anteil realer Fixes für Pakete erhält überhaupt kein CVE. Wenn also Sie oder Ihre Tools nur die CVE-Datenbank lesen, entgehen Ihnen Schwachstellen. Das Patching von Aikido wird teilweise durch Aikido Intel gespeist, das Upstream-Changelogs und die Commit-Historie ausliest, um Schwachstellen aufzuspüren, die im Upstream ohne CVE leise gepatcht wurden. So ist die Abdeckung nicht auf das beschränkt, was öffentliche Datenbanken gerade aufbereitet haben.

Anwendungsspezifische Pakete über npm, PyPI, Maven und Go hinweg werden über Aikido Libraries direkt vor Ort gepatcht, wobei derselbe Backporting-Ansatz wie bei Ihren Abhängigkeiten verwendet wird. Und Aikido Container Image Scanning sucht nach anfälligen Betriebssystempaketen, Abhängigkeiten, veralteten Runtimes, Malware und Lizenzrisiken in Basis-Images, Dockerfile-Befehlen und Kubernetes-Workloads, sodass Fundstellen im Kontext von Code und Cloud angezeigt werden.

Das Team hinter diesen Images kam durch die Übernahme von Root zu Aikido – dem Unternehmen hinter SlimToolkit (ehemals DockerSlim), einem der am häufigsten verwendeten Open-Source-Tools zur Image-Härtung. Die Härtung von Images war der Ursprung dieses Teams, und das Tool ist nach wie vor für jeden frei und kostenlos nutzbar.

{{walkthrough}}

FAQ

Was ist der wichtigste Schritt zur Absicherung eines Docker-Images?

Die Wahl eines kleinen Basis-Images. Die meisten Schwachstellen eines Containers stammen von den Betriebssystempaketen, die von der Basis bereitgestellt werden, und nicht von dem von Ihnen geschriebenen Code. Ein kleineres Basis-Image bedeutet daher weniger vererbte Mängel, bevor Sie überhaupt eigene Komponenten hinzufügen. Ein distroless oder minimales Basis-Image schließt von vornherein ganze Klassen von Schwachstellen aus, die ein vollständiges Distro-Image mit sich bringen würde.

Sollten Docker-Container als Root ausgeführt werden?

Nein, es sei denn, etwas erfordert dies zwingend. Wenn ein Angreifer Code in Ihrer Anwendung ausführt, übernimmt er die Berechtigungen, mit denen der Container läuft. Root im Container in Verbindung mit einem Container Escape kann Root auf dem Host bedeuten. Definieren Sie einen dedizierten Non-Root-User in Ihrem Dockerfile und entziehen Sie Linux-Funktionen, die die App niemals verwendet.

Worin besteht der Unterschied zwischen einem minimalen Image und einem gehärteten Image?

Ein minimales Image enthält weniger Ballast und verzichtet auf Shells, Paketmanager und Bibliotheken, die die App nicht benötigt. Ein gehärtetes Image basiert auf einer minimalen Basis und geht noch einen Schritt weiter, indem es gepatchte Paketversionen und sichere Standardeinstellungen wie die Ausführung als Nicht-Root-Benutzer anwendet. Ein minimales Image verkleinert die Angriffsfläche, während ein gehärtetes Image sie zusätzlich verkleinert und den verbleibenden Rest absichert.

Muss ich zu einer neuen Distro migrieren, um mein Basis-Image zu härten?

Nein. Einige Härtungstools erstellen Images auf ihrer eigenen Distribution neu, was bedeutet, dass jeder Dienst migriert und erneut auf Fehler getestet werden muss. Die Alternative besteht darin, die bereits verwendete Distro und Hauptversion beizubehalten und Korrekturen auf genau diese Version zu backporten – genau so funktioniert Aikido Images, sodass Sie den Patch ohne Migration erhalten.

Warum wird ein gehärtetes Image im Laufe der Zeit wieder anfällig?

Weil neue Schwachstellen für bereits darin enthaltene Pakete bekannt werden. Im Image selbst hat sich nichts geändert, aber die Liste der bekannten Fehler in seinen Paketen wächst kontinuierlich. Härtung ist daher keine einmalige Angelegenheit, sondern eine fortlaufende Aufgabe.

Kann ein Secret versehentlich in einem Docker-Image landen?

Ja, und das ist ein häufiger Fehler. Ein mit ARG oder COPY eingebundenes Secret verbleibt in der Image-Historie, selbst wenn es in einer späteren Schicht wieder gelöscht wird. Jeder, der das Image herunterlädt, kann die Schichten also entpacken und es lesen. Verwenden Sie stattdessen Build-Time Secret Mounts während des Build-Vorgangs und injizieren Sie Laufzeit-Secrets über einen Secrets Manager, anstatt sie fest in das Image einzubauen.

Teilen:

https://www.aikido.dev/blog/securing-docker-images

<script type="application/ld+json">
{
 "@context": "https://schema.org",
 "@graph": [
   {
     "@type": "TechArticle",
     "@id": "https://www.aikido.dev/blog/securing-docker-images#article",
     "isPartOf": { "@id": "https://www.aikido.dev/blog/securing-docker-images#webpage" },
     "mainEntityOfPage": { "@id": "https://www.aikido.dev/blog/securing-docker-images#webpage" },
     "headline": "Securing Docker images: harden, patch, and maintain them",
     "description": "Most of a container's vulnerabilities come from the base image. How to harden Docker images, why hardening is ongoing, and how to patch the base you already run.",
     "datePublished": "2026-08-28",
     "dateModified": "2026-08-28",
     "wordCount": 1650,
     "timeRequired": "PT8M",
     "inLanguage": "en-US",
     "author": { "@id": "https://www.aikido.dev/authors/nicholas-thomson#person" },
     "publisher": { "@id": "https://www.aikido.dev/#organization" },
     "image": { "@id": "https://www.aikido.dev/blog/securing-docker-images#primaryimage" },
     "articleSection": "DevSec Tools & Comparisons",
     "keywords": [
       "securing Docker images",
       "Docker image security",
       "container image hardening",
       "base image vulnerabilities",
       "distroless images",
       "backporting CVE fixes",
       "container vulnerability management",
       "non-root container",
       "multi-stage builds",
       "SBOM"
     ],
     "about": [
       { "@type": "Thing", "name": "Docker image security" },
       { "@type": "Thing", "name": "Container image hardening" },
       { "@type": "Thing", "name": "Vulnerability management" }
     ],
     "mentions": [
       { "@type": "SoftwareApplication", "name": "Docker", "applicationCategory": "DeveloperApplication" },
       { "@type": "SoftwareApplication", "name": "Aikido Images", "applicationCategory": "SecurityApplication", "url": "https://www.aikido.dev/cloud/hardened-images" },
       { "@type": "SoftwareApplication", "name": "Aikido Libraries", "applicationCategory": "SecurityApplication" },
       { "@type": "Thing", "name": "Alpine Linux" },
       { "@type": "Thing", "name": "Debian" },
       { "@type": "Thing", "name": "glibc" },
       { "@type": "Thing", "name": "Node.js" },
       { "@type": "Thing", "name": "SBOM" },
       { "@type": "Thing", "name": "SLSA provenance" },
       { "@type": "Thing", "name": "VEX" },
       { "@type": "Thing", "name": "CVE-2023-4911", "url": "https://nvd.nist.gov/vuln/detail/CVE-2023-4911" },
       { "@type": "Thing", "name": "CVE-2025-4373" }
     ],
     "speakable": {
       "@type": "SpeakableSpecification",
       "cssSelector": ["h1", "h2"]
     }
   },
   {
     "@type": "WebPage",
     "@id": "https://www.aikido.dev/blog/securing-docker-images#webpage",
     "url": "https://www.aikido.dev/blog/securing-docker-images",
     "name": "Securing Docker images: harden, patch, and maintain them",
     "description": "Most of a container's vulnerabilities come from the base image. How to harden Docker images, why hardening is ongoing, and how to patch the base you already run.",
     "inLanguage": "en-US",
     "isPartOf": { "@id": "https://www.aikido.dev/#website" },
     "primaryImageOfPage": { "@id": "https://www.aikido.dev/blog/securing-docker-images#primaryimage" },
     "breadcrumb": { "@id": "https://www.aikido.dev/blog/securing-docker-images#breadcrumb" },
     "datePublished": "2026-08-28",
     "dateModified": "2026-08-28"
   },
   {
     "@type": "ImageObject",
     "@id": "https://www.aikido.dev/blog/securing-docker-images#primaryimage",
     "url": "https://www.aikido.dev/blog/securing-docker-images/hero.png",
     "caption": "Securing Docker images"
   },
   {
     "@type": "BreadcrumbList",
     "@id": "https://www.aikido.dev/blog/securing-docker-images#breadcrumb",
     "itemListElement": [
       { "@type": "ListItem", "position": 1, "name": "Home", "item": "https://www.aikido.dev" },
       { "@type": "ListItem", "position": 2, "name": "Blog", "item": "https://www.aikido.dev/blog" },
       { "@type": "ListItem", "position": 3, "name": "Securing Docker images", "item": "https://www.aikido.dev/blog/securing-docker-images" }
     ]
   },
   {
     "@type": "WebSite",
     "@id": "https://www.aikido.dev/#website",
     "url": "https://www.aikido.dev",
     "name": "Aikido Security",
     "publisher": { "@id": "https://www.aikido.dev/#organization" },
     "inLanguage": "en-US"
   },
   {
     "@type": "Organization",
     "@id": "https://www.aikido.dev/#organization",
     "name": "Aikido Security",
     "url": "https://www.aikido.dev",
     "logo": {
       "@type": "ImageObject",
       "url": "https://www.aikido.dev/logo.png"
     },
     "sameAs": [
       "https://www.linkedin.com/company/aikido-security",
       "https://x.com/AikidoSecurity"
     ]
   },
   {
     "@type": "Person",
     "@id": "https://www.aikido.dev/authors/nicholas-thomson#person",
     "name": "Nicholas Thomson",
     "url": "https://www.aikido.dev/authors/nicholas-thomson",
     "jobTitle": "Senior SEO & Growth Lead",
     "worksFor": { "@id": "https://www.aikido.dev/#organization" },
     "sameAs": [
       "https://www.linkedin.com/in/nicholas-gray-thomson/"
     ]
   },
   {
     "@type": "FAQPage",
     "@id": "https://www.aikido.dev/blog/securing-docker-images#faq",
     "isPartOf": { "@id": "https://www.aikido.dev/blog/securing-docker-images#webpage" },
     "mainEntity": [
       {
         "@type": "Question",
         "name": "What is the most important step to secure a Docker image?",
         "acceptedAnswer": {
           "@type": "Answer",
           "text": "Choosing a small base image. Most of a container's vulnerabilities come from the OS packages the base ships, not the code you wrote, so a smaller base means fewer inherited flaws before you add anything of your own. A distroless or minimal base drops whole classes of vulnerabilities that a full distro image would drag in."
         }
       },
       {
         "@type": "Question",
         "name": "Should Docker containers run as root?",
         "acceptedAnswer": {
           "@type": "Answer",
           "text": "No, unless something genuinely requires it. If an attacker gets code execution in your app, they inherit whatever privileges the container runs as, and root in the container plus a container escape can mean root on the host. Set a dedicated non-root user in your Dockerfile and drop the Linux capabilities the app never uses."
         }
       },
       {
         "@type": "Question",
         "name": "What is the difference between a minimal image and a hardened image?",
         "acceptedAnswer": {
           "@type": "Answer",
           "text": "A minimal image ships less, stripping out shells, package managers, and libraries the app doesn't need. A hardened image starts from a minimal base and goes further, applying patched package versions and secure defaults like non-root execution. Minimal shrinks the attack surface, and hardened shrinks it and locks down what's left."
         }
       },
       {
         "@type": "Question",
         "name": "Do I have to migrate to a new distro to harden my base image?",
         "acceptedAnswer": {
           "@type": "Answer",
           "text": "No. Some hardening tools rebuild images on their own distribution, which means migrating every service and re-testing for breakage. The alternative is to keep the distro and major version you already run and backport fixes to that exact version, which is how Aikido Images works, so you get the patch without the migration."
         }
       },
       {
         "@type": "Question",
         "name": "Why does a hardened image become vulnerable again over time?",
         "acceptedAnswer": {
           "@type": "Answer",
           "text": "Because new vulnerabilities are disclosed against packages already inside it. Nothing in the image changed, but the list of known flaws in its packages keeps growing. Hardening is an ongoing job rather than a one-time pass."
         }
       },
       {
         "@type": "Question",
         "name": "Can a secret end up inside a Docker image by accident?",
         "acceptedAnswer": {
           "@type": "Answer",
           "text": "Yes, and it is a common mistake. A secret pulled in with ARG or COPY stays in the image history even if a later layer deletes it, so anyone who pulls the image can unpack the layers and read it. Use build-time secret mounts during the build, and inject runtime secrets from a secrets manager rather than baking them into the image."
         }
       }
     ]
   }
 ]
}
</script>

​

Nachrichten abonnieren

4.7/5
Falschpositive Ergebnisse leid?

Probieren Sie Aikido, wie 100.000 andere.
Jetzt starten
Erhalten Sie eine personalisierte Führung

Von über 100.000 Teams vertraut

Jetzt buchen
Scannen Sie Ihre App nach IDORs und realen Angriffspfaden

Von über 100.000 Teams vertraut

Scan starten
Erfahren Sie, wie KI-Penetrationstests Ihre App testen

Von über 100.000 Teams vertraut

Testen starten
Base-Images patchen, Migration überspringen

Direkter Ersatz für die Basis-Images, die Sie bereits verwenden

Kostenlos testen

Werden Sie noch heute sicher,
schnell und kostenlos.

Sichern Sie Code, Cloud und Laufzeit in einem zentralen System.
Verbinden Sie ein Repository, um herauszufinden, was die Reasoning Agents in Ihrer Codebasis finden.

Keine Kreditkarte erforderlich | Scan-Ergebnisse in 32 Sekunden.
Von über 150.000 Unternehmen vertraut