В последней редакции этой статьи мною существенно расширена глава, посвященная вопросу корректной настройки собственно named.conf, поправлены некоторые неточности и изменены версии обсуждаемого software на актуальные на сегодняшний день. Так как содержание данного документа вышло далеко за границы вопроса chroot'изации bind, то мною было принято решение сменить его название c "Chrooted Bind" на "Securing Bind".
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 не является безусловным, однако, может упростить нашу задачу.
/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
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).
Последней директивой мы определяем местоположение дополнительного сокета, который должен прослушивать 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: