TTKK / Tietoliikenne / J.Koskinen : Tietoturvallisuuden perusteet

6. viikko, ke 6.10.1999

Ohjelmien oikeellisuudesta

Aiemmin oli puhe viruksista ja niiden torjunnasta. Siinä oli kyse ohjelmakoodin eheydestä, joka todettiin lähinnä varmistamalla, ettei ohjelmaa ollut peukaloitu jälkikäteen. Mistä sitten tietää, että ohjelma toimii alunperinkään oikein? Ensinnäkin kannattaa varmasti noudattaa hyviksi koettuja ohjelmoinnin periaatteita. Kertaa/LUE yksi kokoelma sellaisia.

Toiseksi, ohjelma kannattaa testata huolellisesti. Testausta pitää tehdä ohjelmistotyön eri vaiheissa ja usealla tasolla. Viimeksi mainittu tietojärjestelmän "hyökkäystestaus" on melko viimeisen vaiheen, jo valmiin asennuksen, testausta.

Yksi uudenlainen tietoturvaan liittyvä vikatestausmenettely on esitelty artikkelissa A.K.Ghosh, J.M. Voas: Inoculating Software for Survivalbility, Communications of the ACM, Vol. 42, No. 7 July,1999 , 38-44. Inoculating tarkoittaa taudin istuttamista (kuten rokotuksessa) ja kyseessä on tässä tapauksessa turvallisuuskriittisten järjestelmien testaus siten, että niihin syötetään vikoja ja katsotaan pysyykö järjestelmä pystyssä ja pitääkö se erityisesti varannot turvassa ("fault injection analysis"). Viat saadaan aikaan peukaloimalla kaikkia ohjelmassa esiintyvien muuttujien arvoja, yksi kerrallaan. Vikojen on tarkoitus vastata kaikkea sellaista, mitä hyökkääjä tai epäkuntoinen käyttöjärjestelmä voisi aiheuttaa. Mukana on myös puskurin ylivuototestaus siten, että ajonaikaiseen pinokehykseen paluuosoitteen tilalle kirjoitetaan osoite puskuriin, jossa on ajettavaa koodia, jonka on siis tarkoitus korvata aliohjelmasta palaamisen jälkeinen normaalin suoritus.

Vastaavanlaiseen mutta pinnallisempaan testaukseen viitataan GNU-projektin dokumentissa (mainoksessa): Unix-järjestelmien varusohjelmille annettiin satunnaisia syötteitä ja katsottiin kuinka usein ohjelmat kaatuivat tai jäivät ikisilmukkaan. Kaupallisilla Unix-järjestelmillä tämä keskimäärä oli 15:n ja 43:n prosentin välillä, GNU:lla se oli 7%.

Kolmanneksi, joskin jo osana itse ohjelmointivaihetta, ohjelmien oikeellisuutta voidaan yrittää verifioida formaalein menetelmin, jotka perustuvat yleensä (temporaali)logiikaan ja mallin tarkistukseen (model checking). Vastaavat menetelmät ovat jo osoittaneet voimansa laitteistojen (ja laitelmistojen) suunnittelussa, mutta eivät ole vielä lyöneet itseään läpi ohjelmistojen tapauksessa.

Oikeaksi todistaminen on teoriassa mahdotonta, mutta riittävän rajatuissa yhteyksissä voidaan tuloksia saada. Ohjelman tietoturvallisuus on yksi tällainen ala, vaikka toisaalta hyökkäysten periaatteellinen arvaamattomuus tekee tämänkin hyvin haastavaksi. Tietoturvaprotokollien verifioinnissa käytettyihin periaatteisiin ja menetelmiin voi tutustua protokollakurssin materiaalin avulla: yleistä ja CSP sekä BAN-logiikka.

Yksi uudenlainen mahdollisuus vakuuttaa käyttäjä ohjelman turvallisuudesta on varustaa ohjelmakoodi todistuksella sen omasta oikeellisuudesta. Menetelmää voi soveltaa paitsi liikkuvaan koodiin (esim. "appletteihin") jollaisia käyttäjä lataa verkon ylitse eri lähteistä, myös usein päivitettäviin (paikattaviin) ohjelmistoihin. Koodin tuottaja toteuttaa koodinsa jollain (kone)kielellä, jolla on formaali semantiikka, ja käyttää jotain automaattista teoreemantodistajaa muodostamaan ja esittämään jollain formaalilla kielellä todistuksen siitä, että koodi noudattaa jotain tiettyä turvapolitiikkaa - erityisesti sitä, jonka käyttäjä eli koodin vastaanottaja on ilmaissut jollain formaalilla kielellä. Käyttäjä tarkastaa koodin mukana saamansa todistuksen jollain algoritmilla, joka toimii paljon nopeammin kuin varsinainen todistaminen. Kun hän on vakuuttunut siitä, että todistus on oikea ja koskee ao. koodia ja ao. politiikkaa, hän asentaa ja toteuttaa koodin, ja voi olla varma siitä, että politiikka toteutuu myös käytännössä.

Katso tarkempia tietoja artikkelista Proof-Carrying Code. Todettakoon, että tässä on kysymys paljon enemmästä kuin koodin alkuperän ja eheyden varmistamisesta. Näitä tavoitteita voidaan toteuttaa tavalliseen tapaan tiivisteilla ja allekirjoituksilla, ja sellaista palvelua tarjoaa esim. VeriSign, ks. vaikkapa Object Signing FAQ.

Yksi mahdollisuus varmistua siitä, ettei koodi pääse tekemään luvattomia on ajaa sitä sellaisessa ympäristössä joka avustaa käyttöjärjestelmää pääsynvalvonnassa: Javan ajonaikainen ympäristö on tällainen hiekkalaatikko, jonka rajoja voidaan myös muutella: Niiden sisällä toimivalta koodilta voidaan estää lukeminen tai kirjoittaminen paikalliselle levylle, yhteydenotto muuhun kohteeseen verkossa kuin siihen josta koodi ladattiin, uuden prosessin käynnistäminen, uuden ohjelmakirjaston lataaminen ja aliohjelman suora kutsuminen.

Yleisempi mahdollisuus on kääriä ohjelma toisen ohjelman ("wrapperin") sisälle, jolloin kääre toimii viitemonitorina ja huolehtii erityisesti pääsynvalvonnasta. Tunnettu esimerkki on tcpwrapper, joka käärii Internet-demonin 'inetd'. Tämän ohjelman tehtävänä on kuunnella palvelimen tietoliikenneportteja ja niihin tulleiden palvelupyyntöjen perusteella käynnistää asianmukaisia palvelinohjelmia, kuten http:n tai ftp:n. Tcpwrapper suorittaa tarkastuksia, joiden mukaan se ratkaisee, mihin pyyntöihin se antaa inetd:n vastata.

Edellä mainittujen palvelupyyntöjen lähettäjien eli asiakasohjelmien (esim. selaimen) tapauksessa voidaan vastaavankaltaista "esiliinatoimintaa" saada aikaan ns. proxyillä eli sananmukaisesti "valtuutetuilla" tai "edustajilla". Nämä ovat ohjelmia, jotka sijaitsevat mahdollisesti hieman etäämpänä käyttäjästä, mutta asettuvat käyttäjän ja avoimen tietoverkon väliin suodattaen tietoa suuntaan ja toiseen ja näyttäen ulospäin mahdollisesti vain itsensä eikä käyttäjää. Tietynlaisessa asemassa olevia edustajia sanotaan palomuureiksi ja nämä tulevat esille jäljempänä.

Verkot ja hajautetut järjestelmät

Tietoverkko on sellainen tietojenkäsittelyn ympäristö, jossa on useita itsenäisiä tietokoneita, jotka pystyvät kommunikoimaan keskenään. Kullakin koneella voi olla useita käyttäjiä, mutta muuten koneiden koolla eikä niiden välisellä etäisyydellä ole merkitystä verkon toimintaperiaatteiden kannalta.

Verkon käsitteitä. Näistä olisi hyvä olla jonkinlainen käsitys: Isäntäkone (host), palvelin (server), asiakas (client), lähiverkko (LAN), topologia, verkkojen väliset yhdyskäytävät, verkkojen yhteysverkot (internetit), osoitteet, nimet, reititin, protokollat ja niiden kerroksellinen rakenne (OSI-malli ja TCP/IP-malli).

Resursseja, joita riskianalyysissa pitää ottaa huomioon, läheltä kauas lueteltuina: paikalliset solmut ja niiden väliset linkit, lähiverkko, sen laitteet, prosessit ja talletetut tiedot, mm. kontrolli-informaatio; yhdyskäytävä ulkoiseen verkkoon, ja linkit yhdyskäytävästä ulospäin, ulkoisen verkon reitittimet ja resurssit kuten tietokannat.

Turvattomuutta aiheuttavia tekijöitä verkoissa:

Politiikkaa ja turvamekanismeja ei voi täysin pitää erossa toisistaan, koska jälkimmäiset riippuvat verkkoteknologiasta, joka toisaalta määrää paljolti sen missä kohdin uhkia voi esiintyä.

Viestintää koskevat yleiset uhkat ovat viestin paljastuminen, viestin muuntuminen matkalla, keksityn viesti ilmestyminen, viestin estyminen. Lisäksi etäresurssin luvaton käyttö verkon yli.

Uhkakuvia

Mitä kaikkea ikävää verkkoympäristössä voikaan tapahtua ja miten:

Turvamekanismeja

Erityisistä mekanismeista on jo ollut esimerkkeinä PGP ja SSL ja ensi kerralla tulee vielä SSH ja IPSec. Nyt asiaa katsotaan vain yleisellä tasolla:

Yksi erityinen mekanismi: suodatus palomuurissa

Palomuuri (firewall) on prosessi, joka suodattaa liikennettä ulko- ja sisämaailman välillä ja päästää läpi vain paikallisen politiikan mukaan oikeutetun liikenteen. Palomuuria varten on usein oma koneensa, jossa ei ole muita prosesseja.

Palomuurin yleiset vaatimukset ovat samanlaiset kuin viimeksi esillä olleen yleisen luotetun tietojenkäsittelyperustan (TCB:n):

  1. sen pitää olla ohittamaton: kaiken liikenteen ulos- ja sisäänpäin täytyy kulkea sen kautta;
  2. sen pitää olla riittävän suppea ja yksinkertainen jotta sen toimivuudesta voidaan vakuuttua;
  3. siihen itseensä ei voida murtautua.
Palomuurien luokittelut eivät ole aivan vakiintuneita, mutta yleensä niitä sanotaan olevan kahta tai kolmea päätyyppiä:
  1. paketteja suodattava reititin ('screening router', 'packet filter'): ratkaisee pakettien kohtalon niiden otsikkokentissä olevien tietojen perusteella. Nämä tiedot ovat lähettäjän ja vastaanottajan IP-osoitteet ja porttinumerot, protokolla, johon paketti kuuluu (yleensä TCP tai UDP). Porttinumerot kertovat mistä sovelluksesta on kyse ja tämä voi olla suodatusperusteena. On myös syytä karsia sellaiset ulkoa tulevat paketit, joissa lähettäjäksi on merkitty jokin sisäpuolinen osoite - ja kääntäen.
  2. sovellustason yhdyskäytävä, jollainen on proxyn eli sovellustason suotimen asemassa - siitä nimi 'proxy gateway', joissain yhteyksissä nimityksenä on 'bastion host'. Tämä on nykyään tavallisempi kuin pakettisuodatin, mutta voi olla yhdistettynä sellaiseen (esim. niin että pakettisuodatin on eri laitteessa sisempänä). Suodatus tapahtuu siis pakettia korkeammalla abstraktiotasolla, joka ottaa huomioon viestien semantiikan kunkin sovelluksen kannalta.
  3. Jos proxy-palomuuria vielä monipuolistetaan, saadaan aikaan jotain, jota kutsutaan myös vahdiksi ('guard'). Siinä tyypillisesti vaikutetaan sovelluksen kulkuun pelkän kyllä/ei-suodatuksen lisäksi muuntamalla paketteja vastaamaan jotain politiikkaa. Voidaan esimerkiksi rajoittaa jonkin sovelluksen kautta tietyn ajan kuluessa lähetettävän tai vastaanotettavan datan määrää tai periä maksuja jonkin rajan yläpuolella. Voidaan muuntaa liitetiedostoja sellaisiksi, etteivät makrovirukset "pysy hengissä", tai yleisesti vain skannata viruksia, jne.
Palomuurien keräämät lokitiedot ovat luonnollisesti tärkeä lähde tunkeutumisen havaitsemisessa. Palomuurit ovat ilmeisen hyödyllisiä, mutta ne saattavat rohkaista verkon ylläpitäjää suhtautumaan huolettomasti niiden sisällä olevan alueen turvallisuuteen. Jos palomuuri murtuu, seurauksena voi tällöin olla että koko järjestelmä on täysin avoinna hyökkäjälle. (Vrt. muuan vähemmän ihannoiva maininta palomuureista.)

Kaksi uudehkoa artikkelia palomuureista:
Joanna Makris: Firewall Services, More Bark Than Bite, Data Communications, March 1999. (Tech Tutorial)
David Newman: Lab Test: Super Firewalls!, Data Communications, May 21, 1999, 50-61 (oikeastaan vain 8 sivua).

Monitasoinen turvallisuus: Myös tietoverkossa voidaan soveltaa monitasoisia turvajärjestelyjä turvamerkintöineen ja oikeuksineen. Tällaiseen tarkoitukseen tarvitaan luotettua verkkoliityntää ('trusted network interface'), joka asettuu käyttäjän koneen ja verkon väliin. Se ei siis ole sama asia kuin palomuuri.

SPAM

Spam, "unsolicited bulk e-mail", eli tilaamatta saatu (ja siis ei-toivottu) massasähköposti, lyhyesti roskaposti, on melkoinen vaiva paitsi sitä ylimäärin vastaanottaville käyttäjille, myös postipalvelimille.

Roskapostia voidaan suodattaa palomuurien tapaan siinä vaiheessa kun se saapuu paikalliseen verkkoon. Ensimmäisenä kriteerinä voidaan käyttää viestin otsikossa esiintyviä lähettäjätietoja. Koska nämä on helppo väärentää tai käyttää releöintiä, jolla lähettäjäkoneeksi tulee jokin muu, joudutaan käytännössä sulkemaan kokonaisia palvelun tarjoajia, ISP:tä, joiden on todettu suhtautuvan sallivasti roskapostittajiin. Listoja tällaisista osoitteista ylläpitävät mm. ORBS (Open Relay Behaviour-modification System) ja MAPS RBL (Mail Abuse Orevention Systems's Realtime Blackhole List). Nämä olivat käytössä Lintulassa syksyllä 1999, mutta sittemmin niistä luovuttiin ja nyt hylkäyskriteerinä on se, että lähettäjän domain-nimeä ei löydy DNS-nimipalvelusta.

Käyttäjän oma postiohjelma voi täydentää tällaista suodatusta hylkäämällä tai ohjaamalla erilliseen postilaatikkoon sellaisia viestejä, joiden sisällön se tulkitsee ei-toivotuksi, esim. avainsanojen perusteella. Esimerkiksi yli kolmanneksen spam-postista on havaittu markkinoivan jonkinlaisia rikastumismahdollisuuksia ja yli kymmeneksen aikuisviihdettä yms.

Vähintään samaa tahtia kuin suodattimet kehittyvät, roskapostin lähettäjät ja heitä palvelevat ohjelmistonvalmistajat keksivät uusia menetelmiä hankkia osoitteita ja välttää suodattimia, esimerkiksi muokkaamalla viestiä henkilökohtaisemmiksi, silti automaattisesti. Millainen torjunta on enää sitten mahdollista, jos PKI:n yleistyttyä roskaviestitkin tulevat vastaanottajan julkisella avaimella salattuina ?!

Uudenlaisia torjuntakeinoja on kehitelty, mutta ne vaativat muutoksia postitusprotokolliin ja sen vuoksi eivät voi yleistyä kovin nopeasti:

Lisätietoa artikkelista L.F.Cranor, B.A.LaMacchia: Spam!, Communications of the ACM, Vol. 41, No. 8 (Aug. 1998), 74-83. (n. 45 kiloa)