You are here: TUTWiki>Tietoturva/Tutkielmat>PiskonenJ?>200511

Tomi Kelo:

Port Knocking

Johdanto

Port Knocking, ´porttien koputtelu`, on tekniikka, joka mahdollistaa autentikoinnin eli käyttäjän tunnistamisen suljettujen porttien kautta. Tässä työssä keskitytään palvelin-asiakas- malliin, jossa asiakkaan tarvitsee autentikoituakseen palvelimelle tietää ´salainen koputus`, jonka jälkeen palvelin avaa tarvittavan portin asiakkaalle.

Nykyisessä TCP/IP-maailmassa palvelimien tulee pystyä usein tarjoamaan erilaisia palveluja, esimerkkeinä SSH, POP ja IMAP. Palvelimen tulee kuunnella tiettyjä portteja (edellä mainituissa yleensä 22, 110 ja 143) voidakseen toimia, toisin sanoen palvelimen täytyy pitää tiettyjä portteja aina auki, mikä mahdollistaa myös tunkeutumisyritykset auki olevien porttien kautta. Port Knocking pienentää edellä mainittua riskiä, koska portteja tarvitsee pitää auki vain palvelun ´suorittamisen` ajan.

Kuinka tämä on mahdollista? Mitkä ovat PK:n edut, mahdollisuudet, heikkoudet ja millaisiin ympäristöihin PK:ta voidaan käytännössä soveltaa? Voidaanko Port Knockingia käyttää myös pahaan? Muun muassa näihin kysymyksiin tullaan tässä harjoitustyössä vastaamaan.

Määritelmä

Port Knockingilla tarkoitetaan yleisesti tiedonsiirtoa, jossa informaatio saapuu suljettuihin portteihin kohdistuvien yhteyspyyntöjen muodossa, ja jossa oikea yhteyspyyntöjen sekvenssi laukaisee tapahtuman vastaanottajan päässä eli asiakkaan täytyy lähettää vastaanottajalle oikeita paketteja oikeisiin portteihin oikeassa järjestyksessä. Vastaanottaja ei lähetä operaation missään vaiheessa kuittausta lähettäjälle.

Tässä työssä keskitytään Port Knockingin tapaukseen, jossa toimijat ovat asiakas (client) ja palvelin (server). Tässä yhteydessä PK:lla tarkoitetaan kahden tietokoneen välistä tietoliikennettä, missä informaatio on koodattu porttinumerosekvensseiksi. Tästä sekvenssistä käytetään termiä koputus (knock). Ennen kuin informaatio koodataan, voidaan informaatioon soveltaa luonnollisesti myös muita tietoturvallisuutta lisääviä mekanismeja kuten informaation kryptausta. Tässä tilanteessa Port Knocking tuokin luonnollisesti järjestelmän turvamalliin vain yhden suojakerroksen lisää.

Asiakas-palvelin -mallin tapauksessa palvelin tarjoaa ulospäin julkiseen verkkoon vain suljetut portit ja tarkkailee portteihin kohdistuvia yhteysyrityksiä, toisin sanoen kuuntelee porttien
koputtelua. Yhteys avataan tässä tapauksessa seuraavan protokollan mukaisesti:
1. Asiakas aloittaa lähettämällä yksinkertaisimmillaan TCP:n SYN-paketteja koputuksen määräämiin portteihin.
2. Palvelin kuuntelee koputuksia, mutta ei kuitenkaan lähetä missään vaiheessa kuittauksia asiakkaalle.
3. Kun palvelin havaitsee oikean koputuksen, se käynnistää palvelimen prosessin (server-side process) eli palvelin voi esimerkiksi avata oikeat portit ja asiakas voi siten muodostaa yhteyden ja käyttää haluttua palvelua.

Laillista koputusta ja palvelimen prosessia ei ole tarkasti määritelty, vaan ne on tarkoituksella jätetty vapaasti implementoitaviksi eli erillaisia toteutuksia on useita. Esimerkiksi palvelimen prosessilla voidaankin tarkoittaa dynaamista palomuurin sääntöjen muokkausta tai muita hallinnollisia toimenpiteitä. (Mukailtu lähteestä [1].)

Tässä harjoitustyössä käytetään Port Knockingista jatkossa termiä porttien koputtelu.

Porttien koputtelu - edut ja mahdollisuudet

Perusperiaatteena palvelimen tai verkon ylläpidolle pidetään sitä, että ylläpito hallitsee liikennevirtoja verkkoon/palvelimelle. Tämä voidaan saavuttaa monin eri tavoin, yleisimmin tämä toteutetaan siten, että toiminnan kannalta ylimääräiset portit pidetään kiinni ja että palomuuri suodattaa avoinna olevien porttien läpi kulkevaa liikennettä estäen valtuuttomat yhteydet. Jälkimmäisen toteutus täysin tietoturvallisesti on käytännössä erittäin hankalaa jo pelkästään lukuisten ohjelmistojen ja niiden haavoittuvuuksien takia, ja useimmat hyökkäykset käyttävätkin nimenomaan tätä reittiä päästäkseen kohdejärjestelmään. Vaikka tunkeutumisenhavaitsemisjärjestelmillä ja aktiivisella järjestelmien päivityksillä päästäänkin jo kohtuulliselle tietoturvallisuuden tasolle, ne pystyvät kuitenkin estämään vain tunnetut, johdetut ja ennakoidut hyökkäykset. Avoinna oleva portti on aina kuitenkin teoriassa hyökkäyksen läpäistävissä. (Mukailtu lähteistä [1] ja [3].)

Edellä mainitun hyökkäysväylän täydellinen tukkiminen vaatisi porttien kiinnipitämisen, mutta tämä tukkisi myös luonnollisesti mahdollisuudet palvelujen tarjoamiseen. Tilanteissa, joissa tarjottavan palvelun luonne ei ole jatkuva-aikaista, toisin sanoen ei vaadi jatkuvasti auki olevia portteja (esimerkkinä tästä SSH ja IMAP), porttien koputtelu tarjoaa oivan keinon edellä mainittujen riskien pienentämiseen. Esimerkiksi tilanteessa, jossa palvelin tarjoaa SSH-yhteyden satunnaista käyttöä varten, ei ole järkevää pitää SSH-porttia auki jatkuvasti, koska porttia tarvitaan vain itse palvelun ´suorittamisen` ajan.

Toinen porttien koputtelulla saavutettava etu on käyttäjän luotettava autentikointi myös tuntemattomista IP-osoitteista. Krzywinskin mukaan eräs yleisimmin käytössä olevista palomuurien suodatussäännöistä on asiakkaan IP-osoitteeseen sekä tavoiteltavaan porttiin perustuva suodatus. Palomuuri tutkii ja tarvittaessa suodattaa paketin pois järjestelmästä ennen varsinaista autentikointivaihetta, toisin sanoen palomuuri ei yleensä ota mitään kantaa asiakkaan henkilöllisyyteen vaan autentikointi on usein järjestetty järjestelmän sisällä olevilla sovelluksilla. Yleisesti tämä käytäntö tarjoaakin Krzywinskin mukaan riittävän tasapainon turvallisuuden ja joustavuuden välille. Joissain tilanteissa edellä mainittu suodatuspolitiikka kuitenkin estää täysin järjestelmän käytön. Esimerkiksi yhteydenotot tietyistä ainakin näennäisen anonymiteetin tarjoavista IP-verkoista, kuten internetkahviloiden, hotellien, lentokenttien ja kirjastojen verkot, on monissa organisaatioissa syystäkin suodatettu jo palomuuritasolla pois. Toisaalta tämä estää täysin asiallisetkin yhteydet edellä mainituista verkoista, koska varsinaiseen autikointivaiheeseen ei koskaan päästä. Sen sijaan jos avoimien porttien ja pakettisuodatuksen sijaan käytettäisiinkin suljettuja portteja ja koputukseen perustuvaa autentikaatiota, edellä mainittua ongelmaa ei syntyisi. (Mukailtu lähteestä [3].)

Porttien koputtelu - toteutustavat ja haavoittuvuudet

Staattinen koputus

Staattisella koputuksella tarkoitetaan TCP:n SYN-paketeilla toteutettua ja jaettuun salasanaan perustuvaa toteutusperiaatetta. Staattisen koputuksen heikkouksina pidetään yleensä helppoa havaittavuutta ja toistettavuutta erityisesti man-in-the-middle -tyyppiselle hyökkääjälle. Man-in-the-middle eli välimies-hyökkäyksessä hyökkääjä pääsee palvelimen ja käyttäjän väliin siepaten molempien toisilleen lähettämät viestit. Periaatteessa kuka tahansa väliin päässyt voi kuunnella selkokielisen koputuksen ja toistaa sen päästen siten palvelimelle. [6]

Pelkästään salakirjoittamalla koputus ei päästä merkittävästi turvallisempaan tilanteeseen. Esimerkiksi yksisuuntaiseen hash-algoritmiin perustuva MD5 tuottaa selkotekstistä aina saman salatekstin, ja tällöin hyökkääjän ei edes tarvitse tietää selkokielistä tekstiä, valtuuttomaan käyttöön riittää pelkkä salatekstin selvittäminen ja toistaminen. Jotta yksisuuntaisella salakirjoituksella saavutettaisiin haluttu lopputulos, tulisi käytännössä pystyä käyttämään jonkinlaista haaste-vaste -menetelmään perustuvaa protokollaa, jossa aloittava osapuoli käynnistää neuvottelun esimerkiksi satunnaisella datalla. Tämä ei kuitenkaan ole mahdollista yksisuuntaiseen pakettivirtaan perustuvan porttien koputuksen tapauksessa, koska palvelin ei saa missään vaiheessa lähettää mitään tietoa asiakkaalle.

Hyökkääjä pystyykin riittävän pitkän tarkkailun ja pakettianalyysin jälkeen useimmiten selvittämään käytetyn koputuksen. Hyvänä esimerkkinä tästä on tilanne, jossa aina tietty TCP:n SYN-pakettivirta avaa muulloin kiinniolevan SSH-portin - tämä ei jätä tarkkailijalle paljoa arvailun varaan. Koputuksen havaitsemista voidaan vaikeuttaa piilottamalla koputus muun liikenteen joukkoon, toisin sanoen käyttäen piilotettua koputusta. (Mukailtu lähteestä [2].)

Piilotettu koputus (covert knock)

Piilotetulla koputuksella tarkoitetaan sitä, että koputus piilotetaan normaalin liikenteen joukkoon vaikeuttaen koputuksen havainnointia. Esimerkiksi tilanteessa, jossa HTTP-palvelimelle halutaan avata myös SSH-portti, koputus voidaan piilottaa joko ylimääräisten tai sopivasti muotoiltujen DNS-kyselyiden tai ICMP-pakettien joukkoon. (Mukailtu lähteestä [2].)

Dynaaminen koputus

Eräs tapa staattisten koputusten heikkouksien välttämiseen on käyttää dynaamista, joka kerta erilaista koputusta. Salainen koputus luodaan vain tarpeen mukaan ja viestitetään toista viestintäkanavaa pitkin palvelimelle. Toisen kanavan käyttö asettaa luonnollisesti omat haasteensa järjestelmän turvallisuudelle ja toteutukselle. Tällöin myös viestintäkanava, jota pitkin palvelimelle päätyy tieto uudesta salaisesta koputuksesta, voidaan toteuttaa useilla eri tavoilla. Yksi kohtuullisen turvallinen keino on kertoa uusi salainen koputus palvelimelle aina edellisen viestinnän yhteydessä, jolloin käyttäjä ilmoittaa millä koputuksella tahtoo toteuttaa salaisen koputuksen seuraavalla kerralla. (Mukailtu lähteestä [2].)

Kertakoputus (one-time-knock)

Kertakoputus perustuu RFC 2289:n [5] määrittelemään yhden salasanan kirjautumisjärjestelmään (A One-Time Password System), joka kehitettiin erityisesti staattisten salasanojen ongelmia silmällä pitäen. Se käyttää iteratiivista hash-funktiota, jonka avulla asiakkaan selvätekstistä (salasanasta) muodostetaan jokaisella kerralla erilainen uusi koputus. (Mukailtu lähteistä [2] ja [5].)






Porttien koputtelu - käyttö pahaan

Myös haittaohjelmien kirjoittajat ovat Bradleyn [1] mukaan alkaneet hyödyntää porttien koputtelua takaporttien avaamiseen jo murretuissa järjestelmissä. Sen sijaan, että hyökkääjä yrittäisi avata yhteyttä helpommin havaittavalla ja pahantahtoisen hyökkääjän toiminnaksi tunnistettavalla etäyhteydellä, järjestelmään istutetaankin verkkoliikennettä tarkkaileva troijalainen, joka avaa portin hyökkääjälle salaista koputusta vastaan. Eräs huomionarvoinen seikka Bradleyn [1] mukaan on troijalaisen avaaman portin seurauksena järjestelmän altistuminen myös muiden kuin troijalaisen asentaneen hyökkääjän toimille. Järjestelmästä tuleekin troijalaisen avaaman portin seurauksena Bradleyn [1] mukaan otollinen testikenttä jopa porttiskannausta harrastaville skripti-pennuille.

Porttien koputtelu - käyttötarkoitukset ja soveltuvuus erilaisiin ympäristöihin

Porttien koputtelu tarjoaa mielenkiintoisen mekanismin, jonka avulla voidaan pienentää avointen porttien kautta tapahtuvien hyökkäysten riskejä. Koska porttien koputtelusta saatava tietoturvaetu perustuu nimenomaan siihen, että portit avataan vain tarpeen mukaan, porttien koputtelu ei sovellu jatkuva-aikaisen palvelun, kuten www-palvelun, tai yleisemmin suurten käyttäjämäärien palvelujen tarjoamiseen. Koputusten tarkkailun vaatima prosessointiaika rajaa myös pienen laskentakapasiteetin järjestelmät soveltuvuusalueen ulkopuolelle.

Parhaiten porttien koputtelu soveltuu pienten, ei-jatkuva-aikaisten järjestelmien autentikaatiomekanismiksi. Esimerkiksi yrityksen palvelimelle voidaan tarjota SSH-yhteys, jonka käyttöön tarvittava portti avataan vain tarpeen mukaan. Näin pystytään välttämään suuri osa kyseessä olevan portin kautta tapahtuvien hyökkäyksistä yksinkertaisesti siksi, että portti on kiinni valtaosan ajasta.

Lähteet

  • 4. Port Knockning 2005. PortKnocking?.org [verkkosivusto]. [viitattu 2.11.2005]. Saatavissa: http://portknocking.org .
  • 5. RFC 2289. 1998. A One-Time Password System. Julkaisussa: The Internet Engineering Task Force [verkkotietokanta]. Julkaistu helmikuussa 1998 [viitattu 17.11.2005]. Saatavissa: http://www.ietf.org/rfc/rfc2289.txt .


-- JuusoPiskonen? - 03 Oct 2009
Print version |  PDF  | History: r2 < r1 | 
Topic revision: r2 - 16 Nov 2009 - 20:23:26 - JuusoPiskonen
 

TUTWiki

Copyright © by the contributing authors. All material on this collaboration platform is the property of the contributing authors.
Ideas, requests, problems regarding TUTWiki? Send feedback