Ключевые слова:dns, log, (найти похожие документы)
From: Denis Frolov
Date: Mon, 9 Nov 2008 17:02:14 +0000 (UTC)
Subject: Журналирование событий и обеспечение безопасности DNS сервера
Оригинал: http://www.redhat-club.org/Articles/DenisFrolov/DNSConfiguration
Введение
--------
Bind - это наиболее популярная реализация DNS сервера. Данный пакет
входит в состав абсолютного большинства unix систем. Сайт проекта BIND
www.isc.org. DNS сервер BIND уже есть в вашем дистрибутиве.
Проверьте установленны ли пакеты bind и bind-chroot командами:
rpm -q bind
rpm -q bind-chroot.
В данном руководстве указаны опции которые необходимо указать DNS
серверу для обеспечения безопасности его функционирования.
Журналирование событий
Для своевременного реагирования на проблемы связанные с
функционированием DNS сервера крайне важно вести журналирование событий
Bind. Пакет Bind предоставляет администратору обширные возможности по
настройке системы регистрации событий. Т.к. в стандартной конфигурации
named настроен без включенной системы логирования и работает named в
chroot окружении, то вам необходимо сделать некоторые дополнительные
действия:
В каталоге /var/named/chrrot/var создать каталог log в котором создайте
каталог named.
Создайте в каталоге /var/named/chroot/var/log/named файлы:
xfer.log,lamers.log,conf.log, security.log.
Установите права на эти файлы в 644 и установите владельца и группу на
эти файлы named.named
cd /var/named/chrrot/var/log/named
touch xfer.log
touch lamers.log
touch conf.log
touch security.log
chmod 644 *
chown named.named *
logging{
channel "xfer" {
file "/var/log/named/xfer.log" versions 3 size 10m;
print-time yes;
print-severity yes;
severity info;
};
channel "lame" {
file "/var/log/named/lamers.log" versions 2 size 10m;
print-time yes;
print-severity yes;
severity info;
};
channel "config" {
file "/var/log/named/conf.log" versions 3 size 10m;
print-time yes;
print-severity yes;
severity info;
};
channel "security" {
file "/var/log/named/security.log" versions 3 size 10m;
print-time yes;
print-severity yes;
severity info;
};
//События связанные с получением зон
category "xfer-in" { "xfer"; };
//События связанные с передачей зон
category "xfer-out" { "xfer"; };
//События связанные с изменениями в зонах
category "notify" { "xfer"; };
//События связанные с некорректным делегированием
category "lame-servers" { "lame"; };
//События связанные с обработкой файла конфигурации
category "config" { "config"; };
//События связанные с запрещением/разрешением запросов
category "security" { "security"; };
//Если для события канал не определен
category "default" { "default_syslog"; "default_debug"; };
};
Рассмотрим подробней один из каналов. Параметр file "имя" задает с
каком файле будет храниться информация попадающая в данный канал. Опция
version указывает уровень ротации данного канала, т.е.при достижении
лимита указанного в параметре size файл переименовывается в "имя".0,
"имя".1 и т.д. Для каждого из каналов в опции severity возможно указать
события какой степени важности записывать в лог. Возможно указать
следующие уровни:
1. critical ,
2. error ,
3. warning ,
4. notice ,
5. info ,
6. debug ,
7. dynamic .
При указании уровня все события этого и вышестоящих уровней будут
записываться в файл регистрации. Опция print-time yes; указывает на то,
что в файле регистрации события должно указываться время в которое
данное событие произошло. Опция print-severity yes; указывает DNS
серверу записывать в файл регистрации уровень важности события.
Рекомендуемые опции для обеспечения безопасности
Для сокрытия версии bind в секции options добавьте строку version "DNS
Server";
Для разрешения запросов только из своих сетей добавьте следующую строку
allow-query { Список сетей; }; в секцию options. Если ваш DNS сервер
является либо master либо slave для какой-либо зоны то Вам необходимо
разрешить запросы для всех ip адресов. Данная опция разрешает запросы к
DNS серверу только с ip адресов указанных в скобках.
Для разрешения рекурсивных запросов добавьте allow-recursion { Список
сетей; }; Обратите внимание на эту очень важную опцию. С помощью ее вы
указываете своему серверу кому можно разрешать имена internet используя
ваш DNS сервер. Обязательно используйте эту опцию, иначе вы можете
столкнуться с ситуацией, когда запросами на разрешение имен к вашему
DNS серверу будет сгенерированн большой объем входящего трафика за
который в конечном итоге ваш провайдер заставит вас расчитаться (если у
вас не безлимитный тариф конечно), либо ваш DNS сервер будет сильно
загружен запросами на разрешение имен DNS, Данную опцию следует
включить только для довереных сетей, без указания данной опции ваши
клиенты не смогут делать преобразование символьных адресов в ip адреса.
Если вы ведете master зону для домена, тогда для обновления информации
о изменениях внесенных в файл зоны вам необходимо разрешить передачу
зоны для slave серверов указанных у регистратора домена. Делается это
опцией allow-transfer {список ip адресов slave серверов;}; Если вы
ведете slave зону для какого-нибудь домена необходимо указать опцию
allow-transfer { none; };. Данные опции могут задаваться как глобально
в секции options так и для каждой зоны в отдельности.
В случае если вы оплачиваете входящий либо исходящий трафик своему
провайдеру, но ваш провайдер разрешил вам использовать его DNS сервера
и стоимость обмена трафиком с данными серверами гораздо ниже чем
глобальный трафик, либо обмен трафиком с данными серверами бесплатен,
то я рекомендую использовать опции: forwarders {первый dns провайдера;
второй dns провайдера;}; forward only;
Данными параметрами Вы указываете вашему серверу BIND использовать DNS
сервера провайдера для разрешения имен. Если Вы вместо forwarders only;
укажете forward first; , то ваш DNS сервер будет пытаться разрешать
имена с помощью DNS серверов указанных в параметре forwarders, и лишь в
случае если разрешить имя с помощью данных серверов не удалось, то
будет осуществлять попытки разрешения имени самостоятельно.
В случае если ваш DNS сервер ведет несколько master зон имеет смысл
установить ограничение на количество одновременных передач зон для
каждого запрашивающего данные сервера. Делается это для того чтобы ваш
DNS сервер не был загружен запросами на передачу зон. Для установки
данного ограничения установите опцию transfers-per-ns 2; в секции
options, тем самым мы разрешили одновременную передачу 2 зон для
каждого slave сервера. В случае если ваш сервер обслуживает несколько
сотен зон имеет смысл увеличить значение данного параметра.
Можно также установить максимальное значение одновременно запрашиваемых
зон вашим DNS сервером, за это отвечает параметр transfers-in 5; в
секции options.
Можно также установить значение одновременно запрашиваемых зон у вашего
DNS сервера, за это отвечает параметр transfers-out 5; в секции
options.
Для того чтобы задать время в минутах которое DNS сервер может
потратить на получение зоны с первичного DNS сервера служит параметр
max-transfer-time-in 60;. Если по истечении времени зона так и не будет
получена с первичного DNS сервера, то наш DNS сервер автоматически
разорвет сессию.
Для задание максимального времени на передачу зоны slave серверам
служит параметр max-transfer-time-out 60;.
Интервал обновления зоны может быть очень маленьким, таким образом
вторичные DNS сервера будут зачастую выполнять ненужную работу. Для
установления ограничений на минимальное и максимальное кол-во передач
зоны можно использовать параметры:
max-refresh-time 86400; // обновлять зону не реже чем раз в сутки.
min-refresh-time 1800; // обновлять зону не чаще 1 раза в 30 минут.
Также имеет смысл установить параметр recursive-clients 100; в секции
options. Который ограничивает число клиентов параллельно обслуживаемых
вашим DNS сервером.
Параметр tcp-clients 200; Ограничивает число одновременных TCP
(используется для передачи зон, и TCP запросов) соединений с вашим DNS
сервером.
Если в вашем сервере установлено несколько сетевых интерфейсов и вы
хотите чтобы named работал только на одном из них, то вам необходимо
использовать параметр listen-on {localhost; нужный сетевой интерфейс;};
Если вы не используете IPv6 отключите его поддержку в BIND listen-on-v6
{ none; };
Работа под непривилегированным пользователем.
Очень важным является указание BIND работать от имени
непривилегированного пользователя а не от root-a. По умолчанию в RHEL
bind так и работает от имени пользователя named. Убедиться в этом можно
выполнив команду ps ax|grep named при запущеном демоне named, ответ
должен выглядеть примерно так /usr/sbin/named -u named. Имя
пользователя после параметра -u говорит под каким пользователем
работает BIND. Другой способ убедиться у том, что BIND работает из под
непривилегированного пользователя это проверить стартовый скрипт
/etc/init.d/named на наличие строки daemon /usr/sbin/named -u named
${OPTIONS};
Пример кэширующего DNS сервера.
Допустим ваш провайдер выделил вам 1 ip адрес. В вашей внутренней сети
используется адресация 10.0.0.0/24 (10.0.0.0 по маске 255.255.255.0). У
вашего шлюза в интернет внутренний ip адрес 10.0.0.1. Внешний ip адрес
выделеный провайдером (192.168.0.10). IP адреса DNS серверов провайдера
192.168.0.1, 192.168.0.2. Данный DNS сервер должен разрешать имена
используя только DNS сервера провайдера. \
//Настраиваем логирование
logging {
channel "xfer" {
file "/var/log/named/xfer.log" versions 3 size 10m;
print-time yes;
print-severity yes;
severity info;
};
channel "lame" {
file "/var/log/named/lamers.log" versions 2 size 10m;
print-time yes;
print-severity yes;
severity info;
};
channel "config" {
file "/var/log/named/conf.log" versions 3 size 10m;
print-time yes;
print-severity yes;
severity info;
};
channel "security" {
file "/var/log/named/security.log" versions 3 size 10m;
print-time yes;
print-severity yes;
severity info;
};
category "xfer-in" { "xfer"; };
category "xfer-out" { "xfer"; };
category "notify" { "xfer"; };
category "lame-servers" { "lame"; };
category "config" { "config"; };
category "security" { "security"; };
category "default" { "default_syslog"; "default_debug"; };
};
//Список сетей для которых разрешены рекурсивные запросы
acl "my_net" {
localhost;
10.0.0.0/24;
};
options {
directory "/var/named";
dump-file "/var/named/data/cache_dump.db";
statistics-file "/var/named/data/named_stats.txt";
version "DNS Server";
allow-recursion { my_net; };
allow-query { my_net; };
forwarders { 192.168.0.1; 192.168.0.2; };
listen-on{localhost;10.0.0.1;};
forward only;
recursive-clients 100;
};
controls {
inet 127.0.0.1 allow { localhost; } keys { rndckey; };
};
zone "." IN {
type hint;
file "named.ca";
};
zone "localdomain" IN {
type master;
file "localdomain.zone";
allow-update { none; };
};
zone "localhost" IN {
type master;
file "localhost.zone";
allow-update { none; };
};
zone "0.0.127.in-addr.arpa" IN {
type master;
file "named.local";
allow-update { none; };
};
include "/etc/rndc.key";
При данном подходе Вам не нужно открывать на внешнем интерфейсе 53 порт
для запросов т.е. правила для iptables должны выглядеть так:
В данном фрагменте правил предполагается, что
eth0 - сетевой интерфейс с адресом 192.168.0.10
eth1 - сетевой интерфейс с адресом 10.0.0.1
*filter
:INPUT DROP [0:0]
:FORWARD DROP [0:0]
:OUTPUT DROP [0:0]
#Разрешаем DNS запросы только к серверам провайдера
-A INPUT -i eth0 -s 192.168.0.1/32 -d 192.168.0.10/32 -p tcp --sport 53 --dport 1025:65535 -j ACCEPT
-A INPUT -i eth0 -s 192.168.0.1/32 -d 192.168.0.10/32 -p udp --sport 53 --dport 1025:65535 -j ACCEPT
-A OUTPUT -o eth0 -d 192.168.0.1/32 -s 192.168.0.10/32 -p tcp --dport 53 --sport 1025:65535 -j ACCEPT
-A OUTPUT -o eth0 -d 192.168.0.1/32 -s 192.168.0.10/32 -p udp --dport 53 --sport 1025:65535 -j ACCEPT
-A INPUT -i eth0 -s 192.168.0.2/32 -d 192.168.0.10/32 -p tcp --sport 53 --dport 1025:65535 -j ACCEPT
-A INPUT -i eth0 -s 192.168.0.2/32 -d 192.168.0.10/32 -p udp --sport 53 --dport 1025:65535 -j ACCEPT
-A OUTPUT -o eth0 -d 192.168.0.2/32 -s 192.168.0.10/32 -p tcp --dport 53 --sport 1025:65535 -j ACCEPT
-A OUTPUT -o eth0 -d 192.168.0.2/32 -s 192.168.0.10/32 -p udp --dport 53 --sport 1025:65535 -j ACCEPT
#Разрешаем запросы из внутренней сети
-A INPUT -i eth1 -s 10.0.0.0/24 -d 10.0.0.1/32 -p tcp --dport 53 --sport 1025:65535 -j ACCEPT
-A INPUT -i eth1 -s 10.0.0.0/24 -d 10.0.0.1/32 -p udp --dport 53 --sport 1025:65535 -j ACCEPT
-A OUTPUT -o eth1 -d 10.0.0.0/24 -s 10.0.0.1/32 -p tcp --sport 53 --dport 1025:65535 -j ACCEPT
-A OUTPUT -o eth1 -d 10.0.0.0/24 -s 10.0.0.1/32 -p udp --sport 53 --dport 1025:65535 -j ACCEPT
#Остальные правила iptables
--//--
В /etc/resolv.conf пропишите
nameserver 127.0.0.1
Может распространяться свободно при указании авторства.
Автор: Фролов Денис.