Разделяй и властвуй
Jail позволяют разделить выполнение различных процессов. Например, вы можете держать Apache в jail и не бояться, что потеряете всю систему целиком в случае его компрометации. Jail может быть как полнофункциональной системой, так и набором только необходимых файлов.
Я недавно приобрел машину Pentium 4 2.4GHz, это довольно мощная система, у нее много ресурсов и довольно высокое время простоя, так как я ее использую в личных целях. Вот на ней я и создам jail, в который помещу Bacula.
Находясь внутри jail невозможно попасть на уровень выше, что очень похоже на поведение chroot, но в тоже самое время, создается впечатление работы с собственной полноценной операционной системой.
Запуск виртуальной системы в jail является хорошим выбором при необходимости предоставить кому-либо ресурсы системы без права хозяйничать в ней. Jail может помочь вам решить проблему безопасного доступа пользователей и повысить КПД использования ресурсов системы.
Документация по Jail
Основным документом, описывающим механизм jail, является man jail. Далее я следовал инструкциям, описанным в разделе «Setting up a Jail Directory Tree». В процессе настройки вам понадобятся полные исходные тексты системы, в моем примере для сборки мира использовался каталог /usr/src/.
Был шаг, в котором я отступил от указаний man jail: я оставил Sendmail (в действительности Postfix) запущенным, указав, какие конкретно IP адреса прослушивать, в файле /usr/local/etc/postfix/main.cf:
Таким образом мы обеспечим работу в jail собственного почтового сервера.
Я поместил свою jail в каталог /home/jail/192.168.0.155.bacula. Это значение, которое я присвоил переменной D, согласно инструкции по установке:
После того, как вы установили jail, она выглядит точно так же как корневой каталог типичной системы FreeBSD:
Терминология: Host и Jail
Host — это та машина, на которой вы первоначально устнавливаете FreeBSD, именно в этом окружении вы устанавливаете jail. И Bacula, установленная в jail не будет иметь ни какого доступа к корневой системе.
Очень важно понимать различие в окружении корневой машины и окружении jail.
В нашем примере, корневая машина имеет IP адрес 192.168.0.100, а jail имеет адрес 192.168.0.155.
Модифицируем демоны
Большинство демонов будет слушать все, назначенные системе IP адреса. Например, если после установки jail вы попробуете войти на нее по ssh, то вы попадете на корневую машину. Для того, чтобы все работало как надо, необходимо:
В файл конфигурации /etc/rc.conf поместите следущую строку:
Она укажет демону syslogd корневой машины не открывать UDP порт для приема сообщений с удаленных систем, что позволит запустить syslogd в окружении jail.
Настройка inetd корневой системы заключается в том, чтобы прописать в /etc/rc.conf строку:
Обратите внимание, что первая половина взята из /etc/defaults/rc.conf:
Настройка sshd корневой системы потребует прописать в /etc/ssh/sshd_config такой параметр:
Внеся изменения, необходимо перезапустить процесс:
Для проверки того, что IP адрес jail не прослушивается в настоящий момент корневой системой, воспользуйтесь утилитой telnet:
Если результат такой, как указано выше, то вы все сделали правильно.
Для запуска sshd в окружении jail необходимо отредактировать файл rc.conf обычным порядком:
Для того, я изменил конфигурацию syslogd jail таким образом, чтобы он выводил сообщения не на консоль, а в /var/log/messages, добавив следущие строки:
Конфигурирование jail
Настала пора прочитать часть руководства man, озаглавленную «Configuring the Jail». В ней рассказано, как сконфигурировать несколько параметров, необходимых для функционирования jail. Я внес изменения с корневой машины, без запуска jail. Запустить оболочку в jail можно следующей командой:
Если не появилось сообщение о ошибках, то вы попадете в оболочку jail. Вы можете запустить утилиту /usr/sbin/sysinstall для дальнейшего конфигурирования или вручную отредактировать /etc/rc.conf. Изменить можно такие параметры как:
Автоматический запуск и останов jail
Я нашел довольно интересный инструментарий для работы с jail — sysutils/jailutils и установил его в корневую систему. Используя этот инструмент, я создал следущий сценарий:
Это довольно примитивный сценарий, например, он не проверяет, запущена ли в настоящий момент jail или нет.
В заключение, возможно вы захотите выставить эту переменную в /etc/sysctl.conf корневой машины:
В версиях 4.* FreeBSD эта переменная имела несколько другое название.