В последней редакции этой статьи мною существенно расширена глава, посвященная вопросу корректной настройки собственно 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: