Top News Search Software X Window System Documentation Support Home

Chrooted Bind - FreeBSD Version

Максим Коновалов, cr0n@chat.ru

Содержание

Введение

Данный текст описывает необходимые шаги для запуска bind в chrooted environment. Обращаю внимание, что эти действия являются исключительно дополнительными мерами безопасности и эффективны только в сочетании с другими мероприятиями по обеспечению security Вашего dns-сервера. Этот текст является вольным пересказом статьи Craig H. Rowland Securing DNS, но не ограничивается ею. Все Ваши пожелания, уточнения и исправления я с благодарностью выслушаю и внесу необходимые коррективы. Ваши исправления особенно ценны, так как статья, посвященная вопросам безопасности, не должна содержать ошибок по определению.

Реквизиты

Все дальнейшие рассуждения ведутся для OS FreeBSD 4.0-current и bind 8.2.2-P5. Если у Вас установлены полные исходные тексты FreeBSD, то в каталоге /usr/src/contrib/bind размещены все необходимые для нашей работы файлы. Особо обращаю Ваше внимание, что в каталоге /usr/src/contrib/bind/doc располагается документация для настройки bind. В случае отсутствия по каким либо причинам дерева исходных текстов, необходимо взять исходные тексты bind 8.2.2-P5 на сайте Internet Software Consortium. Не забудьте и документацию.

Статическая линковка

Распакуем и установим bind 8.2.2-P5 согласно инструкции в файле INSTALL. Теперь нам необходимо собрать статически слинкованные версии named и named-xfer. Для этого надо перейти в каталог src/port/freebsd дерева исходных текстов bind и отредактировать файл Makefile.set. Произведем следующие изменения:

строку

'CDEBUG= -O2 -g'

заменим на

'CDEBUG= -O2 -static'

Перейдем в корневой каталог дерева исходных текстов bind и произведем компиляцию и сборку: make clean && make. Требование статически собранных исполняемых файлов named и named-xfer не является обязательным, однако, может упростить нашу задачу. Более того, Craig H. Rowland рекомендует все сетевые демоны собирать статическими.

Строим sandbox

Теперь наша задача подготовить структуру каталогов для нашего chrooted bind. Допустим, каталог /chroot/named будет корневым каталогом нашего bind sandbox. В этом каталоге необходимо создать следующую структуру директорий:

/dev
/etc
     /namedb
/usr
     /libexec
/var
     /run
     /stat

Для каждого директория проделаем необходимые действия:

/
     сюда скопируем из дерева исходных текстов bind src/bin/named статически слинкованный исполняемый файл named

/etc
     скопируем named.conf из /etc
     скопируем localtime из /etc для корректного отображение Вашей таймзоны в сообщениях syslog
     скопируем файлы passwd и group из /etc и удалим из них записи о реальных пользователях

/etc/namedb
     сюда поместим все файлы зон из /etc/namedb. Если Ваш nameserver является slave, то Вам необходимо сделать данный каталог доступным для записи для uid bind: chown bind.bind etc/namedb. Другое решение - создать специальный каталог для хранения файлов зон, для которых Ваш nameserver является slave: mkdir etc/namedb/slave; chown bind.bind etc/namedb/slave

/dev
     mknod dev/null c 2 2; chmod 666 dev/null

/usr/libexec
     скопируем из дерева исходных текстов bind src/bin/named-xfer статически слинкованный исполняемый файл named-xfer

/var
     chown bind.bind var/run var/stat

Дополнительные опции для bind

Теперь немного поговорим о некоторых полезных опциях в named.conf. Рекомендуется добавить в секцию options следующие записи, которые определяют, где named будет создавать различные служебные файлы:
     options {
             ...
             dump-file "/var/stat/named.dump";
             memstatistics-file "/var/stat/named.mem";
	     pid-file "/var/run/named.pid";
	     statistics-file "/var/stat/named.stat";
	     ...
     };
     

И в секцию controls:

     controls {
	     unix "/var/run/ndc" perm 0600 owner 0 group 0;
     };
     

Здесь мы определяем служебный канал FIFO, через который name daemon control programm ndc будет взаимодействовать с named. Дело в том, что, согласно man 8 ndc, метод управления named через отправку ему сигналов признан устаревшим и будет полностью удален в следующий версиях bind. Мы имеем возможность назначить владельца и права для управляющего канала, что дает возможность делегировать управление named непривилегированным пользователям. Обратите внимание на ведущий ноль в permissions и на числовые id.

Корректируем стартовые скрипты

В файле /etc/rc.local.conf создадим и/или отредактируем следующие записи:

named_enable="YES"
named_program="/chroot/named/named"
named_flags="-u bind -g bind -t /chroot/named -b /etc/named.conf"
syslogd_flags="-l /chroot/named/dev/log"

Последней директивой мы определяем местоположение дополнительного сокета, который должен прослушивать syslogd и в который будет писать syslog-информацию named.

После этих модификаций необходимо перезапустить syslogd:

# kill `cat /var/run/syslogd.pid`; /usr/sbin/syslogd -l /chroot/named/dev/log

Запускаем named:

# /chroot/named/named -u bind -g bind -t /chroot/named -b /etc/named.conf

и проверяем:

# /usr/sbin/ndc -c /chroot/named/var/run/ndc getpid

Последние штрихи

Как Вы уже поняли, управлять нашим named теперь нужно командой ndc -c /chroot/named/var/run/ndc [command]. После того, как мы убедились, что наш новый nameserver работает исправно, нужно навести порядок в нашем королевстве, а именно:

Ссылки