среда, 29 сентября 2010 г.

Настройка named в chroot на FreeBSD

Заметка о настройке DNS сервера в "песочнице", как способ повышения безопасности сервера.
Также расмотренты некоторые опции по тюнингу производительности и надежности.
Вся настройка проводилась на FreeBSD 8.x Bind 9.x

По умолчанию во FreeBSD уже есть named, его нужно просто настроить.
1. Создаем конфиг для утилиты rndc,при помощи которой можно управлять named (хотя возможностей пока маловато...)

#/usr/sbin/rndc-confgen > /etc/namedb/rndc.conf
2. В /etc/namedb/rndc.conf копируем вторую часть в /etc/namedb/named.conf и
убираем коментарии

# key "rndc-key" {
algorithm hmac-md5;
# secret "++secret-key==";
# };
#.
# controls {
# inet 127.0.0.1 port 953
# allow { 127.0.0.1; } keys { "rndc-key"; };
# };

3. Создаем ACL /etc/namedb/named.conf

acl localnet { 192.168.0.0/22; 127.0.0.1;};.
acl all { any; };

4. Настраиваем логирование (мой пример)

// Relative to the chroot directory, if any
logging {
channel syslog {
file "/var/log/named/named.log";
severity info;
print-time yes;
print-category yes;
print-severity yes;
};

channel security_ch {
file "/var/log/named/security.log";
print-time yes;
print-category yes;
};

channel lame {
file "/var/log/named/lame.log";
print-time yes;
print-category yes;
};

channel default_ch {
file "/var/log/named/default.log";
print-time yes;
print-category yes;
};

category default { syslog; };
category security { security_ch; };
category lame-servers { null; };
category default { default_ch; };
};

5. Настраиваем раздел опций.

options {
// Relative to the chroot directory, if any
directory "/etc/namedb";
pid-file "/var/run/named/pid";
dump-file "/var/dump/named_dump.db";
statistics-file "/var/stats/named.stats";
// Запрет отдавать номер версии сервера.
version none;
// Запрет отдавать имя хоста, на котором работает BIND
hostname none; 
// запрет отдавать запросы об идентификаторе
server-id none;
// Разрешаем по-умолчанию днс запросы только от доверенных сетей
allow-query { localnet; };
// Разрешать ли рекурсивные запросы, или отдавать только те зоны, которые держит сам сервак.
recursion yes;
// Посылка рекурсивных запросов 
// разрешена только клиентам подсети  
allow-recursion { localnet; }; 
// Игнорировать запросы blackhole
// DNS-сервер не посылает запросы к DNS-серверам из этого списка 
// и не отвечает на за­просы, получаемые от этих серверов. 
blackhole { 
0.0.0.0/8;
10.0.0.0/8;
169.254.0.0/16;
172.16.0.0/12;
192.0.2.0/24;
192.168.0.0/16;
224.0.0.0/4;
240.0.0.0/4;
};
// Интервал принудительной очистки кеша. По-умолчанию - 60 мин.
// Экономит ОЗУ, использует CPU для очистки
// При 0 - отключить очистку (Удаление данных при обнулении TTL)
cleaning-interval 360; 
// Количество рекурсивных запросов
recursive-clients 5000; // По-умолчанию 1000
// Максимальный объем памяти, отводимой под кэш DNS-сервера, в байтах
// Когда объем данных кэша достигает этог о предела, DNS-сервер 
// принудительно удаляет записи, даже если срок их жизн и не истек, 
// чтобы не превысит ь ограничение . По умолчанию - unlimited, 
// то есть записи удаляются из кэша только по истечении 
их времени жизни .
max-cache-size 128M; 
max-acache-size 128M;
// Параметр max-ncache-ttl устанавливает максимальное время 
// хранения отрицательных ответов , в секундах .
// Значение по умолчанию - 10800 секунд (3 часа) .
max-ncache-ttl 10800;
// Устанавливает максимальное время кэширования 
// обычных (положительных ) ответов. По умолчанию - одна неделя 
// Выставляю 1 сутки
max-cache-ttl 86400;
clients-per-query 70;
max-clients-per-query 100;
Ограничение участников транзакций на основе IP-адреса

allow-query: указывает список хостов, которым разрешено запрашивать все зоны name-сервера или конкретную зону внутри name-сервера.
allow-recursion: указывает список хостов, которым разрешено создавать рекурсивные запросы к name-серверу для всех зон или для конкретной зоны, обслуживаемой name-сервером.
allow-transfer: указывает список хостов, которым разрешено инициировать запросы зонной пересылки к name-серверу для всех зон или для конкретной зоны внутри name-сервера. Данное утверждение обязательно требуется в конфигурации первичного name-сервера.
allow-update: указывает список хостов, которым разрешено инициировать запросы динамического обновления.
allow-update-forwarding: указывает список хостов, которым разрешено перенаправление запросов динамического обновления (независимо от того, кто является источником запроса).
allow-notify: указывает список хостов, с которых можно принимать сообщения DNS NOTIFY, говорящих об изменениях в зонном файле. Данный список относится только к конфигурации вторичного name-сервера.
blackhole: указывает список хостов, которые входят в черный список (запрещен доступ) для инициализации любых транзакций с данным name-сервером.

6.1 Настройка прав для директории /var/named/etc/namedb
Необходимо отредактировать файл /etc/mtree/BIND.chroot.dist.
Этот файл выставляет права на файлы и папки для chroot.
Более детально можно прочитать в /usr/src/etc/mtree/README
Сохраняем стандартный файл

cp /etc/mtree/BIND.chroot.dist /etc/mtree/BIND.chroot.dist_BACK
Приводим к следующему виду /etc/mtree/BIND.chroot.dist

# $FreeBSD$
#
# Please see the file src/etc/mtree/README before making changes to this file.
#

/set type=dir uname=bind gname=wheel mode=0500
.
    dev     uname=root    mode=0555
    ..
    etc
        namedb uname=bind mode=0500
            dynamic uname=bind mode=0700
            ..
            master  uname=bind mode=0500
            ..
            slave   uname=bind mode=0700
            ..
            working uname=bind mode=0700
            ..
        ..
    ..
/set type=dir uname=bind gname=wheel mode=0755
    var             uname=root
        dump
        ..
        log
        ..
        run
            named
            ..
        ..
        stats
        ..
    ..
..
Выставляем руками некоторые права доступа

chown -R bind:wheel /var/named/etc/namedb
chmod -R go-rwx /var/named/etc/namedb
cd /var/named/etc/namedb
chmod u-wx named.root named.conf rndc.conf
chmod -R u+rw-x /var/named/etc/namedb/slave/*
chmod -R u+r-wx /var/named/etc/namedb/master/*
Рестарт named. При рестарте выставляются все права
на папки в соответствии с /etc/mtree/BIND.chroot.dist
Если будут несоответствия прав доступа, будут выданы соответствующие сообщения, в первый раз это нормально. Предварительно нужно выполнить пункт 7

/etc/rc.d/named restart
Проверяем права доступа

# ll /etc/namedb/
total 87
drwx------  2 bind  wheel      2 Jul 18 02:12 dynamic
dr-x------  2 bind  wheel    146 Dec 30 17:58 master
-r--------  1 bind  wheel  21333 Jan 12 13:22 named.conf
----------  1 bind  wheel  13998 Dec  3 13:14 named.conf_DEFAULT
----------  1 bind  wheel  34223 Jan 11 13:19 named.conf_OLD
-r--------  1 bind  wheel   3009 Jul 18 02:18 named.root
-r--------  1 bind  wheel    479 Dec  3 14:12 rndc.conf
-r--------  1 bind  wheel   1439 Dec  1 19:49 rndc.conf.sample
drwx------  2 bind  wheel      6 Dec  3 14:40 slave
drwx------  2 bind  wheel      2 Jul 18 02:12 working

6.2 Настройка прав для директорий логов

#mkdir /var/named/var/log/named
#chmod 700 /var/named/var/log/named
#chown bind:wheel /var/named/var/log/named
#ln -s /var/named/var/log/named /var/log/named

7. Автозапуск - добавляем в /etc/rc.conf

### DNS
named_enable="YES"
named_uid="bind"

8. Ротация логов. Добавляем в /etc/newsyslog.conf

# DNS
/var/log/named/named.log bind:wheel 600 7 200 * JC
/var/log/named/security.log bind:wheel 600 7 200 * JC
/var/log/named/default.log bind:wheel 600 7 200 * JC
/var/log/named/lame.log bind:wheel 600 7 200 * JC

9. Все :) !

Работа с утилитой rndc
Перечитать конфиг named.conf

# rndc reload
server reload successful
Получить данные статистики named.stat (должно быть настроено в named.conf)
Путь к файлу указан в конфиге относительно корня песочницы.

# rndc stats

# rndc status
version: 9.7.1 (version.bind/txt/ch disabled)
CPUs found: 1
worker threads: 1
number of zones: 129
debug level: 0
xfers running: 0
xfers deferred: 0
soa queries in progress: 0
query logging is OFF
recursive clients: 0/0/50
tcp clients: 0/100
server is up and running
Дамп кеша в файл (debug проблем резолва какого либо домена в интернете)

rndc dumpdb
Полный сброс кеша вашего DNS сервера:

rndc flush

Просто полезные команды
Просмотре версии BIND

# /usr/sbin/named -v
BIND 9.7.1
Если в папке master у вас нет файлов localhost.rev и localhost-v6.rev, то в /etc/namedb есть файл make-localhost и выполнив команду, эти два файла будут созданы автоматически.

sh make-localhost
Рестарт BIND

#/etc/rc.d/named restart
Проверка конфига /etc/namedb/named.conf, если есть какие либо ошибки, они будут выданы

#named-checkconf
Проверка зон

named-checkzone movie.edu db.movie 
zone movie.edu/IN: loaded serial 4 
OK
Проверка трансфера зоны

dig @ns1.example.com example.com AXFR

ОШИБКИ
Ошибка возникает при получении зоны от мастера на слейве.
Побороть эту ошибку можно прописав полнуй путь к файлу зоны.

general: dumping master file: slave/tmp-ZyMPa0odDK: open: file not found


UPDATE 19.01.2011

В основном Использовалась книга Альбитц П , Ли К DNS и BIND. Издательство Символ Плюс.
Теория и настройка DNS сервера (bind) на FreeBSD

3 комментария:

  1. При запуске named.reload появляется
    rndc: connect failed: 127.0.0.1#953: connection refused
    Что делать?
    FreeBSD 8.3

    ОтветитьУдалить
  2. попытаться проделать следующее (описано в сатье)
    1. сгенерировать заново rndc ключ.
    2. скопировать его в named. /etc/namedb/rndc.conf - НЕ УДАЛЯТЬ!!!
    3. рестарт named. Проверить, что порт 953 слушается named
    4. проверить еще раз
    # rndc status

    Удачи :)

    ОтветитьУдалить
  3. Спасибо, пожулу лучшее рководство!

    ОтветитьУдалить