Top News Search Software X Window System Documentation Support Home

Securing Bind

Максим Коновалов, maxim@FreeBSD.org,
2000-2002 гг.

Содержание

Введение

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

В последней редакции этой статьи мною существенно расширена глава, посвященная вопросу корректной настройки собственно named.conf, поправлены некоторые неточности и изменены версии обсуждаемого software на актуальные на сегодняшний день. Так как содержание данного документа вышло далеко за границы вопроса chroot'изации bind, то мною было принято решение сменить его название c "Chrooted Bind" на "Securing Bind".

Реквизиты

Все дальнейшие рассуждения ведутся для OS FreeBSD 5.0-CURRENT и bind 8.3.4.

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

Перейдем в каталог /usr/ports/net/bind8, выкачаем tarball с исходными текстами, распакуем его и наложим FreeBSD-специфичные патчи:

cd /usr/ports/net/bind8/
make PORT_REPLACES_BASE_BIND8=yes clean patch

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

'CDEBUG= -O2 -pipe -mcpu=pentiumpro -W -Wall -Wmissing-prototypes -Wcast-qual -Wwrite-strings -Wformat'

заменим на

'CDEBUG= -O2 -pipe -static -mcpu=pentiumpro -W -Wall -Wmissing-prototypes -Wcast-qual -Wwrite-strings -Wformat',

a в файле work/src/bin/named/pathtemplate.h строку

#define _PATH_NDCSOCK "%DESTRUN%/ndc"

на

#define _PATH_NDCSOCK "/chroot/named/var/run/ndc".

Соберем и установим named:

make PORT_REPLACES_BASE_BIND8=yes install clean

Требование статически собранных исполняемых файлов named и named-xfer не является безусловным, однако, может упростить нашу задачу.

Строим sandbox

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

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

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

/
     сюда скопируем из дерева исходных текстов 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 var/log

Дополнительные опции для 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;
     };
     

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

Определим acl, в который будут входить "доверенные" сети и хосты:

     acl "trusted" {
	localhost;
	192.168.1.0/24;
     };
     
Таким образом, доверенными являются localhost и сеть, хосты в которой пользуются услугами нашего nameserver.

В секцию options добавим следующие директивы:

     options {
	...
	allow-query { trusted; };
	allow-transfer { none; };
	allow-recursion { trusted; };
	...
     };
     
Данные директивы определяют поведение bind по умолчанию (запросы разрешены только для "доверенных" хостов, трансфер зон запрещен, рекурсивные запросы разрешены только для "доверенных" хостов), которое можно переопределить для каждой зоны в соответствующей секции zone. В частности, для зон, для которых наш bind является slave, необходимо явно разрешить запросы c любым ip src address. Для master-зон (кроме зоны 0.0.127.in-addr.arpa) дополнительно к этому необходимо разрешить трансфер зонных файлов с ip src addresses наших slave ns:
     zone "example.com" {
	type master;
	file "primary/example.com";
        allow-query { any; };
	allow-transfer { localhost; 192.168.0.1; };
     };

     zone "5.168.192.in-addr.arpa" {
	type slave;
	file "secondary/0.126.in-addr.arpa";
        masters { 192.168.5.1; };
	allow-query { any; };
	allow-transfer { localhost; };
     };
     
По умолчанию версию bind можно узнать с любого хоста в internet выполнив команду:

$ dig @our.name.server version.bind chaos txt

или

$ host -t txt -c chaos version.bind our.name.server

Хотя security by obscurity не может являться основной политикой обеспечения security, покажем здесь как разрешить такие запросы только с "доверенных" хостов. Для этого в named.conf необходимо внести описание зоны bind:

     // Control access to BIND version number to
     // users at example.com only.
     // Ref: BUGTRAQ posting from LaMont Jones on 1998-06-12.

     zone "bind" chaos {
	type master;
	file "primary/bind";
        allow-query { trusted; };
	allow-transfer { none; };
     };
     
и создать собственно зонный файл:
     ; File primary/bind
     $TTL 3600
     $ORIGIN bind.
     @	1D	CHAOS	SOA	localhost.	root.localhost. (
	1	; serial
	3H	; refresh
        1H	; retry
	1W	; expiry
	1D )	; minimum
     CHAOS NS	localhost.
     ; EOF
     
Немаловажным моментом при настройке и сопровождении bind является возможность ведение логфайлов. В рассматриваемой версии bind существует гибкая и мощная система ведения логов. Покажем основные приемы:
     logging {
	channel default_ch {
		file "/var/log/named.log" versions 3 size 100k;
		severity info;
		print-time yes;
                print-category yes;
	};

	channel security_ch {
		file "/var/log/security.log" versions 3 size 100k;
                severity info;
		print-time yes;
		print-category yes;
	};

	category default { default_ch; };
        category security { security_ch; };
     };
     
Таким образом мы определили два канала: default_ch и security_ch, туда будет попадать соответствующая их названиям информация с уровнем важности info. Не забудьте определить желаемую политику ротации этих файлов посредством директив versions (количество ротаций) и size (размер файла). В качестве альтернативы можно использовать newsyslog(8).

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

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

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

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

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

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

Запускаем named:

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

и проверяем:

# /usr/sbin/ndc getpid

Для запуска и перезапуска можно использовать командy:

# /usr/sbin/named.restart

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

Как Вы уже поняли, управлять нашим named теперь нужно командой ndc [command]. Любители low level interface могут предпочесть telnet /chroot/named/var/run/ndc. Дополнительно обратите внимание на команды named.restart(8) и named.reload(8). После того, как мы убедились, что наш новый nameserver работает исправно, нужно навести порядок в нашем королевстве, а именно:

Ссылки