FreeBSD virtualizáció az ezjail használatával

Az eddigi FreeBSD-s írások után következzen ugyanebben a témában egy kicsit izgalmasabb  írás, szóljon pedig ez a virtualizációról. Napjainkban már több operációs rendszer támogatja a virtualizációt natívan, különböző formában, különböző megoldásokkal, a terminológia is különböző lehet. Gondolhatunk itt arra, amit Solaris alatt zónának neveznek, AIX platformon LPAR, Linux-oknál chroot. Nagyon kíváncsi voltam arra, hogy BSD (ebben az esetben FreeBSD) fronton mik a lehetőségek, ha ilyen igényeim vannak. Nos, örömömre szolgált, hogy itt sem találkoztam elmaradással. A FreeBSD-nek megvan a megoldása a virtualizációra, amit itt jail-nek nevezünk, és a legegyszerűbb módon az ez-jail nevű porttal menedzselhetjük.

FreeBSD virtualizáció (jail) az ezjail használatával

Mi az a jail?

A BSD-szerű operációs rendszerekben már a 4.2BSD óta megtalálható volt a chroot. Ez lehetővé tette adott programok számára a gyökérkönyvtár megváltoztatását (saját könyvtárstruktúrájuk volt). Az adott program nem fért hozzá a chroot-olt könyvtáron kívüli részhez, ez biztonságossá tette ezt. Az idők folyamán azonban biztonsági réseket fedeztek fel, egyre több kiskaput találtak ezek kijátszására, és nem utolsósorban a hangolásra sem nagyon volt lehetőség. Ennek kiküszöbölésére született a jail alrendszer, mely az előbb felsoroltakon kívül már kibővítette a lehetőségeket, pl. a hálózati alrendszer és felhasználók jailben történő kezelésére, ezenkívül a finomhangolhatósága is jóval kiterjedtebb lett. Ez azonban azt is magával vonta, hogy a jailek telepítése, beállítása, konfigurációja meglehetősen nehézkessé vált. Ezt sikerült megkönnyíteni az ez-jail nevű porttal (igazából ez egy script-szerű tool), mely ezt nagyon egyszerűvé teszi.

Nézzük meg a FreeBSD ez-jail-lel installált jailjeinek előnyeit:

– tárhely-megtakarítás azáltal, hogy egyetlen alaprendszer bináris szettet használ az összes jail
– updatelhető az összes jail egy base-directoryn belül
– mivel a base system (binárisok) read-only módban vannak csatolva, ez a betörő dolgát nehezíti (ellehetetleníti), pl. rootkitek esetén
– az ezjail sh scriptként van írva, így nem szükséges bármilyen extra shell telepítése a host-rendszeren
– attach-detach, backup-restore megoldott

és hátrányait:

– közös binárisok (külön nem upgradelhető jailek)
– jelenleg körülményes, ill. helyenként nem megoldott a jailek erőforrás menedzsmentje
– az előbbi miatt amennyiben több  jailt akarunk futtatni, a CPU kiosztás csak affinity alapján lehetséges
– egy base-jailre mindenképp szükség van, ez plusz helyet foglal (azonban ez a továbbiakban templateként használható, tehát van pozitívuma is)

Az első lépések:

Tesztrendszerünk egy FreeBSD, annak is 9.0-ás verziója, friss portfával, egy darab em0-ra hallgató hálózati csatolóval. A jailek base-directoryja nagyon szimplán a /jails lesz, ez azonban akár lehet külön filerendszeren is természetesen. Első lépésként telepítenünk kell az ez-jail-t.

# cd /usr/ports/sysutils/ezjail
# make install

Alapesetben maga telepítés kész is. Tegyük be az /etc/rc.conf-ba is, hogy elinduljon rendszerinduláskor ( ezjail_enable=”YES” ). Szükségünk van még az ezjail konfigurációs fájljának editálására, ez igazából csak egyszer, most az elején szükségeltetik.

Én csak a jail-ek basedir-jét változtattam, semmi egyebet. Ha ez megtörtént, akkor készen állunk arra, hogy installáljuk a base-jailt. Erre, normál esetben, egyetlen egyszer van szükség a jail használatánál, többet nem.

# ezjail-admin install

Érdekes dolgokat figyelhetünk most meg:

Látjuk, hogy az install a FreeBSD ftp helyéről letölti a jelenlegi verziónknak megfelelő alaprendszer csomagját, és ezt telepíti (mintegy másodszor), csak épp most a jail basedir alá a basejail könyvtárba. A basejail installja valami hasonló módon ér véget:

A basejailünk készen van. Ezzel azonban még nem nyertük meg a lottó 5-öst, hiszen nincs egy darab virtuális rendszerünk sem, éppen csak felkészítettük rendszerünket arra, hogy létrehozhassuk a valóban működő jaileket. Érdekes lesz megfigyelni, hogy mennyire hasonlít ennek az egésznek a folyamata és az eredménye a Solaris operációs rendszer zóna-szemléletére (annyira azért nem kifinomult, de ki tudja, talán a jövőben). No, hát kreáljuk meg az első jailünket.

Ehhez létre kell hozni a host system-en az IP címet vagy címeket aliasként, amin majd az újonnan létrehozott jailünk figyelni fog. Fontos megjegyezni, hogy ez azt is jelenti, hogy az olyan szolgáltatásokat, amik minden IP-n figyelnek (syslogd például), a host systemen át kell konfigurálni, hogy csak a host IP-n figyeljenek (értelemszerűen a jailen ezt NEM kell megtenni, hiszen ott csak egy IP-n – amit osztottunk- fog figyelni).

# ipconfig em0 192.168.55.17 alias
# ezjail-admin create -r testjail testjail 192.168.55.17

Majd a vége valami hasonló lesz:

Látjuk is a figyelmeztetést, éppen az említett syslogd-ről, mely minden IP-n figyel, ezt leszámítva sikeres volt a jail létrehozása. Nézzük meg, a meglevő és újonnan installált jaileket, erre is van több mód:

Megnézhetjük az ezjail paranccsal:

# ezjail-admin list

Illetve a jls paranccsal:

Látjuk, a kettő kimenete, más elrendezésben, de megegyezik. Az  STA oszlop alatti DR státusz mutatja, hogy D(irectory tree based jailünk) van és R(unning), tehát fut.

Próbáljuk most ide beloginolni:

# ezjail-admin console testjail

Sikeres volt tehát az installunk. A jail fut és igény szerint integrálhatóak bele az igényeknek megfelelő alkalmazások (web, mail, stb. szerverek).

A jail vagy jailek leállítása és indítása a következőképpen történik:

# ezjail-admin stop testjail
# ezjail-admin start testjail

Finomhangolás:

A jailek beállításainak finomhangolását túlnyomórészt sysctl változókkal végezhetjük el. A sysctl-en belül egy speciális részfában találhatunk erre alkalmas beállításokat: ez a a FreeBSD rendszermag opciói között megtalálható security.jail.*. Az alábbi képen ezek láthatóak kigyűjtve:

Összegzés:

Annak ellenére, hogy bármelyik BSD rendszer támogatja a leírtakban szereplő lehetőségeket, legkönnyebben nekem FreeBSD alatt sikerült működésre bírnom – itt viszont rövid idő alatt (Open- és NetBSD esetében nem fordult le probléma nélkül, de ez lehetett az én figyelmetlenségem miatt is). Engem ez a  virtualizációs megvalósítás leginkább a Solaris zónáira emlékeztetett, ahogy említettem. Vannak még korlátok, és megoldásra váró problémák a BSD virtualizációban, azonban a jelenlegi eredmények alapján is ígéretesnek és használhatónak tűnik a BSD jail.