четверг, 11 ноября 2010 г.

jail - безопасность и виртуализация на базе FreeBSD

Jail можно использовать, как систему виртуализации или как средство для запуска программы в ограниченном окружении.
Для меня встал вопрос именно по безопасности, хотя сути это не меняет.
Учитывая, что большинство взломов производится не из-за "дырявой" системы (по крайней мере это относится к FreeBSD ), а из-за уязвимостей сервисов или неправильной их настройки.
Самым часто взламываемым сервисом является Веб.
Чтобы минимизировать ущерб от вероятного взлома, лучше поместить каждый сервис в свою отдельную "тюрьму" - виртуальную среду, за пределы которой злоумышленник не сможет выйти (или это будет крайне затруднительно).

Итак, поехали :)

Перед созданием jail необходимо обновить систему(обновить порты, пересобрать мир и ядро) + поставить набор базовых программ.
Создание jail.
Используем следующий скрипт (был взят у lissyara)

cat jail_create.sh
#!/bin/sh

# скрипт создания клеток

case "$2" in
        create)
                # стругаем клетку
                jail_dir="$1"
                mkdir -p ${jail_dir}
                cd /usr/src
                mkdir -p ${jail_dir}
                make world DESTDIR=${jail_dir}
                cd /usr/src/etc
                make distribution DESTDIR=${jail_dir}
                mount_devfs devfs ${jail_dir}/dev

                ;;
        *)
                echo ""
                echo "Usage: `basename $0` { /path/to/jail/directory create }"
                echo ""
                exit 64
                ;;
esac
Запускаем его (учитывая, что будет собираться мир, то выполнение этого скрипта займет значительное время)

#./jail_create.sh /usr/local/jails/jail_test create
Пока идет сборка мира, подготовим родительскую машину.
Заводим алиасы для каждого jail. У каждого jailа должен быть свой ip адрес!

# Переназываем интерфейс (для удобства)
ifconfig_em0_name="net0"
# IP реальной машины
ifconfig_net0="inet 192.168.0.200 netmask 255.255.255.0"
# альяс для первого jail`a
ifconfig_net0_alias0="inet 192.168.0.201 netmask 255.255.255.0"
Заставляем работать sshd в родительской системе на одном адресе:

>cat /etc/ssh/sshd_config | grep ListenAddress
ListenAddress 192.168.0.200
#ListenAddress ::
Вешаем syslogd на тот же адрес:

>cat /etc/rc.conf | grep syslo
syslogd_flags="-b 192.168.0.200"
Ждем пока соберется мир.
После чего для надежности перезагружаем сервак (лучше сразу все поправить, чем потом разгребать...)
Проверяем, все ли альясы подцепились:

>ifconfig
plip0: flags=108810 mtu 1500
net0: flags=8843 mtu 1500
        inet 192.168.0.200 netmask 0xffffff00 broadcast 192.168.0.255
        inet 192.168.0.201 netmask 0xffffff00 broadcast 192.168.0.255
        ether 00:80:c8:24:a5:d2
lo0: flags=8049 mtu 16384
        inet 127.0.0.1 netmask 0xff000000
Создаём в клетке пусой файл /etc/fstab

>touch /usr/local/jails/jail_test/etc/fstab
Создаём в ней файл /usr/local/jails/jail_test/etc/resolv.conf такого содержания:

nameserver 192.168.0.3
Добавляем в файл /usr/local/jails/jail_test/etc/rc.conf такую строку (если там нужен этот демон, аналогично и для других необходимых демонов)

sshd_enable="YES"
Затем на родительской машине добавляем такие строки в /etc/rc.conf

# запускать ли клетки
jail_enable="YES"
# список имён jail`ов разделённый пробелами, типа
# jail_list="test tets1 test2 test3"
jail_list="test"
# Разрешить руту в клетке изменять её имя хоста
jail_set_hostname_allow="YES"
# дальше настроки специфичные для кажой клетки
# корневая директория клетки `test`
jail_test_rootdir="/usr/local/jails/jail_test"
# имя хоста для клетки `test`
jail_test_hostname="test-jail.local"
# IP-адрес клетки `test`
jail_test_ip="192.168.0.201"
# Монтировать devfs в клетке `test`
jail_test_devfs_enable="YES"
# монтировать procfs в клетке `test`
jail_test_procfs_enable="YES"
# Флаги для клетки `test`
jail_test_flags="-l -U root" 
Затем заводим пользователя и даём руту в клетке пароль, для этого входим в клетку:

>jail /usr/local/jails/jail_test/ test 192.168.0.201 /bin/csh
И заводим пользователя командой useradd. Не забываем задать пароль для рута. Выходим из клетки командой exit, и можно запускать:

>/etc/rc.d/jail start
Configuring jails:.
Starting jails: test-jail.local.
Первый запуск может занять много времени (до 5 мин, в зависимости от компа),
т.к. sshd генерит ключи.
Последующие запуски будут гораздо быстрей.
Для ускорения, можно положить свои ключи, с реального хоста.
C клеткой можно работать точно также как и с реальной машиной - ставить приложения, запускать. Едиственое что - на -реальной машине, при установке любых приложений нужно не забывать вешать их на тот IP адрес который ей принадлеит - большинство приложений по дефолту слушают все адреса. Работает всё точно также шустро как и на реальной машине

Источники:
Установка и настройка клеток (jail) на FreeBSD6.1 + полезные коментарии
BSDA-jail-howto

Комментариев нет:

Отправить комментарий