Sep 29, 2016

Tietoturvaa sovelluskehitykseen

Security_green_lock_wide_2.png

Kyberturvallisuuteen liittyvät asiat ovat tänä päivänä nousseet koko kansan tietoisuuteen, ja erilaisista kyberhyökkäyksistä ja tietoturvallisuuteen liittyvistä asioista uutisoidaan nykyään lähes päivittäin. Jutuissa vilisee kohta yleistiedoksi luokiteltavia asioita, kuten palomuureja, tietoturvapäivityksiä, injektioita ja haavoittuvuuksia. Yleisölle harvemmin kuitenkaan selvennetään niitä taustatekijöitä, joita varsinaisessa sovelluskehityksessä tarvitaan turvallisen ohjelmistotuotteen rakentamiseksi.

Tietoturva ei ole add-on

Turvallinen järjestelmä on aina kokonaisuus, eikä kokonaisturvallisuutta pystytä rakentamaan kiinnittämällä huomiota vain yhteen järjestelmän osaan. Turvallista järjestelmää suunniteltaessa on tärkeää tiedostaa ja tunnistaa sekä järjestelmän loppukäyttäjät että muut sidosryhmät, joiden vaatimukset tulee pyrkiä huomioimaan turvallista kokonaisratkaisua suunniteltaessa. Esimerkkeinä tällaisista sidosryhmistä, loppukäyttäjien lisäksi, voivat olla vaikkapa yrityksen johto ja omistajat, yrityksen tietoturvasta vastaavat tahot, tai lainsäädäntö. Näiden sidosryhmien vaatimukset järjestelmälle voivat vaihdella aina tehokkuudesta tiettyjen laissa määriteltyjen yksityiskohtien täyttymiseen.

Hyvin suunniteltu on puoliksi turvallinen

Asioita ei voida olettaa, joten järjestelmän toiminnalliset vaatimukset, ei-toiminnalliset vaatimukset ja tietoturvavaatimukset tulee kuvata. Nämä vaatimukset lähtevät sidosryhmien tarpeista ja ovat matkan alussa monesti suurpiirteisiä ja karkeita. Näiden ylätason vaatimusten ja perusperiaatteiden kirjaaminen ja niistä keskustelu on kuitenkin tärkeä osa järjestelmän suunnittelua. Tällaisia korkean tason tietoturvavaatimuksia voivat olla esimerkiksi vaatimukset järjestelmän luottamuksellisuudesta tai eheydestä. Näitä voidaan edelleen tarkentaa tarkoittamaan vaikkapa järjestelmän toteuttamaa turvallista tietoturvalokia käyttäjän toiminnan auditointiin, järjestelmäkomponenttien välistä liikenteen salausta ja todentamista tai käyttöjärjestelmien koventamista.

Tietoturvavaatimuksia suunniteltaessa on myös tärkeää kuvata järjestelmän tärkeimmät suojattavat osat.

Esimerkkejä analysoitavista asioista ovat:

Tieturvakysymykset_1_final.jpg

Yhtenä apukeinona voi toimia tietoturva-arkkitehtuurin suunnittelu, sillä se pyrkii kuvaamaan järjestelmäkokonaisuuden turvallisuuteen liittyvät yksityiskohdat, kuten verkkorakenteen, verkon aktiivilaitteet, salauksen ja käytettävät protokollat.

Hyökkääjäkin on käyttäjä

hacker.jpgTietoturvaan liittyvät vaatimukset ja käyttäjätarinat voi olla hyvä kirjoittaa ominaisuuksien kontekstiin, jolloin yksittäiset tietoturvaan liittyvät vaatimukset pystytään paremmin turvaamaan. Yksi hyvä tapa on esimerkiksi pyrkiä lisäämään käyttötapauksiin näkymä pahantahtoisen käyttäjän näkökulmasta, jolloin näihin ”misuse case” -tyyppisiin käyttötapauksiin pystytään suunnittelemaan tarvittavat tietoturvakontrollit. Esimerkiksi palvelunestohyökkäyksen estämiseen voidaan käyttää tiettyjä kuorman kestoon tai liikenteen estämiseen liittyviä kontrolleja, kun taas luvattomaan käyttöön voidaan vaikuttaa vaikkapa käyttäjähallinnalla. Lisäksi on syytä huomioida tilanne, jossa luvallinen käyttäjä toimii tietämättään hyökkääjän puolesta.

Ei ainoastaan sovelluskehittäjän vastuulla

Myös itse sovelluksen rakentamiseen liittyy tietoturvan huomioivia menetelmiä, ja yksi keskeisimmistä on sovelluskehittäjien tietoturvatietoisuus. Edelleen on tyypillistä, että samat perushyökkäystyypit ovat vuodesta toiseen yleisimpiä uhkia verkkosovelluksia kohtaan. Esimerkkinä näistä mainittakoon erilaiset injektiot, joissa hyökkääjä pyrkii vaikuttamaan sovelluksen käyttäytymiseen syöttämällä sovellukseen merkkejä, jotka katkaisevat normaalin ohjelmasuorituksen. Sovelluskehittäjän tietoisuus erilaisista hyökkäystyypeistä ja niihin varautumisesta sovelluskoodia kirjoitettaessa on kuitenkin vain hyvä perusta. Emme voi tuudittautua siihen turvallisuuden tunteeseen, että jokainen yksittäinen kehittäjä onnistuu turvallisessa koodin kirjoittamisessa joka ikinen kerta. Tällaista vastuuta ei voi eikä saa antaa yksinomaan kehittäjien vastuulle, joten lisäturvaan tarvitaan muunlainen suojaverkko.

Turvallisen kehittämisen suojaverkkona voidaan käyttää hyvin pitkälle samantyyppisiä työkaluja kuin koodin kehittämisessä käytetään muutenkin. Koodaus voi olla parhaimmillaan parityötä, mutta ainakin sen tulisi olla toisen henkilön katselmoimaa. Katselmoinnin tarkoituksena on laadun parantaminen pyrkimällä löytämään ohjelmakoodin vikoja mahdollisimman aikaisessa vaiheessa, ja sillä pyritään myös yhdenmukaistamaan ohjelmakoodin ulkoasua ja näin ollen parantamaan sen rakennetta ja luettavuutta. Katselmoinnissa voidaan kiinnittää huomiota myös tietoturvaan liittyviin seikkoihin, kuten tietoturvakontrollien käyttöön tai vaikkapa poikkeusten hallintaan.

Koodianalyysien lisäksi tietoturvatestauksella on keskeinen rooli lopputuotteen turvallisuuden kanssa. Tietoturvatestausta voidaan suorittaa joko yrityksessä sisäisesti, tai hankkia siihen erikoistunutta ulkopuolista apua. Penetraatiotestaus on yksi esimerkki tietoturvatestauksesta, ja siinä testaaja pyrkii tunkeutumaan kohdejärjestelmään joko tietämällä järjestelmästä teknisiä yksityiskohtia tai aloittamalla testaamisen ilman esitietoja.
Edellä mainittujen sovelluskehitystyöhön liittyvien asioiden lisäksi on myös huolehdittava sovelluskehitysympäristöjen turvallisuudesta. Laitteita ja ohjelmistoja täytyy pystyä käyttämään tehokkaasti ja turvallisesti, ja myös työskentely-ympäristö on syytä ottaa huomioon.

Tietoturvaongelmat eivät aina ole itselähtöisiä

Nykyaikainen sovelluskehitys koostuu itse kehitetyn sovelluksen lisäksi myös entistä enemmän erilaisista kolmannen osapuolen komponenteista. Käytön lisääntyessä myös riski näissä komponenteissa olevista uhkista lisääntyy. Kehittäjän ja sovelluksen ylläpidon kannalta on tärkeää hallita riippuvuuksia ja ylläpitää tietoisuutta komponenteissa olevista haavoittuvuuksista. Yhtenä lisäkeinona on liittää jatkuvan integraation yhteyteen työkaluja, jotka tutkivat sovelluksessa mukana olevista riippuvuuksista versiotietoja ja listaavat niihin liittyviä tunnettuja haavoittuvuuksia. Lisämahdollisuutena on ottaa käyttöön myös tietoturvaan liittyviä staattisia analyysejä, jotka pyrkivät löytämään ohjelmakoodista virheitä ennen koodin ajamista.

Turvallisen järjestelmän turvallinen käyttö

Suunnittelun, toteutuksen ja testauksen lisäksi on tärkeää suunnitella järjestelmän käyttöpolitiikka tai huomioida se yrityksen muissa tietoturvapolitiikoissa. Esimerkiksi:

  • Mitä on järjestelmän hyväksyttävä käyttö?
  • Sovelletaanko järjestelmässä pienimpien oikeuksien periaatetta?
  • Miten ja kuka järjestelmän käyttöä valvoo?
  • Miten varmuuskopiointi on järjestetty ja harjoiteltu?
  • Kuinka tietoturvaloukkaukset tulee hallita?

Organisaation yhteinen asia

Turvallisen järjestelmän suunnitteluun voidaan käyttää apuna tässä artikkelissa mainittuja tekniikoita, mutta tärkeintä on silti mieltää kaikki tietoturvallisuuteen liittyvät asiat yhtenä kokonaisuutena. Tämä kokonaisuus taas koostuu koko yrityksen toimintaympäristön läpileikkaavista, hyvin erilaisista komponenteista. Yksittäinen ohjelmistokehittäjä ei todennäköisesti voi tuntea koko toimintaympäristöä ja ottaa huomioon kaikkea mahdollista, minkä vuoksi panostus kyberturvallisuuteen on oltava koko organisaation yhteinen asia.