Frage Wie werden Sicherheitsupdates in Docker-Containern gehandhabt?


Wenn Sie Anwendungen auf Servern bereitstellen, gibt es normalerweise eine Trennung zwischen dem, was die Anwendung mit sich selbst bündelt und was sie von der Plattform (Betriebssystem und installierte Pakete) erwartet. Ein Punkt ist, dass die Plattform unabhängig von der Anwendung aktualisiert werden kann. Dies ist beispielsweise nützlich, wenn Sicherheitsupdates dringend auf von der Plattform bereitgestellte Pakete angewendet werden müssen, ohne dass die gesamte Anwendung neu erstellt werden muss.

Herkömmlicherweise wurden Sicherheitsupdates einfach durch Ausführen eines Paketmanagerbefehls zum Installieren aktualisierter Paketversionen auf dem Betriebssystem (z. B. "yum update" auf RHEL) angewendet. Aber mit dem Aufkommen von Container-Technologie wie Docker, wo Container Bilder im Wesentlichen beide Anwendungen bündeln und die Plattform, was ist die kanonische Art, ein System mit Containern auf dem neuesten Stand zu halten? Sowohl der Host als auch die Container haben ihre eigenen, unabhängigen Sätze von Paketen, die auf dem Host aktualisiert und aktualisiert werden müssen, um keine Pakete innerhalb der Container zu aktualisieren. Mit der Veröffentlichung von RHEL 7, wo speziell Docker-Container zum Einsatz kommen, wäre es interessant zu erfahren, wie Redhats empfohlen wird, Sicherheitsupdates von Containern zu handhaben.

Gedanken zu einigen der Optionen:

  • Wenn der Paketmanager Pakete auf dem Host aktualisiert, werden die Pakete in den Containern nicht aktualisiert.
  • Die Notwendigkeit, alle Containerimages neu zu generieren, um Updates zu übernehmen, scheint die Trennung zwischen der Anwendung und der Plattform zu durchbrechen (das Aktualisieren der Plattform erfordert Zugriff auf den Anwendungs-Build-Prozess, der die Docker-Images generiert).
  • Das Ausführen von manuellen Befehlen in jedem der laufenden Container scheint mühsam zu sein, und Änderungen sind bei der nächsten Aktualisierung von Containern aus den Anwendungsfreigabeartefakten gefährdet.

Daher scheint keiner dieser Ansätze zufriedenstellend zu sein.


103
2017-07-08 21:54


Ursprung


Die beste Idee dafür habe ich bisher gesehen Projekt Atomic. Ich denke nicht, dass es so ist ziemlich Bereit für die Prime Time. - Michael Hampton♦
Valko, mit welchem ​​Workflow bist du fertig geworden? Ich betreibe Langzeitcontainer (zB hpp-cgi) und was ich bisher gefunden habe ist: docker pull debian/jessie um das Bild zu aktualisieren, dann meine vorhandenen Bilder neu aufzubauen, dann die Behälter zu stoppen und sie erneut auszuführen (mit dem neuen Bild). Die Bilder, die ich erstelle, haben den gleichen Namen wie die vorherigen, so dass der Start über das Skript erfolgt. Ich entferne dann "unbenannte" Bilder. Ich würde sicherlich einen besseren Workflow schätzen. - miha
miha: Das klingt ähnlich wie das, was ich getan habe. Grundsätzlich alle Bilder im Rahmen der Neuerstellung fortlaufend aktualisieren und neu aufbauen. Und die Container mit den neuen Images neu starten. - Markus Hallmann
Die beste Antwort Hier hilft sehr, weil es ein Skript gibt, das Hauptbefehlszeilen enthält, um genau das zu tun, was Johannes Ziemke sagte: - Hudson Santos


Antworten:


Ein Docker-Image bündelt Anwendung und "Plattform", das ist richtig. Aber normalerweise besteht das Bild aus einem Basisbild und der eigentlichen Anwendung.

Die übliche Vorgehensweise bei Sicherheitsupdates besteht darin, das Basisimage zu aktualisieren und anschließend das Anwendungsimage neu zu erstellen.


43
2017-08-12 11:41



Danke, das klingt vernünftig. Nur noch wünschen, aktualisieren die Plattform sozusagen würde nicht auslösen, die gesamte Anwendung neu verpacken (z. B. müssen 100 verschiedene Anwendungsbilder aufgrund eines einzigen Basis-Image aktualisieren Update). Aber vielleicht ist dies mit der Docker-Philosophie unvermeidlich, alles in einem einzigen Bild zu bündeln. - Markus Hallmann
@ValkoSipuli Sie könnten immer ein Skript schreiben, um den Prozess zu automatisieren. - dsljanus
Warum nicht Apt-Get-Upgrade, Dnf-Upgrade, Pacman-Syu, etc. äquivalent in den Container? Sie könnten sogar ein Shell-Skript erstellen, das das tut und dann Führt die Anwendung aus und verwendet sie dann als Einstiegspunkt des Containers, damit beim Start / Neustart des Containers alle Pakete aktualisiert werden. - Arthur Kay
@ArthurKay Zwei Gründe: 1) Sie vergrößern die Containergröße, da alle Pakete, die aktualisiert werden, dem Container-Layer hinzugefügt werden, während das veraltete Paket im Image verbleibt. 2) Es schlägt den größten Vorteil von (Container-) Images: Das Image, das Sie ausführen, ist nicht dasselbe, das Sie erstellen / testen, weil Sie Pakete zur Laufzeit ändern. - Johannes 'fish' Ziemke
Eines verstehe ich nicht: Wenn Sie eine Software kaufen, die als Docker-Container ausgeliefert wird, müssen Sie darauf warten, dass der Hersteller der Software das Anwendungspaket jedes Mal neu erstellt, wenn ein Sicherheitsproblem auftritt ? Welche Firma würde auf diese Weise die Kontrolle über ihre offenen Schwachstellen aufgeben? - Sentenza


Die Behälter sollen leicht und austauschbar sein. Wenn Ihr Container ein Sicherheitsproblem aufweist, erstellen Sie eine Version des gepatchten Containers neu und stellen den neuen Container bereit. (Viele Container verwenden ein Standard-Basis-Image, das standardmäßige Paketverwaltungs-Tools verwendet, wie apt-get, um ihre Abhängigkeiten zu installieren. Beim Neuaufbau werden die Updates aus den Repositorys abgerufen.)

Während Sie innerhalb von Containern patchen können, wird das nicht gut skalieren.


6
2017-10-03 19:44





Dies wird automatisch in SUSE Enterprise Linux mit zypper-docker (1) gehandhabt.

SUSE / zypper-docker

Docker Schnellstart


1
2018-05-08 17:05





Zunächst einmal werden viele Ihrer Updates, die Sie in der Vergangenheit üblicherweise ausgeführt haben, nicht im Container selbst enthalten sein. Der Container sollte eine ziemlich leichte und kleine Teilmenge des vollständigen Dateisystems sein, das Sie in der Vergangenheit gewohnt waren. Die Pakete, die Sie aktualisieren sollten, sind diejenigen, die Teil Ihrer DockerFile sind, und da Sie DockerFile haben, sollten Sie in der Lage sein, die Pakete und Container-IDs im Auge zu behalten, die aktualisiert werden müssen. Cloudsteins UI, das bald veröffentlicht wird, verfolgt diese DockerFile-Zutaten für Sie, damit Sie das Update-Schema erstellen können, das am besten für ihre Container passt. Hoffe das hilft


0
2017-07-08 23:23