Vandaag de dag zijn containers helemaal in en is virtualisatie al even ouderwets als bare metal vijf jaar geleden. De snelheid en flexibiliteit waarmee je nieuwe containers uitrolt, is ongezien. Maar heb je al eens nagedacht over de beveiliging van je containers? Containers mogen dan wel heel wat problemen oplossen, ze introduceren ook nieuwe uitdagingen!

Ontwikkelaars hebben Docker containers omarmd alsof het de allerbeste uitvinding sinds jaar en dag is. Dankzij Docker hoeven zij hun applicatie niet meer te compileren voor verschillende versies van uiteenlopende Linux-distributies. Ook krijgen ze geen klachten meer van gebruikers die de applicatie niet aan de praat krijgen wegens dependancy-problemen en daarnaast behoort het tijdrovende packagen tot het verleden. Ze hoeven maar één Docker image te maken met de hele stack aan benodigdheden voor hun applicatie en klaar is kees. De gebruikers moeten enkel nog het image importeren en een nieuwe container aanmaken. Binnen enkele minuten is de applicatie up and running, ongeacht de onderliggende distributie. Het gaat zelfs zó ver dat meer en meer ontwikkelaars hun applicaties nog maar op twee manieren verspreiden: als broncode en als Docker-image. Installeer je toch liever klassieke packages? Dan mag je hopen dat jouw favoriete distributie de applicatie opneemt in hun repositories. Steeds minder ontwikkelaars houden zich zelf nog bezig met het aanbieden van repositories voor hun applicaties.

 

Vulnerable

Docker images maken het leven vooral eenvoudiger voor ontwikkelaars en minder voor beheerders. Zulke images zijn weliswaar handig om een applicatie uit te rollen, maar hoe weet jij als beheerder nou of het ook de allerlaatste security patches bevat? Niet alle ontwikkelaars houden hun images even nauwgezet up-to-date. Gelukkig zijn veel images gebaseerd op andere, officiële images. Die krijgen over het algemeen wél voortdurend security updates. Wat je vaak ook ziet in de Dockerfile is een yum update of apt-get upgrade om de laatste updates binnen te halen op het ogenblik dat jij het image bij jou importeert. Bekijk dus altijd de Dockerfile van een image voordat je beslist het te gebruiken. Zo weet je meteen of het image de laatste patches bevat of niet. Uit onderzoek is gebleken dat heel wat images die je vindt op het web nog bekende vulnerabilities bevatten. Het heeft natuurlijk geen zin om de applicaties op je up-to-date server via containers netjes van elkaar te scheiden en vervolgens oudere OpenSSL-libraries te draaien in diezelfde containers!

 

Updates

Een up-to-date container image is een goed begin, maar de échte uitdaging is om het nadien ook up-to-date te houden. Het is niet de bedoeling dat je security updates met yum of apt-get in de container installeert. De meeste applicatie-images zijn op een bestaand image gebaseerd, bijvoorbeeld een minimale Ubuntu of CentOS-installatie. De procedure om de container te patchen, is dan ook eenvoudig. Eerst update je het basisimage (met docker pull) en vervolgens maak je een nieuw applicatie-image aan. Tot slot gooi je de oude container weg en start je een nieuwe op basis van het up-to-date image. Dat veronderstelt natuurlijk wel dat je belangrijke data in externe volumes bewaart en niet in de container zelf. Op die manier is het updaten van een container een snelle en eenvoudige procedure. Eventueel bewaar je zelfs één of meerdere oudere versies van het image nog eventjes voor de zekerheid. Mocht de applicatie niet meer correct functioneren met het nieuwe image, dan kan je nog gemakkelijk terugkeren naar een vorige versie.

 

Maar wanneer?

De hamvraag is hoe je kunt weten wanneer updates beschikbaar zijn voor een basisimage van pakweg Ubuntu en CentOS. Aangezien het hele Docker-ecosysteem nog relatief jong is, zijn er erg uiteenlopende oplossingen bedacht voor dat probleem. Veel beheerders schrijven zelf de nodige scripts om updates te traceren, images te updaten en containers te herstarten. Zie je dat niet zitten, kijk dan eens naar automated builds op Docker Hub (om images automatisch te updaten) in combinatie met Watchtower (om containers automatisch te herstarten). 

Hoeft het voor jou niet allemaal volledig geautomatiseerd te worden, omdat je maar een beperkt aantal containers draait? Dan kan je ook gewoon controleren op updates in je container(s) met een tool, zoals yum check-update in CentOS of apticron in Ubuntu. Zo weet je tenminste wanneer updates beschikbaar zijn en kan je alsnog manueel je images updaten en containers herstarten. Je ziet dus dat nieuwe technologieën, zoals Docker, niet alleen bestaande problemen oplossen, maar ook nieuwe uitdagingen creëren. Het is zeker niet slecht om even stil te staan bij dergelijke vragen voordat je beslist om Docker in gebruik te nemen.