Vytvárame FreeBSD jail

19.06.2006 22:38

Čo je to vlastne ten jail ? Iste každý zdatnejší Linuxák počul o pojme
chroot. Je to vlastnosť Linuxu izolovať nejaký proces od zbytku hierchickej
štruktúry filesystému. V praxy sa táto vlastnoť využíva hlavne na
zabezpečovanie chodu démonov ako apache prípadne proftpd a podobných dangerous
procesov, kedže potencionálny útočník sa cez diery buď v aplikáciach alebo
v dynamických web stránkach môže dostať poľahky k citlivým systémovým či iným
dôležitým súborom, prípadne v extrémných situláciách vykonať operáciu vedúcu k zhodeniu celého serveru a pod.
Tým, že tento proces uzavrieme v chroote, útožníkovy zostáva skrytá dôležitá
časť systému a pod.
Vráťme sa ale k samotnému FreeBSD jailu. Čím sa líši tento systém od chrootu.
Toto býva prvá otázka Linuxákov pokiaľ im začnem vysvetľovať čo vlastne jail
je. Jail má totiž všetky vlastnosti chrootu avšak pridáva niečo viac.
Jailom si totižto môžte pomerne ľahko vytvoriť virtuálny server tak, že
uživateľia a procesy v ňom budú úplne oddelený od zbytku systému, nebudú
vidieť a ani môcť meniť procesy bežiace mimo jailu a pod.
Tým pádom napríklad v jaile môžme ešte do vätčšej miery obmedziť v ňom bežiaci
proces a pod.

Na vytvorenie jailu ako virtuálneho stroja môžme použiť niekoľko ciest.

1. Použiť existujúce jail distribúcie BSD ako MiniBSD a pod. Tu sa však vynorí
množstvo problémov hlavne zo závislosťami a pod.
2. Použit sysinstall. Pozostáva z nakopírovania binárnych balíčkov
a nainštalovania špecifických distribúcií. Inštalácia je prakticky obdobná
ako pri inštalácii FreeBSD.
3. Cez make world. Táto cesta je síce dlhšia avšak mne osobne sa páči najviac.
Ide o to, že si skompilujete novú kópiu worldu, ktorú následne
nainštalujete priamo do jailu.

V tomto "mini-howto" budem postupovať práve treťou cestov.
Základ dobrého worldu spočíva v dobre nakonfigurovanom make.conf-e.
Ako príklad môžem uviesť nasledujúci make.conf:

NO_ACPI=      true    # nabude sa buildovať ACPI
NO_BOOT=      true    # taktiež bootloader je nám zbytočný
NO_BLUETOOTH=  true
NO_FORTRAN=    true    # ble fortan.
NO_I4B=        true    # isdn je nám tiež zbytočné
NO_IPFILTER=  true    # ipfilter
NO_KERBEROS=  true
NO_MAILWRAPPER=true
NO_MODULES=    true    # nebudú sa buildovať moduly do jadra
NO_SENDMAIL=  true    # vyhodíme sendmail.
NO_SHAREDOCS=  true    # dokumentáciu nepotrebujeme
NO_INFO=      true    # info ani man nebudeme potrebovať
NO_MAN=        true    # do not build manual pages
NO_PROFILE=    true
NO_BIND=      true    # bind nám nebude treba vätčšinou

Keď už máme takto upravený make.conf, môžme pristúpiť k samotnemu vytváraniu
jailu.

V prvom kroku povytvárame zopár adresárov.

JAILDIR=/jail
mkdir -p $JAILDIR/dev
mkdir -p $JAILDIR/etc
mkdir -p $JAILDIR/usr/tmp
chmod 777 $JAILDIR/usr/tmp

Presunieme sa do adresára /usr/src a spustíme kompiláciu cez príkaz:

make buildworld

Tento krok bude trvať pomerne dlho, tý čo už kompilovali world iste vedia
o čom hovorím, čiže máme čas na nejaké to caffe alebo frozen bubbles...
Po kompilácii nainštalujeme novo skompilovaný systém cez príkazom:

make installworld DESTDIR=$JAILDIR

Ďalej je nutné vytvoriť distribúciu príkazom:

make distribution DESTDIR=$JAILDIR NO_OPENSSH=YES NO_OPENSSL=YES

Presunieme sa do adresára $JAILDIR, pripojíme devfs a vytvoríme fakový kernel :

mount_devfs devfs $JAILDIR/dev
devfs -m $JAILDIR/dev rule -s 4 applyset
ln -s dev/null kernel

Pokiaľ nechceme aby nám pri štartovaní jailu vypisovalo hlášky okolo
chýbajúceho fstabu vykonáme nasledovný príkaz a potom ešte pár príkazov aby
nám fungovalo SSL:

touch $JAILDIR/etc/fstab
cp /etc/resolv.conf $JAILDIR/etc/resolv.conf
mkdir -p $JAILDIR/etc/ssl
mkdir -p $JAILDIR/usr/local/openssl
cp /etc/ssl/openssl.cnf $JAILDIR/etc/ssl
cd $JAILDIR/usr/local/openssl/
ln -s ../../../etc/ssl/openssl.cnf openssl.cnf

Takže základný systém už máme funnkčný a môžme sa pustiť do jeho konfigurácie.
Najprv si nakonfigurujeme rc.conf, ktorý notoricky pozná každý BSDčkar.
Konfiguračný súbor môže vyreať napríklad takto:

hostname="alkatraz.doma.net"
ifconfig_em0="inet 10.0.0.20 netmask 255.255.255.255" # IP, ktorú bude náš
Jail používať.
defaultrouter="10.0.0.1"        # Default gateway
kern_securelevel_enable="YES"  # Nastaví vyšší security level (vysvetlenie
neskôr ;-)
kern_securelevel="3"

A teraz prišla chvíla, kedy si náš Jail prvý krát spustíme. Pokiaľ nenastali
žiadne problémy (vždy nejaké nastanú ;) vykonáme to nasledujúcim príkazom:

mount_nullfs /usr/ports $JAILDIR
mount_nullfs /usr/src $JAILDIR
jail $JAILDIR alkatraz.doma.net 10.0.0.20 /bin/sh

IP adresa sa musí zhodovať s tou, ktorú sme uviedli v rc.confe. Teraz sme sa
ocitli v našom novom systéme vnútry systému. Je načase nabootovať services,
zapnúť sieť a pod. Čiže použijeme príkaz:

/bin/sh /etc/rc

Ďalším krokom môže byť napr. zmena hesla roota a vytvorenie uživaťeľov, ktorý
môžu pristupovať do jailu. To či nám šlape sieť v jaile môžeme efektne
otestovať tak, že sa z vonkajšieho systému pokúsime do jailu dostať napr.
prostredníctvom SSH. (ssh user@10.0.0.20).
Následne si už môžme pospúštať všetky aplikácie, ktoré chceme v Jailovanom
prostredí používať ako apache alebo iné serveri...

No a keď už máme vytvorený jail patrilo by sa ho spúštať vždy pri štarte
systému, pretože spusšať ho vždy ručne by bola zrejme otrava. Preto do rc.conf
na našom servery dopíseme tieto riadky:

jail_enable="YES"
jail_list="alkatraz"
jail_set_hostname_allow="NO" # zakážeme meniť hostname jailu z jailu
jail_socket_unixiproute_only="YES" # do jailu sa bude dať dostať iba cez TCPIP

jail_alkatraz_rootdir="/jail"
jail_alkatraz_hostname="jail.doma.net"
jail_alkatraz_ip="10.0.0.20"
jail_alkatraz_exec_start="/bin/sh /etc/rc"
jail_alkatraz_devfs_enable="YES"
jail_alkatraz_devfs_ruleset="devfsrules_jail"

Týmto mamé konfiguráciu jailu za sebou. Výhody takéhoto riešenia vidím hlavne
na serveroch, kde je viacej uživateľov s kategórie "skúšaci", kde ich pokusy
neovplyvnia hod celého serveru a prípadny hangover riešime iba reštartovaním
jailu.

Ešte sa trošku vrátim k secure levelom, ktoré boli spomenuté vyššie.
Securelevel vo FreeBSD je sysctl volanie, ktorým môžme za behu systému zmeniť
určité bezpečnostné prvky na serveri. Poďla man securelevel sú to tieto
úrovne:

-1 - Toto je defaultná hodnota, pri ktorej niesú aplikované žiadne
obmedzenia.
0 - V podstate to isté, akurát do zariadení sa dá zapisovať podľa permisien.
1 - /dev/mem, /dev/kmem, /dev/io niesú prístupné pre zápis.
2 - To isté ako 1 avšak disky sú pripojené iba na čítanie.
3 - To isté ako 2 ale nedá sa zmeniť nastavenie firewallu.

Chcel by som ešte upozorniť na projekt mod_jail od Igora Popova, ktorý umožnuje chod Apache servera v jaile.

Pre ďalšie informácie je dobré prečítať si nasledovné veci:

man jail

Creating a FreeBSD jail

Jail subsystem

    • xen 19.06.2006 | 22:53
      Avatar blackhole_ventYl   Používateľ

      na lugcone som pocul prednasku o xene a zda sa mi, ze vybudovanie xen virtualneho stroja je rychlejsie...

      ---
      Riadit pracu programatorov je ako past macky.

      --- Cuchat s nadchou, to je ako sniffovat bez promiscu.
      • re: 19.06.2006 | 22:58
        mifo   Návštevník

        Xen pod FreeBSD nerozbehas pokial viem... Podla mna ma toto riesenie 2 vyhody. Ta prva je taka, ze sa nieco naucis o systeme a ta druha, ze Jail je priamo zabudovany v kernely cize IMHO iste zrychlenie tam moze byt aj ked som necheckoval benchmarky.

        Linux ma aj nejaky VServer projekt a pod ale IMHO FreeBSD jail ma svoje caro ;-)

        • yoyo, konkretne projekt 19.06.2006 | 23:59
          Avatar blackhole_ventYl   Používateľ

          yoyo, konkretne projekt vserver ma s jailom vela spolocneho (filozofiou), akurat, ze vserver je patch proti 2.4 a 2.6 kernelu. Podla benchmarkov vserveru in-the-wild je znizenie vykonu u vserveru niekde okolo 3%. Rozdiel medzi xenom a vserverom je v tom, ze xen beha cely jeden virtualny stroj ako jeden proces na hostovskom stroji a vserver sa chova tak, ze kazdy jeden proces vo vnutri vservera je reprezentovany jednym procesom materskeho systemu, co predpokladam viac koresponduje s jailom. Akurat neviem, ci je na tom lepsie s nastavenim politiky virtualneho stroja lepsie jail, alebo vserver.

          ---
          Riadit pracu programatorov je ako past macky.

          --- Cuchat s nadchou, to je ako sniffovat bez promiscu.
          • Neprirovnaval by som rozne 17.02.2007 | 08:37
            wire   Návštevník

            Neprirovnaval by som rozne untrusted testing projekty linuxu k jailu v BSD.
            Osobne aj keby napriklad XEN bezal pod BSD nepouzil by som ho uz len koli tomu ze jail je sucast samotneho systemu je vyladeny, odskusany a zatial secure.

            Takze nejake pokusy ktore budu unstable alebo inak naburatelne by som proste nedaval. Jail je krasna vec ktora je dostatocne odladena, bezi vyborne a je sucastou samotneho jadra systemu.

    • jail. .. 21.06.2006 | 21:59
      jimy   Návštevník
      jail je strasne dobra vec ... ale nepaci sa mi ze neni multiip a nepodporuje ipv6 priamo. dalej taka vec cele toto je ryxlejsie z manu jail ... asi 4 prikazy a mas to installnute .. . a par doladovaciek ... Robert Holbik Yegon s. r. o.
    • pekny clanek, jen vic 24.06.2006 | 02:14
      cm3l1k1   Návštevník

      pekny clanek, jen vic podobnych o featurach bsd, nebo jeste lepe obsd :)
      --
      .::[ Trust is a Weakness ]::.