15.6. A jailek alkalmazása

15.6.1. Szolgáltatások jailbe foglalása

Írta: Daniel Gerzo.

Ez a rész eredetileg Simon L. Nielsen http://simon.nitro.dk/service-jails.html oldalon található írásán, valamint Ken Tom () á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.

15.6.1.1. A kialakítás

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.

Figyelem: 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.

Megjegyzés: 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.

Megjegyzés: 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.

15.6.1.2. A sablon létrehozása

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.

  1. 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
  2. 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
  3. 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
  4. 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
  5. 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
  6. Utolsó lépésként hozzunk létre egy /home/j/skel/etc/make.conf állományt az alábbi tartalommal:

    WRKDIRPREFIX?=  /s/portbuild

    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.

15.6.1.3. A jailek létrehozása

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”.

  1. Í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:

    /home/j/mroot   /home/j/ns     nullfs  ro  0   0
    /home/j/mroot   /home/j/mail   nullfs  ro  0   0
    /home/j/mroot   /home/j/www    nullfs  ro  0   0
    /home/js/ns     /home/j/ns/s   nullfs  rw  0   0
    /home/js/mail   /home/j/mail/s nullfs  rw  0   0
    /home/js/www    /home/j/www/s  nullfs  rw  0   0

    Megjegyzés: 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.

  2. Állítsuk be a jaileket az /etc/rc.conf-ban:

    jail_enable="YES"
    jail_set_hostname_allow="NO"
    jail_list="ns mail www"
    jail_ns_hostname="ns.example.org"
    jail_ns_ip="192.168.3.17"
    jail_ns_rootdir="/usr/home/j/ns"
    jail_ns_devfs_enable="YES"
    jail_mail_hostname="mail.example.org"
    jail_mail_ip="192.168.3.18"
    jail_mail_rootdir="/usr/home/j/mail"
    jail_mail_devfs_enable="YES"
    jail_www_hostname="www.example.org"
    jail_www_ip="62.123.43.14"
    jail_www_rootdir="/usr/home/j/www"
    jail_www_devfs_enable="YES"

    Figyelem: Azért állítottuk a jail_név_rootdir változó értékét a /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_név_rootdir 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.

  3. 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
  4. 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
  5. 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/www

Itt 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

15.6.1.4. Frissítés

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.

  1. 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
  2. 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
  3. Most érkezett el az idő, hogy leállítsuk a jaileket:

    # /etc/rc.d/jail stop
  4. 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

    Megjegyzés: 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.

  5. 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
  6. 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): <freebsd-questions@FreeBSD.org>.
Ha ezzel a dokumentummal kapcsolatban van kérdése, kérjük erre a címre írjon: <gabor@FreeBSD.org>.