Skip to main content

Docker für Node.js-Entwickler: 5 Dinge, die Sie wissen müssen, um Ihre Sicherheit nicht zu gefährden

Artikel von
docker node

25. Januar 2021

0 Min. Lesezeit

Docker verzeichnet insgesamt mehr als 50 Milliarden Downloads von Container-Images. Bei Millionen von Anwendungen auf Docker Hub sind containerbasierte Anwendungen beliebt und bieten eine einfache Möglichkeit, Anwendungen zu nutzen und bereitzustellen.

Allerdings kann die unbedarfte Entwicklung eigener Docker-Webanwendungen mit Node.js viele Sicherheitsrisiken mit sich bringen. Wie machen wir Sicherheit also zu einem festen Bestandteil von Docker für Node.js-Entwickler?

Bevor wir uns mit den Grundlagen von Docker für Node.js und dem Erstellen von Docker-Images befassen, werfen wir einen Blick auf einige häufig gestellte Fragen zu diesem Thema.

Wie dockerisiere ich Node.js-Anwendungen?

Ihre Node.js-Anwendung in einem Docker-Container auszuführen, kann so einfach sein, wie das Projektverzeichnis zu kopieren und alle erforderlichen npm-Pakete zu installieren. Dabei können jedoch zahlreiche Sicherheits- und produktionsbezogene Aspekte übersehen werden. Diese Tipps für den produktiven Einsatz finden Sie in der folgenden Anleitung zum Containerisieren von Node.js-Webanwendungen mit Docker. Sie behandelt alles von der Wahl des passenden Docker-Basis-Images und dem Einsatz von Multi-Stage-Builds bis hin zur sicheren Verwaltung von Secrets und der korrekten Aktivierung produktionsbezogener Framework-Konfigurationen.

In diesem Artikel erfahren Sie, wie sich die Wahl des passenden Node.js-Docker-Basis-Images auf Ihre Webanwendung auswirkt. Außerdem zeigen wir Ihnen, wie Sie das sicherste verfügbare Docker-Image für Ihre Anwendung finden.

Wie ist Docker für Node.js-Entwickler hilfreich?

Wenn Sie Ihre Node.js-Anwendung in einem Container bündeln, können Sie die gesamte Anwendung verpacken – einschließlich Laufzeitumgebung, Konfiguration, Abhängigkeiten auf Betriebssystemebene und allem, was Ihre Webanwendung benötigt, um auf verschiedenen Plattformen und CPU-Architekturen ausgeführt zu werden. Diese Pakete werden als bereitstellbare Artefakte, sogenannte Container-Images, gebündelt. Docker-Images sind softwarebasierte Pakete, die leicht reproduzierbare Builds ermöglichen und Node.js-Entwicklern erlauben, dasselbe Projekt oder Produkt in allen Umgebungen auszuführen.

Außerdem können Entwickler mit Docker-Containern leichter neue Plattformversionen oder andere Änderungen ausprobieren, ohne besondere Berechtigungen zu benötigen oder eine dedizierte Umgebung für ein Projekt einrichten zu müssen.

1. Wählen Sie das passende Node.js-Docker-Basis-Image für Ihre Anwendung

Wenn wir ein Docker-Image für ein Node.js-Projekt erstellen, bauen wir unser Anwendungs-Image auf einem anderen Docker-Image auf, das wir von Docker Hub beziehen. Dieses nennen wir Basis-Image. Es bildet die Grundlage für das neue Docker-Image, das Sie für Ihre Node.js-Anwendung erstellen.

Die Wahl des Basis-Images ist entscheidend, da sie sich erheblich auf alles auswirkt – von der Build-Geschwindigkeit des Docker-Images bis hin zur Sicherheit und Leistung Ihrer Webanwendung. Möglicherweise entscheiden Sie sich für ein vollständiges Betriebssystem-Image auf Basis von Debian oder Ubuntu, weil Sie damit alle darin enthaltenen Tools und Bibliotheken nutzen können.

Das hat jedoch seinen Preis. Wenn ein Basis-Image eine Sicherheitslücke aufweist, übernehmen Sie diese in Ihr neu erstelltes Image. Warum sollten Sie mit einem großen Basis-Image, das zahlreiche Schwachstellen enthält, von Anfang an Nachteile in Kauf nehmen?

Viele Sicherheitslücken in Basis-Images betreffen die Betriebssystemebene (OS), auf der das jeweilige Image basiert. Snyks Studie von 2019 Docker-Sicherheit nach links verlagern zeigte, dass die durch die OS-Ebene eingebrachten Schwachstellen je nach gewählter Variante stark variieren können.

Balkendiagramm mit dem Titel „Schwachstellen in Betriebssystem-Images“: Debian 55, Debian stretch-slim 42, Ubuntu 31, CentOS 1, Fedora 0 und Alpine 0.

Diese Bedenken gelten übrigens für alle Basis-Images, deren Einsatz Sie in Betracht ziehen. Die beliebtesten Docker-Images mit ihren neuesten Builds aus dem Bericht „State of Open Source Security 2020“ zeigen beispielsweise, dass Docker-Basis-Images standardmäßig durchgehend Sicherheitslücken enthalten.

2. Scannen Sie Ihr Node.js-Docker-Image während der Entwicklung

Das Erstellen eines Docker-Images auf Basis anderer Images sowie deren erneuter Build können neue Schwachstellen mit sich bringen. Doch Sie können den Überblick behalten.

Behandeln Sie den Build-Prozess für Docker-Images wie jede andere entwicklungsbezogene Tätigkeit. Genauso wie Sie Ihren Code testen, sollten Sie auch die Docker-Images testen, die Sie erstellen.

Zu diesen Tests gehören statische Dateiüberprüfungen, auch Linter genannt, die sicherstellen, dass Sie Sicherheitsfallen und andere schlechte Muster in Ihrer Dockerfile vermeiden. Einige davon haben wir in unseren Best Practices für die Sicherheit von Docker-Images beschrieben. Wenn Sie Node.js-Anwendungen entwickeln, sollten Sie sich diese Schritt-für-Schritt-Anleitung zu den 10 Best Practices für das Containerisieren von Node.js-Webanwendungen mit Docker ansehen.

Auch die Verknüpfung Ihrer Git-Repositories mit Snyk ist eine hervorragende Möglichkeit. Snyk unterstützt native Integrationen mit GitHub, GitLab, Bitbucket und Azure Repos. Dank der Git-Integration können wir Ihre Pull Requests scannen und mit Sicherheitsinformationen versehen, wenn wir Schwachstellen finden. So können Sie Prüfungen einrichten und das Zusammenführen eines Pull Requests verhindern, wenn dieser neue Sicherheitslücken einführt.

Wenn Sie mehr Flexibilität für Ihre Continuous Integration (CI) oder eine eng integrierte Entwicklererfahrung benötigen, lernen Sie die Snyk CLI kennen.

Mit der CLI können Sie Ihr Docker-Container-Image ganz einfach testen. Angenommen, Sie erstellen lokal ein Docker-Image und kennzeichnen es mit nodejs:notification-v99.9 – dann testen wir es so:

  1. Installieren Sie die Snyk CLI:$ npm install -g snyk

  2. Lassen Sie die Snyk CLI anschließend mit folgendem Befehl automatisch ein API-Token für Sie abrufen:$ snyk auth

  3. Scannen Sie das lokale Basis-Image:$ snyk container test nodejs:notification-v99.9

Die Testergebnisse werden auf dem Bildschirm ausgegeben. Sie enthalten Informationen zur CVE und zum Pfad, über den die Schwachstelle eingebracht wird. So erfahren Sie, welche OS-Abhängigkeit dafür verantwortlich ist.

Hier sehen Sie ein Beispiel für die Testergebnisse des Docker-Basis-Images node:15:

✗ High severity vulnerability found in binutils
  Description: Out-of-Bounds
  Info: https://snyk.io/vuln/SNYK-DEBIAN9-BINUTILS-404153
  Introduced through: dpkg/dpkg-dev@1.18.25, libtool@2.4.6-2
  From: dpkg/dpkg-dev@1.18.25 > binutils@2.28-5
  From: libtool@2.4.6-2 > gcc-defaults/gcc@4:6.3.0-4 > gcc-6@6.3.0-18+deb9u1 > binutils@2.28-5
  Introduced by your base image (node:15)

✗ High severity vulnerability found in binutils
  Description: Integer Overflow or Wraparound
  Info: https://snyk.io/vuln/SNYK-DEBIAN9-BINUTILS-404253
  Introduced through: dpkg/dpkg-dev@1.18.25, libtool@2.4.6-2
  From: dpkg/dpkg-dev@1.18.25 > binutils@2.28-5
  From: libtool@2.4.6-2 > gcc-defaults/gcc@4:6.3.0-4 > gcc-6@6.3.0-18+deb9u1 > binutils@2.28-5
  Introduced by your base image (node:15)

Organization:      snyk-demo-567
Package manager:   deb
Target file:       Dockerfile
Project name:      docker-image|node
Docker image:      node:15
Platform:          linux/amd64
Base image:        node:15
Licenses:          enabled

Tested 412 dependencies for known issues, found 554 issues.

Base Image  Vulnerabilities  Severity
node:15     554              56 high, 63 medium, 435 low

Recommendations for base image upgrade:

Alternative image types
Base Image                Vulnerabilities  Severity
node:current-buster-slim  53               10 high, 4 medium, 39 low
node:15.5-slim            72               18 high, 7 medium, 47 low
node:current-buster       304              33 high, 43 medium, 228 low

Unser Snyk-CLI-Spickzettel zeigt einige der Möglichkeiten, die Ihnen die CLI bietet. Weitere Informationen zum Einstieg in die Snyk Container CLI finden Sie in unserer Dokumentation.

3. Beheben Sie Schwachstellen in der Node.js-Laufzeitumgebung Ihrer Docker-Images

Ein oft übersehener Aspekt beim Risikomanagement für Docker-Container-Images ist die Laufzeitumgebung der Anwendung selbst. Ganz gleich, ob Sie Docker für Java verwenden oder Docker für Node.js-Webanwendungen einsetzen: Die Node.js-Laufzeitumgebung Ihrer Anwendung kann selbst Schwachstellen aufweisen.

Sie sollten die Sicherheits-Releases von Node.js und die Sicherheitsrichtlinie von Node.js im Blick behalten und befolgen. Anstatt diese manuell zu verfolgen, können Sie Snyk nutzen, um auch Node.js-Sicherheitslücken zu finden.

Um Ihnen einen besseren Überblick über Sicherheitslücken in den verschiedenen Node.js-Basis-Image-Tags zu geben, habe ich einige davon mit der Snyk CLI gescannt und die Ergebnisse in einem logarithmischen Diagramm dargestellt:

Balkendiagramm zum Vergleich der gesamten Sicherheitslücken und der Node.js-Laufzeit-Sicherheitslücken in Docker-Node.js-Basis-Images und Laufzeitvarianten.

Sie sehen, dass:

  1. Das standardmäßige Basis-Image-Tag node, das auch als node:latest gekennzeichnet ist, bündelt mehr als 500 Sicherheitslücken. Zudem bringt es zwei Sicherheitslücken in der Node.js-Laufzeitumgebung selbst mit. Das sollte Ihnen zu denken geben, wenn Sie derzeit Node.js 15 in der Produktionsumgebung einsetzen und keine Patches oder Fehlerbehebungen vorgenommen haben.

  2. Das Basis-Image-Tag node:alpine enthält möglicherweise keine anfälligen OS-Abhängigkeiten im Basis-Image – deshalb fehlt der blaue Balken. Es verwendet jedoch weiterhin eine anfällige Version der aktuellen Node.js-Laufzeitumgebung (Version 15).

  3. Wenn Sie eine nicht mehr unterstützte Node.js-Version verwenden – zum Beispiel Node.js 10 –, ist diese anfällig. Wie Sie sehen, erhält sie keine Sicherheitsupdates mehr.

Wenn Sie sich für Node.js Version 15 entscheiden würden, die zum Zeitpunkt der Veröffentlichung dieses Artikels die neueste Version war, wären Sie nicht nur 561 Sicherheitslücken in diesem Container ausgesetzt, sondern auch zwei Sicherheitslücken in der Node.js-Laufzeitumgebung selbst.

Die Ergebnisse des Docker-Scans finden Sie unter dieser öffentlichen URL für Image-Tests. Sie können auch andere von Ihnen verwendete Node.js-Basis-Image-Tags mit diesem öffentlichen, kostenlosen Docker-Scan-Service testen.

Snyk-Schwachstellenbericht für Docker node:15.5.0 mit 563 Schwachstellen und in der Seitenleiste hervorgehobenen Node-bezogenen Problemen.

Wenn Sie bereits ein Docker-Benutzerkonto haben, können Sie es verwenden, um eine Verbindung zu Snyk herzustellen und Ihre Docker-Hub-Repositories schnell zu importieren.

4. Überwachen Sie bereitgestellte Docker-Images für Ihre Node.js-Anwendungen

Sobald Sie Docker-Images erstellt haben, übertragen Sie diese wahrscheinlich in eine Docker-Registry, in der die Images verwaltet werden, damit sie bereitgestellt und als funktionsfähige Container-Anwendungen gestartet werden können.

Warum sollten wir Docker-Basis-Images überwachen?

Wenn Sie alle bisher beschriebenen Sicherheitsrichtlinien zum Scannen und Beheben von Problemen in Basis-Images befolgen, ist das großartig. Denken Sie jedoch daran, dass ständig neue Sicherheitslücken entdeckt werden. Wenn Ihr Image jetzt 78 Schwachstellen aufweist, heißt das nicht, dass es morgen früh nicht 100 sein könnten, sobald neue CVEs gemeldet werden und Ihre laufenden Container in der Produktionsumgebung betreffen. Deshalb ist es entscheidend, Ihre Container-Image-Registry – also die Images, die Sie für die Bereitstellung von Containern verwenden – zu überwachen. So erfahren Sie frühzeitig von Sicherheitsproblemen und können sie beheben.

Sie können direkt über die Snyk-App zahlreiche Docker-Image-Registries integrieren. Importieren Sie beispielsweise Images von Docker Hub, ACR, ECR, GCR oder Artifactory. Snyk scannt diese dann regelmäßig und benachrichtigt Sie über Slack oder per E-Mail über gefundene Sicherheitsprobleme:

Snyk Projects-Dashboard mit einer durchsuchbaren Liste von Docker-Projekten und der Anzahl von Problemen mit hohem, mittlerem und niedrigem Schweregrad.

5. Befolgen Sie Sicherheitsrichtlinien und Empfehlungen für den produktiven Einsatz, um ein sicheres und optimales Node.js-Docker-Image zu erstellen

Glückwunsch, dass Sie bisher alle Sicherheitsrichtlinien befolgt haben!

Zum Abschluss: Wenn Sie sich über Best Practices für die Sicherheit beim Erstellen optimaler Docker-Images für Node.js- und Java-Anwendungen informieren möchten, finden Sie hier einige Ressourcen:

  1. 10 Best Practices für Docker-Sicherheit – ausführliche Sicherheitspraktiken, die Sie beim Erstellen und Abrufen von Docker-Basis-Images befolgen sollten. Außerdem erfahren Sie mehr über Docker Content Trust.

  2. Entwickeln Sie mit Java? Diese Ressource ist für Sie interessant: Docker für Java-Entwickler: 5 Dinge, die Sie wissen müssen, um Ihre Sicherheit nicht zu gefährden

  3. 10 Best Practices für das Containerisieren von Node.js-Webanwendungen mit Docker – Wenn Sie Node.js-Entwickler sind, wird Ihnen diese Schritt-für-Schritt-Anleitung gefallen. Sie zeigt Ihnen, wie Sie sichere und leistungsfähige Docker-Basis-Images für Ihre Node.js-Anwendungen erstellen.

Beginnen Sie jetzt damit, Ihre Container-Images mit Snyk zu testen und Schwachstellen zu beheben.

Starten Sie mit Capture the Flag

Erfahren Sie in unserem virtuellen On-Demand-Workshop für Einsteiger, wie Sie Capture-the-Flag-Herausforderungen lösen.