


Pikkun{pp{r{ hakkeri-siivil{
Jukka Ukkonen (ukkonen@csc.fi), 
CSC - Tieteellinen laskenta oy
N{in talven ensi lumien laskeutuessa puiden oksille ja ulkol{mp|tilojen roikkuessa muutamann asteen tiet{mill{ on miellytt{v{ ajatella kotoista l{mmint{ turvallisuutta ja matkata ty|p{iv{n j{lkeen touhuamaan oman keitti|n lieden tuoksuihin.
 Turvallisuutta ihminen kaipaa toki my|s ty|ss{{n, mutta kaikki tietokoneiden ja verkkojen kanssa ty|skentelev{t tiet{v{t, ett{ t{ll{ alalla turvallisuus on usein kovin rajallista. Se rajoittuu niihin ihmisiin, joiden kanssa teemme t|it{ samoilla koneilla, omiin ty|tovereihin ja muihin koneiden k{ytt{jiin. Useimmiten se on vain, mit{ itse siit{ teemme.
 Avoimet ovet ...
Perinteisesti UNIXin sukuiset k{ytt|j{rjestelm{t ovat olleet hyvin avoimia ja osittain juuri avoimen taustansa vuoksi my|s varsin usein valitettavan helppoja tietokonemurtojen kohteita. 
 Koska luonnollinen l{ht|kohta on ollut juuri p{invastainen kuin esim. perinteisess{ IBM:n main-frame-ymp{rist|ss{, miss{ kaikki, mik{ ei ole ollut erikseen sallittua on ollut kielletty{, ei mit{{n erityisvalvontaa ole useinkaan pidetty tarpeellisena. P{invastoin painotus on aina ollut siin{, ett{ kaikilla olisi yhden k{ytt{j{tunnuksen puitteissa k{ytett{viss{ mahdollisimman suuri ty|kalupakki, ja ett{ kaikkien on ollut helppo laajentaa t{t{ aseistusta omien tarpeidensa mukaan.
Niin kauan kun valtaosa koneista oli suhteellisen eristettyj{ pikku saarekkeita t{llaisessa filantrooppisessa ajattelussa ei ollutkaan mit{{n vikaa. Vasta aivan viimeisten vuosien aikana tietokoneverkot ovat kokeneet todellisen boomin valmistajasta ja laitteistosta riippumattomien verkkojen yleistyess{ koko maailman kattaviin mittoihin.
T{ll{ hetkell{ Internetin koko kaksinkertaistuu joka 18. kuukausi. Toisaalta maailmanlaajuisiin verkkoihin kytkeytyy yh{ enemm{n koneita, joihin liittyy suuria taloudellisia arvoja, esim. patentointikelpoista tutkimusty|t{ tai tuotesuunnittelua, mihin joukkoon CSC:n koneetkin kuulunevat.
 Kuitenkin samalla kun verkottuminen on tuonut maailman {{rill{ sijaitsevat koneet luvallisten k{ytt{jien kotioville, ovat ne my|s tarjonneet luvattomille seikkailijoille helpon v{yl{n kolkuttelemaan omien koneidemme portteja.
... vai hallittu sis{{ntulo
Koska UNIXin perinn{istapoihin on kuulunut, ettei ulkoa koneelle p{in tulevista yhteyksist{ eik{ aina muistakaan kriittisist{ operaatioista ole pidetty tiukkaa automaattista kirjanpitoa, murtoyritykseen ei ole liittynyt edes kovin suurta riski{ j{{d{ kiinni. Mik{ pahinta, vaikka nyky{{n UNIX-ymp{rist||n on saatavilla monen laisia turvallisuusty|kaluja, likik{{n kaikki yll{pit{j{t saati sitten operaattorit tai tavalliset k{ytt{j{t eiv{t viel{k{{n suhtaudu koko turvallisuuskysymykseen kovin vakavasti. 
Monille kyseess{ on jonkun toisen ongelma, jonkinlainen iso-veli-valvoo-mentaliteetti. Usein todelliset ongelmat ovat kuitenkin alkaneet jostakin aivan yht{ yksinkertaisesta asiasta kuin huonosti valittu tunnussana tai sen kirjoittaminen jonnekin muistiin. Valitettavan usein kyse on siis ollut joko k{ytt{j{n tai yll{pidon tiet{m{tt|myydest{ tai jopa silkasta v{linpit{m{tt|myydest{.
Hyv{t tunnussanat ovat jo sin{ll{{n riitt{v{ aihe kokonaisen uuden artikkelin aiheeksi, mutta niiden mainitseminen t{ss{ esimerkkin{ riitt{nee osoittamaan, ett{ tuo l{hes myyttinen koneiden ja verkon turvallisuus on kaikkien yhteinen ongelma. Olipa kyseess{ sitten super-yll{pit{j{ tai rivik{ytt{j{, on hyv{ muistaa vanha viisaus ketjusta ja sen lenkeist{. 
Merkitt{v{ osa kaikista koneiden turvallisuusriskeist{ johtuu siit{, ett{ ne yll{pit{j{t, joilla tulisi olla tarvittava tieto ja taito, eiv{t viitsi pakottaa k{ytt{ji{{n tai toisten koneiden ja verkkojen yll{pit{ji{ j{rkev{{n turvallisuuspolitiikkaan.
Lopuista riskeist{ osa aiheutuu aivan selvist{ ohjelmistovirheist{, joihin ei puututa riitt{v{n tehokkaasti heti, kun ongelma havaitaan. Osa taas johtuu pelk{st{{n siit{, ett{ mahdollisista murtoyrityksist{ ei j{{ riitt{v{sti j{lki{, jotta ne havaittaisiin ajoissa saati sitten ett{ seikkailijan alkuper{ olisi selvitett{viss{.
Uusi ty|kalu helpottaa valvontaa
Verkkoturvallisuuden ja tulevien yhteyksien j{ljitett{vyyden parantamiseen UNIX-koneilla on t{m{n vuoden kev{{st{ alkaen ollut saatavilla ohjelma nimelt{ tcpd (Transmission Control Protocol Daemon). Sit{ on kokeiltu my|s CSC:ll{. 
Jo muutaman lyhyen koejaksonsa mittaan se on ehtinyt yll{tt{{ ik{v{sti joitakin CSC:n k{ytt{ji{ paljastamalla heid{n oman kotiverkkonsa yll{pidon olevan v{h{n puolivillaisissa kantimissa. Liek| sitten ollut pakko-lamautuksen seurauksia vai jotain muuta.
Toistaiseksi tcpd on ainoa IP-verkon yhteyksien valvontaan tarkoitettu ohjelma, jonka CERT (Computer Emergency Responce Team) on hyv{ksynyt ja jota se jakelee ilmaiseksi (!) kaikille halukkaille.
 Sen alkuper{inen tekij{ on Wietse Venema Eindhovenin teknisest{ korkeakoulusta, Hollannista. Julkiseen jakeluun tcpd on p{{stetty viime kev{{n{. Kiinnostuneet voivat poimia oman kopionsa anon-ftp:ll{ mm. ftp.funet.fi:st{.
Pyrkimyksen{ tcpd:n toteutuksessa on ollut minimaalinen ja helposti hallittava "vahtikoira", joka on kuitenkin eritt{in monipuolisesti ohjelmoitavissa kunkin koneen tarpeiden mukaan. 
Periaatteessa se on vain pelkk{ suodatin, joka tarkistaa, ett{ koneelle tuleva yhteydenotto on j{ljitett{viss{ ja normaalisti her{tt{{ varsinaisen palvelinohjelman. Mik{li yhteys ei ole asianmukaisesti j{ljitett{viss{, se katkaisee yhteyden.
Merkitt{v{{ on, ett{ tcpd toimii juuri sill{ koneella, johon tulevia yhteyksi{ halutaan valvoa. N{in se on ohjelmoitavuutensa vuoksi paljon joustavampi kuin palosein{ksi kutsutun reitittimen taakse suljettu eristetty verkko. K{yt{nn|ss{ sen antama turvallisuus on silti aivan yht{ hyv{ ellei parempikin. Mik{{nh{n ei takaa, ett{ palosein{kone osaisi aina valvoa osoitteiden ja nimien v{{rent{mist{.
 Lis{ksi palosein{ usein haittaa aivan yht{ paljon yhteyksi{ eristetyst{ verkosta ulos kuin p{invastaiseenkin suuntaan. T{t{ kaksiter{isen miekan symmetriaa tcpd:ll{ ei ole. Se tosiaan "puree" vain luvatonta vierailijaa.
Ohjelmoimalla lis{{ joustoa
Tavallisimmassa tapauksessa tcpd vain kirjaa tiedon avatusta yhteydest{ ja sen lajista (esim. telnet, rlogin, rsh, ftp, gopher jne.) ja her{tt{{ normaalin palveluohjelman hoitamaan yhteyden loppuun. Mik{li vastapuolen ymp{rist|ss{ tai yhteydenotossa itsess{{n on jotakin ep{selv{{, tcpd hylk{{ yhteyden v{litt|m{sti ja rekister|i tiedon hyl{tyst{ yhteydest{, sen avaajasta ja hylk{{misen syyst{. 
Se voi my|s tarkistaa erillisen luotettujen koneiden/verkkojen listan sek{ sulkulistan, joissa valinta voidaan tehd{ halutun palvelun ja kutsujan osoitteen, nimen, verkon tai nimipalvelualueen mukaan. Kun yhteys ohjelmallisesti hyl{t{{n tai hyv{ksyt{{n, voi tcpd aktivoida normaalin palvelinohjelman sijaan jonkin muun koneen yll{pit{j{n valittavissa olevan toiminnan.
 Tcpd sulkee verkkoyhteydet niilt{ koneilta,
 1) joita ei tunneta nimipalvelussa (DNS),
 2) joilla konversio osoitteesta nimeksi ja takaisin nimest{ osoitteeksi antavat ristiriitaiset tulokset (ainakin toinen kahdesta nimipalvelijasta siis valehtelee),
 3) jotka yritt{v{t avata yhteyden IP-verkon source-routing piirrett{ k{ytt{en, tai
 4) jotka l|ytyv{t erillisten valintakriteerien tarkistuksessa sulkulistalta.
Kustakin em. kohdasta saatavat hy|dyt ovat:
 1 --> koneen haltijan j{ljitett{vyys (jos nimi on OK)
 2 --> nimen v{{rent{misen j{ljitett{vyys (jos osoite OK)
 3 --> osoitteen v{{rent{misen tunnistus ja yhteyden aktiivinen hylk{{minen 
4 --> voi sulkea tai sallia yhteyden yksitt{isist{ koneista, tiettyyn joukkoon kuuluvista osoitteista tai tietyist{ nimipalvelualueista (esim. murtautujan "maaston ansoittaminen")
Lis{ksi tcpd:n avulla on mahdollista mm. yritt{{ selvitt{{, kuka tai ketk{ ovat yhteyden avanneessa koneessa paikalla kun yhteyspyynt| tulee. 
Sen voi my|s laittaa l{hett{m{{n automaattisen ilmoituksen nimipalvelussa havaituista puutteista ao. nimipalvelualueen yll{pit{j{lle. Jos kyseess{ ei ollut oikea yritys oman koneen identiteetin k{tkemiseksi, saattaisi yhteys n{in menetelt{ess{ jonkin ajan p{{st{ onnistua ilman k{ytt{j{n tai kohdekoneen yll{pit{j{n aktiivista toimintaakin. 
Esimerkiksi CSC:ll{ tcpd pyrkii mahdollisuuksien mukaan my|s informoimaan k{ytt{j{{ siit{, ett{ yhteys on tarkoituksellisesti katkaistu.
Koska tcpd:n voi laittaa her{tt{m{{n aivan mink{ hyv{ns{ ohjelman tavallisen palvelimen tilalle, voi yll{pit{j{ sen avulla rakentaa niin itselleen kuin yhteytt{ yritt{v{lle k{ytt{j{lle t{ysin k{sitt{m{tt|mi{ ansoja.
Vihre{{ ja punaista valoa
Ohjelmoitavat hyv{ksymis- ja hylk{yskriteerit ovat tcpd:ll{ eri tiedostoissa. Ensin tcpd lukee allow-tiedoston (yleens{ /etc/hosts.allow).
 Mik{li allow-tiedostosta ei l|ytynyt rivi{, joka olisi sopinut juuri k{sill{ olevaan tapaukseen, se lukee deny-tiedoston (/etc/hosts.deny). Jos edes deny-tiedostosta ei l|ydy rivi{, joka ratkaisisi yhteyden kohtalon, se hyv{ksyt{{n. Oletuksena tietysti on, ett{ yhteytt{ ei ole hyl{tty jo alkutarkastuksissa esim. IP:n source-route option vuoksi.
Sek{ allow- ett{ deny-tiedoston muoto on sama. Kukin s{{nt| kirjoitetaan omalle rivilleen, eiv{tk{ ne voi jatkua seuraavalla rivill{. S{{nn|t muodostuvat kolmesta kaksoispisteell{ toisistaan erotetusta kent{st{ seuraavasti:
<palvelu> <palvelu> ... : <kone/verkko> <kone/verkko> ... : <toiminta>
Toimintaosa ei ole v{ltt{m{t|n. Jos sit{ ei ole, yhteys joko hyv{ksyt{{n tai hyl{t{{n ilman enempi{ kommentteja.
Koska sek{ palvelujen ett{ koneiden kentt{ on oikeastaan lista, voidaan yhdess{ s{{nn|ss{ k{sitell{ esim. rlogin ja telnet samalla kertaa.
Jos samaa kontrollitiedostoa halutaan jakaa esim. rdistin avulla useammille koneille, voi joskus olla hy|dyllist{ laittaa palveluosaksi esim. `ftpd .ftpd'. T{m{ sopii sek{ ohjelmaan ftpd ett{ kaikkiin muihin ohjelmiin, joiden nimet p{{ttyv{t `.ftpd' esimerkiksi in.ftpd (tavallinen ftpd:n Internet-versio) ja un.ftpd (UltraNet-versio).
Jos toisessa kent{ss{ ilmoitetaan koneen tai nimipalvelualueen nimi, on tulkinta sama kuin palvelun kohdallakin. N{in csc.fi on yksi ainoa kone, mutta .csc.fi viittaa kaikkiin niihin koneisiin, joiden nimi p{{ttyy `.csc.fi'.
Toisen kent{n sis{lt|n{ voi olla my|s yksitt{inen IP-osoite kuten 128.214.46.10 tai kokonainen verkko (aliverkko) 128.214.46.0/255.255.255.0. Kun halutaan viitata kokonaiseen verkon osaan on ilmoitettava my|s, mitk{ osoitteen bitit halutaan tulkittavaksi verkkonumeron osaksi. T{m{ tehd{{n antamalla tavallinen netmask kauttaviivalla erotettuna verkko-osoitteen j{lkeen.
Toisen kent{n sis{lt|n{ voi olla my|s `unknown', joka sopii kaikkiin niihin osoitteisiin, joita ei ole rekister|ity nimipalveluun. Ainakaan allow-tiedosto ei siis ole oikea paikka valitsimelle `unknown'. Sen sijaan deny-tiedostoon sit{ voi vilpitt|m{sti suositella, ja jos mahdollista viel{ seuraavaa esimerkkirivi{ tiukempanakin versiona.
ftpd telnetd rlogind : unknown : echo `Where are you?'
Molemmissa em. kentiss{ (palvelu & kone) voi k{ytt{{ my|s "jokeria" ALL, joka sopii kaikkeen mahdolliseen. Yksin{{n ALL ei ehk{ ole kovin mielek{s valitsin lukuunottamatta tilannetta, jossa koneesta halutaan tehd{ t{ysin suljettu, jolloin /etc/hosts.allow olisi tyhj{ ja /etc/hosts.deny olisi vain yhden rivin mittainen.
ALL : ALL :
Yleens{ ALL valitsimen luonnollinen jatke on EXCEPT, jolla voi rajata listasta pois jonkin koneen tai palvelun, vaikka se edelt{v{n valitsimen perusteella sinne kuuluisi. Jos kyseess{ on esimerkiksi kone, josta et halua kenenk{{n hakevan tiedostoja ftp:ll{, koska ymp{rist|ss{si on oma ftp-palvelukone, voisi tiedostossa /etc/hosts.deny olla rivi
ftpd .ftpd : ALL EXCEPT csc.fi .csc.fi : echo `ftp available on ftp.funet.fi'
T{llainen rivi jollakin CSC:n koneella j{tt{isi tien auki kuitenkin CSC:n sis{lt{ tuleville ftp:n k{ytt{jille. Muille se antaisi viel{ ilmoituksen, miss{ on l{hin julkinen ftp-palvelin.
Luvaton yritys laukaisee toiminnon
Kolmas kentt{ on varattu halutun toiminnan tekemiseen. Se voi joko puuttua kokonaan tai olla k{yt{nn|ss{ mik{ hyv{ns{ komento, mutta toivottavaa olisi, ett{ se on kohtuullisen nopeasti suoritettu asia ja ettei se aiheuta turhaa h{mmennyst{ yhteytt{ yritt{v{lle k{ytt{j{lle.
Tcpd:lle on k{{nn|saikana mahdollista m{{ritell{ my|s vaihtoehtoinen tapa t{m{n kent{n k{ytt{miselle, jolloin sen avulla voi toteuttaa varsin monipuolisia muutoksia k{ytt|ymp{rist||n ja silti k{ynnist{{ lopulta sen palvelun, mihin k{ytt{j{ halusikin olla yhteydess{. T{m{ ei kuitenkaan ole en{{ ihan sunnuntai-yll{pit{j{n hommia. Kikkailusta kiinnostuneille todettakoon, ett{ vaihtoehtoisen kolmannen kent{n ainoa dokumentointi on toistaiseksi tcpd:n paketista l|ytyv{ tiedosto options.c.
Toimintakent{ss{ voidaan komentojen parametrein{ k{ytt{{ %X-tyylisi{ merkint|j{ viittaamassa asiakaskoneen osoitteeseen (%a = address) ja nimeen (%h = host), k{ytt{j{n nimeen toisella koneella (%u = user) sek{ kaikkeen informaatioon, mit{ toisesta koneesta ja sen k{ytt{j{st{ on saatavilla (%c = client). Yhteyden kohteena olleen palvelun nimeen voi viitata lyhenteell{ %d (daemon name) ja prosessinumeroon lyhenteell{ %p (process id). N{in automaattisen ilmoituksen nimipalvelussa olevista puutteista voisi her{tt{{ vaikkapa seuraavalla rivill{ deny-tiedostossa.
ALL : unknown : /usr/local/etc/report.access.fail %a %d %h
Esimerkki voi vaikuttaa hieman fiktiiviselt{, mutta itse asiassa se on t{ysin k{ytt|kelpoinen ratkaisu, koska sopivan shell-skriptin tekeminen hoitamaan itse ilmoitusty| on melko vaivatonta. Kuvassa 1 on malliksi er{{n CSC:n koneen tiedosto /etc/hosts.deny kun koneelle ei haluta lainkaan yhteyksi{ CSC:n ulkopuolelta. Vastaava /etc/hosts.allow on tyhj{.
TCPD:n rajoitukset 
Tcpd on tarkoitettu valvomaan niit{ yhteyksi{, joiden palvelimet k{ynnistyv{t normaalisti inetd:n avulla (InterNET super Daemon, ks. /etc/inetd.conf tai /usr/etc/inetd.conf). 
Kuvassa 2 on n{ht{vill{ p{tk{ tiedostoa inetd.conf ja miten tavanomainen inetd.conf muuttuu kun tcpd laitetaan valvomaan er{it{ tyypillisimpi{ interaktiivisia yhteyksi{. Jos kyseess{ on t{ysin itsen{isen{ toimiva palvelin (UNIX-sanastossa daemon), joka v{ijyy itse sille tulevia yhteydenottoja, ei tcpd:ll{ ole mit{{n tapaa p{{st{ v{liin kurkistamaan, kuka tai mik{ yhteyden avaaja oikein on.
Usein esimerkiksi sendmail tai muut MTA:t (Mail Transfer Agent) toimivat omissa oloissaan, joten t{llaiselle palvelimelle tulevia yhteydenottoja tcpd ei pysty kontrolloimaan. Samaan sarjaan kuuluvat my|s nimipalvelu eli DNS, (x)ntpd (Network Time Protocol Daemon) tai NFS (Network File System) sek{ monet muut. Esimerkiksi sendmail olisi mahdollista siirt{{ toimimaan inetd:n ohjauksessa, mutta on lukuisia palvelimia, joiden on toimittava itsen{isin{. Lis{ksi on joukko UDP:n (User Datagram Protocol) varaan rakennettuja palveluja, joiden palvelimet voivat k{ynnisty{ inetd:n avulla, mutta jotka kerran k{ynnistytty{{n j{{v{t itse joksikin aikaa vahtimaan omaa porttiaan. Jos t{m{n latenssiajan kuluessa palveluun tulee uusia pyynt|j{, ei tcpd p{{se v{liin tarkastamaan n{it{ my|hempi{ yhteyksi{, vaan ainoastaan sen ensimm{isen, jonka tullessa inetd her{tt{{ erillisen palvelimen hoitamaan palvelun loppuun.
Erikoisemmat tcpd:n k{ytt|tavat 
Tcpd:n voi laittaa vahtimaan my|s palvelimia, jotka jokin toinen ohjelma kuin inetd her{tt{{ hoitamaan joitakin tiettyj{ teht{vi{. Jos t{ll{ toisella ohjelmalla ei inetd:n tapaan ole erillist{ ohjaustiedostoa, jossa tcpd:n voisi m{{ritell{ her{tett{v{ksi todellisen palvelimen asemesta tai et halua muuttaa t{llaista tiedostoa (esim. inetd.conf), tcpd:n voi kopioida todellisen palvelimen paikalle ja nimelle koneen tiedostoj{rjestelm{{n. Alkuper{inen palvelin tulee ensin tietysti siirt{{ jonnekin talteen, koska sen teht{v{ksih{n varsinaisen palvelun toteuttaminen edelleen j{{. Lis{ksi alkuper{inen palvelin t{ytyy siirt{{ jonnekin, mist{ tcpd osaa sen tarvittaessa hakea. T{t{ varten tcpd:lle voidaan k{{nn|saikana m{{ritell{ ennalta tunnettu hakemisto, mist{ se etsii ja k{ynnist{{ palvelun, jonka nimell{ se itse on her{tetty. Her{tettiinp{ tcpd mill{ tavalla hyv{ns{, v{litt{{ se aina saamansa parametrilistan sellaisenaan todelliselle palvelimelle. Todellinen palvelin ei voi siis miss{{n olosuhteissa edes tiet{{, ettei sit{ her{tt{nyt inetd tms. tai ett{ tcpd on todellisuudessa jo ehtinyt varmentaa yhteydenoton.
TCPD:n asennus ja konfigurointi 
Kun tcpd:n paketti on ensin haettu jostakin (esim. ftp.funet.fi) ja purettu oman koneen levylle, paketista l|ytyv{t tiedostot BLURB ja README sek{ manuaalisivut tcpd.8, hosts_access.3 ja hosts_access.5, joille kannattaa uhrata hetki. Se lukeminen ei taatusti mene hukkaan, sill{ kaikki k{ytt||notossa tarvittava tieto l|ytyy n{ist{ tiedostoista.
Itse asennusty|n pit{isi kaiken j{rjen mukaan olla varsin suoraviivaista. En siis sanonut helppoa, koska joku voisi olettaa sen tarkoittavan, ettei se olisi lainkaan ty|l{st{. Todellisuudessa tiedoston /etc/inetd.conf muuttaminen ja sopivien tiedostojen hosts.deny ja hosts.allow laatiminen vaatii aikaa ja vaivann{k|{. Itse ohjelmakoodin pit{isi kuitenkin olla hyvin siirrett{v{{ ja k{{nty{ helposti, ellei koneellasi ole jotain todella ep{tavallisia virityksi{. Ainoat tarvittavat viritykset tehd{{n Makefile-tiedostoon.
Lopputulos onkin sitten v{hint{{n kokeilemisen arvoinen ja jokaisen, joka arvostaa omien koneidensa verkkoturvallisuutta varmasti kannattaa tutustua tcpd:n mahdollisuuksiin l{hemminkin. Parhaan siit{ saa irti kokeilemalla. Se on kaikessa yksinkertaisuudessaankin aivan liian monipuolinen kuvattavaksi t{ydellisesti yhdess{ artikkelissa.







