Виртуализация в FreeBSD (Jails)

Обновление 06.04.2024. Обновленную версию статьи про подсистему клеток во FreeBSD можно найти здесь.

 

Подсистема клеток (Jails) во FreeBSD появилась еще в 4-ой ветке, а в 5-ой была значительно переработана и усовершенствована, что сделало ее очень мощной и гибкой. В основу клеток положена системная команда chroot, которая устанавливает для процессов корневую папку и создает безопасное окружение,  тем самым повышая надежность основной системы. Процессы, работающие в ограниченном окружении не могут получить доступ к файлам и ресурсам, находящимися за его пределами. Главный плюс такого подхода заключается в том, что атакующий взломав сервис, работающий в ограниченном окружении, не сможет скомпрометировать основную систему. Но такой метод подходит только для решения простых задач, так как с помощью него нельзя сделать отдельное окружение, имеющее свои ограничения доступа к системным плюшкам (например: доступ к IPC, доступ к канальным сокетам и др.), свое пространство пользователей и процессов, индивидуальные параметры сетевой подсистемы. Поэтому для решения подобных задач (требующих более гибкого подхода) и была разработана подсистема клеток... На этом теория закончена, так что пора уже приступать к практике.

Все действия я буду производить на 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)

Что же здесь происходит:

  1. Создаем папку, где будут находиться все файлы клетки
  2. Собираем мир
  3. Устанавливаем мир в созданную папку
  4. Устанавливаем конфигурационные файлы  в папку клетки
  5. Подключаем файловую систему devfs в окружение будущей клетки, это делать не обязательно, но некоторым приложениям при сборке из портов (тот же perl, ему нужно устройство /dev/null) она необходима, да и в процессе работы некоторых приложений тоже бывает иногда нужна

Ну вот необходимые файлы для работы клетки созданы, теперь нужно предварительно ее настроить. Заходим в клетку под рутом:

# jail -u root /home/jails/www info-x.org 192.168.7.254 /bin/csh

Несколько слов про аргументы команды: в первом аргументе указывается имя пользователя, во втором путь до клетки, в третьем имя хоста, в четвертом ip-адрес клетки, а в пятом команда, которую необходимо запустить. Теперь приступаем к настройке:

  • Создаем файл /etc/fstab, чтобы система, при запуске клетки, не ругалась на счет его отсутствия
  • Отключаем сервис rpcbind, для этого в /etc/rc.conf добавляем: rpcbind_enable="NO"
  • Указываем сервер имен в /etc/resolv.conf
  • Создаем БД алиасов для sendmail:
    • # cd /etc/mail
      # make aliases
  • Отключаем конфигурирование интерфейсов на этапе запуска, для этого в /etc/rc.conf добавляем: network_interfaces=""
  • Задаем пароль пользователю root
  • Устанавливаем временную зону

Так же можно поднять сервис ssh в клетке, чтобы можно было ее удаленно админить. Учтите, что все сервисы должны быть привязаны только к одному ip-адресу - ip-адресу клетки. Я обычно запускаю сервер ssh через inetd, поэтому в /etc/rc.conf в клетке у меня такие строки:

inetd_enable="YES"
inetd_flags="-wW -C 60 -a 192.168.7.254"

Ну вот, предварительная настройка клетки закончена, теперь пора запускать ее как полноценное виртуальное окружение. Чтобы клетка автоматом запускалась при старте системы, нужно /etc/rc.conf добавить несколько строк. Некоторые доступные параметры для управления клетками:

  • 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 в клетку

Вот, что я добавил в /etc/rc.conf:

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:

# 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, которая позволяет создавать клетки с полноценной виртуальной сетевой подсистемой, что дает возможность работать в клетке фаерволам и другим сервисам, требующих низкоуровневой работы с сетевой подсистемой.

Добавить комментарий

CAPTCHA
Этот вопрос задается для того, чтобы выяснить, являетесь ли Вы человеком или представляете из себя автоматическую спам-рассылку.
Яндекс.Метрика