Vuonna 2022 päivittyi tietoturvan hallintajärjestelmä ISO/IEC 27001. Päivityksessä yksinkertaistettiin liitteen A hallintakeinojen rakennetta sekä lisättiin uusia hallintakeinoja. Standardi vaatii, että organisaatiot perustelevat hallintakeinojen käyttämisen tai käyttämättä jättämisen, vaikka ne eivät olekaan pakollisia. Syvennymme tässä blogissa turvalliseen ohjelmointiin (secure coding), joka on yksi uusista hallintakeinoista. Turvallisen ohjelmoinnin tarkoituksena on pienentää haavoittuvuuksien lukumäärää varmistamalla, että ohjelmisto on tehty turvallisesti.
Mitä on turvallinen ohjelmointi?
Varsinainen ISO 27001 –standardin vaatimus turvallisesta ohjelmoinnista on yksinkertainen – ja samalla aika monitulkintainen: “Ohjelmistokehityksessä on sovellettava turvallisen ohjelmoinnin periaatteita”. Koska ohjelmointi ei ole pelkkää koodin naputtelua, vaan myös ongelmanratkaisua, suunnittelua, testausta ja ylläpitoa, turvallisen ohjelmoinnin käsite sisältää monia asioita. ISO 27001-standardia täydentävässä ISO 27002-stadardissa käytännön ohjeistus ja suositukset turvallisesta ohjelmoinnista kattavatkin koodin kirjottamisen lisäksi DevSecOps-menettelyjä ennen ja jälkeen varsinaista koodin tuottamista.
Hyvä suunnittelu lisää ohjelmistoturvallisuutta
Onko hyvin suunniteltu ohjelmisto puoliksi tehty? Ehkei aivan, mutta ainakin voidaan välttää tilanteet, joissa murtotestauksessa löytyneet vakavat haavoittuvuudet pakottavat mittaviin koodi- ja arkkitehtuurimuutoksiin. Ennen varsinaista toteutusta tapahtuvia turvallisen ohjelmoinnin menettelyjä ovat muun muassa:
- Turvallisten suunnittelu- ja arkkitehtuuriperiaatteiden valinta tiimissä. Sovitut periaatteet kannattaa dokumentoida esimerkkien kera ja käydä läpi koko tiimin kesken. Hyviä lähteitä ovat esimerkiksi OWASP Secure Product Design Cheat Sheet, OWASP DevGuiden Secure Design Principles ja AWS Well Architected.
- Tietoturvan minimivaatimusten määrittely. Vähimmäisvaatimukset voivat pohjautua esimerkiksi yhdistelmään asiakasvaatimuksista ja OWASP Application Security Verification Standardin tasoon 1.
- Uhkamallinnus auttaa tunnistamaan mahdolliset tietoturvaongelmat ja tarvittavat suojakeinot aikaisessa vaiheessa. Tällöin tietoturvasta saadaan sisäänrakennettua.
- Kolmannen osapuolen kirjastojen hallinnan säännöt. Voidaan esimerkiksi sopia, mitä asioita tulisi tarkistaa uusista avoimen lähdekoodin kirjastoista, jotta lisenssin sopivuudesta, kirjaston luotettavuudesta ja kehityksen jatkuvuudesta voidaan varmistua.
Suunnittelunäkökohtiin tuovat lisätietoa myös standardin muut ohjelmistokehitykseen liittyvät hallintakeinot, kuten A.8.25 Turvallisen kehittämisen elinkaari, A.8.26 Sovelluksia koskevat turvallisuusvaatimukset ja A.8.27 Turvallisen järjestelmäarkkitehtuurin ja –suunnittelun periaatteet.
Turvallinen ohjelmointi vaatii jatkuvaa oppimista
Kukaan ei ole seppä syntyessään, saati sitten tietoturvallisen ohjelmoinnin ammattilainen. Hyökkäykset ja teknologiatkin kehittyvät jatkuvasti. Siksi sisäinen tiedonsiirto tiimin kokeneemmilta junnuille ja käytännönläheisiin koulutuksiin osallistuminen esimerkiksi tyypillisistä sovellushaavoittuvuuksista ja turvallisen kehittämisen käytännöistä ovat hyödyllisiä. Myös Security Championin nimeäminen tiimiin edistää tietoturvakäytäntöjen toteutumista ja oppimista.
Turvallinen koodaus on ketterää
Turvallisen koodin kirjoittamisen tueksi voi ottaa käyttöön ohjelmointikieli- tai teknologiakohtaisia turvallisen ohjelmoinnin periaatteita. Ne voivat liittyä ohjelmointikielen ominaisuuksiin, kuten siihen tarvitseeko ohjelmoijan huolehtia muistinkäsittelystä itse, tai saatavilla oleviin ohjelmistokehyksiin ja niiden tarjoamaan apuun turvaominaisuuksien, kuten lokituksen tai tunnistautumisen, toteuttamiseen.
Myös yleisluontoisempia periaatteita kannattaa sopia joko koko organisaatiossa tai tiimin kesken. Esimerkkinä tällaisesta on ohjelman rakentaminen oletuksella, että siihen kohdistuu hyökkäyksiä. Linjaus voi liittyä myös tekoälyn käyttöön koodauksessa ja siihen, mitkä ovat tähän hyväksytyt työkalut. Joskus voidaan myös sopia, mitä ei ainakaan saa tehdä. Kovakoodattujen salasanojen käyttö, omien salausalgoritmien keksiminen tai koodin kopiointi sellaisenaan Stack OverFlow’sta ovat usein kiellettyjen asioiden listalla.
Monet ketterän ohjelmistokehityksen menettelyt, kuten parikoodaus, testipohjainen kehitys ja koodin vertaiskatselmointi auttavat turvallisuuden varmistamisessa. Koodikatselmoinnin avuksi voi kehittää lyhyen tietoturva- ja tietosuojanäkökulmien tarkistuslistan – esimerkiksi, onko sovittuja turvallisen suunnittelun periaatteita noudatettu tai onko syötteenkäsittely turvallista. Lisäksi staattisen koodianalyysityökalun käyttö voi helpottaa haavoittuvuuksien löytämistä koodista.
Dokumentointikin on osa turvallista ohjelmointia. Etenkin oletukset turvallisuudesta, luottamussuhteista, tunnetuista heikkouksista tai väliaikaiseksi tarkoitetuista korjauksista kannattaa kirjata.
Toteutuksen tietoturvan varmistamiseen liittyy myös hallintakeino A.8.29 Tietoturvatestaus kehitys- ja hyväksyntävaiheissa.
Turvallinen kehitysympäristö tukee turvallista koodausta
Kehitysympäristöjen ja – työkalujen turvallisuus ja hallinta liittyy läheisesti ohjelmiston turvalliseen toteutukseen. Ylläpidetäänkö ja päivitetäänkö kehitysympäristöjä ja -työkaluja? Onko ne konfiguroitu turvallisesti? Onko pääsynhallinta kunnossa, käyttöoikeudet ajan tasalla sekä testidatan luottamuksellisuus ja tietosuoja-asiat mietittynä?
Lisää kehitysympäristöjen suojaamisesta on ISO 27001 -standardin hallintakeinossa A.8.31 Kehitys-, testaus- ja tuotantoympäristöjen erottaminen.
Ohjelmistoturvallisuus vaatii ylläpitoa ja päivitystä
Huolellisesta suunnittelusta, toteutuksesta ja testauksesta huolimatta ohjelmistoissa on virheitä ja haavoittuvuuksia – joko omassa koodissa tai ulkoisissa kirjastoissa. Siksi turvalliseen ohjelmointiin kuuluu haavoittuvuuksien hallinta ja päivittäminen.
Automaattiset kirjastojen haavoittuvuuksia tunnistavat työkalut, jotka integroituvat esimerkiksi versionhallintaan tai kehitys- ja julkaisutyökaluihin, nopeuttavat haavoittuvuustiedon saamista ja voivat helpottaa päivitysten käyttöönottoa. Haavoittuvuuksien vakavuuden arviointiin omassa ympäristössä on syytä olla kriteerit. Joskus tarvitsee myös selvittää, onko haavoittuvuutta ehditty hyödyntää, jolloin ohjelmistoturvallisuus linkittyy tietoturvapoikkeamien ja -häiriöiden hallintaan.
Kannattaa varautua siihenkin, että valkohattuhakkeri löytää haavoittuvuuden organisaation tekemästä ohjelmistosta. Onko verkkosivuilla tieto siitä, miten asiasta voi ilmoittaa luottamuksellisesti? Onko olemassa keino todentaa haavoittuvuuden olemassaolo, arvioida vakavuus ja korjata se pikaisesti? Miten ja missä vaiheessa asiakkaille ilmoitetaan haavoittuvuudesta ja saatavilla olevasta korjauksesta?
Turvallinen ohjelmointi alkaa ennen varsinaista koodaamista tietoturvallisten suunnitteluperiaatteiden ja tietoturvavaatimusten valinnalla sekä turvallisten kehitysympäristöjen rakentamisella. Turvallinen ohjelmointi sisältää myös teknologiakohtaisten turvallisen koodauskäytäntöjen soveltamista, katselmointia ja testausta sekä haavoittuvuuksienhallintaa ja koodin ylläpitoa. Turvallinen ohjelmointi edellyttää myös osaamisen ylläpitoa ja koulutusta.
Anne Oikarinen
Anne toimii 2NS:llä hallinnollisen tietoturvan asiantuntijana ja hänellä on vahva kokemus sovellusturvallisuudesta sekä ISO 27001 -standardin käyttöönotosta.
2NS auttaa yrityksiä implementoimaan ja ylläpitämään ISO/IEC 27001 -standardia. Lisätietoa löydät ISO 27001- palveluosiostamme.