= bubbalog =Дневникът на моето стадо

Jail, ezjail и FreeBSD 8.1

Friday 24.12.2010 00:17 EEST · Публикувано от в = FreeBSD =

http://www.cyberciti.biz/faq/howto-setup-freebsd-jail-with-ezjail/
http://scratching.psybermonkey.net/2010/06/freebsd-how-to-setup-configure-jail.html
http://www.devco.net/archives/2005/11/01/sharing_directories_between_jails_using_nullfs.php

То не бе пауза, не бе мързел и много работа… но факта си е факт, от доста време нямах никакво желание да пиша каквато и да е статия тук. Не че съм спрял да се занимавам, но така се случи. Онзи ден най-накрая седнах и реших да отхвърля още един проблем с който отдавна смятах да се захвана, но все я не ми стискаше, я нямаше ресурс, я мързела ми идваше в повече… И ето как след няколко часа четене и борба най-накрая успях да конфигурирам FreeBSD  с jail-ове. Вече имам няколко идеи как ще до приложа, но засега това остава само в сферата на тестовете.

В основата на самото изпълнение е FreeBSD 8.1, последния релийз към момента.Инсталацията е стандартна User дистрибуция, като са прибавени пълния пакет src от дистрибуциите (Sysinstall->Configure->Distributions->src->All).

1. Донастройка на системата

След като инсталацията приключи идва време на малките системни донастройки. Настройва се SSH (редактира се /etc/ssh/sshd_config), като се избира порт и адрес на който да слуша демона.   Този адрес ще е основния IP адрес на системата, защо – това ще се изясни по-късно. След това от Sysinstall се настройват root парола, създава се потребител в wheel групата за логване през SSH, след което от мрежовите настройки се настройва мрежовата част. На системата задължително трябва да се зададат твърди IP адрес, gateway и DNS [1], в противен случай в последствие могат да се получат някои трудности. От същото меню се запуска и SSH, с което работата ни със Sysinstall приключва. Следва донастройка на мрежата като в /etc/rc.conf се добавят няколко виртуални адреса (network interface alias), за всеки jail който ще конфигурираме в последствие. Прибавят редове от типа:

ifconfig_fxp0_alias0=”inet XXX.XXX.XXX.XXX netmask XXX.XXX.XXX.XXX”

като в крайна сметка мрежовата част на файла придобива подобен вид вид

defaultrouter=”192.168.0.1″
hostname=”jailhome.local”
ifconfig_fxp0=”inet 192.168.0.100 netmask 255.255.255.0″
ifconfig_fxp0_alias0=”inet 192.168.0.110 netmask 255.255.255.0″
ifconfig_fxp0_alias1=”inet 192.168.0.111 netmask 255.255.255.0″
ifconfig_fxp0_alias2=”inet 192.168.0.112 netmask 255.255.255.0″
ifconfig_fxp0_alias3=”inet 192.168.0.113 netmask 255.255.255.0″

С това настройката на системата е завършена.

2. Инсталиране и конфигуриране на ezjail

След доста борба и нерви по създаването и управление на джейлове, в крайна сметка ezjail се оказа най-приятното приложение за работа.

Инсталираме програмата от портовете

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

след като инсталацията приключи, създаваме директорията в която ще се поместват джейловете и копираме примерния конфигурационен файл в работен

# cp /usr/local/etc/ezjail.conf.sample /usr/local/etc/ezjail.conf

редактираме

# ee /usr/local/etc/ezjail.conf

като се настройва директорията за jail-овете която създадохме по-рано, както и махаме коментарите на всички редове освен


# In case you want to provide a copy of ports tree in base jail, set this to
# a cvsroot near you
# ezjail_portscvsroot=freebsdanoncvs@anoncvs.FreeBSD.org:/home/ncvs
#
# This is where the install sub command defaults to fetch its packages from
# ezjail_ftphost=ftp.freebsd.org

# Setting this to YES will start to manage the basejail and newjail in ZFS
# ezjail_use_zfs=”YES”
# The name of the ZFS ezjail should create jails on, it will be mounted at the e
# ezjail_jailzfs=”tank/ezjail”
# ADVANCED, be very careful!
# ezjail_zfs_properties=”-o compression=lzjb -o atime=off”

Прибавяме ред за стартиране в /etc/rc.conf и стартираме демона

# echo ‘ezjail_enable=”YES”‘ >> /etc/rc.conf
# /usr/local/etc/rc.d/ezjail.sh start

Структирата на програмата е следната:

  • /usr/jails/ – Локацията по подразбиране за джайловете. За целта по-рано създадохме друга директория.
  • /usr/jails/flavours/ – Задаването на предварителни настройки става от flavours. Например, прибавяне на /etc/resolv.conf по подразбиране или ъпдейт на съществуващия /etc/make.conf може да бъде направено от тук.
  • /usr/jails/basejail/ – basejail ще бтде експортнат и маунтнат като read only за всеки jail. Това би спестило дисково място.
  • /usr/local/etc/rc.d/ezjail.sh – Stop / Start / Restart jails script.
  • /usr/local/etc/ezjail.conf – Конфигурационния файл на програмата, описан по-рано. Съдържа конфигурационни параметри, както и указания за това как да работи the ezjail-admin в последствие.
  • /usr/local/etc/ezjail/ – Всички конфигурационни файлове за всеки jail са тук.

3. Създаване на темплейт за джейловете.

Ако никога не сте правили buildworld  сега му е времето да го направите, като изпълнете следната комада [2]

# cd /usr/src
# make buildworld

След като изпълнението свърши, се създава основния темплейт за джейловете

# ezjail-admin update -p -i

където

  • -p : създава копие на портовете за jail-овете.
  • -i : не изпълнява make world. Това спестява време и ще се използва съществуващия buildworld създаден при предишната команда

4. Създаване на jail

Създаването на jail става с изпълнение на следната команда

# ezjail-admin create jailname jail_IP

след което за да стартита трябва да се рестартира ezjail демона

# /usr/local/etc/rc.d/ezjail.sh restart

5. Донастройка на jail-овете

Като начало, трябва да подготвим jail-а за отдалечена администрация. За целта трябва отново да създадем за всеки jail (с помоща на Sysinstall) потребител в wheel групата, и да зададем парола за root. Тъй като виртуалните адреси създадени в първата стъпка биха отговаряли на цялата система, съответно от адреса на един джейл да се логвате в друг, много по-добре би било да се донастрои всеки джейл да отговаря само на неговия си адрес. Прави се по същия начин, както стана и за основната система.

Първо се включваме в jail-а [3]

# ezjail-admin console jailname

и редактираме конфигурационния файл

jailname# ee /etc/ssh/sshd_config

прибавяме настройки за стартиране

jailname# grep ssh /etc/defaults/rc.conf >> /etc/rc.conf

редактира се /etc/rc.conf на реда sshd_enable=”NO” се променя на “YES”

jailname# ee /etc/rc.conf

и стартираме SSH демона

jailname# /etc/rc.d/sshd start

Следва създаване и настройка /etc/resolv.conf. Както написах по-рано, това може да стане с поставането на такъв във flafours, но ако не е направено, ето как става това на ръка.

jailname# echo ‘nameserver 192.168.100.1’ > /etc/resolv.conf

Сега джейла е готов и би трябвало да има работеща мрежа и излаз навън [4]

6. Допълнителни файлови системи.

След доста борба най-накрая разбрах, че от гледна точка на сигурноста в jail-а няма как да се монтира нищо допълнително. Става дума за това, че в момента директорията с блога ми например е изнесена на друг диск, на който са и бекъпите на системата и една директория за SAMBA, а това няма как да стане в джейла, поне не и по стандартния начин чрез UFS или NFS. След доста главоболия, четене и проби, най-накрая се оказа, че все пак има начин тов да стане, но не и вътре от самия джейл, а отвън от основната система като се използва nullfs. С 2 думи обяснено, това позволява монтирането на дадена директория в друга.

На ръка това става по следния начин:

# mount_nullfs /selected/folder /path/to/jail/mount/folder

като също може да бъде направено и от /etc/fstab с добавянето на подобен ред

/selected/folder /path/to/jail/mount/folder nullfs rw 0 0

Имено тук е момента да спомена, че това е начин (който не ми изглежда особено читав от гледна точка на сигурноста), чрез който една директория може да се монтира в няколко джейла едновременно, без това да пречи на работата в нея.

Ето така се реши и проблема с добавянето на втория диск към системата. в fstab първо се описва как се маунтва втория диск, а после с nullfs маунтпоинта на диска се монтира в директория, която се вижда в джейла.

И… това е. от тук натам кой за какво може да използва така подготвената система си е негова работа. Аз продължавам с моите си задачки…

***

[1] По време на тестовете бях задал на рутера MAC адреса на сървъра, за да не се расправям всеки път да настройвам мрежата на всяка система. Операционни системи различни, настройки много… досадна работа. Това обаче се оказа в последствие проблем, тъй като при настройка DHCP в /etc/rc.conf няма запис за defaultgateway, което пък е необходимо в последствие за мрежата на джейловете

[2] грешка при инсталацията – http://www.daemonforums.org/showpost.php?p=12542&postcount=2

По време на изпълнението на “ezjail-admin update -p -i” се получи грешка, като инсталацията спря по следния начин:


cd /usr/src; make -f Makefile.inc1 install
===> share/info (install)
install -o root -g wheel -m 444  dir-tmpl /usr/data/jails/fulljail/usr/share/info/dir
install:No such file or directory
*** Error code 1
|
Stop in /usr/src/share/info.
*** Error code 1
|
Stop in /usr/src.
*** Error code 1
|
Stop in /usr/src.
*** Error code 1
|
Stop in /usr/src.
*** Error code 1
|
Stop in /usr/src.
Error: The command ‘make installworld’ failed.
Refer to the error report(s) above.

След кратко четене се оказа, че за да се избегне е нужно да се направи buildworld, рехашва се и после пак се запуска “ezjail-admin update -p -i”.
В упътванията които четох пишеше, че ако не сте правили buildworld може да изпълните

# ezjail-admin install

но при мен така и не даде резултат

[3] По този начин в последствие може да получите безусловен root достъп до всеки jail, даже и да е настроена root парола.

[4] проблемът с пинг – http://forums.freebsd.org/showpost.php?p=22975&postcount=2

Може би по навик, всеки от нас би проверил свързаноста с помоща на ping, но с голямо разочарование ще открие, че това не е позволено вътре от джейла. Все пак има един начин, като изрично е описано, че след дадената проверка е хубаво това отново да се спре, тъй като е потенциална дупка в сигурноста. Настройката се прави от хост системата а не за всеки джейл поотделно, като се добавя следния ред в /etc/sysctl.conf

# echo ‘security.jail.allow_raw_sockets=1’ >> /etc/sysctl.conf

Остави коментар

Писането на кирилица е задължително!
Коментари, които не са на кирилица ще бъдат изтрити без предупреждение.
Всеки коментари съдържащи 1 или повече линка, ще бъдат публикувани след одобрение.