Kovenna konttisi - 10+1 keinoa konttien tietoturvan parantamiseen

Oletko varmistanut konttiesi tietoturvan? Tero Niemistö kertoo 10 +1 -vinkkiä konttihyökkäyksien estämiseksi.

kontti-tietoturva.jpg

Vaikka tässä blogissa käyn läpi konttiteknologian haavoittuvuuksia ja uhkakuvia, niin alkuun on syytä korostaa yhtä asiaa: lähtökohtaisesti konttiratkaisu on tietoturvallisempi kuin perinteinen ratkaisu. Tämä siksi, että kontti tarjoaa suojatun ja eristetyn ympäristön sovelluksen ajamiseen kaventaen jo valmiiksi potentiaalisia hyökkäysvektoreita merkittävästi.

Tästä huolimatta konttiteknologia ei automaattisesti takaa tietoturvaa. Huolimattomalla tai tietämättömällä konfiguroinnilla voi konttiratkaisun tietoturva olla merkittävästi huonompi kuin perinteisissä ratkaisuissa. Tämä siksi, että konttiteknologia tarjoaa paljon työkaluja tietoturvaa varten, mutta väärinkäytettynä ne voivat aiheuttaa paljon vakavampia vahinkoja kuin perinteiset ratkaisut.

Konttihyökkäys ja sen laajentaminen

Tyypillinen vektori hyökkääjälle on yksittäinen kontti. Hyökkääjä voi päästä konttiin sisälle sen tai kontin riippuvuuden sisältämän tietoturva-aukon avulla. Pahimmassa tapauksessa hyökkääjä myös voi onnistua ujuttamaan ratkaisuun mukaan oma konttinsa esimerkiksi riippuvuuksien kautta. Tämä uhka on enemmän kuin todellinen kuten maaliskuussa 2017 julkaistu akateeminen tutkimus osoitti. Tutkimuksessa analysoitiin konttien tietoturva-aukkoja Dockerin virallisessa rekisterissä Docker Hubissa. Tutkimus havaitsi, että jopa ajantasaisissa virallisissa konteissa tietoturva-aukkoja oli keskimääriin yli 70. Epävirallisissa luku oli keskimäärin yli 150.

Konttiin päästyään hyökkääjä voi yrittää kaapata sensitiivisiä tietoja (kuten luottokorttitietoja tai henkilötunnuksia) mikäli kontin käytämän tietovaraston salasanat ovat kryptaamattomia tai/ja tallennettu huolimattomasti esimerkiksi kontin ympäristömuuttujiin. Kontin ympäristömuuttujat kun ovat helposti luettavissa, jos vain hyökkääjä pääsee konttiin sisälle.

Konttiin päästyään hyökkääjä voi laajentaa hyökkäystään tietoturva-aukkojen avulla muihin kontteihin tai jopa kontteja pyörittävälle palvelimelle. Pahimmassa skenaariossa hyökkääjä voi tehdä yksittäisestä kontista Denial-of-Service (DOS) -hyökkäyksen palvelimelle haitaten merkittävästi muiden palvelimella ajettavien konttien toimintaa tai jopa kaataa koko palvelimen ja sitä myöten kaikki palvelimella ajettavat kontit.

Konttiympäristössä ajetaan siis yleensä useita eri sovelluksia samalla palvelimella – usein jopa kymmeniä - ja yhden kontin puutteellinen tietoturva voi tällöin vaarantaa kaikkien samalla palvelimella olevien konttien tietoturvan. Siksi onkin äärimmäisen tärkeää, että jokaisessa kontissa on huomioitu sen tietoturva.

Kontin ja konttiympäristön kovennus

Jotta Dockerista ja siten konteista voidaan tehdä tietoturvallisia, tulee koko Docker-arkkitehtuuri ”koventaa”. Koventamisella tarkoitetaan joukkoa toimenpiteitä, joiden avulla potentiaalisia hyökkäysvektoreita pyritään kaventamaan ja täten tehdä hyökkääminen todella vaikeaksi. Usein nämä toimenpiteet tulisi pohjautua johonkin yleisesti tunnustettuihin kovennussuosituksiin, joista esimerkkinä Center for Internet Securityn (CIS) suositukset. On syytä huomioida, että kyseessä ovat suositukset eli on toteuttajan vastuulla miettiä mitkä suosituksista kannattaa tehdä ja mitkä ei. Jotkut kovennussuositukset saattavat olla hyvinkin hankalia toteuttaa ja voivat pahimmillaan aiheuttaa suorituskykyongelmia tai vaikeuttaa itse ratkaisun käyttöä.

Alla on listattuna 10 helppoa ja 1 työläs (mutta sitäkin tärkeämpi) keino, joilla konttiratkaisun tietoturvaa saadaan nostettua merkittävästi.

1. Luo kontille oma käyttäjätunnus

Jos kontille ei ole määritelty käyttäjätunnusta, sen oletuskäyttäjätunnus on root. Mikäli hyökkääjä pääsee kontista itse palvelimelle, saa hän myös palvelimella root-käyttäjän oikeudet. Tällöin hyökkääjä voi ajaa palvelimella mitä tahansa komentoja. Tämä voidaan estää useilla tavoilla, mutta helpoin tapa on asettaa kontille oma käyttäjätunnus.

2. Käytä luotettua Alpine-pohjaista Base Imagea

On luonnollisesti selvää, että ratkaisuissa tulisi käyttää vain luotetuista lähteistä ladattuja verifioituja Base Imageja. Suositelluin Base Image on kirjoitushetkellä Alpine. Tämä siksi, että kyseinen image on pienin mahdollinen sisältäen mahdollisimman vähän mitään ylimääräistä, joka saattaa aiheuttaa tietoturvan heikkenemistä.

3. Asenna vain verifioituja paketteja

Mikäli konttiin ladataan verifioimaton paketti, voi se vaarantaa merkittävästi kontin tietoturvaa ja tarjota hyökkääjälle pääsyn kontin sisään. Jokaisen kontin luonnin yhteydessä ladatun paketin integriteetti tulisi siis tarkistaa esimerkiksi SHA-tarkistussumman avulla.

4. Aseta kontin juuri ”vain luku” –tilaan

Asettamalla kontin juuri ”vain luku” –tilaan on pieni, mutta merkittävä toimenpide tietoturvan parantamiseksi. Kyseisellä toimenpiteellä estetään potentiaalista hyökkääjää kirjoittamasta mitään konttiin ja siten estetään lukuisten haitallisten toimenpiteiden tekeminen.

5. Käytä tarkkoja versionumeroita

Kun lataat konttiisi riippuvuuksia eli muita kontteja, käytä aina tarkkaa versionumeroa, ei siis latest-versiota tai wildcard-merkkejä versionumeroiden sijaan (*). Tämä siksi, että ilman tarkkaa versionumeroa, välimuistin takia uusinta versiota ei ladatakaan vaan käytetään edelleen vanhaa, potentiaalisesti tietoturva-aukon sisältävää versiota.

6. Aseta muisti- ja pid-limit -rajoitus konttiin

Ilman näiden rajojen asettamista (oletusarvoisesti näitä ei ole rajoitettu), on hyökkääjän mahdollista tehdä DOS-hyökkäys palvelimelle kaapaten palvelimen muistin tai prosessorin tehon kokonaan, näännyttää palvelimen muut kontit ja lopulta kaataa koko palvelin.

7. Luo erillinen verkko konttien välille

Vaikka Docker tarjoaa konttien väliseen liikenteeseen oletusarvoisesti verkkosiltaa (docker0), niin tätä ei ole suositeltua käyttää. Konttien välille tulisikin siis luoda oma sovelluskohtainen verkko Dockerin dokumentaation avulla. Mikäli käytät Docker Composea, niin kyseinen työkalu luo verkon automaattisesti.

8. Estä konttien välinen liikenne

Oletuksena samalla palvelimella olevien konttien välinen verkkoliikenne on sallittu. Mikäli siis yhteen konttiin murtaudutaan, pääsee hyökkääjä ottamaan yhteyttä myös muihin palveluihin. Konttien välisen kommunikaation tulee siis rajata vain niiden konttien välille, jotka vaativat keskinäistä kommunikointia.

9. Vain luotetut käyttäjät docker-käyttäjäryhmässä

Käyttäjä, joka kuuluu docker-käyttäjäryhmään, saa käytännössä root-tason oikeudet palvelimelle. On siis ensiarvoisen tärkeää, että Dockeria pyörittävällä palvelimella määritellyn docker-käyttäjäryhmän jäsenet ovat luotettuja.

10. Luo Dockerfile ja Docker Compose -templatet

Valitettavasti suurin osa sovelluskehittäjistä ei ole kovin perehtyneitä tietoturvaan tai ei osaa hakea tietoa siihen liittyen. Tämän vuoksi olisi syytä luoda projekteille mallipohjat Dockerfilesta ja Docker Compose -tiedostoista, joissa on huomioitu tietoturva.

+ Konttien jatkuva tietoturvaskannaus

Tämän toteuttaminen voi olla erittäin työlästä, mutta on äärimmäisen tärkeä toimenpide. Koska kontit käyttävät riippuvuuksinaan sisälleen asennettuja kirjastoja, niin perinteiset palvelimen tietoturvapäivitykset eivät auta. Kontit on siis jatkuvasti skannattava haavoittuvuuksien varalta jollain soveltuvalla työkalulla ja mikäli yhdestäkään riippuvuudestaan havaitaan tietoturva-aukko, on aukko korjattava tarvittavalla patchilla. Korjauksen jälkeen kaikki – aivan kaikki – kontit, joissa riippuvuus esiintyy, on rakennettava ja asennettava uudestaan. Mikäli kyseessä on Base Image, tulee tämä tehdä jokaiselle kontille ja ilman toimivaa automaatiota, konttien tietoturvaa on lähes mahdotonta pitää ajan tasalla.

 

Tutustu Teron luentokalvoihin konttien tietoturvasta SlideSharessa >

tietoturva   konttiteknologia




Tero Niemistö | Tiimiesimies, teknologia-johtaja

Tero Niemistö | Tiimiesimies, teknologia-johtaja

Tero on ”managerisoitunut” pitkän linjan arkkitehti. Noin 14 teknisen vuoden jälkeen Tero siirtyi esimiesrooliin tahtonaan johtaa alan huippuasiantuntijoita kuten itseään haluaa johdettavan. ”Esimiehen tärkein tehtävä on mahdollistaa alaistensa onnistuminen”, Tero sanoo. Teron johtamisfilosofiassa esimies ei ole perinteisen hierarkisen mallin mukaisesti joukkojen yläpuolella vaan tukee heidän päivittäistä työtä alhaalta. Hän haluaa olla läsnä ja kiinnostunut alaistensa arjesta sekä tukea heitä sparraamalla ja valmentamalla niin usein kuin mahdollista. Kun Tero laittaa ns. haalarit päälle ja kädet saveen, niin hänet löytää usein julistamassa DevOps-kulttuurin ilosanomaa ja rakentamassa sovelluskehityshankkeisiin täysin automatisoitua jatkuvan julkaisun putkea.

Kirjoittajan kaikki blogitekstit

Tilaa blogikirjoitukset sähköpostiisi




Seuraa meitä somessa

LinkedIn Twitter Facebook YouTube YouTube