Подсистема клеток (Jails) во FreeBSD появилась еще в 4-ой ветке, а в 5-ой была значительно переработана и усовершенствована, что сделало ее очень мощной и гибкой. В основу клеток положена системная команда chroot, которая устанавливает для процессов корневую папку и создает безопасное окружение, тем самым повышая надежность основной системы. Процессы, работающие в ограниченном окружении не могут получить доступ к файлам и ресурсам, находящимися за его пределами. Главный плюс такого подхода заключается в том, что атакующий взломав сервис, работающий в ограниченном окружении, не сможет скомпрометировать основную систему. Но такой метод подходит только для решения простых задач, так как с помощью него нельзя сделать отдельное окружение, имеющее свои ограничения доступа к системным плюшкам (например: доступ к IPC, доступ к канальным сокетам и др.), свое пространство пользователей и процессов, индивидуальные параметры сетевой подсистемы. Поэтому для решения подобных задач (требующих более гибкого подхода) и была разработана подсистема клеток (Jails)... На этом теория закончена, так что пора уже приступать к практике.
Все действия я буду производить на FreeBSD 7.4. Нам нужно подготовить новое окружения для клетки, для этого собираем мир и ставим его в отдельную папку. Если вы уже собирали мир (при обновлении системы или еще по какой причине), то этап компиляции можно пропустить. Так же нужно будет создать системные конфигурационные файлы для клетки. Все это делается так:
- # mkdir /home/jails/www (1)
- # cd /usr/src
- # make buildworld (2)
- # make installworld DESTDIR=/home/jails/www (3)
- # make distribution DESTDIR=/home/jails/www (4)
- # mount -t devfs devfs /home/jails/www/dev (5)
- Создаем папку, где будут находиться все файлы клетки
- Собираем мир
- Устанавливаем мир в созданную папку
- Устанавливаем конфигурационные файлы в папку клетки
- Подключаем файловую систему devfs в окружение будущей клетки, это делать не обязательно, но некоторым приложениям при сборке из портов (тот же perl, ему нужно устройство /dev/null) она необходима, да и в процессе работы некоторых приложений тоже бывает иногда нужна
- # jail -u root /home/jails/www info-x.org 192.168.7.254 /bin/csh
- Создаем файл /etc/fstab, чтобы система, при запуске клетки, не ругалась на счет его отсутствия
- Отключаем сервис rpcbind, для этого в /etc/rc.conf добавляем:
- rpcbind_enable="NO"
- Указываем сервер имен в /etc/resolv.conf
- Создаем БД алиасов для sendmail:
- # cd /etc/mail
- # make aliases
- Отключаем конфигурирование интерфейсов на этапе запуска, для этого в /etc/rc.conf добавляем:
- network_interfaces=""
- Задаем пароль пользователю root
- Устанавливаем временную зону
- inetd_enable="YES"
- inetd_flags="-wW -C 60 -a 192.168.7.254"
- jail_enable - разрешить запуск клеток
- jail_list - список клеток, разделенных пробелами
- jail_set_hostname_allow - разрешить пользователю root в клетке изменять имя хоста
- jail_socket_unixiproute_only - маршрутизировать только TCP/IP в клетке
- jail_sysvipc_allow - разрешить SystemV IPC в клетке
- jail_{jname}_rootdir - корневая папка клетки
- jail_{jname}_hostname - имя хоста в клетке
- jail_{jname}_interface - интерфейс, на котором будет создан ip-адрес
- jail_{jname}_fib - номер таблицы маршрутизации
- jail_{jname}_ip - ip-адрес клетки
- jail_{jname}_devfs_enable - монтировать devfs в клетку
- jail_enable="YES"
- jail_list="www"
- jail_set_hostname_allow="NO"
- jail_sysvipc_allow="YES"
- jail_www_rootdir="/home/jails/www"
- jail_www_hostname="info-x.org"
- jail_www_interface="sk0"
- jail_www_fib="0"
- jail_www_ip="192.168.7.254"
- jail_www_devfs_enable="YES"
- # service jail start www
- # service jail stop www
- # service jail start
- # service jail stop
- # jls
- JID IP Address Hostname Path
- 1 192.168.7.254 info-x.org /usr/home/jails/www
- # jexec -u root 1 csh
Ну вот настройка клетки закончена. Теперь можно подключиться к ней по ssh и работать как с обычной системой. Кстати, в портах есть полезные утилиты для работы с клетками во FreeBSD, например ezjail. Такие утилиты значительно упрощают процесс создания и дальнейшего сопровождения клеток. Несколько слов про обновление мира в клетке - этот процесс практически ничем не отличается от процесса обновления основной системы. Отличие заключается только в том, что в командах make installworld и mergemaster нужно будет указать путь до корневой папки клетки (make installworld DESTDIR=/path/to/jail и mergemaster -D /path/to/jail).
P.S. В восьмой ветке FreeBSD разработчики улучшили подсистему клеток, добавив новую технологию - VIMAGE, которая позволяет создавать клетки с полноценной виртуальной сетевой подсистемой, что дает возможность работать в клетке фаерволам и другим сервисам, требующих низкоуровневой работы с сетевой подсистемой.