Takaisin pääsivulle

Linuxin tietoturvan perusteet

Huolimatta Linuxin maineesta turvallisena järjestelmänä ei edes kotikäyttäjän kannata tuudittautua valheelliseen turvallisuudentunteeseen. Täysin avoin ja päivittämätön Linux-järjestelmä, jossa on useita (Internetiin näkyviä) palveluita käynnissä, säilyy tuskin kovin montaa kuukautta murtamatta.

Tietoturvauhat voidaan jatkaa useisiin osa-alueisiin. Kotikäyttäjän kannalta on mielekästä jakaa uhat paikallisiin (local) ja ulkoisiin (remote). Useimpien kotikäyttäjien ei tarvitse juurikaan huolehtia paikallisista uhista. Paikalliset tietoturvauhat korostuvat suurissa tietojärjestelmissä, joissa järjestelmän käyttäjiin ei voida täysin luottaa. Allaolevassa tekstissä keskitytäänkin nimenomaan ulkoisten uhkien torjuntaan.

Kotikäyttäjän perustietoturvan kannalta oleellisimpia ovat palomuuri (iptables) ja tcpwrappers sekä turhien palveluiden poistaminen käytöstä. Lisäksi järjestelmän ohjelmat ja ydin kannattaa ehdottomasti pitää ajan tasalla. Jos on aikeissa pystyttää julkista internetiin yhdistettyä palvelinta, tulee tietoturva-asioihin kiinnittää erityistä huomiota. Lisäohjeita löytyy esimerkiksi Debianille räätälöidystä Securing Debian -oppaasta. Siitä on nimestään huolimatta runsaasti hyötyä myös muiden kuin Debian-pohjaisten jakeluiden käyttäjille. Muita vastaavia tietoturvaoppaita on olemassa lukuisia.

Käyttäjäoikeudet

Linux- ja Unix järjestelmissä järjestelmän varsinainen pääkäyttäjä eli root voi tehdä järjestelmälle aivan mitä haluaa. Pääkäyttäjän lisäksi Linux-järjestelmässä on useita järjestelmäkäyttäjiä, joiden avulla esimerkiksi palvelinsovellusten oikeuksia voidaan rajoittaa. Näiden lisäksi ovat tietenkin ns. tavalliset käyttäjät, joilla Linuxia käytetään päivittäin.

Tietoturvan kannalta käyttäjäoikeuksista on tärkeintä muistaa se, ettei Linuxia pidä ikinä käyttää pääkäyttäjänä, ellei sille ole erityistä tarvetta. Sovellukset toimivat nimittäin lähes poikkeuksetta ne käynnistäneen käyttäjän oikeuksin. Siis jos esimerkiksi www-selain käynnistetään pääkäyttäjänä, voi siinä oleva tietoturva-aukko pahimmillaan tuhota koko järjestelmän. Jos sensijaan www-selainta käytetään tavallisena käyttäjänä, rajoittuu tuho käyttäjän kotihakemistoon.

Tavallisille käyttäjille voidaan tarvittaessa myöntää lisäoikeuksia. Linux-jakelusta riippuen esimerkiksi digikameran, äänikortin tai skannerin käyttö vaatii käyttäjän kuulumisen johonkin ryhmään, kuten camera, scanner tai audio. Käyttäjiä tulisi liittää ryhmiin vain tarpeen mukaan, sillä ylimääräisistä oikeuksista ei ole heille mitään hyötyä, mutta liialliset oikeudet voivat vaarantaa järjestelmän turvallisuuden. Hyvänä esimerkkinä tästä on ryhmä disk, johon kuuluvat voivat tehdä massamuistilaitteille (mm. kovalevyille) käytännössä mitä vain. Tavallisia käyttäjiä ei tulisikaan ikinä liittää disk-ryhmään.

Linuxin ytimen päivittäminen

Linuxin ydin (engl. kernel) on erittäin laaja kokonaisuus. Onneksi ytimen haavoittuvuudet koskettavat tavallisesti vain pientä osaa koko ytimestä ja sen moduuleista. Tästä syystä on hyvinkin mahdollista, ettei haavoittuvuus kosketa itse käyttämääsi osaa ytimestä. Ytimessä olevat haavoittuvuudet voivat kuitenkin olla erityisen vaarallisia, joten ytimen pitäminen ajan tasalla on erittäin tärkeää.

Helpoiten ytimen päivitys onnistuu jakelun omaa pakettienhallintaa käyttäen. Ytimen päivittämisen jälkeen tietokone on käynnistettävä uudelleen, jotta uusi ydin otetaan käyttöön.

Mikäli käännät itse omat ytimesi, kannattaa käyttää jakelun pakettienhallinnasta ladattavia ytimen lähdekoodeja. Ainakin Debian Stable tarjoaa ytimen lähdekoodiin samat tietoturvapäivitykset kuin valmiisiin ytimiinkin. Kun ytimen versio ei muutu, ei uuden ytimen kääntäminenkään vaadi juurikaan käsityötä. Pienellä skriptillä uuden ytimen kääntäminen ja asentaminenkin on myös mahdollista automatisoida.

Sovellusten päivittäminen

Kotikäyttäjän kannalta ehkä suurimman tietoturvariskin muodostavat erilaiset Internetin palveluiden käyttöön tarkoitetut sovellukset. Esimerkiksi kaikista www-selaimista löytyy ajoittain vakaviakin haavoittuvuuksia, joita ei tule painaa villaisella pelkästään siksi, että käytössä on "turvallinen" käyttöjärjestelmä.

Toisen sovellusten riskiryhmän muodostavat Internetiin näkyvät palvelut, kuten esimerkiksi www-palvelin apache. Palvelinsovelluksia ei tulisikaan ajaa kotikoneella kuin sisäverkon tarpeita varten, ellei ole täysin varma siitä mitä on tekemässä.

Ohjelmista löytyvät haavoittuvuudet ovat erityisen vaarallisia siksi, että ne tyypillisesti ohittavat täysin palomuurit ja muut ulkoiset suojavarustukset. Koska haavoittuvuus on käyttäjän omalla koneella olevassa ohjelmassa, hyökkäyskin tapahtuu sisältäpäin. Kaikista vakavimmat haavoittuvuudet mahdollistavat hyökkääjän määrittämän koodin ajamisen kohdetietokoneessa pääkäyttäjän oikeuksin. Useimmat haavoittuvuudet eivät onneksi ole erityisen vakavia ja/tai ne koskettavat vain osaa sovelluksen käyttäjistä.

Kaikki Internetin palveluja käyttävät (ja tarjoavat) ohjelmistot on siis syytä pitää aina ajan tasalla. Mitä enemmän jotain tiettyä sovellusta käytetään, sitä tärkeämpää on huolehtia siitä, että käytössä on turvallinen versio.

Ohjelman "turvallinen versio" voi tarkoittaa uudempaa versiota ohjelmasta, jonka kaikki tunnetut tietoturva-aukot on korjattu. Esimerkiksi Fedora Core -jakelun tietoturvapäivitykset noudattavat tätä periaatetta. Toinen vaihtoehto on käyttää vanhan ohjelman korjattua versiota: ohjelman uudempiin versioihin tehdyt korjaukset muokataan vanhempaan versioon sopiviksi. Tätä lähestymistapaa käytetään esimerkiksi Debian Stable -jakelussa.

Jos mahdollista, kannattaa käyttää Linux-jakelun omia versioita ohjelmista, koska ohjelmien päivitettyjen versioiden jatkuva latailu ja asentelu käsipelillä on vaivalloista ja saattaa siksi jäädä tekemättä.

Verkkoliikenteen suojaaminen

Verkkoliikenne kulkee Internetissä pääosin salaamattomana. Käytännössä tämä tarkoittaa sitä, että Internetin liikennettä voidaan melko helposti nuuskia. Erityisen vaarallisia ovat salaamattomat yhteydet sellaisille palvelimille, joita ei ole tarkoitettu julkisiksi. Salaamatonta yhteyttä käytettäessä esimerkiksi käyttäjätunnukset ja salasanat ovat ulkopuolisten kaapattavissa varsin helpostikin.

Jos haluat esimerkiksi päästä tietokoneesi tiedostoihin käsiksi sen ulkopuolelta, ei niitä pitäisi missään tapauksessa jakaa niitä salaamattoman yhteyden välityksellä. Tavallisia verkkojakoja (Samba/CIFS, NFS) ei ole tarkoitettu käytettäväksi sellaisenaan Internetistä. Myöskään esim. FTP-palvelimen pystyttäminen ei ole järkevää, sillä siihen kohdistuvaa väärinkäyttöä on hyvin vaikea estää.

Oman koneen resursseihin on mahdollista päästä turvallisesti käsiksi muutamalla tavalla. Kotikäyttäjälle yksinkertaisinta lienee käyttää OpenSSH:ta, joka löytyy käytännössä kaikista Linux-jakeluista. SSH-yhteyden välityksellä tiedostojen siirtely on turvallista, sillä koko yhteys alusta loppuun on voimakkaasti salattu. SSH:lla voidaan paitsi kopioida tiedostoja, myös etäkäyttää konetta. Myös graafisten sovellusten käyttö etäyhteyden välityksellä onnistuu vipua "-X" käytettäessä.

Jos haluaa päästä käsiksi muihin lähiverkossa oleviin palvelimiin, kannattaa tutustua erilaisiin VPN-ratkaisuihin. VPN- eli Virtual Private Network tarkoittaa tekniikkaa, jolla useita lähiverkkoja voidaan liittää toisiinsa esimerkiksi Internetin välityksellä. SSL-salattu yhteys sisäverkkoon onnistuu esimerkiksi SSL-Exploreria ja OpenVPN:ä käyttämällä. OpenSSH:lla on mahdollista paitsi siirtää tiedostoja, myös luoda salattuja tunneleita sisäverkon palvelimille. Kaikista kattavin suojaus saadaan IPSec-salauksella, jolla voidaan suojata jotakuinkin mikä tahansa verkkoyhteys. IPSecin käyttöönotto on kuitenkin sen verran monimutkaista, ettei sitä voi suositella kuin asiasta oikeasti kiinnostuneille.

Iptables (palomuuri)

Linuxissa palomuuriominaisuudet on integroitu järjestelmän ytimeen eli kerneliin. Niiden käyttämiseen tarvitaan kuitenkin myös erillinen ohjelma, iptables. Iptablesia ohjataan säännöillä, jotka määrittelevät, mitä kullekin verkosta saapuneelle IP-paketille tehdään. Tekniseltä kannalta iptables on siis pakettisuodatin (packet filter), jolla voidaan tehdä paljon muutakin kuin estää yhteydenotot internetistä kotikoneelle. Kuitenkin tavallinen kotikäyttäjä tarvitsee iptablesia yleensä nimenomaan palomuuria pystyttäessään tai internet-yhteyttä jakaessaan.

Iptablesin käyttö komentoriviltä on suositeltavaa vain jos tietää mitä on tekemässä. Jos kuitenkin tuntuu siltä, ettei halua tai osaa konfiguroida palomuuria komentoriviltä, voi asentaa jonkin iptables-ohjelman konfigurointiin tarkoitetun ohjelmiston ja tehdä palomuuriasetukset sillä. Esimerkiksi firestarter ja guarddog ovat helppokäyttöisiä graafisia ohjelmia iptablesin palomuurisääntöjen konfigurointiin. Mikäli käytät Linuxin lisäksi esimerkiksi *BSD-koneita, kannattaa kokeilla ohjelmaa fwbuilder, jolla voi samasta fwbuilder-tiedostosta rakentaa toimivat palomuurisäännöt paitsi iptablesille, myös *BSD-käyttöjärjestelmien pakettisuotimille. Fwbuilder soveltuu myös varsin monimutkaisten palomuurisääntöjen rakentamiseen.

Palomuurin rakentamisessa nyrkkisääntönä tulisi olla seuraava: pidä palomuurin säännöt tiukkoina ja salli yhteyksiä vain jos oikeasti tarvitset niitä. Tyypillinen palomuuri sallii yhteydet tietokoneesta internetiin, mutta estää uudet yhteydet internetistä tietokoneelle. Älä siis esimerkiksi pidä http-porttia (TCP/80) avoimena, mikäli sinulla on käytössä www-palvelin pelkästään lähiverkon tarpeita varten. Jos tarvitset suoran yhteyden esimerkiksi ssh-palvelimeesi, älä salli yhteyksiä kuin niistä ip-osoitteista joita tulet itse käyttämään. Näin käynnissä olevia palveluita ei voi kolkutella mistä tahansa Internetistä.

Tcpwrappers

Tcpwrapperin avulla voit määritellä mihin palveluihin voidaan ottaa yhteyttä ja mistä. Toisin kuin palomuuri, tcpwrapper ei estä yhteydenottoja, vaan käsittelee ne ja lähettää pyyntöön vastauksen sääntöjen perusteella. Pyynnön lähettäjä ei näe onko pyynnön hylännyt tcpwrapper vai palvelin, jolle pyyntö kohdistettiin. Kannattaa huomata, että kaikki palvelinohjelmat eivät tue tcpwrappersia. Tcpwrappersin toiminta on siis ohjelmistokohtaista.

Tcpwrapperin toiminnan määräävät kaksi tiedostoa. /etc/hosts.allow sekä /etc/hosts.deny. Mikäli mahdollista, kannattaa kieltää ensin, sallia vasta sitten. Sääntöjen kirjoittaminen tcpwrapperille on helppoa, kuten alla olevista esimerkeistä voi nähdä:

#/etc/hosts.deny

# kiellä kaikki yhteydet kaikkialta
ALL: ALL

---

#/etc/hosts.allow

# sallitaan yhteydet ssh-palvelimeen (sshd) (lähi)verkon 192.168.0.* kaikilta koneilta
sshd: 192.168.0.
# sallitaan yhteys ssh-palvelimeen (sshd) koneelta 192.168.1.5
sshd: 192.168.1.5

Turhien palvelujen rajoittaminen ja poistaminen käytöstä

Oletuksena monissa Linux-jakeluissa on käynnissä palveluita, joita useimmat eivät koskaan tarvitse. Nämä palvelinohjelmat ovat yleensä joko itsenäisiä, taustalla pyöriviä ohjelmia (daemon) tai ylipalvelimen (super-server), esimerkiksi xinetd-palvelimen hallinnoimina. Xinetd kuuntelee kaikkien hallinnoimiensa palvelinten portteja ja käynnistää tarvittaman palvelimen vasta kun yhteydenottopyyntö tehdään. Näin se säästää tietokoneen voimavaroja hyödyllisempiin tehtäviin. Palvelut voi tarkistaa esimerkiksi komennolla netstat:
samuli@localhost:~$ netstat -a|less

Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address           Foreign Address         State 
tcp        0      0 *:998                   *:*                     LISTEN     
tcp        0      0 *:sunrpc                *:*                     LISTEN     
tcp        0      0 *:x11                   *:*                     LISTEN     
tcp        0      0 *:auth                  *:*                     LISTEN     
tcp        0      0 localhost:981           *:*                     LISTEN     
tcp        0      0 localhost:smtp          *:*                     LISTEN     

...jne

Ylläolevasta listauksesta on jo suurin osa turhista palveluista. Gnomen tarvitsema portmapper-palvelu (*:sunrpc) vastaa kuitenkin kaikkiin pyyntöihin, mikä ei ole tavallisesti välttämätöntä. Debianissa (3.1) portmapper voidaan määrätä kuuntelemaan vain paikallisia yhteyksiä muokkaamalla tiedostoa /etc/default/portmap.

Mikäli turhia palveluja löytyy, on mielestäni loogisinta yrittää edetä seuraavassa järjestyksessä:

  1. Poista ko. palvelin kokonaan järjestelmästä
    Aina mikäli mahdollista, on järkevintä poistaa turha palvelin järjestelmästä. Mikäli syystä tai toisesta esimerkiksi palomuuriasetukset ovat pielessä, ei huonosti konfiguroitu palvelin vaaranna koko järjestelmää. Xinetd:n hallinnoimat palvelimet voidaan poistaa käytöstä myös sen asetustiedostoista.
  2. Konfiguroi palvelin hylkäämään ulkopuolelta tulevat yhteydenotot
    Jos palvelinta ei saada poistettua, koska esim. jokin ohjelmisto tarvitsee sitä, kannattaa yrittää säätää palvelimen asetuksia siten, että se hylkää ulkopuolelta (Internetistä) tulevat yhteydenottopyynnöt. Näin ulkopuolisien on vaikeampi hyväksikäyttää ko. palvelua, vaikka jotkin asennetut ohjelmistot olisivatkin siitä riippuvaisia.
  3. Estä yhteydenotot palvelimeen iptablesia ja tcpwrapperia käyttäen
    Mikäli palvelinta itseään ei saa hylkäämään ulkopuolisia yhteydenottoja, täytyy ne estää iptablesilla ja/tai tcpwrapperilla. Vaikka palvelimessa itsessään olisikin mahdollisuus rajoittaa ulkopuolisia yhteyksiä, on silti järkevää estää yhteydet myös iptablesilla ja tcpwrapperilla.

Palveluiden siirtäminen epästandardeihin portteihin

Palveluilla (services) tarkoitetaan ohjelmia, jotka tarjoavat asiakkaille erilaisia palveluita verkon välityksellä. Palvelut kuuntelevat asiakkaiden yhteydenottopyyntöjä tavallisesti ennalta-arvattavan portin takana. Kuten aiemmin jo mainittiin, www-palvelimet kuuntelevat salaamattomia (http) yhteydenottopyyntöjä portissa 80 (TCP). Erityisesti automatisoidut hyökkäykset kohdistetaan yleensä eri palveluiden oletuksena käyttämiä portteihin. Mikäli palvelu ei kuuntelekaan tavanomaisen portin takana, automaattiset hyökkäykset eivät ole yhtä suuri uhka.

Vaikka kaikki edellämainittu kuulostaakin hyvältä, on syytä ottaa huomioon muutamia seikkoja. Ensinnäkin palvelujen sitominen epätavallisiin portteihin ei varsinaisesti paranna palvelun turvallisuutta. Se saattaa kyllä vähentää palveluun kohdistuneita hyökkäyksiä, ja siten välillisesti myös tietoturvaa. Huonosti konfiguroitu palvelin on kuitenkin aina huonosti konfiguroitu palvelin, olipa se missä portissa tahansa.

Vaikka portteja on käytössä 65536, on kuitenkin melko helppo löytää ne portit, joiden takana kuuntelee jokin palvelu. Kun oikea portti on löytynyt, voi palvelinohjelman murtaminen alkaa.

Palvelun siirtäminen kuuntelemaan epästandardia porttia voi olla kuitenkin hyvä ajatus, mikäli käytettävä portti saadaan kerrottua kaikille palvelua käyttäville.