Come gestire gli aggiornamenti di sicurezza all'interno dei contenitori Docker?


117

Quando si distribuiscono applicazioni sui server, esiste in genere una separazione tra ciò che l'applicazione si raggruppa con se stessa e ciò che si aspetta dalla piattaforma (sistema operativo e pacchetti installati). Un punto di ciò è che la piattaforma può essere aggiornata indipendentemente dall'applicazione. Ciò è utile, ad esempio, quando è necessario applicare urgentemente gli aggiornamenti di sicurezza ai pacchetti forniti dalla piattaforma senza ricostruire l'intera applicazione.

Tradizionalmente gli aggiornamenti di sicurezza sono stati applicati semplicemente eseguendo un comando gestore pacchetti per installare versioni aggiornate dei pacchetti sul sistema operativo (ad esempio "aggiornamento yum" su RHEL). Ma con l'avvento della tecnologia dei container come Docker, dove le immagini dei container raggruppano essenzialmente sia l'applicazione che la piattaforma, qual è il modo canonico di mantenere aggiornato un sistema con i container? Sia l'host che i container hanno i propri set indipendenti di pacchetti che devono essere aggiornati e l'host sull'host non aggiornerà alcun pacchetto all'interno dei container. Con il rilascio di RHEL 7 in cui sono particolarmente presenti i contenitori Docker, sarebbe interessante sapere qual è il modo consigliato da Redhat per gestire gli aggiornamenti di sicurezza dei contenitori.

Considerazioni su alcune delle opzioni:

  • Consentire al gestore pacchetti di aggiornare i pacchetti sull'host non aggiornerà i pacchetti all'interno dei contenitori.
  • Dover rigenerare tutte le immagini del contenitore per applicare gli aggiornamenti sembra interrompere la separazione tra l'applicazione e la piattaforma (l'aggiornamento della piattaforma richiede l'accesso al processo di generazione dell'applicazione che genera le immagini Docker).
  • L'esecuzione di comandi manuali all'interno di ciascuno dei contenitori in esecuzione sembra ingombrante e le modifiche rischiano di essere sovrascritte al successivo aggiornamento dei contenitori dagli artefatti di rilascio dell'applicazione.

Quindi nessuno di questi approcci sembra soddisfacente.


1
L'idea migliore per questo che ho visto finora è Project Atomic . Non penso che sia abbastanza pronto per la prima serata.
Michael Hampton

1
Valko, con quale flusso di lavoro sei finito? Sto eseguendo container a lungo termine (ospitando php-cgi, per esempio) e quello che ho trovato finora è: docker pull debian/jessieaggiornare l'immagine, quindi ricostruire le mie immagini esistenti, quindi arrestare i contenitori ed eseguirli di nuovo ( con la nuova immagine). Le immagini che costruisco hanno lo stesso nome di quelle precedenti, quindi l'avvio avviene tramite lo script. Quindi rimuovo immagini "senza nome". Gradirei sicuramente un flusso di lavoro migliore.
miha,

1
miha: Sembra simile a quello che ho finito per fare. Sostanzialmente aggiornando e ricostruendo continuamente tutte le immagini come parte della realizzazione di nuove versioni. E riavviare i contenitori utilizzando le nuove immagini.
Markus Hallmann,

1
La migliore risposta qui aiuta molto perché c'è uno script che contiene le principali linee di comando per fare esattamente quello che ha detto Johannes Ziemke:
Hudson Santos,

Domanda interessante. Me lo chiedo da solo. Se hai 20 applicazioni in esecuzione su un host docker, devi aggiornare le immagini di base, ricostruire e riavviare! 20 applicazioni e non sai nemmeno se l'aggiornamento della sicurezza ha interessato tutte o solo una di esse. Devi ricostruire l'immagine per dire Apache quando l'aggiornamento della sicurezza ha interessato solo libpng, ad esempio. Quindi finisci con ricostruzioni e riavvii inutili ...
Dalibor Filus,

Risposte:


47

Un'immagine Docker raggruppa l'applicazione e la "piattaforma", è corretto. Ma di solito l'immagine è composta da un'immagine di base e dall'applicazione effettiva.

Quindi il modo canonico di gestire gli aggiornamenti di sicurezza è aggiornare l'immagine di base, quindi ricostruire l'immagine dell'applicazione.


3
Grazie, sembra ragionevole. Vorrei solo aggiornare la piattaforma per così dire non dovrebbe innescare il riconfezionamento dell'intera applicazione (si consideri ad esempio la necessità di ricostruire 100 immagini diverse dell'applicazione a causa di una singola immagine di base che ottiene l'aggiornamento). Ma forse questo è inevitabile con la filosofia Docker di raggruppare tutto insieme in un'unica immagine.
Markus Hallmann,

3
@ValkoSipuli Potresti sempre scrivere uno script per automatizzare il processo.
dsljanus,

Perché non apt-get upgrade, dnf upgrade, pacman -syu, ecc. Equivalente all'interno del contenitore? È anche possibile creare uno script shell che lo fa e quindi esegue l'applicazione, quindi utilizzarlo come punto di accesso del contenitore in modo che quando il contenitore viene avviato / riavviato aggiorni tutti i suoi pacchetti.
Arthur Kay,

8
@ArthurKay Due motivi: 1) Fai esplodere le dimensioni del contenitore, poiché tutti i pacchetti che vengono aggiornati verranno aggiunti al livello contenitore mantenendo il pacchetto obsoleto nell'immagine. 2) Sconfigge il più grande vantaggio delle immagini (container): l'immagine che esegui non è la stessa che crei / test perché cambi i pacchetti in fase di esecuzione.
Johannes "pesca" Ziemke il

7
C'è una cosa che non capisco: se sei un'azienda che acquista un software che viene spedito come contenitore docker, devi aspettare che il produttore del software ricostruisca il pacchetto dell'applicazione ogni volta che si presenta un problema di sicurezza ? Quale azienda rinuncerebbe al controllo sulle proprie vulnerabilità aperte in quel modo?
Sentenza,

7

I contenitori dovrebbero essere leggeri e intercambiabili. Se il contenitore presenta un problema di sicurezza, si ricostruisce una versione del contenitore con patch e si distribuisce il nuovo contenitore. (molti container utilizzano un'immagine di base standard che utilizza strumenti di gestione dei pacchetti standard come apt-get per installare le proprie dipendenze, la ricostruzione estrarrà gli aggiornamenti dai repository)

Mentre potresti rattoppare all'interno dei contenitori, questo non si ridimensionerà bene.



0

Prima di tutto, molti dei tuoi aggiornamenti che tradizionalmente hai eseguito in passato non saranno semplicemente all'interno del contenitore stesso. Il contenitore dovrebbe essere un sottoinsieme abbastanza leggero e piccolo dell'intero file system che sei abituato a vedere in passato. I pacchetti che dovresti aggiornare sarebbero quelli che fanno parte del tuo DockerFile e, dato che hai il DockerFile, dovresti essere in grado di tenere traccia di quei pacchetti e ID contenitore che necessitano di aggiornamenti. L'interfaccia utente di Cloudstein che sarà rilasciata presto terrà traccia di questi ingredienti DockerFile per te in modo che uno possa costruire lo schema di aggiornamento che si adatta meglio ai propri contenitori. Spero che sia di aiuto


-1

è generalmente anche peggio delle tre scelte fornite. La maggior parte delle immagini della finestra mobile non sono costruite con i gestori pacchetti, pertanto non è possibile eseguire la shell nell'immagine della finestra mobile ed emettere un aggiornamento. Dovrai ricostruire o riottenere l'immagine della finestra mobile.

Il fatto che sia necessario ricostruire o guardare gli altri per ricostruire patch di sicurezza sembra irragionevole nella maggior parte dei casi.

Stavo pensando di distribuire sonarr e radarr nei container docker, ma sapere che non otterranno i regolari aggiornamenti di sicurezza che il mio container ottiene è un problema. Gestire gli aggiornamenti di sicurezza per il mio container è abbastanza seccante senza dover affrontare in qualche modo la necessità di applicare manualmente gli aggiornamenti di sicurezza a ciascuna immagine docker singolarmente.


1
Il tuo post non sarà considerato una risposta, in quanto non fornisci una risposta alla domanda. Aggiungilo come commento alla domanda e rimuovi la tua "risposta". StackExchange non è un forum, ma dovrebbe essere considerato come una domanda e risposta in cui gli esperti rispondono alle domande con cui possono fornire assistenza.
Phillip -Zyan K Lee- Stockmann
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.