TTKK / Tietoliikenne / J.Koskinen : Tietoturvallisuuden perusteet

6. viikko, ma 4.10.1999

Käyttöjärjestelmään perinteisesti liittyviä turva-asioita

Tätä ennen on puhuttu käyttöjärjestelmän alaisuudessa toimivasta tiedostojärjestelmästä ja siitä, miten lähinnä käyttäjien pääsyä niihin tai sisäänpääsyä koneeseen valvotaan. Kohta katsotaan miten käyttöjärjestelmä voi havaita tunkeutujan ja jäljempänä tutustutaan erityisen turvallisen käyttöjärjestelmän periaatteisiin. Katsotaan nyt lyhyesti, mitä keinoja "tavallisella" käyttöjärjestelmällä on pitää prosessi aisoissa, erityisesti miten muistiviittaukset pidetään erossa muiden prosessin käyttämästä muistialueesta (kertaus käyttöjärjestelmien kurssilta).

Muisti

Muistin lisäksi nykyaikaisen käyttöjärjestelmän pitää huolehtia lukuisista muista usean toimijan yhteiskäytössä olevista resursseista, jollain seuraavista tavoista: Vain ensimmäinen on aidosti erottelu. Kuten edellä jo nähtiin, segmentoinnin avulla voidaan sallia tietojen jakamista. Tätä on myös prosessien välinen kommunikointi. Yhteisten tietorakenteiden käytön voisi sanoa tapahtuvan "päällekkäin", mutta silti ilman törmäyksiä, ja erityisesti vanhentuneen tiedon käyttöä välttäen. Pääsynvalvonta voidaan järjestää yleisen mallin mukaisesti (vrt. kolmas luentokerta) joko pääsymatriisin, pääsylistojen, kykylistojen tai ryhmittelyn avulla. On myös mahdollista yksinkertaisesti sallia tiedon jakaminen kaikkien kesken tai kieltää se kaikilta muilta. Toisaalta pääsynvalvontaa voidaan tarkentaa asettamalla rajoituksia sille, mitä on lupa tehdä.

Joitakin "pieniä" käytäntöjä

Unix-koneeseen kirjautumisen jälkeen, mistä voimme tietää, käynnistävätkö antamamme komennot sen varusohjelman, joka on tarkoituskin, vaiko jonkin Troijan hevosen? Meidän pitää voida luottaa varusohjelmiin, sillä ylläpitäjä huolehtii niistä keinoilla, joita kohta esitellään. Oma hakemistomme ei välttämättä ole puhdas hyökkääjän asentamista harhauttavan nimisistä ohjelmista, joten käytännön varokeinona kotihakemistomme ei saa olla suoritettavien tiedostojen hakupolussa.

Yksi suosittu keino yrittää päästä käyttämään konetta luvattomin valtuuksin on suid- ja sgid-ohjelmien hyödyntäminen. Tavallinen ohjelma käynnistyy käyttäjänsä mukaisin oikeuksin. Suid-ohjelma on sellainen, että sen käynnistämällä prosessilla on ohjelmatiedoston omistajan oikeudet (eli prosessin uid, user-id, on sama kuin omistajan uid). Tällainen menettely on varsin hyödyllinen. Esimerkiksi salasanan vaihto-ohjelman pystyy suid-ohjelmana kenen tahansa ajamana kirjoittaa /etc/passwd/-tiedostoon, johon vain root-käyttäjällä on kirjoitusoikeus. Sgid on muuten vastaava kuin suid, mutta koskee ryhmää. Sekä suid että sgid ovat osa yksi bitti kunkin tiedoston pääsynvalvontatiedoissa ja ne näytetään x- eli suoritusoikeuden tilalla, jos ne on asetettu. Suid- tai sgid-ohjelmat eivät ole turvallisuusongelma, kunhan mitään ohjelmaa ei tarpeettomasti eikä vahingossa määritellä sellaiseksi eikä näiden ohjelmien kautta pääse tekemään mitään muuta kuin oli tarkoitettu.

Kun ajatellaan sitä, että käyttöjärjestelmän pitäisi myös valvoa, ettei mikään prosessi (esim. pillastuttuaan) syö kohtuuttomasti aikaa tai muistia, tai ole jollain muulla tavalla asiaton, tullaan oikeastaan seuraavaan aiheeseen:

Tunkeutumisen havaitseminen

Yleensä ei voida täysin ehkäistä hyökkäyksiä ja väärinkäyttöä. Tunkeutumisen havaitseminen (intrusion detection) ja (lisä)vahinkojen estäminen on seuraavaksi paras, mitä voidaan tehdä. Periaate on yksinkertainen: kerätään tietoa kaikesta oleellisesta mitä järjestelmässä on tekeillä ja tapahtuu, tutkitaan tätä tietoa ja tehdään johtopäätöksiä, ovatko havaitut seikat oire jostain hyökkäyksestä vai ovatko ne osa kyseisen ympäristön normaalia käyttäytymistä.

Järjestelmät käyttävät kolmenlaista tietoa analyysinsa perustana:

Seuraavassa käsitellään ensin lyhyesti tapahtumakirjanpitoa unixissa, sitten mainitaan rakenteen analysointivälineitä ja esitellään CERT:n käytännön ohjeita. Lopuksi esitetään tunkeutumisen havaitsemismenetelmien yleinen luokittelu.

Tapahtumat lokitiedostoihin

Unixissa monet ohjelmat luovat lokitiedostoja, eli lisäävät sinne aikajärjestyksessä merkintöjä tietynlaisista tapahtumista. Tällaisia tiedostoja ovat (vrt. hakemistosta /var/adm, mitä Lintulassa on käytössä): Joissain tapauksissa tieto ei ole kumulatiivinen, vaan lokitiedostoksi sanotaan (harhaanjohtavasti) myös voimassaolevaa tilanteen kuvausta. Tällaisia tiedostoja ovat mm. Lokeja voi kerätä myös yleisellä syslog-ohjelmalla, jota muut ohjelmat kutsuvat tallettamaan lokitietojaan.

Rakenteen eheys ja kestävyys

Olettaen että järjestelmä jossain vaiheessa on vielä puhdas, tai jokin sen osa on asennuksen jäljiltä vielä eheä, pitää siitä tallettaa tietoa, jotta myöhemmät tahrat pystyttäisiin tunnistamaan.

Hyökkäystyökaluilla voi tarkistaa onko omassa järjestelmässä aukkoja

Muuan käytännön ohjeisto

CERT:n laatima ylläpitäjän tarkistuslista hyökkäysten havaitsemiseksi näyttää tällaiselta: Tarkasta/etsi
  1. lokitiedostot: epätavalliset paikat joista on otettu yhteyttä tai epätavalliset toimet.
  2. suid- ja sgid-tiedostot (esim. find-ohjelmalla)
  3. varusohjelmistot (system binaries)
  4. paketinnuuskijat (packet sniffers)
  5. tiedostot joita ajetaan ajastettuina cron- tai at-ohjelmilla.
  6. ettei tarjolla ole valtuuttamattomia palveluita
  7. /etc/passwd-tiedosto
  8. järjestelmän ja paikallisen verkon konfiguraatio
  9. kaikkialta epätavalliset tai piilotetut tiedostot
  10. kaikki koneet paikallisesssa verkossa
ja ryhdy turvapolitiikan määräämiin toimiin.

Tunkeutumisen havaitsemismenetelmien luokittelua

Tämä esitys perustuu artikkeliin H.Debar, M.Dacier, A.Wespi: Towards a taxonomy of intrusion-detection systems, Computer Networks 31, 1999, 805-822. Tunkeutumisen havaitsemista käsittelee myös mm. Saksan BSI:n julkaisu (sen sisällysluettelo).

Jonkin havaitsemismenetelmän hyvyyttä voidaan arvioida seuraavissa ulottuvuuksissa:

Tunkeutumisen havaitsemismenetelmät jaotellaan seuraavassa kolmessa pääsuunnassa: mistä tiedot, mitä niillä tehdään ja mitä sitten tehdään.
  1. Tapahtumatietojen lähde. Seuraavista kahdesta on luonnollisesti myös yhdistelmiä
  2. Havaitsemismenetelmä
  3. Reagointi, eli mitä tehdään kun havaitaan hyökkäys.
Hieman eri ulottuvuudessa oleva hyökkäysten torjuntakeino on rakentaa ansoja, "hunajapurkkeja", jotka houkuttelevat hyökkääjiä. Näin voidaan ehkä välttää varsinaisen järjestelmän haavoittuminen, mutta erityisesti voidaan saada keskitetysti tietoa mahdollisesta hyökkääjästä ja katkaista hänen tiensä ennenkuin hän siirtyy oikeaan kohteeseen.

Näkökulmia luotettuun käyttöjärjestelmään

"Luotettu tietojenkäsittelypohja" (trusted computing base, TCB) tarkoittaa kokonaisuutta, joka koostuu tietokonejärjestelmään kuuluvista laitteista ja ohjelmista (ym.), jotka yhdessä panevat toimeen turvapolitiikan. Se, miten hyvin TCB toteuttaa politiikkaa, riippuu paitsi siihen kuuluvien mekanismien oikeellisuudesta, myös siitä, miten hyvin ne on suojattu ja miten hyvin politiikkaan liittyvät parametrit syötetään TCB:lle (esim. käyttäjien oikeudet).

Lähtökohtana voidaan pitää takeita siitä, ettei itse laitteistoa ole peukaloitu. Tämä aihe oli esillä viimeksi. Nyt mielikuvana voisi olla sellainen, että "systeemi" (viitemonitori) välittää kaiken vuorovaikutuksen käyttäjien ja resurssien välillä - tarkistaen joka kerta luotetusta pääsynvalvonnan tietokannasta, sallitaanko vai kielletäänkö vuorovaikutus.

Tietoturvallisuuden kannalta olisi tietysti suotavaa, että koko tietojärjestelmän voisi sanoa kuuluvan luotetun tietojenkäsittelyn piiriin. Käytännössä TCB:n on kuitenkin parempi olla suppea, koska kovin suuren osuuden turvallisuudesta ei voitaisi kuitenkaan vakuuttua. Periaatteessa TCB:n ulkopuoliset osat pitäisi voida antaa vaikka hyökkääjän kirjoitettaviksi, eikä politiikasta silti tarvitsisi tinkiä.

TCB:n suhteellisesta osuudesta riippumatta turvallisuusmekanismit voidaan tietokoneen arkkitehtuurissa levittää laajalle alalle tai keskittää. "Security kernel"-menettelyssä tehdään jälkimmäisellä tavalla. Siinä arkkitehtuurin muista osista eristetty "turvaydin" huolehtii järjestelmän turvallisuuspolitiikan toteuttamisesta. Tällainen turvaydin on tyypillisesti osin kovossa ja osin käyttöjärjestelmässä ja se on asennettu sinne jo järjestelmää rakennettaessa. Suppeuden ansiosta sitä on silti mahdollista melko yksinkertaisesti mukauttaa politiikan tarkentuessa - esim. uudentyyppisten hyökkäysten tultua ilmi.

Turvaytimen tärkeimmät ominaisuudet, jotka ovat kyllä TCB:ltä toivottavia ominaisuuksia yleisemminkin:

TCB:hen sisällytettäviä käyttöjärjestelmän osat voidaan määrätä sen mukaan, mitä tarvitaan politiikan toteuttamiseen. Näitä ovat ainakin: Esimerkiksi AIX:ssa eli IBM:n unixissa kaikki tietokonelaitteisto kuuluu TCB:hen ja huomattavan suuri osa käyttöjärjestelmästä (vrt. Trusted Computing Base Overview). Kaikkea käyttöjärjestelmää ei kuitenkaan tarvitse sisällyttää TCB:hen, vaan esimerkiksi tiedostonhallinnan riittää kyetä käsittelemään niitä yksinkertaisia tiedostoja, jotka TCB vain tarvitsee.

TCB:n rakentamisessa voidaan noudattaa samanlaista "sipuli"-rakennetta kuin käyttöjärjestelmässä yleensäkin. Vastaavasti kuin tietoliikenneprotokollien kerrosrakenteessa TCB:n ylemmät kerrokset saavat palvelua alemmilta kerroksilta ja mitä alempana ollaan sen parempaa luotettavuutta voidaan käytännössäkin edellyttää.