Jak obsługiwać aktualizacje zabezpieczeń w kontenerach Docker?

117

Podczas wdrażania aplikacji na serwerach zwykle występuje oddzielenie między tym, co aplikacja łączy ze sobą, a tym, czego oczekuje od platformy (system operacyjny i zainstalowane pakiety). Jednym z nich jest to, że platformę można aktualizować niezależnie od aplikacji. Jest to przydatne na przykład, gdy aktualizacje zabezpieczeń muszą być pilnie stosowane do pakietów dostarczanych przez platformę bez przebudowywania całej aplikacji.

Tradycyjnie aktualizacje zabezpieczeń były stosowane po prostu przez wykonanie polecenia menedżera pakietów, aby zainstalować zaktualizowane wersje pakietów w systemie operacyjnym (na przykład „yum update” na RHEL). Ale wraz z pojawieniem się technologii kontenerów, takich jak Docker, w której obrazy kontenerów zasadniczo obejmują zarówno aplikację, jak i platformę, jaki jest kanoniczny sposób aktualizowania systemu z kontenerami? Zarówno host, jak i kontenery mają własne, niezależne zestawy pakietów, które wymagają aktualizacji, a aktualizacja na hoście nie aktualizuje żadnych pakietów w kontenerach. Wraz z wydaniem RHEL 7, w którym szczególnie polecane są kontenery Docker, ciekawie byłoby usłyszeć zalecany przez Redhat sposób obsługi aktualizacji zabezpieczeń kontenerów.

Myśli na temat kilku opcji:

  • Zezwolenie menedżerowi pakietów na aktualizację pakietów na hoście nie zaktualizuje pakietów w kontenerach.
  • Konieczność ponownego wygenerowania wszystkich obrazów kontenera w celu zastosowania aktualizacji wydaje się przerywać separację między aplikacją a platformą (aktualizacja platformy wymaga dostępu do procesu kompilacji aplikacji, który generuje obrazy Docker).
  • Uruchamianie ręcznych poleceń w każdym z uruchomionych kontenerów wydaje się kłopotliwe, a zmiany mogą zostać zastąpione przy następnej aktualizacji kontenerów z artefaktów wydania aplikacji.

Żadne z tych podejść nie wydaje się zadowalające.

Markus Hallmann
źródło
1
Najlepszym pomysłem, jaki do tej pory widziałem, jest Project Atomic . Nie sądzę jednak, żeby był gotowy na najwyższy czas.
Michael Hampton
1
Valko, z czym skończyłeś? Korzystam z długoterminowych kontenerów (na przykład hostuję php-cgi) i do tej pory znalazłem: docker pull debian/jessiezaktualizować obraz, następnie odbudować moje istniejące obrazy, a następnie zatrzymać pojemniki i uruchomić je ponownie ( z nowym obrazem). Obrazy, które buduję, mają taką samą nazwę jak poprzednie, więc uruchamianie odbywa się za pomocą skryptu. Następnie usuwam „nienazwane” obrazy. Z pewnością doceniłbym lepszy przepływ pracy.
miha
1
miha: Brzmi podobnie do tego, co skończyłem. Zasadniczo ciągła aktualizacja i przebudowywanie wszystkich obrazów w ramach tworzenia nowych wydań. I restartowanie kontenerów przy użyciu nowych obrazów.
Markus Hallmann
1
Najlepsza odpowiedź tutaj bardzo pomaga, ponieważ istnieje skrypt, który zawiera główne wiersze poleceń pozwalające robić dokładnie to, co powiedział Johannes Ziemke:
Hudson Santos
Interesujące pytanie. Zastanawiam się nad tym sam. Jeśli masz 20 aplikacji działających na jednym hoście dokera, musisz zaktualizować obrazy podstawowe, odbudować i uruchomić ponownie! 20 aplikacji i nawet nie wiesz, czy aktualizacja zabezpieczeń wpłynęła na wszystkie, czy tylko na jedną z nich. Musisz odbudować obraz, powiedzmy Apache, gdy aktualizacja zabezpieczeń wpłynęła na przykład tylko na libpng. Skończysz więc z niepotrzebnymi przebudowaniami i restartem ...
Dalibor Filus

Odpowiedzi:

47

Obraz Dockera zawiera aplikację i „platformę”, to prawda. Ale zwykle obraz składa się z obrazu podstawowego i rzeczywistej aplikacji.

Tak więc kanonicznym sposobem obsługi aktualizacji zabezpieczeń jest aktualizacja obrazu podstawowego, a następnie odbudowanie obrazu aplikacji.

Johannes „fish” Ziemke
źródło
3
Dzięki, to brzmi rozsądnie. Po prostu nadal chcę zaktualizować platformę, aby nie mówiąc, nie trzeba będzie rozpakowywać ponownie całej aplikacji (rozważ na przykład przebudowanie 100 różnych obrazów aplikacji z powodu aktualizacji jednego obrazu podstawowego). Ale może jest to nieuniknione w przypadku filozofii Dockera polegającej na łączeniu wszystkiego w jeden obraz.
Markus Hallmann,
3
@ValkoSipuli Zawsze możesz napisać skrypt automatyzujący proces.
dsljanus
Dlaczego nie apt-get upgrade, dnf upgrade, pacman -syu itp. W ekwiwalencie w kontenerze? Można nawet utworzyć skrypt powłoki, który to robi, a następnie uruchamia aplikację, a następnie użyć go jako punktu wejścia kontenera, aby po uruchomieniu / ponownym uruchomieniu kontenera zaktualizował wszystkie swoje pakiety.
Arthur Kay
8
@ArthurKay Dwa powody: 1) Wysadzasz rozmiar kontenera, ponieważ wszystkie pakiety, które zostaną zaktualizowane, zostaną dodane do warstwy kontenera, zachowując przestarzały pakiet na obrazie. 2) Pokonuje największą zaletę obrazów (kontenerów): uruchamiany obraz nie jest tym samym, który budujesz / testujesz, ponieważ zmieniasz pakiety w czasie wykonywania.
Johannes „fish” Ziemke
7
Jest jedna rzecz, której nie rozumiem: jeśli jesteś firmą, która kupuje oprogramowanie, które jest dostarczane jako kontener dokujący, musisz poczekać, aż producent oprogramowania przebuduje pakiet aplikacji za każdym razem, gdy pojawi się problem z bezpieczeństwem ? Która firma zrezygnowałaby w ten sposób z kontroli nad swoimi otwartymi podatnościami?
Sentenza
7

Pojemniki powinny być lekkie i wymienne. Jeśli Twój kontener ma problem z bezpieczeństwem, odbuduj wersję łatanego kontenera i wdróż nowy kontener. (wiele kontenerów używa standardowego obrazu podstawowego, który używa standardowych narzędzi do zarządzania pakietami, takich jak apt-get, aby zainstalować swoje zależności, przebudowanie spowoduje pobranie aktualizacji z repozytoriów)

Chociaż można wstawiać wewnątrz pojemników, nie będzie to dobrze skalować.

Paul R.
źródło
0

Przede wszystkim wiele aktualizacji, które tradycyjnie uruchamiano w przeszłości, po prostu nie będzie w samym pojemniku. Kontener powinien być dość lekkim i małym podzbiorem pełnego systemu plików, do którego przyzwyczaiłeś się w przeszłości. Pakiety, które powinieneś zaktualizować, to te, które są częścią DockerFile, a ponieważ masz DockerFile, powinieneś być w stanie śledzić te pakiety i identyfikatory kontenerów, które wymagają aktualizacji. Wkrótce zostanie udostępniony interfejs użytkownika Cloudstein, który śledzi składniki DockerFile, dzięki czemu można zbudować schemat aktualizacji najlepiej pasujący do ich pojemników. Mam nadzieję że to pomoże

Ben Grissinger
źródło
-1

ogólnie jest nawet gorszy niż trzy opcje, które podałeś. Większość obrazów dokerów nie ma wbudowanych menedżerów pakietów, dlatego nie można po prostu powlekać obrazu dokera i wydać aktualizacji. Będziesz musiał odbudować lub ponownie uzyskać obraz dokera.

Fakt, że musisz przebudować lub oczekujesz od innych, aby przebudowali łaty bezpieczeństwa, wydaje się w większości przypadków nieuzasadniony.

Zastanawiałem się nad wdrożeniem sonarr i radarr w kontenerach dokerów, ale wiedząc, że nie będą otrzymywać regularnych aktualizacji bezpieczeństwa, które otrzymam mój kontener, jest przełomowy. Zarządzanie aktualizacjami zabezpieczeń dla mojego kontenera jest dość kłopotliwe bez konieczności ręcznego stosowania aktualizacji zabezpieczeń do każdego obrazu dokera osobno.

Lee Burch
źródło
1
Twój post nie będzie uważany za odpowiedź, ponieważ nie podasz odpowiedzi na pytanie. Dodaj go jako komentarz do pytania i usuń „odpowiedź”. StackExchange nie jest forum, ale należy je traktować jako pytania i odpowiedzi, na których eksperci odpowiadają na pytania, w których mogą udzielić pomocy.
Phillip -Zyan K Lee- Stockmann