Запуск named в песочнице
Для дополнительной безопасности вам может потребоваться запускать named(8) с правами непривилегированного пользователя и настроить его на выполнение chroot(8) в каталог-песочницу. Это позволит сделать недоступным для даемона named все, что расположено вне песочницы. Если named будет взломан, то это поможет уменьшить возможный ущерб. По умолчанию во FreeBSD имеются пользователь и группа с именами bind, которые предназначены именно для такого использования.
Замечание: Многие рекомендуют вместо настройки named
на использование chroot, запускать named внутри jail(8). В этом разделе такой подход не рассматривается.
Так как named не сможет обратиться ни к чему вне песочницы (например, совместно используемым библиотекам, сокетам протоколов и так далее), то нужно выполнить несколько шагов, чтобы named смог работать нормально. В следующем списке предполагается, что каталогом песочницы является /etc/namedb и что вы не делали никаких изменений в содержимом этого каталога. Выполните следующие шаги, работая как пользователь root:
Создайте все каталоги, которые ожидает увидеть named:
# cd /etc/namedb
# mkdir -p bin dev etc var/tmp var/run master slave
Программе named нужен доступ с правом записи в эти каталоги, так что это все, что мы ей предоставим.
Измените и создайте базовые файлы зоны и настроек:
# mv named.conf etc && ln -sf etc/named.conf
# mv named.root master
# sh make-localhost && mv localhost.rev localhost-v6.rev master
# cat > master/named.localhost $ORIGIN localhost. $TTL 6h @ IN SOA localhost. postmaster.localhost. ( 1 ; serial 3600 ; refresh 1800 ; retry 604800 ; expiration 3600 ) ; minimum IN NS localhost. IN A 127.0.0.1 ^D
Это позволит программе named протоколировать правильное время в .
Если вы используете FreeBSD версии ранее 4.9-RELEASE, то постройте статически скомпонованную копию named-xfer и скопируйте её в песочницу:
# cd /usr/src/lib/libisc
# make cleandir && make cleandir && make depend && make all
# cd /usr/src/lib/libbind
# make cleandir && make cleandir && make depend && make all
# cd /usr/src/libexec/named-xfer
# make cleandir && make cleandir && make depend && make NOSHARED=yes all
# cp named-xfer /etc/namedb/bin && chmod 555 /etc/namedb/bin/named-xfer
После установки статически скомпонованного named-xfer, во избежание появления старых копий библиотек и программ в дереве исходного кода, требуется некоторая зачистка:
# cd /usr/src/lib/libisc
# make cleandir
# cd /usr/src/lib/libbind
# make cleandir
# cd /usr/src/libexec/named-xfer
# make cleandir
Иногда при выполнении этого шага возникают ошибки. Если это случилось, выполните такую команду:
# cd /usr/src && make cleandir && make cleandir
и удалите ваше дерево /usr/obj:
# rm -fr /usr/obj && mkdir /usr/obj
При этом из вашего дерева исходных текстов будет удалён весь ``мусор'', и повторение вышеописанных шагов должно выполниться успешно.
Если вы используете FreeBSD 4.9-RELEASE или более позднюю версию, то копия named-xfer в каталоге /usr/libexec по умолчанию является статически скомпонованной, и вы можете просто скопировать её в песочницу при помощи команды cp(1).
Создайте файл устройства dev/null, который named может видеть и писать в него:
# cd /etc/namedb/dev && mknod null c 2 2
# chmod 666 null
Создайте символическую ссылку /var/run/ndc на /etc/namedb/var/run/ndc:
# ln -sf /etc/namedb/var/run/ndc /var/run/ndc
Замечание: Это просто для того, чтобы не задавать опцию -c при каждом запуске ndc(8). Так как содержимое каталога /var/run удаляется при загрузке, и если это показалось вам полезным, то вы можете добавить эту команду в crontab для root с использованием параметра @reboot. Обратитесь к справочной странице по crontab(5) для получения более полной информации относительно этого.
Настройте на создание дополнительного протоколирующего сокета log, в который может писать named. Для этого добавьте -l /etc/namedb/dev/log к переменной syslogd_flags из файла /etc/rc.conf.
Задайте запуск named и выполнение chroot в песочницу, добавив следующее в /etc/rc.conf:
named_enable="YES" named_flags="-u bind -g bind -t /etc/namedb /etc/named.conf"
Замечание: Заметьте, что конфигурационный файл /etc/named. conf именуется по полному имени относительно песочницы, то есть в вышеприведённой строке указывается файл, который на самом деле является файлом /etc/namedb/etc/named.conf.
Следующим шагом является редактирование файла /etc/namedb/etc/named.conf так, чтобы named знал, какую зону загружать и где найти их на диске. Далее следует прокомментированный пример (все, что специально не прокомментировано, ничем не отличается от настройки сервера DNS, работающего не в песочнице):
options { directory "/";
named-xfer "/bin/named-xfer";
version ""; // Не выдавайте версию BIND query-source address * port 53; }; // управляющий сокет ndc controls { unix "/var/run/ndc" perm 0600 owner 0 group 0; }; // Далее следуют зоны: zone "localhost" IN { type master; file "master/named.localhost";
allow-transfer { localhost; }; notify no; }; zone "0.0.127.in-addr.arpa" IN { type master; file "master/localhost.rev"; allow-transfer { localhost; }; notify no; }; zone "0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.ip6.int" { type master; file "master/localhost-v6.rev"; allow-transfer { localhost; }; notify no; }; zone "." IN { type hint; file "master/named.root"; }; zone "private.example.net" in { type master; file "master/private.example.net.db"; allow-transfer { 192.168.10.0/24; }; }; zone "10.168.192.in-addr.arpa" in { type slave; masters { 192.168.10.2; }; file "slave/192.168.10.db";
};
В директиве directory указан каталог /, так как все файлы, которые нужны для named, находятся внутри этого каталога (вспомните, что это равнозначно ``обычному'' пользовательскому /etc/namedb).
Задает полный путь к двоичному выполнимому файлу named-xfer
(внутри границ видимости named). Это необходимо, так как named компилируется с тем, чтобы брать named-xfer по умолчанию из /usr/libexec.
Задает имя файла (относительно директивы directory выше), в котором named может найти файл зоны для этой зоны.
Задает имя файла (относительно директивы directory выше), в котором named должен записывать копию файла зоны для этой зоны после успешной передачи ее с основного сервера. Вот почему нам нужно изменить владельца каталога slave на bind на этапах настроек выше.
После выполнения шагов выше либо перезагрузите ваш сервер, либо перезапустите syslogd(8) и запустите , не забыв использовать новые опции, заданные в syslogd_flags и named_flags. Теперь named должен заработать в песочнице!