Ez a rész eredetileg Simon L. Nielsen <simon@FreeBSD.org>
http://simon.nitro.dk/service-jails.html oldalon
található írásán, valamint
Ken Tom (<locals@gmail.com>
) átdolgozott
cikkén alapul. Itt megismerhetjük, hogyan
állítsunk be a FreeBSD rendszerünkben egy
biztonsági réteget a jail(8)
felhasználásával. Továbbá
feltételezzük, hogy ez a rendszer legalább
RELENG_6_0 verziójú és a fejezetben
korábban tárgyaltakat az olvasó teljes
mértékben megértette.
A jailek egyik legnagyobb gondja a frissítés folyamatának lebonyolítása. Azért jelent ez egyre inkább gondot, mert minden egyes jailt újra fel kell építenünk a frissítése során. Ez többnyire nem okoz gondot egyetlen jail használata során, mivel maga a frissítési folyamat meglehetősen egyszerű, azonban igen időigényessé és fárasztóvá tud válni több jail esetében.
Ez a példa a FreeBSD képességeinek
haladó szintű ismeretét követeli
meg. Amennyiben az itt bemutatott lépesek
túlságosan is bonyolultnak
tűnnének, érdemes olyan egyszerűbb
rendszerek után nézni, mint mondjuk a
sysutils/ezjail
, amely
egy egyszerűbb módszert kínál fel
a FreeBSD-ben használt jailek
karbantartására, és nem is annyira
bonyolult, mint ez a példa.
A bemutatandó példa célja, hogy feloldja az ilyen jellegű problémákat, és ezért igyekszik a jailek között mindent megosztani, ami csak lehetséges. Mindezt biztonságosan éri el — írásvédett mount_nullfs(8) állományrendszer használatával, aminek köszönhetően a frissítés maga egyszerűbbé, az egyes szolgáltatások különzárása pedig vonzóbbá válik. Ráadásul egyúttal egy nagyon egyszerű módszert mutat az új jailek hozzáadására és a régi törlésére ugyanúgy, mint a frissítésükre.
Például ilyen szolgáltatásokat kívánunk szabályozni: egy HTTP szervert, egy DNS szervert, egy SMTP szervert és így tovább.
Az itt szereplő beállítás céljai:
Készítsünk egy egyszerűen és könnyen átlátható jailkezelési rendszert. Ebből tehát következik, hogy ne kelljen lefuttatni a teljes rendszer telepítését minden egyes jailre.
Könnyítsük meg az új jailek hozzáadását és a régiek eltávolítását.
Könnyítsük meg a már létező jailek frissítését és cseréjét.
Tegyük lehetővé saját FreeBSD ágak futtatását.
Legyünk különösen körültekintőek a biztonság tekintetében, és igyekezzünk minél jobban csökkenteni veszély kockázatát.
Takarékoskodjunk a tárhellyel és az állományrendszerrel, amennyire csak lehet.
Ahogy azt már korábban is említettük, ez a kialakítás nagyban építkezik egyetlen fő sablonra, amely írásvédetten kerül csatlakoztatásra (nullfsen keresztül) az egyes jailekben, valamint jailenként egy-egy írható-olvasható eszközre. Ez az eszköz lehet egy külön fizikai lemez, egy partíció vagy egy vnode alapú md(4) eszköz. Ebben a példában írható-olvasható nullfs csatlakozásokat használunk.
Az állományrendszer kiosztása a most következő listában szerepel:
Minden jailt a /home/j
könyvtárban csatlakoztatunk.
A /home/j/mroot
lesz az összes jail sablonja és
mindegyikük számára
írásvédett.
Minden jailnek létrehozunk egy üres
alkönyvtárat a /home/j
könyvtárban.
Minden jailnek lesz egy /s
alkönyvtára,
amelyet a rendszer írható-olvasható
részére irányítunk.
Minden jailnek lesz egy saját
írható-olvasható része, amely
a /home/j/skel
könyvtáron alapszik.
Mindegyik elzárt terület (a jailek
írható-olvasható része) a
/home/js
könyvtárban jön létre.
Ez a kiosztás feltételezi, hogy a jaileket
a /home
partíción hozzuk létre. Ez
természetesen bármi másra
megváltoztatható, de akkor figyelnünk
kell erre minden egyes parancs kiadása
előtt.
Ez a rész leírja a fő sablon létrehozásához szükséges lépéseket. Ez a jailek számára írásvédett lesz.
Érdemes mindig frissíteni a FreeBSD
rendszerünket a legújabb -RELEASE ágra.
Ehhez olvassuk el az ide tartozó fejezetet a
kézikönyvből. Abban az esetben, ha a
frissítés nem lenne megoldható, egy
make buildworld
parancsot
mindenképpen le kell tudnunk futtatni. Ezenfelül
a sysutils/cpdup
csomagra
is szükségünk van. Használni fogjuk a
portsnap(8) segédprogramot is a FreeBSD
Portgyűjtemény letöltéséhez.
Akik nem ismernék, a kézikönyv erről
szóló fejezetében olvashatnak
róla.
Először is, készítsük el az írásvédett állományrendszer könyvtárszerkezetét, amely majd tartalmazni fogja a jailek által használt FreeBSD-s programokat. Ezután lépjünk be a FreeBSD forrásfájának könyvtárába és telepítsük fel az írásvédett állományrendszert a sablonba:
#
mkdir /home/j /home/j/mroot
#
cd /usr/src
#
make installworld DESTDIR=/home/j/mroot
Ezt követően készítsük elő a jailek számára a FreeBSD Portgyűjteményt és FreeBSD forrásfát, melyek kellenek a mergemaster használatához:
#
cd /home/j/mroot
#
mkdir usr/ports
#
portsnap -p /home/j/mroot/usr/ports fetch extract
#
cpdup /usr/src /home/j/mroot/usr/src
Hozzuk létre a rendszer írásvédett részének vázát:
#
mkdir /home/j/skel /home/j/skel/home /home/j/skel/usr-X11R6 /home/j/skel/distfiles
#
mv etc /home/j/skel
#
mv usr/local /home/j/skel/usr-local
#
mv tmp /home/j/skel
#
mv var /home/j/skel
#
mv root /home/j/skel
Használjuk a mergemastert a hiányzó konfigurációs állományok telepítésére. Szabaduljunk meg a mergemaster által készített felesleges könyvtáraktól:
#
mergemaster -t /home/j/skel/var/tmp/temproot -D /home/j/skel -i
#
cd /home/j/skel
#
rm -R bin boot lib libexec mnt proc rescue sbin sys usr dev
Most pedig szimbolikusan linkeljük az
írható-olvasható
állományrendszert az
írásvédett
állományrendszerre. Ellenőrizzük,
hogy a szimbolikus linkek a megfelelő s/
könyvtárakban
jöttek létre. Valós vagy rossz helyen
létrehozott könyvtárak
használata esetén a telepítés
nem fog sikerülni.
#
cd /home/j/mroot
#
mkdir s
#
ln -s s/etc etc
#
ln -s s/home home
#
ln -s s/root root
#
ln -s ../s/usr-local usr/local
#
ln -s ../s/usr-X11R6 usr/X11R6
#
ln -s ../../s/distfiles usr/ports/distfiles
#
ln -s s/tmp tmp
#
ln -s s/var var
Utolsó lépésként hozzunk
létre egy
/home/j/skel/etc/make.conf
állományt az alábbi
tartalommal:
A WRKDIRPREFIX
beállításával
lehetővé válik a FreeBSD portok jaileken
belüli fordítása. Ne felejtsük
el, hogy a portokat tartalmazó könyvtár
az írásvédett rendszer része!
Az átállított
WRKDIRPREFIX
azonban megengedi, hogy a
fordítások az egyes jailek
írható-olvasható részeiben
történjenek.
Most, miután teljesen elkészült a FreeBSD
jailek sablonja, be is tudjuk állítani és
hozzá is tudjuk venni ezeket az
/etc/rc.conf
állományhoz.
Ebben a példában 3 jail
létrehozását láthatjuk:
„NS”, „MAIL” és
„WWW”.
Írjuk bele a következő sorokat az
/etc/fstab
állományba,
aminek köszönhetően az egyes jailek
számára elérhetővé
válik az írásvédett sablon
és a hozzájuk tartozó
írható-olvasható
területek:
Az első helyen nullával jelölt
partíciókat a fsck(8) nem fogja
ellenőrizni a rendszer indulása
során, a második helyen nullával
jelölt partíciókat pedig nem fogja
menteni a dump(8). Mi egyáltalán nem
akarjuk, hogy az fsck
ellenőrizze vagy a dump
lementse a jailjeinkhez tartozó
írásvédett
nullfs-partícióinkat.
Ezért szerepel végig
„0 0” a fentebb szereplő
fstab
-bejegyzések
utolsó két oszlopában.
Állítsuk be a jaileket az
/etc/rc.conf
-ban:
Azért állítottuk a
jail_
változó értékét a
név
_rootdir/usr/home
könyvtárra a /home
könyvtár
helyett, mert a FreeBSD
alaptelepítésében a /home
könyvtár
fizikailag a /usr/home
könyvtárral egyezik meg. A
jail_
változó értékeként
megadott könyvtár nem
tartalmazhat szimbolikus linket,
máskülönben a jailek nem lesznek
hajlandóak létrejönni. Ennek
megállapításában a
realpath(1) segédprogram lehet
segítségünkre. A
korlátozás részleteiről a
FreeBSD-SA-07:01.jail biztonsági
figyelmeztetésben olvashatunk.név
_rootdir
Hozzuk létre az egyes jailek írásvédett állományrendszereihez szükséges csatlakozási pontokat:
#
mkdir /home/j/ns /home/j/mail /home/j/www
Telepítsük az
írható-olvasható sablont az egyes
jailekbe. Figyeljük meg a sysutils/cpdup
használatát, amellyel az egyes
könyvtárak pontos másolatait hozhatjuk
létre:
#
mkdir /home/js
#
cpdup /home/j/skel /home/js/ns
#
cpdup /home/j/skel /home/js/mail
#
cpdup /home/j/skel /home/js/www
Ebben a fázisban a jailek már
elkészültek és készen
állnak a futásra. Először
csatlakoztassuk az egyes jailekhez szükséges
állományrendszereket, majd indítsuk
el ezeket a /etc/rc.d/jail
szkripttel:
#
mount -a
#
/etc/rc.d/jail start
A jailek most már futnak. Az elindulásuk ellenőrzéséhez használjuk a jls(8) parancsot. Valami ilyesmit láthatunk a kiadása után:
#
jls
JID IP Address Hostname Path
3 192.168.3.17 ns.example.org /home/j/ns
2 192.168.3.18 mail.example.org /home/j/mail
1 62.123.43.14 www.example.org /home/j/wwwItt már be tudunk jelentkezni az egyes jailekbe,
új felhasználókat tudunk
készíteni vagy démonokat tudunk
beállítani. A JID
oszlop
mutatja az egyes jailek azonosítási
számát. A 3-as JID
számú jailben az alábbi parancs
használatával karbantartási feladatokat
elvégezni:
#
jexec 3 tcsh
Időről időre adódhat, hogy frissítenünk kell a rendszert a FreeBSD egy újabb változatára, vagy egy biztonsági hiba javítása miatt, vagy pedig a már meglevő jailek számára hasznos újítások bevezetése miatt. Ez a kialakítás megkönnyíti a korábban létrehozott jailjeink frissítését. Továbbá igyekszik minimalizálni a kiesésüket is, mivel a jaileket csak a legutolsó pillanatban fogjuk leállítani. Sőt, még az is lehetővé válik, hogy visszaállítsuk a korábbi verziót, ha véletlenül valami rosszul sülne el menetközben.
Első lépéseként
frissítsük magát a befogadó
rendszert a megszokott módon. Ezután
hozzunk létre egy új
írásvédett sablont a /home/j/mroot2
könyvtárban.
#
mkdir /home/j/mroot2
#
cd /usr/src
#
make installworld DESTDIR=/home/j/mroot2
#
cd /home/j/mroot2
#
cpdup /usr/src usr/src
#
mkdir s
A installworld
lefuttatása létrehoz néhány
felesleges könyvtárat, melyeket
takarítsunk is el:
#
chflags -R 0 var
#
rm -R etc var root usr/local tmp
Hozzuk újra létre az írható-olvasható szimbolikus linkjeinket a fő állományrendszerre:
#
ln -s s/etc etc
#
ln -s s/root root
#
ln -s s/home home
#
ln -s ../s/usr-local usr/local
#
ln -s ../s/usr-X11R6 usr/X11R6
#
ln -s s/tmp tmp
#
ln -s s/var var
Most érkezett el az idő, hogy leállítsuk a jaileket:
#
/etc/rc.d/jail stop
Válasszuk le az eredeti állományrendszereket:
#
umount /home/j/ns/s
#
umount /home/j/ns
#
umount /home/j/mail/s
#
umount /home/j/mail
#
umount /home/j/www/s
#
umount /home/j/www
Az írható-olvasható
állományrendszerek hozzá vannak
kapcsolva az írásvédett
állományrendszerhez (/s
), ezért azokat
először le kell választani.
Mozgassuk el az útból a régi írásvédett állományrendszerünket és váltsuk fel az újjal. Így biztonsági mentésként és a régi írásvédett rendszer archívumaként továbbra is rendelkezésre áll, ha valami baj történne. Az itt használt elnevezés az újonnan létrehozott írásvédett állományrendszer dátumából ered. Mozgassuk át az eredeti FreeBSD Portgyűjteményt az új állományrendszerre, hogy megtakarítsunk némi tárhelyet és állományleírót:
#
cd /home/j
#
mv mroot mroot.20060601
#
mv mroot2 mroot
#
mv mroot.20060601/usr/ports mroot/usr
Most már készen áll az új írásvédett sablon, így már csak az állományrendszerek újracsatlakoztatása és a jailek újraindítása maradt:
#
mount -a
#
/etc/rc.d/jail start
A jls(8) használatával ellenőrizzük, hogy a jailek rendesen elindultak. Ne felejtsük el jailenként lefuttatni a mergemastert sem. A konfigurációs állományokat és az rc.d szkripteket is frissítenünk kell majd.
Ha kérdése van a FreeBSD-vel kapcsolatban, a
következő címre írhat (angolul):
<questions@FreeBSD.org>.
Ha ezzel a dokumentummal kapcsolatban van kérdése, kérjük erre a címre írjon:
<gabor@FreeBSD.org>.