Ohjelmistotietoturvan rooli web-tietojärjestelmän kerrosarkkitehtuurissa

Tietojärjestelmän rakenne hahmotetaan tyypillisesti loogisena ja rakenteellisena kerrosarkkitehtuurina, jossa jokaisella arkkitehtuurin kerroksella on oma vastuualueensa ja toiminnallinen roolinsa kokonaisuuden tuottamisessa. Tietojärjestelmän tietoturvallisuuden varmistamisen näkökulmasta kerrosarkkitehtuurin ymmärtäminen ja tietoturvavaatimusten ja -kontrollien kohdistaminen arkkitehtuurikerroksiin on keskeistä, jotta toteutettavista tietoturvamekanismeista saadaan vaikuttavia ja siten tietojärjestelmästä turvallinen. Looginen suunnitteluvaiheen jaottelu ja kehitysvaiheessa toteutuva rakenteellinen malli eroavat kuitenkin käytännössä aina toisistaan, mikä voi aiheuttaa myös tietoturvayllätyksiä. Mikäli halutaan nukkua paremmin, kannattaa tietojärjestelmäarkkitehtuuriin soveltaa security-in-depth -periaatetta; tietoturvallisuutta syventävää sipulimallia.

Blogisarja ohjelmistotietoturvallisuudesta

Aloitamme ohjelmistojen tietoturvallisuutta käsittelevän blogisarjan, jonka tarkoituksena on parantaa tietoisuutta kyberturvallisuudesta ohjelmistotietoturvallisuuden alueella. elfGROUP on työskennellyt ohjelmistojen tietoturvatestauspalveluiden parissa pian kymmenen vuoden ajan. Tämän kokemuksen valossa voimme todeta, että lähes kaikki asiakkaiden ohjelmistoista löydetyistä tietoturvahaavoittuvuuksista ovat johtuneet puutteellisesta tietoturvan huomioinnista ohjelmistoa suunniteltaessa tai toteutettaessa. Tietoturvaa ei ole osattu rakentaa systemaattisesti ja oletusarvoisesti osaksi järjestelmän ydintä. Tästä syystä haluamme nostaa näkyvyyttä ja keskustelua tietoturvan integroimiseksi ohjelmistotuotannon prosesseihin sekä tietoturvallisuuden hallinnan tuomiseksi ohjelmistosuunnittelun kaikkien vaiheiden keskeiseksi osa-alueeksi.

Tässä blogisarjan ensimmäisessä osassa tarkastelen tyypillistä web-pohjaisen tietojärjestelmän kerrosarkkitehtuuria ja ohjelmistotietoturvan roolia siinä tuloksellista tietoturvamallia toteutettaessa. 

Uimalasit päähän ja arkkitehtuurihissillä kattohuoneistoon – Tietojärjestelmäkerrokset ohjelmistokehityksessä

Arkkitehtuurin kerrosmalleja on varmasti lähes yhtä paljon, kuin aihetta käsitteleviä kirjoituksia tai toteutettuja tietojärjestelmiä. Määritelmät eivät ole erityisen vakiintuneita ja asiaa voidaan tarkastella esimerkiksi koko tietojärjestelmän laajuudessa tietojärjestelmäarkkitehtuurina tai yksittäisen toteutettavan ohjelmiston laajuudessa ohjelmistoarkkitehtuurina. Tietoturvan kannalta kokonaisuus joka tapauksessa ratkaisee, koska yksikin heikko lenkki voi riittää vaarantamaan tietojen turvallisuuden tai antamaan hyökkääjälle riittävää jalansijaa laajemmalle tunkeutumiselle. Tietojärjestelmän rakenne hahmotetaan tyypillisesti loogisena ja rakenteellisena kerrosarkkitehtuurina, jossa jokaisella arkkitehtuurin kerroksella on oma vastuualueensa ja toiminnallinen roolinsa kokonaisuuden tuottamisessa. Tietojärjestelmän tietoturvallisuuden varmistamisen näkökulmasta kerrosarkkitehtuurin ymmärtäminen ja tietoturvavaatimusten ja – kontrollien kohdistaminen arkkitehtuurikerroksiin on keskeistä, jotta toteutettavista tietoturvamekanismeista saadaan vaikuttavia ja siten tietojärjestelmästä turvallinen.

Tyypillisessä web-pohjaisessa tietojärjestelmässä voidaan tunnistaa ainakin seuraavat kerrokset:

  • Käyttäjäkerros (palvelun loppukäyttäjät, myös potentiaaliset hyökkääjät)
  • Käyttöliittymäkerros/frontend(JavaScript, React, HTML)
  • Frontendin ajoympäristö eli selainkerros (Firefox, Chrome, IE)
  • Verkkoyhteyskerros/internet (IP, TCP, HTTP, TLS)
  • Palveluntarjoajien verkkoinfra ja verkon suojaukset (operaattorit, palomuurit, IDS/IPS)
  • Kuormantasaimet(Big-IP, Nginx, Netscaler)
  • Web-palvelinkerros (Apache, Nginx, IIS)
  • Sovelluspalvelinkerros (WildFly, GlassFish, Websphere, Pyramid, ASP.NET)
  • Ohjelmistokerros (Java / Python / C++)
  • Integraatiokerros (sanomajonot, tiedostosiirrot, kantaintegraatiot)
  • Tietokantakerros (Oracle, MariaDB, MongoDB)

Kerrosmallin voi visualisoida ja ajatella hyvin konkreettisesti reittinä, jota pitkin käyttäjän tahtotila siirtyy tietojärjestelmän pohjimmaisten kerrosten liiketoimintalogiikkaan ja tietovarastoihin.

Web-sovelluksen tapauksessa voidaan ajatella, että käyttäjän tekemät pyynnöt liikkuvat arkkitehtuurissa alaspäin ja palautettava tieto tai kuittaus toiminnon suorittamisesta liikkuu ylöspäin. 

Joku voisi nähdä asian niinkin, ettei käyttäjä tai käyttäjäkerros kuulu tietojärjestelmän arkkitehtuuriin —eikä se tekniseen kokoonpanoon kuulukaan – mutta tietoturvan rakentamisen kannalta ehdottomasti kuuluu, koska juuri tästä kerroksesta lähtee koko paletin horjuttaminen ja useassa tapauksessa myös ne helpoimmin hyödynnettävät suoranaiset tietovuodot. Kattohuoneistossa voi siis toisinaan olla tuulista, mutta keinoälyn aikakautta odotellessa joutunemme keskittymään alempien kerrosten tukevoittamiseen.

Web-sovelluksen tapauksessa voidaan ajatella, että käyttäjän tekemät pyynnöt liikkuvat arkkitehtuurissa alaspäin ja palautettava tieto tai kuittaus toiminnon suorittamisesta liikkuu ylöspäin. Tyhmiä välikerroksia siirtelyssä olisi syytä välttää, mutta harvoin näin tapahtuu. Mitä varhaisemmassa vaiheessa hississä oleva epäkelvollisuus kyetään pysäyttämään, sen vähemmän resursseja ongelman käsittelemiseen kuluu ja sitä paremmassa turvassa ohjelmiston kriittiset osatekijät ovat. Kannattaa huomioida, että hissin suunnalla tai sen hetkisellä kerroksella ei ole tässä suhteessa merkitystä.

Ohjelmistotietoturvan rooli

Kypärää ei tarvitse käyttää, jos ei aio kaatua? – Suojautumiskeinoja tietoturvallisen kerrosarkkitehtuurin kautta

Olipa tarkastelussa mikä järjestelmäkokonaisuus tahansa, tietoturvaa on rakennettava koko arkkitehtuuripinon syvyydeltä nk. security-in-depth-periaatetta eli sipulimallia noudattaen. Jokaisen kerroksen ja matkan varrella toimivan komponentin on laitettava kampoihin potentiaaliselle hyökkääjälle, väärin muodostetuille syötteille, valtuudet ylittäville pyynnöille, tunnistamattomille resurssiviittauksille, jumittuville silmukoille, hallitsemattomille poikkeuksille, yllättäville palautusarvoille, loogisen käyttäjäistunnon tilaan nähden ristiriitaiselle tapahtumalle ja niin edelleen. Tuntuu, että listaa voisi jatkaa loputtomiin.

Kun yhden kerroksen suojaukset pettävät ja toteutus esimerkiksi epäonnistuu tunnistamaan virheellisen tilanteen, seuraava kerros voi aktiivisella toiminnallaan paikata tapahtuneen virheen. Kun sipulimallin mukainen toimintaperiaate leivotaan sisään jo vaatimushallinnassa ja huomioidaan projektin resursoinnissa, tulee siitä oletusarvoinen toimintamalli, joka osataan ottaa huomioon myös toiminnallisen testauksen yhteydessä. Kaikkia ajonaikaisesti ilmeneviä poikkeustilanteita ja virheitä ei ole mahdollista aavistaa etukäteen. Paras suojautumiskeino on varautua mahdollisimman monella tasolla ja mahdollisimman perusteellisesti.

Ohjelmistotietoturvaa vaikka silmiä kirvellen – Apua systemaattisista ja automatisoiduista toimintatavoista

Ohjelmistotietoturvallisuus on läsnä kaikissa arkkitehtuuripinon teknisissä kerroksissa. Web-sovelluksen tuottavan yrityksen näkökulmasta suurin osa pinosta on jonkin muun tahon tuottamaa ohjelmistoa, kun toteutuksissa käytetään yhä enemmän ja yhä kompleksisempia palvelukehikkoja ja kirjastoja, hajautetuista ja pilvipohjaisista järjestelmistä puhumattakaan. Tällöin on entistäkin tärkeämpää hahmottaa vastuualueiden ja komponenttien väliset luottamuksen rajat ja toteuttaa kaikissa toteutuksen vaiheissa tarkkaa kontrollia tietoturvavaatimusten määrittelyssä ja niiden toteutumien valvonnassa. Järjestelmien kasvava kompleksisuus ja laajuus pakottavat systemaattiseen, keskitettyyn ja mahdollisuuksien mukaan automatisoituun tietoturvatyöhön ja -testaukseen. Niin arkkitehtuurikerrokset kuin ohjelmistokomponentit ja niiden käsittelemät tiedot tulee luokitella suojattavan tietosisällön ja mahdollistettavien tapahtumien mukaisesti. Kaikkiin kerroksiin ei voi luottaa, mutta riskit tulee vähintäänkin tiedostaa ja käsitellä.

Tiedonhallinnan ja tietojen luokittelemisen kriittisyys ja oikea toteuttaminen osana tietoturva-arkkitehtuuria toimii tiiviisti luottamusrajojen mukaan. Ohjelmistojen ja tietojärjestelmien tietoturvallisuus tulee nähdä laajana aihealueena sisältäen paitsi tahallisten tietomurtojen ennaltaehkäisyn, myös järjestelmien oikean ja kiistattoman toiminnan varmistamisen. On olemassa useita tietoturvakehyksiä ja malleja, joita systemaattisesti yrityksen liiketoimintaan ja sen tukemiseksi suoritettavaan ohjelmistokehitykseen soveltamalla yrityksen kyberturvallisuusvalmiuksia voidaan parantaa merkittävästi.

Ohjelmistoala kokonaisuutena on vielä nuori ja ottaa jatkuvasti valtavia harppauksia eteenpäin teknologian kehittyessä nopeasti. Perusteet on laitettava kuntoon, jotta kehittyvää teknologiaa uskalletaan hyödyntää.


Blogisarjan seuraavissa osissa käsittelemme mm. edellä esiinnousseita aiheita, kerrosten välistä luottamusta, tietojen luokittelun toteutusta ja tietoturvallisen ohjelmistoarkkitehtuurin rakentamista ja arviointia. Yksi minua kiehtova aihealue ohjelmistojen tietoturvallisuuden ymmärtämisessä, parantamisessa ja todistamisessa on formaalien menetelmien hyödyntäminen. Myös tätä aihetta käsitellään tulevissa blogeissa.

Share This Story, Choose Your Platform!

About the Author: Tuomas Tonteri

Tuomas Tonteri

Tuomas Tonteri on elfGROUPin perustaja ja toimitusjohtaja. Taustaltaan Tuomas on koodari, softa-arkkitehti ja tietoturvakonsultti, pesunkestävä nörtti siis – ja ylpeä siitä! Työssään Tuomas on ennen kaikkea kyberturvallisuusasiantuntija muiden elfGROUPin asiantuntijoiden joukossa, ja tämä näkyy myös yrityskulttuurissa. Vapaa-aika kuluu pitkälti tekniikan ja perheen parissa, hölkkäilyä ja muuta kuntoilua unohtamatta.