TTY / Tietoturvallisuuden jatkokurssi / Harjoitustyö 2012

Riku Itäpuro

Linux VServer eristäjänä

Johdanto

VServer[1] on Linux-ympäristön eristysteknologia, joka perustuu koneen osittamiseen turvakonteksteihin. Voidaan myös puhua virtualisoinnista, sillä osituksen sisällä järjestelmä näyttäytyy kuin virtualisoitu järjestelmä. Se on kevyt, sillä käytössä on vain yksi ydin, joka suorittaa ytimelle kuuluvat tehtävät. Virtuaalikoneiden kesken jaetaan muisti, verkko ja tiedostojärjestelmä eristetysti toisistaan. Se on myös nopea, koska laitteistoa ei emuloida. Käytän jatkossa muotoa vserver tarkoittaessa VServer-tekniikalla luotuja virtuaaliympäristöjä.

VServerin kaltaisia tekniikoita ovat tavallinen chroot, BSD-jail, Solaris Containers sekä Linux Containers (LXC[4]) Samankaltaisesta nimestä huolimatta VServer ei ole Microsoft Virtual Server eikä Linux Virtual Server Project (LVS). VServer ei käytä paravirtualisointia tai täysvirtualisointia
  • Paravirtualisoinnissa ajetaan isäntäkoneen alla virtualisoituja käyttöjärjestelmiä, joiden ydin on muokattava keskustelemaan isäntäjärjestelmän kanssa. Tämä kohta estää esim. Windows käyttöjärjestelmien suoran ajamisen, sillä sen ydintä ei voi vapaasti muokata.
  • Täysvirtualisoinnissa virtualisoitua käyttöjärjestelmää ei tarvitse muokata. KJ:n virtualisointi on toteutettu joko ohjelmallisesti tai prosessorin rautatuella, jos kyseessä on esim. AMD-V tai Intelin VT-x.

Käyttökohteiksi vserverille sopii mainiosti esim. webpalvelun massavirtualisointi, jossa asiakkaille voidaan myydä yhdestä ja samasta palvelimesta turvallisia, mutta nopeita osioita, sillä virtualisoinnin nopeuden menetys on vain noin <1% eli huomattavasti pienempi kuin kokonaisvirtualisointiratkaisuissa, kuten para- tai hypervisorvirtualisoinneissa. Sillä saadaan myös pieniä, elegantteja, rajoitettuja ympäristöjä ja hiekkalaatikoita, mikä on hyödyllistä laboratoriotestauksissa.

Eristyksen kohteet ja mahdollistavat tekijät

  • Eristetty prosessiavaruus.
    • Ytimen VServer-laajennus lisää ominaisuuden konteksti prosesseille (prosessit näkevät vain saman kontekstin muut prosessit)
  • Pääkäyttäjyyden kaltaiset toiminnot konteksteissa.
    • Linux ytimen kykyjako (capabilities)[2] tarjoaa hienojakoisemman oikeusten jaottelun kuin perinteisesti käytössä olevan kaksijakoisen etuoikeutetut tai muut. Kykyjako tuo mahdollisuuden jakaa pääkäyttäjälle kuuluvia oikeuksia tiettyä operaatiota varten ilman, että tarvitsee antaa itse pääkäyttäjyyttä prosessille.
  • Jailbreakin esto
    • Chroot, josta ei pääse pois perustuu siihen, että käytetään erityistä Barrier-bittiä vservereiden juurihakemistolle. Lisäksi tiedostojärjestelmä liittää tiedostoille tunnistekentän (tag-optio), joka kertoo, mille kontekstille tiedosto kuuluu. Tiedostojärjestelmän alin kerros ottaa tämän huomioon perustuen kykyjakoon.
  • varusohjelmisto, jolla VServer-ympäristöä hallitaan. Ohjelmiston täytyy tietää ytimen VServer-laajennuksesta.
  • Käytönrajoitus ja tilastointi (muisti, cpu, levytila, jne).
    • rajoitukseen Linuxissa on jo valmiina rlimit ja dlimit. VServer tuo vielä näihin laajennuksia tiedostojärjestelmän osalta. Muutoksia voidaan tehdä ilman koneen uudelleenkäynnistystä _vspace_-ohjelmalla konteksteille.
    • /proc tiedostojärjestelmään syntyy alihakemistot /proc/virtual ja /proc/virtnet tilastointia varten.

Esimerkkiajoja ja ruutukaappauksia rajoitetusta ympäristöstä

vservereiden tila isäntäkoneesta nähtynä

vs1a ja vs1b alla ovat minimaalisia VServer-virtualisoituja Debian-jakelun käyttöjärjestelmiä eli vservereitä. Ne pyörivät siis yhteisen kernelin alla, mutta eristettynä toisistaan ja ovat muuten identtisiä, mutta ensimmäiseen on asennettu oletusasetuksilla www-palvelimeksi Apache2.2 ja jälkimmäiseen kevyempi Lighttpd. Verrataan isäntäkoneesta konteksteja vs1a ja vs1b.
root@manaatti:~# vserver-stat
CTX   PROC    VSZ    RSS  userTIME   sysTIME    UPTIME NAME
40000   61 479.4M  13.3M   0m42s21   1m31s78  48m35s25 vs1a
40001    8  37.4M   8.6M   0m25s27   0m37s96  48m40s26 vs1b 
VSZ ja RSS ovat käytössä oleva virtuaalimuisti ja kiinteässä RAM:ssa oleva osuus sivuina. Sivukoko on 4KiB x86-arkkitehtuurissa. Molemmat ovat olleet käynnissä yhtä kauan. Muistin käytön ero on huomattava osittain johtuen siitä, että Apache on käynnistänyt varulta jo monta serveri-instanssia. CPU:n käyttö näyttäisi olevan Apachessa kaksinkertainen lighttpd vserveriin verrattuna.

Kaikki prosessit isännän vs. vserverin näkökulmasta

Prosesseilla on ennestäänkin rajoitettu avaruus, nyt kuitenkin kukin konteksti näkee pelkästään itselleen kuuluvat prosessit. Hallinnoivalta isäntäkoneella voidaan kääritä ohjelma ajettavaksi erityiskontekstissa numero yksi, joka pystyy lukemaan muiden kontekstien tietoja.

Kaikki prosessit nähdään _vps_-komennolla, joka on ps komento kääritty ajettavaksi kontekstissa 1. Sarake CONTEXT eroaa normaalista ps komennosta. Kontekstissa 40000 on vs1a niminen vserver ja 40001:ssa vs1b. Konteksti 0 on isäntäkone ja 1 erityinen ALL_PROC konteksti, jolla on pääsy kaikkien kontekstien sisään

root@manaatti:~# vps axu
USER       PID CONTEXT             %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
 root         1     0 MAIN           0.0  0.0   2208   744 ?        Ss   19:18   0:01 init [2]  
 root         2     0 MAIN           0.0  0.0      0     0 ?        S    19:18   0:00 [kthreadd]
 root         3     0 MAIN           0.0  0.0      0     0 ?        S    19:18   0:00 [migration/0]
 root         4     0 MAIN           0.0  0.0      0     0 ?        S    19:18   0:00 [ksoftirqd/0]
 ...
 root      3975     1 ALL_PROC       0.0  0.0    152    36 ?        S+   21:06   0:00 vps axu
 root      3976     0 MAIN           0.0  0.0   5244   852 ?        S+   21:06   0:00 less
 root      3977     1 ALL_PROC       0.0  0.0   5964  1144 ?        R+   21:06   0:00 ps axu
 ...
 root     19110 40001 vs1b           0.0  0.0  19504  1460 ?        Sl   20:10   0:00 /usr/sbin/rsyslogd -c5
 root     19133 40001 vs1b           0.0  0.0   2176   784 ?        Ss   20:10   0:00 /usr/sbin/cron
 root     19279 40000 vs1a           0.0  0.0  19508  1464 ?        Sl   20:10   0:00 /usr/sbin/rsyslogd -c5
 root     19300 40000 vs1a           0.0  0.0   2176   788 ?        Ss   20:10   0:00 /usr/sbin/cron
 root     22031 40000 vs1a           0.0  0.0   5924  2948 ?        Ss   20:34   0:00 /usr/sbin/apache2 -k start
 www      22038 40000 vs1a           0.0  0.0   5712  2052 ?        S    20:34   0:00 /usr/sbin/apache2 -k start
 www      22041 40000 vs1a           0.0  0.1 227476  3256 ?        Sl   20:34   0:00 /usr/sbin/apache2 -k start
 www      22042 40000 vs1a           0.0  0.0 227232  2548 ?        Sl   20:34   0:00 /usr/sbin/apache2 -k start
 root     22739 40001 vs1b           0.0  0.0   3032  1692 ?        Ss+  20:51   0:00 /bin/bash -login
 www      23723 40001 vs1b           0.0  0.0   6804  1596 ?        S    20:52   0:00 /usr/sbin/lighttpd -f /etc/lighttpd/lighttpd.conf
 ... 

Kontekstissa vs1b ajettu ps-komento, joka tulostaa kaikki ajossa olevat prosessit. Huomaa, että ytimen prosesseja (vuorontaja, keskeytykset, laiteajurit ym) ei näy, koska ne kuuluvat isäntäkoneelle.
root@vs1b:/# ps -ef
 UID        PID  PPID  C STIME TTY          TIME CMD
 root         1     0  0 17:18 ?        00:00:01 init [2]
 root      3853 22739  0 18:10 pts/4    00:00:00 ps -ef
 root     19110     1  0 17:18 ?        00:00:00 /usr/sbin/rsyslogd -c5
 root     19133     1  0 17:18 ?        00:00:00 /usr/sbin/cron
 root     22705 18795  0 17:59 ?        00:00:00 login                                                
 root     22739 22705  0 17:59 pts/4    00:00:00 /bin/bash -login
 www      23723     1  0 18:00 ?        00:00:00 /usr/sbin/lighttpd -f /etc/lighttpd/lighttpd.conf

Jail break

Jail break tarkoittaa sitä, että vserveristä (jail=vankila) olisi pääsy isäntäkoneelle kulkemalla tiedostojärjestelmässä juureen asti ja jopa siitä yli. Samoin viittaus isäntäkoneen prosesseihin tässä tarkoittaa murtoa. Isäntäkoneen tiedostoja ei pidä nähdä vserveristä, mutta toiseen suuntaan toimi pätee. _chroot_-sovellus muuttaa ajettavan ohjelman näkemäksi tiedostojärjestelmän juureksi uuden hakemiston (CHange Root.)

Joitain tapoja päästä karkuun tästä uudesta juuresta hyödyntävät sitä, että
  • avoimet tiedostokahvat jäävät auki ja niihin palataan chrootin sisältä
  • ${CWD} (käytössä oleva hakemisto) ei muutu chroot kutsussa, sillä kutsu muokkaa ainoastaan hakemistonselvitysprosessia, ei muuta. Tekemällä peräkkäisiä chroot-kutsuja on mahdollista, joskaan ei varmaa, päästä ulos.

Yleiset haavoittuvuudet, joihin perustuu normaalista chrootista poismurtautuminen edellyttävät, että käyttäjällä on hallussaan root-käyttäjyys. VServerin tapauksessa root-käyttäjän kyvyt on rajoitettu, mutta varsinainen ratkaisu ongelmaan on Secure Barrier bitti tiedostossa (hakemistossa). VServer-laajennukset tiedostoille sisältävät tämän lisäksi muitakin ominaisuuksia kuten _immutable_-bitin, joka tarkoittaa, että tiedostoa ei voi muuttaa, mutta sen voi poistaa.

Esimerkeissä käytetty chroot-hakemisto on /var/lib/vservers. Sen alla olevissa hakemistoissa on Barrier-bitti estämässä vserveristä paluuta. Siinä on samoin immutable (=i) estämässä hakemiston muokkaamista.
root@manaatti:/var/lib/vservers# showattr /var/lib/vservers
 ----BuiX /var/lib/vservers
 ----buiX /var/lib/vservers/lost+found
 ----buiX /var/lib/vservers/vs1a
 ----buiX /var/lib/vservers/vs1b

Sandboxing

Sandbox-ajo (hiekkalaatikko) on ohjelman ajamista hallitusti rajoitetussa ympäristössä. VServerin avulla voidaan saada sovellukselle käyttöympäristö vieläkin pienemmäksi kuin minimaalinen, ydinvapaa käyttöjärjestelmä. Jos halutaan hiekkalaatikoida sovelluksia, täytyy sovelluksen käyttäytyminen tuntea.

  • tarvitseeko se pääsyn laitetiedostoihin?
  • tarvitseeko se NET_RAW kykyä (tcpdump)?
  • entä UDP tai /dev/random?
  • mitä muuta sen käyttäytymisestä tiedetään ja jos ei tiedetä, selvitetään virhelogista ja debugataan, kun ohjelma ei toimi

Tämä selvitys olisi tehtävä myös, jos tehdään normaali KJ:n mukainen chroot, jossa tarkistetaan mitä tiedostoja ohjelma tarvitsee ja missä vaiheessa sen tulisi luopua etuoikeuksistaan.

Ongelmakohdat

Joissain tapauksissa vserver ei toimi samoin kuin fyysinen kone. Loopback-osoite 127.0.0.1 on vain isäntäkoneen käytössä. Jos tarvitaan loopbackia vserverin puolella, on käytettävä joko koneen omaa verkko-osoitetta tai johdannaista 127.a.b.c, jossa a.b.c ovat uniikkeja kyseiselle virtuaalikoneelle. Samoin käy, jos ohjelma ryhtyy kuuntelemaan porttia osoitteessa *, sillä se sen jälkeen muut koneet eivät voi käyttää omissa verkkoliitännöissään tätä porttia. Esimerkiksi ssh-palvelin on aina sidottava käyttämään oman IP-osoitteensa porttia.

Jos sovelluksella on käännöksen yhteydessä määritelty capabilities ominaisuuksia, ei se toimi suoraan vserverissä. Esim. ftp-palvelinohjelma PureFTPd on käännetty normaalisti hyväksikäyttämään capabilitiesia, joten se on käännettävä uudestaan optiolla --without-capabilities. Tässä tapauksessa ohjelmisto olisi huolehtinut itse kykyjen pudotuksesta ilman VServeriä.

Jos ohjelma tarvitsee tiettyä etuoikeutusta, täytyy tämä määrätä isäntäkoneen puolelta sallituksi. Esi.m ICMP paketin lähetykseen vaaditaan CAP_NET_RAW kyky ja wireshark, nmap ja ids voivat tarvita sitä myös.

Teknologian tulevaisuus

VServerin tulevaisuus on hämärä. Toisaalta tuote on kypsynyt tasaisesti, mutta rinnalle on tullut muita tuotteita ja laajemmin kehittäjiä, jotka ovat toteuttaneet omia uusia ratkaisujaan.

Tällä hetkellä (2012 syksy) Debian GNU/Linux jakelussa 6.0 on viimeistä kertaa tuettuna vaihtoehtoytimenä mukana linux-kernel-vserver [3]. Tämä tarkoittaa 2.6-sarjan ytimiä. 3.2-sarjan ytimistä tämä puuttuu. Syynä on se, että erillisien ytimien ylläpitoon ei riitä voimia eikä VServer-yhteisö ole aina toiminut Debian-yhteisön ohjeiden mukaisesti. Toisaalta samankaltaista toiminnallisuutta tarjoaa Linux Container (LXC[4]). VServer-tuettu ydin toki voidaan kääntää itse tai noutaa valmiina muualta.

Debianin suositus korvaavaksi on siirtyä joko KVM- tai XEN-virtualisointiin tai Linux Containereihin (LXC)[debian-alt]. Näistä ainoastaan Linux Container on lähellä Linux VServeriä, mutta harmillisesti kuitenkin vielä melko tuore vuonna 2012 verrattuna VServerin 10 vuoden ikään eikä sisällä kaikkea sitä, mitä VServerissä on. Varsinkin user-space työkalut ovat kehittymättömiä. Muut vaihtoehdot ovat täysvirtualisointiratkaisuja. Migrointipolkuja on tehty vservereistä LXC:ään [5] ja KVM:ään [6].

Päätelmät / yhteenveto

VServer on kevyt ja kypsä eristysjärjestelmä, joka vaatii kuitenkin jonkin verran erityisosaamista käyttökuntoon laittamisessa. Huolestuttavaa on se, että VServer näyttäisi hitaasti hiipuvan oman aikansa BETA-tallennusjärjestelmäksi. Toisaalta sille on kuitenkin ehtinyt kerääntyä paljon käyttäjiä, vaikka se tulee saamaan kilpailijan varsinkin LXC:stä. Todennäköisesti VServer tullee häviämään 5 vuoden sisällä. Yksi syy sen harvinaistumiseen voi olla täysvirtualisointiratkaisun yleistyminen, joka ovat hyvin erilainen tekniikaltaan.

Lähteet

SivuTiedotLaajennettu edit

Vaativuus Jatko
Valmius Valmis
Tyyppi Arviointi
Luokitus Atk
Mitä Muu
Miltä Useita
Missä Järjestelmä
Kuka Tite-ammattilainen
Milloin Rakennettaessa
Miksi Hyvä tapa
Print version |  PDF  | History: r19 < r18 < r17 < r16 | 
Topic revision: r19 - 09 Dec 2012 - 16:48:12 - RikuItaepuro
 

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