Библиотека сайта rus-linux.net
Сетевые серверы: DNS
Обзор
DNS чрезвычайно важный сервис для IP сетей. Однако, данные на сервере DNS могут оказаться ложными. Сейчас все идет к цифровой подписи таких данных, что будет подтверждать их подлинность (метод базируется на цифровой подписи RSA).
DNS-серверы
Bind
Большинство дистрибутивов включают bind 8.x, однако ни один (насколько мне известно) не использует установку для не-root, по умолчанию использован chroot. Исправить данное упущение просто:
-u
указывает с каким UID bind будет работать как только свяжется с портом
53 (я использую пользователя 'named' без каких-либо прав, аналог 'nobody').
-g
указывает с каким GID bind будет работать как только свяжется с портом
53 (я использую группу 'named'без каких-либо прав, аналог 'nobody').
-t
указывает каталог, который bind будет использовать после запуска, в этом
каталоге, Вы должны разместить все нужные для bind библиотеки, и файлы
конфигурации. Хорошим выбором является /home/named.
Еще один способ: скачать пакет bind-chroot, доступный для большинства дистрибутивов и поставить его. Перед установкой создайте (можно с помощью groupadd и useradd) группу и пользователя, на UID/GID которых bind сменит свои после запуска. Многие пакеты используют holelogd для протоколирования данных bind в /var/log/messages (нормальный режим работы bind). Файл настроек обычно безопасен (то есть, Вы не сможете запросить версию bind).
Другой аспект bind: он хранит данные о Вашей сети. Когда делается запрос DNS обычно посылается маленькая просьба о части информации. Например, что является адресом IP для www.seifried.org? Но есть доменные запросы, где DNS запрашивает всю информацию для, скажем, seifried.org, захватывает ее и может затем делать ее доступной другому (в случае вторичного DNS-сервера). Это потенциально очень опасно. Bind версии 4 толковой защиты не имел. Вы могли ограничивать передачи некоторым сервером, но толку было мало. Это изменилось в Bind 8, документация есть на http://www.isc.org/bind.html. Помните, что обезопасить придется ВСЕ зональные серверы (как master, так и secondaries), поскольку secondary могут прекрасно передать данные за пределы зоны.
Имеется относительно безопасный файл named.conf (из пакета bind-chroot с ftp://ftp.tux.org):
options { // The following paths are necessary for this chroot directory "/var/named"; dump-file "/var/tmp/named_dump.db"; // _PATH_DUMPFILE pid-file "/var/run/named.pid"; // _PATH_PIDFILE statistics-file "/var/tmp/named.stats"; // _PATH_STATS memstatistics-file "/var/tmp/named.memstats"; // _PATH_MEMSTATS // End necessary chroot paths check-names master warn; /* default. */ datasize 20M; }; zone "localhost" { type master; file "master/localhost"; check-names fail; allow-update { none; }; allow-transfer { any; }; }; zone "0.0.127.in-addr.arpa" { type master; file "master/127.0.0"; allow-update { none; }; allow-transfer { any; }; }; // Deny and log queries for our version number except from localhost zone "bind" chaos { type master; file "master/bind"; allow-query { localhost; }; }; zone "." { type hint; file "named.zone"; }; zone "example.org" { type master; file "zones/example.org"; allow-transfer { 10.2.1.1; 10.3.1.1; }; };
DNS работает на порте 53, используя протоколы udp и tcp, udp используется для нормальных запросов (это легко и быстро), tcp используется для зональных передач и больших запросов (скажем, dig www.microsoft.com). Таким образом, firewalling tcp относительно безопасен и определенно остановит любые зональные передачи, но случайный запрос DNS не сможет работать. Лучше использовать named.conf, чтобы управлять зональными передачами.
ipfwadm -I -a accept -P tcp -S 10.0.0.0/8 -D 0.0.0.0/0 53 ipfwadm -I -a accept -P tcp -S some.trusted.host -D 0.0.0.0/0 53 ipfwadm -I -a deny -P tcp -S 0.0.0.0/0 -D 0.0.0.0/0 53
или
ipchains -A input -p tcp -j ACCEPT -s 10.0.0.0/8 -d 0.0.0.0/0 53 ipchains -A input -p tcp -j ACCEPT -s some.trusted.host -d 0.0.0.0/0 53 ipchains -A input -p tcp -j DENY -s 0.0.0.0/0 -d 0.0.0.0/0 53
Блокирует зональные передачи и большие запросы, следующие команды блокируют нормальные запросы (но не зональные передачи, так что при блокировке не забывайте использовать оба набора правил):
ipfwadm -I -a accept -P udp -S 10.0.0.0/8 -D 0.0.0.0/0 53 ipfwadm -I -a accept -P udp -S some.trusted.host -D 0.0.0.0/0 53 ipfwadm -I -a deny -P udp -S 0.0.0.0/0 -D 0.0.0.0/0 53
или
ipchains -A input -p udp -j ACCEPT -s 10.0.0.0/8 -d 0.0.0.0/0 53 ipchains -A input -p udp -j ACCEPT -s some.trusted.host -d 0.0.0.0/0 53 ipchains -A input -p udp -j DENY -s 0.0.0.0/0 -d 0.0.0.0/0 53
Chroot'ing DNS
http://www.etherboy.com/dns/chrootdns.html
Dents
Dents представляет собой DNS-сервер, доступный по GPL, в настоящее время находится на тестировании (release 0.0.3). Dents написан с нуля с поддержкой SQL backends, интеграции с SNMP и использует CORBA для своих задач. В целом это должно создать хорошую конкуренцию Bind. Dents доступен на http://www.dents.org.
Written by Kurt Seifried