Издательский дом ООО "Гейм Лэнд"ЖУРНАЛ ХАКЕР #92, АВГУСТ 2006 г.

Тюрьма для чертенка

Евгений Зобнин ака j1m

Хакер, номер #092, стр. 092-106-2


Jail эффективно решает проблемы, связанные с проникновением непрошеных гостей в корневую машину, но совершенно беззащитен против тех, кто хочет использовать ресурсы сервера в корыстных целях. Суперпользователь вправе устанавливать лимиты, поэтому любой, получивший root'а внутри jail-окружения, сможет повесить систему при помощи пресловутой fork-бомбы. SMTP-сервер может быть использован для рассылки спама, а FTP-сервер превращен в хранилище вареза. Это не большая трагедия для администратора, который следит за своим сервером, но пустяковой ее тоже не назовешь. Частично эти проблемы можно решить, создав нечто вроде демилитаризованной зоны (DMZ) из нескольких jail'ов, но это тема для отдельной статьи.

Личный jail-сервер

Наверное, немногие из читателей могут похвастаться наличием в своем распоряжении сразу нескольких глобально маршрутизируемых IP-адресов. Поэтому jail'у придется назначить IP-адрес из сетей класса A, B или C (10.0.0.0/8, 172.16.0.0/12, 192.168.0.0/16). Пакеты с такими адресами назначения никогда не придут из внешнего мира, так как еще вначале пути будут отсечены корректно настроенным маршрутизатором. Также необходимо будет произвести трансляцию сетевых адресов (NAT) и настроить редирект входящих пакетов с определенными портами назначения на зарезервированный IP-адрес из частного диапазона. Пусть это будет, например, 192.168.3.3.

Для создания нового jail-окружения нам понадобятся исходники ОС. Из них мы соберем базовое окружение FreeBSD и установим в выделенный каталог, получив в результате копию хост-системы. Можно пойти и другим путем: скопировать все необходимое для запуска сервиса прямо из корневого каталога, но это трудозатратный и чреватый ошибками способ, поэтому его мы пока оставим. Итак, установив с диска или получив при помощи cvsup исходники, переходим в каталог /usr/src и набираем следующую последовательность команд:

КОД

Сборка jail-окружения

# JAIL=/usr/jail/192.168.3.3

# mkdir -p $JAIL

# make world DESTDIR=$JAIL

# cd etc

# make distribution DESTDIR=$JAIL

# cd $JAIL

# ln -sf /dev/null kernel

В результате каталог /usr/jail/192.168.3.3 будет содержать все необходимое для создания нового jail'а. Здесь имя каталога было выбрано в соответствии с IP-адресом, который мы вскоре назначим jail'у. На самом деле имя может быть любым, но в случае создания нескольких jail'ов ассоциация имени каталога с IP-адресом или сервисом очень помогает в администрировании.

Далее назначаем сетевому интерфейсу IP-псевдоним, адрес jail'а. IP-алиасинг выполняется при помощи команды /sbin/ifconfig:

# ifconfig ed0 inet alias 192.168.3.3 255.255.255.255

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

# echo "ifconfig_ed0_alias0=\"inet 192.168.3.3\"" >> /etc/rc.conf

Также необходимо устранить конфликты между корневой машиной и jail-окружением, изменив конфигурацию некоторых сетевых демонов:

# echo "syslogd_flags=\"-ss\"" >> /etc/rc.conf

# echo "inetd_flags=\"-wW -a <IP-адрес корневой машины>\"" >> /etc/rc.conf

Назад на стр. 092-106-1  Содержание  Вперед на стр. 092-106-3