Wie gehe ich mit Sicherheitsupdates in Docker-Containern um?

117

Bei der Bereitstellung von Anwendungen auf Servern besteht normalerweise eine Trennung zwischen dem, was die Anwendung mit sich selbst bündelt, und dem, was von der Plattform (Betriebssystem und installierte Pakete) erwartet wird. Ein Punkt dabei ist, dass die Plattform unabhängig von der Anwendung aktualisiert werden kann. Dies ist beispielsweise nützlich, wenn Sicherheitsupdates dringend auf Pakete angewendet werden müssen, die von der Plattform bereitgestellt werden, ohne die gesamte Anwendung neu zu erstellen.

Üblicherweise wurden Sicherheitsupdates einfach durch Ausführen eines Paketmanagerbefehls angewendet, um aktualisierte Versionen von Paketen auf dem Betriebssystem zu installieren (z. B. "yum update" auf RHEL). Doch wie lässt sich mit der Einführung der Containertechnologie wie Docker, bei der Container-Images im Wesentlichen sowohl die Anwendung als auch die Plattform bündeln , ein System mit Containern auf dem neuesten Stand halten? Sowohl der Host als auch die Container verfügen über eigene, unabhängige Paketsätze, die aktualisiert werden müssen. Durch die Aktualisierung auf dem Host werden keine Pakete in den Containern aktualisiert. Mit der Veröffentlichung von RHEL 7, in dem Docker-Container besonders vorgestellt werden, wäre es interessant zu erfahren, wie Redhat Sicherheitsupdates von Containern handhaben soll.

Gedanken zu einigen Optionen:

  • Wenn Sie den Paketmanager Pakete auf dem Host aktualisieren lassen, werden die Pakete in den Containern nicht aktualisiert.
  • Das erneute Generieren aller Container-Images zum Anwenden von Updates scheint die Trennung zwischen der Anwendung und der Plattform aufzuheben (das Aktualisieren der Plattform erfordert Zugriff auf den Anwendungserstellungsprozess, der die Docker-Images generiert).
  • Das Ausführen manueller Befehle in jedem der ausgeführten Container ist mühsam und es besteht die Gefahr, dass Änderungen überschrieben werden, wenn Container das nächste Mal von den Artefakten der Anwendungsfreigabe aktualisiert werden.

Keiner dieser Ansätze scheint also zufriedenstellend zu sein.

Markus Hallmann
quelle
1
Die beste Idee, die ich bisher gesehen habe, ist Project Atomic . Ich glaube nicht , es ist ziemlich obwohl für Hauptsendezeit bereit.
Michael Hampton
1
Valko, mit welchem ​​Workflow bist du gelandet? Ich verwende langfristige Container (z. B. Hosting von PHP-CGI). Bisher habe ich Folgendes festgestellt: docker pull debian/jessieAktualisieren Sie das Image, erstellen Sie die vorhandenen Images neu, halten Sie die Container an und führen Sie sie erneut aus ( mit dem neuen Bild). Die von mir erstellten Bilder haben denselben Namen wie die vorherigen, daher erfolgt der Start über das Skript. Ich entferne dann "unbenannte" Bilder. Ich würde mich sicher über einen besseren Workflow freuen.
Miha
1
miha: Das hört sich ähnlich an, wie ich es gemacht habe. Grundsätzlich werden alle Images im Rahmen von Neuveröffentlichungen ständig aktualisiert und neu erstellt. Und die Container mit den neuen Images neu starten.
Markus Hallmann
1
Die beste Antwort hier hilft viel, weil es ein Skript gibt, das Hauptbefehlszeilen enthält, um genau das zu tun, was Johannes Ziemke sagte:
Hudson Santos
Interessante Frage. Ich wundere mich selbst darüber. Wenn auf einem Docker-Host 20 Anwendungen ausgeführt werden, müssen Sie die Basis-Images aktualisieren, neu erstellen und neu starten! 20 Anwendungen und Sie wissen nicht einmal, ob das Sicherheitsupdate alle oder nur eine davon betroffen hat. Sie müssen ein Image für Apache neu erstellen, wenn das Sicherheitsupdate beispielsweise nur libpng betrifft. Sie müssen also unnötige Neuerstellungen und Neustarts durchführen ...
Dalibor Filus,

Antworten:

47

Ein Docker-Image bündelt Anwendung und "Plattform", das ist richtig. In der Regel besteht das Image jedoch aus einem Basisimage und der eigentlichen Anwendung.

Die kanonische Möglichkeit, mit Sicherheitsupdates umzugehen, besteht darin, das Basisimage zu aktualisieren und anschließend das Anwendungsimage neu zu erstellen.

Johannes 'Fisch' Ziemke
quelle
3
Danke, das klingt vernünftig. Wünschen Sie nur noch, die Plattform sozusagen zu aktualisieren, müsste dies nicht dazu führen, dass die gesamte Anwendung neu gepackt wird. Aber vielleicht ist dies unvermeidlich mit der Docker-Philosophie, alles in einem einzigen Bild zu bündeln.
Markus Hallmann
3
@ValkoSipuli Sie können jederzeit ein Skript schreiben, um den Prozess zu automatisieren.
Dsljanus
Warum nicht apt-get upgrade, dnf upgrade, pacman -syu usw. gleich im Container? Sie können sogar ein Shell-Skript erstellen, das dies ausführt und dann die Anwendung ausführt. Verwenden Sie dieses Skript dann als Eintrittspunkt des Containers, damit beim Starten / Neustarten des Containers alle seine Pakete aktualisiert werden.
Arthur Kay
8
@ArthurKay Zwei Gründe: 1) Sie vergrößern die Containergröße, da alle Pakete, die aktualisiert werden, zur Containerebene hinzugefügt werden, während das veraltete Paket im Image bleibt. 2) Es hat den größten Vorteil von (Container-) Images: Das Image, das Sie ausführen, ist nicht dasselbe, das Sie erstellen / testen, da Sie Pakete zur Laufzeit ändern.
Johannes 'Fisch' Ziemke
7
Eines verstehe ich nicht: Wenn Sie ein Unternehmen sind, das eine Software kauft, die als Docking-Container geliefert wird, müssen Sie jedes Mal, wenn ein Sicherheitsproblem auftritt, warten, bis der Hersteller der Software das Anwendungspaket neu erstellt ? Welches Unternehmen würde auf diese Weise die Kontrolle über seine offenen Schwachstellen aufgeben?
Sentenza
7

Die Behälter sollen leicht und austauschbar sein. Wenn Ihr Container ein Sicherheitsproblem aufweist, erstellen Sie eine Version des Containers neu, die gepatcht ist, und stellen den neuen Container bereit. (Viele Container verwenden ein Standard-Basisimage, das Standard-Paketverwaltungstools wie apt-get verwendet, um ihre Abhängigkeiten zu installieren. Bei der Neuerstellung werden die Aktualisierungen aus den Repositorys abgerufen.)

Sie könnten zwar in Containern patchen, aber das wird nicht gut skalieren.

Paul R
quelle
0

Erstens sind viele Ihrer Updates, die Sie in der Vergangenheit traditionell ausgeführt haben, einfach nicht im Container selbst enthalten. Der Container sollte eine relativ kompakte und kleine Teilmenge des gesamten Dateisystems sein, das Sie in der Vergangenheit gesehen haben. Die Pakete, die Sie aktualisieren müssen, sind Teil Ihrer DockerFile, und da Sie die DockerFile haben, sollten Sie in der Lage sein, die Pakete und Container-IDs zu verfolgen, die aktualisiert werden müssen. Cloudsteins Benutzeroberfläche, die in Kürze veröffentlicht wird, verfolgt diese DockerFile-Inhaltsstoffe für Sie, sodass Sie das für ihre Container am besten geeignete Aktualisierungsschema erstellen können. Hoffe das hilft

Ben Grissinger
quelle
-1

Es ist in der Regel sogar noch schlimmer als die drei von Ihnen bereitgestellten Optionen. Die meisten Docker-Images werden nicht mit Paket-Managern erstellt, daher können Sie das Docker-Image nicht einfach mit einer Shell versehen und ein Update ausgeben. Sie müssen das Docker-Image entweder neu erstellen oder neu erhalten.

In den meisten Fällen ist es unvernünftig, dass Sie für die Neuerstellung von Sicherheitspatches eine Neuerstellung durchführen müssen oder andere Personen beaufsichtigen.

Ich überlegte, Sonarr und Radarr in Docker-Containern einzusetzen, aber zu wissen, dass sie nicht die regelmäßigen Sicherheitsupdates erhalten, die mein Container erhält, ist ein Deal Breaker. Das Verwalten von Sicherheitsupdates für meinen Container ist ausreichend mühsam, ohne dass Sicherheitsupdates manuell auf jedes Docker-Image einzeln angewendet werden müssen.

Lee Burch
quelle
1
Ihr Beitrag wird nicht als Antwort angesehen, da Sie keine Antwort auf die Frage geben. Bitte füge es als Kommentar zu der Frage hinzu und entferne deine "Antwort". StackExchange ist kein Forum, sollte jedoch als Frage-und-Antwort-Forum betrachtet werden, in dem Experten Fragen beantworten, bei denen sie Hilfe leisten können.
Phillip-Zyan K Lee- Stockmann