Руководство FreeBSD

         

Запуск 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

# chown bind:bind slave var/*

Программе named нужен доступ с правом записи в эти каталоги, так что это все, что мы ей предоставим.

Измените и создайте базовые файлы зоны и настроек:

# cp /etc/localtime etc

# 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 должен заработать в песочнице!


Содержание раздела