Aikido

Container ist schwierig – Aikido Container macht es einfach

Mackenzie JacksonMackenzie Jackson
|
#
#
#

Container beginnt mit Ihrem Basisimage.
Aber hier ist der Haken:

  • Ein einfaches Upgrade auf die „neueste“ Version eines Basis-Images kann Ihre Anwendung beschädigen.
  • Sie sind gezwungen, sich zwischen dem Ausliefern bekannter Schwachstellen oder dem tagelangen Beheben von Kompatibilitätsproblemen zu entscheiden.
  • Und oft... sind Sie sich nicht einmal sicher, ob sich ein Upgrade lohnt.

In diesem Beitrag untersuchen wir, warum das Aktualisieren von Basis-Images schwieriger ist, als es scheint, gehen reale Beispiele durch und zeigen, wie Sie sichere, intelligente Upgrades automatisieren können, ohne Ihre Anwendung zu beschädigen.

Das Problem: „Aktualisieren Sie einfach Ihr Basis-Image“ – Leichter gesagt als getan

Wenn Sie dies lesen, haben Sie wahrscheinlich etwas gegoogelt wie „Wie sichert man seine Container“, und der erste Punkt in jedem KI-generierten Schrottartikel, den Sie gelesen haben, ist dieser: aktualisieren Sie Ihr Basis-Image. Einfach, oder? Nun, nicht ganz so schnell. 

Ihr Basis-Image ist Ihr zentraler Sicherheitspunkt; wenn Ihr Basis-Image Schwachstellen enthält, trägt Ihre Anwendung diese Schwachstellen mit sich. Lassen Sie uns dieses Szenario durchspielen. 

Sie führen einen Scan Ihres container durch und es wird eine CVE mit hohem Schweregrad gefunden. Die hilfreiche Empfehlung lautet, das Basis-Image zu aktualisieren – fantastisch, das haben Sie noch vor dem Mittagessen erledigt. 

⚠️ CVE-2023-37920 gefunden in ubuntu:20.04
Schweregrad: Hoch
Behoben in: 22.04
Empfehlung: Basis-Image aktualisieren

„…aber Sie entdecken ein Problem.“ 

Durch blindes Upgrade von ubuntu:20.04 zu ubuntu:22.04, zerbricht Ihre Anwendung.

Schauen wir uns einige Beispiele an, wie ein Base Image aktualisiert wird und was in der Realität passiert. 

Beispiel 1: Ein Dockerfile, das nach einem Upgrade fehlschlägt

Initiales Dockerfile:

FROM python:3.8-buster‍
RUN apt-get update && apt-get install -y libpq-dev
RUN pip install psycopg2==2.8.6 flask==1.1.2
COPY . /appCMD ["python", "app.py"]

Das Team rüstet auf zu:

FROM python:3.11-bookworm‍
RUN apt-get update && apt-get install -y libpq-dev
RUN pip install psycopg2==2.8.6 flask==1.1.2COPY . /appCMD ["python", "app.py"]

Ergebnis:

  • psycopg2==2.8.6 lässt sich nicht gegen neuere kompilieren libpq Header aktiviert Bücherwurm.
  • flask==1.1.2 unterstützt nicht Python 3.11 Laufzeitfunktionen (veraltete APIs führen zu Fehlern).
  • Der Build schlägt in CI fehl.
  • Ihr Dev-Team ist verärgert und Ihr Mittagessen ist ruiniert. 

Beispiel 2: Base-Image-Upgrades, die subtile Laufzeitfehler einführen

Original:

FROM node:14-busterCOPY . /app
RUN npm ci
CMD ["node", "server.js"]

Upgrade auf:

FROM node:20-bullseye
COPY . /app
RUN npm ci
CMD ["node", "server.js"]

Laufzeitproblem:

  • node:20 verwendet neuere OpenSSL Versionen — strenge TLS-Verifizierung führt bei älteren axios-Konfigurationen zu Problemen.
  • Die App wirft UNABLE_TO_VERIFY_LEAF_SIGNATURE Laufzeitfehler HTTP Aufrufe an Legacy-Dienste.

Warum „latest“ eine Falle ist

Das Docker-Ökosystem fördert die Verwendung von neuesten Tags oder Top-Line-Releases. Dies bedeutet jedoch oft, dass Ihre Anwendung, die am Montag noch lief, am Dienstag plötzlich ausfällt. Dies ist oft eine Falle, die zu Kopfschmerzen, Ausfällen und einer langsameren Entwicklung führt, da Sie Zeit mit der Fehlerbehebung verbringen. 

Die Lösung ist dann offensichtlich, auf eine getestete Minor-Version zu pinnen… Nicht so schnell, denn jetzt sind Sie in das Spiel des Security Whack-a-Mole eingetreten, wo Sie für immer neue CVEs entdecken werden, die Sie anfällig machen könnten. 

Entscheidungslähmung: Sollten Sie ein Upgrade durchführen oder nicht?

Sicherheitsteams drängen auf Upgrades.
Entwickelnde wehren sich aufgrund der Stabilität.

Wer hat Recht? Es kommt darauf an.

UM die Entscheidung überhaupt zu verstehen, müssen Sie alle Optionen prüfen, was bedeutet, eine riesige Tabelle mit allen Versionen, Sicherheitsrisiken, Stabilitätsrisiken und Verfügbarkeiten zu erstellen. 

Werfen wir einen Blick darauf, wie das aussehen könnte. 

Versionstag Vorhandene CVEs (Hoch/Kritisch) Kompatibilitätsrisiko (1-5) Wichtige Breaking Changes / Funktionales Risiko Ecosystem Binary Support (Wheels/NPM-Binärdateien)
node:14-buster (Aktuell) - CVE-2022-35256 (OpenSSL Buffer-Overflow)
- CVE-2022-25883 (node-fetch SSRF)
- CVE-2021-32803 (Prototypen-Pollution in object-path)
1 (Stabil, aber veraltet) Legacy TLS, unsichere Abhängigkeiten integriert Vollständig unterstützt, aber EOL (Wartung eingestellt April 2023)
node:14-bullseye - Dieselben CVEs wie oben + kleinere zusätzliche OpenSSL-Probleme 1 Geringfügige glibc-Änderungen
Potenzielle Kompatibilitätsänderungen der Docker-Laufzeitschicht
Stabil; das Wheel- & NPM-Ökosystem wird weiterhin unterstützt
node:16-buster - CVE-2023-30581 (libuv OOB Write)
- CVE-2022-35256 (OpenSSL Overflow)
- CVE-2022-25883 (node-fetch SSRF)
2 Warnungen zur Deprecation des Buffer()-Konstruktors
Ältere HTTP-Bibliotheken geben strenge Warnungen aus
Weitgehend unterstützt
node:16-bullseye - Wie oben + kleinere OpenSSL-Updates 2 Leicht abweichendes DNS-Resolver-Verhalten
Benötigt Testabdeckung für interne Netzwerkaufrufe
Unterstützt
node:18-bullseye - CVE-2022-45195 (TLS-Schwachstelle in älterem Build)
- CVE-2023-30581 (libuv OOB Write)
3 TLS Strict Mode standardmäßig
Legacy Axios und ältere Request-Bibliotheken schlagen bei strengen Zertifikaten fehl.
Ökosystem in mittlerer Reife; einige Module erfordern Upgrades
node:18-alpine - Wie oben; Alpine glibc-Diskrepanz-Risiken 4 Alpine musl kann bestimmte native Module wie bcrypt beschädigen
Probleme beim Fallback auf den Build aus dem Quellcode
Erfordert Rebuilds für native Binärdateien
node:20-bullseye - 0 kritische CVEs (aktuelle stabile Version) 4 Breaking DNS resolver changes
Default ESM loader changes
axios < 1.3.2 breaks
Aktiv unterstützt; Ökosystem holt auf
node:20-bookworm (neueste) - 0 kritische CVEs (Stand März 2024) 5 Wesentliche Änderungen:
Strenges TLS
DNS-Änderungen
ESM-Durchsetzung
Ältere NPM-Plugins schlagen fehl
Einige Nischenmodule hinken noch hinterher; neuestes node-gyp erforderlich

Das führt zu komplexen, mangelhaften und unmöglichen Entscheidungen 

  1. Bleiben Sie beim alten Image und akzeptieren Sie Schwachstellen.
  2. Ihre App upgraden und dabei beschädigen, mit dem Risiko von Produktionsausfällen
  3. Manuelle Kompatibilitätstests versuchen – tagelange Arbeit

Der manuelle Upgrade-Workflow:

Wenn Sie dies manuell tun, sieht es so aus:

  • CVEs prüfen: trivy python:3.8-buster
  • Jede CVE recherchieren: Ist sie im Kontext Ihrer Anwendung erreichbar?
  • Über Upgrade-Kandidaten entscheiden 
  • Testen Sie das neue Image:
    • Build
    • Führen Sie Unit-Tests aus
    • Führen Sie Integrationstests aus
  • Im Fehlerfall versuchen Sie, Code zu patchen oder Bibliotheken zu aktualisieren.
  • Wiederholen Sie dies für jeden container.

Es ist anstrengend.

Die Kosten des Stillstands

Sie denken vielleicht: “Never change a running system.”

Aber ungepatchte container tragen massiv zu Sicherheitsverletzungen bei „87 % der in der Produktion verwendeten container wiesen mindestens eine kritische oder schwerwiegende Schwachstelle auf.“ Quelle 

Es gibt auch viele bekannte Exploits, die in gängigen Basis-Images existieren. 

  • Unzip Path Traversal Schwachstelle (CVE-2020-27350) — saß jahrelang in Millionen von Containern.
  • Heartbleed (CVE-2014-0160) verblieben lange nach offiziellen Fixes in Legacy-Containern.
  • PHP-FPM RCE (CVE-2019-11043) ermöglichen es Angreifern aus der Ferne, über manipulierte HTTP-Anfragen beliebigen Code auszuführen, und waren in container mit vorinstalliertes PHP-FPM bevor sie gepatcht werden

Wie unsere Auto-Fix-Funktion hilft

Um genau dieses Problem zu lösen, hat Aikido unsere Funktion container eingeführt, denn auch wir leiden unter diesem Problem. 

Die Funktion arbeitet wie folgt: Aikido Ihre Container auf Schwachstellen. Wenn (oder besser gesagt: sobald) wir Schwachstellen finden, benachrichtigen wir Sie wie immer und bieten Ihnen verschiedene Optionen an, anstatt Sie zu ermahnen, Ihr Basisimage zu aktualisieren. Wir erstellen eine Tabelle, aus der Sie ersehen können, welche Version des Basis-Images welche CVEs behebt. Auf diese Weise können Sie sehr schnell erkennen, dass eine geringfügige Aktualisierung alle oder einen Großteil der hohen CVEs beseitigen kann, was bedeutet, dass dies ein angemessenes Upgrade des Basis-Images ist. 

Wenn das Upgrade ein kleiner Versionssprung ist, können Sie automatisch einen Pull Request erstellen, um die Version zu erhöhen. 

Das sind Stunden an Arbeit, die eingespart werden.

Fazit:

  • Das Aktualisieren von container ist wirklich schwierig.
  • Der Ratschlag „einfach upgraden“ vereinfacht einen komplexen, risikobehafteten Prozess zu stark.
  • Ihre Teams sind zu Recht vorsichtig – aber sie sollten sich nicht zwischen Sicherheit und Stabilität entscheiden müssen.
  • container Aikidoübernimmt die mühsame Arbeit für Sie, sodass Sie eine fundierte Entscheidung treffen können. 
  • Wenn Sie also das nächste Mal eine Schwachstellenwarnung für Basis-Images sehen, werden Sie nicht in Panik geraten. Sie erhalten einen PR.
4.7/5

Sichern Sie Ihre Software jetzt.

Kostenlos starten
Ohne Kreditkarte
Demo buchen
Ihre Daten werden nicht weitergegeben · Nur Lesezugriff · Keine Kreditkarte erforderlich

Werden Sie jetzt sicher.

Sichern Sie Ihren Code, Ihre Cloud und Ihre Laufzeit in einem zentralen System.
Finden und beheben Sie Schwachstellen schnell und automatisch.

Keine Kreditkarte erforderlich | Scan-Ergebnisse in 32 Sek.