Захист DNS-сервера - Налагодження безпеки h2>
Денис Колісниченко p>
Конфігуріруя
сервер, адміністратори часто забувають правильно настроїти DNS. Після
такого налаштування служба DNS працює коректно: IP-адреси вирішуються в імена
комп'ютерів, а символьні імена без проблем перетворюються в IP-адреси. На цьому
більшість адміністраторів і зупиняються: головне, щоб працювало.
Працювати-то воно працює, але неправильно налаштований DNS-сервер може стати
величезною дірою в системі безпеки компанії. Одна справа, коли сервер DNS
обслуговує локальну мережу без виходу в Інтернет: навіть, якщо хтось і
спробує "зламати" сервер, то обчислити "хакера"
досить просто. А от, якщо мережа підприємства підключена до Інтернет, то дізнатися,
хто ж намагався зламати (або зламав) вашу мережу досить складно. Збиток від
злому може обійтися компанії в кругленьку суму. p>
Перш,
ніж приступити до злому мережі або окремої системи зловмисник (або група
зловмисників) намагається зібрати якомога більше інформації: імена
комп'ютерів мережі, імена користувачів, версії встановленого програмного
забезпечення. Цілою комори корисною для зломщика інформації стане
неправильно налаштована служба DNS (BIND). Розглянемо невеликий приклад:
запустіть програму nslookup і введіть команду: p>
ls
server.com p>
Якщо
адміністратор забув правильно налаштувати трансфер зони, то будь-хто отримає
список комп'ютерів нашої мережі: p>
[comp2.server.com] server.com.
323.111.200.2 p>
server.com. server =
comp1.server.com server.com. server = comp2.server.com server.com. p>
server = comp3.server.com mail
323.111.200.17 gold 323.111.200.22 www.ie 323.111.200.11 p>
jersild 323.111.200.25 comp1
323.111.200.1 comp3 323.111.200.3 parasit3 323.111.200.20 p>
www.press 323.111.200.30 comp1
323.111.200.1 www 323.111.200.2 p>
Примітка.
Щоб не було непорозумінь, вказані неіснуючі IP-адреси p>
Щоб
не сталося непоправного, дозвольте передачу зону тільки одного комп'ютера --
вторинного DNS-сервера вашої компанії, якщо такий, звичайно, є. У файлі
конфігурації сервісу named -/etc/named.conf - змініть секцію options
наступним чином: p>
options (
p>
allow-transfer
(192.168.1.2;);); p>
Вторинний
DNS-сервер, як правило, не передає ніякої інформації про зону, тому
обов'язково вкажіть такий рядок у його файлі конфігурації/etc/named.conf
(в секції options): p>
allow-transfer
p>
(
none;) p>
Якщо
у вас немає вторинного DNS-сервера, додайте вищезгадану рядок у файл
конфігурації основного DNS-сервера. p>
Як
будь-який хороший адміністратор, ви хочете, щоб ваш DNS-сервер швидко обслуговував
запити клієнтів. Але до вашого сервера можуть підключатися користувачі не з
вашої мережі, наприклад, з мережі конкуруючого провайдера. Тоді вас сервер буде
обслуговувати "чужих" клієнтів. Непорядок! Опція allow-query дозволяє
вказати адреси вузлів і мереж, яким можна використовувати наш DNS-сервер: p>
allow-query
(192.168.1.0/24; localhost;); p>
В
даному прикладі ми дозволяємо використовувати наш сервер вузлів з мережі 192.168.1.0 і
вузла localhost. Доцільно дозволити рекурсивні запити тільки з мережі
192.168.1.0 і вузлу localhost: p>
allow-recursion
(192.168.1.0/24; localhost;); p>
Зазвичай
злом будь-якої мережі починається зі збору інформації - про структуру мережі, про
установлених на комп'ютері, та версії цього ПЗ і т.д. Ми можемо
змусити DNS-сервер повідомляти не номер своєї версії, а довільне повідомлення: p>
version
p>
"Made
in USSR "; p>
Всі
вищеперелічені опції повинні бути вказані в секції options файлу конфігурації
named.conf: p>
options (allow-query p>
(192.168.1.0/24; localhost;);
allow-recursion (192.168.1.0/24; localhost;); p>
allow-transfer (192.168.1.2;);
version "Made in USSR";) p>
З
міркувань безпеки рекомендується запускати всі мережеві сервіси в так
званому chroot-оточенні. Зараз поясню, що це таке. Створюється файлова
система, що повторює структуру кореневої файлової системи, але на цій файловій
системі будуть тільки ті файли, які необхідні для запуску нашого мережевого
сервісу. Зламавши мережевий сервіс та отримавши доступ до кореневої файлової системи,
зловмисник не зможе зашкодити всій системі в цілому, оскільки він отримає
доступ лише до файлів, які належать даному мережного сервісу. Одні
мережеві сервіси можуть працювати в chroot-оточенні, а інші - ні. Сервіс BIND
як саме належить до першої групи. Тепер розберемося, як все це
організовується. Вам не потрібно створювати окремий розділ на диску для кожного
мережевого сервісу: потрібно лише створити каталог, наприклад, root-dns, в який
ви скопіювали всі файли, необхідні для запуску DNS-сервера. Потім, при
запуск сервісу, буде виконана команда chroot для цього сервісу, яка
підмінить файлову систему. А так як в каталозі root-dns, який стане каталогом
/, Є всі необхідні файли для роботи bind, то для сервісу запуск і
робота в chroot-оточенні буде абсолютно прозорим. p>
Відразу
потрібно сказати, що настроювати chroot-оточенні ми будемо для дев'ятій версії
BIND, оскільки це значно простіше, ніж для восьмий версії. На відміну від
восьмий версії, де для налаштування chroot-оточення потрібно було копіювати все
бінарні файли або бібліотеки, необхідні для запуску BIND, для роботи дев'ятого
версії достатньо скопіювати тільки файли конфігурації і зон, що обслуговуються
сервером. p>
Почнемо
настроювати chroot-оточення для нашого DNS-сервера. Створимо каталоги кореневої
файлової системи DNS-сервера - root-dns: p>
mkdir-p/root-dns mkdir-p
/ root-dns/etc mkdir-p/root-dns/var/run/named p>
mkdir-p/root-dns/var/named p>
Зупинимо
DNS-сервер, якщо він запущений: p>
service
named stop p>
Перемістивши
файл конфігурації named.conf та файли зон в каталог/root-dns: p>
mv/etc/named.conf/root-dns/etc/ p>
mv/var/named/*/root-dns/var/named /
chown named.named/chroot/etc/named.conf p>
chown-R named.named
/ root-dns/var/named/* p>
Нам
ще знадобиться файл localtime для належного функціонування DNS-сервера з часом: p>
cp/etc/localtime p>
/root-dns/etc/ p>
Захистимо
від редагування та видалення файл конфігурації named.conf: p>
chattr + i/root-dns/etc/named.conf p>
Примітка. Не забудьте зняти атрибут "i" перед редагуванням файлу конфігурації (chattr-i
/ root-dns/etc/named.conf) p>
Видалимо
каталоги/var/named та/var/run/named - вони нам більше не потрібні: p>
rm-rf/var/named/rm-rf
/ var/run/named/ p>
Додамо в
файл
/ etc/sysconfig/named рядок: p>
ROOTDIR = "/ root-dns /" p>
Все,
тепер можна запустити сервер named: p>
service named start p>
Виконайте команду ps-ax | grep named. Якщо ви побачите
приблизно таке: p>
5380 p>
? S 0:00 named-u named-t
/ root-dns/5381? S 0:00 named-u named-t/root-dns/ p>
5382? S 0:00 named-u named-t
/ root-dns/5383? S 0:00 named-u named-t/root-dns/ p>
значить,
ви все зробили правильно. p>
Ми
запустили DNS-сервер в chroot-оточенні, але на цьому дана стаття не
закінчується. У дев'ятій версії BIND з'явилася можливість створювати підпису
транзакцій (TSIG - Transaction SIGnatures). Механізм TSIG працює так: сервер
отримує повідомлення, підписане ключем, потім підпис перевіряється, якщо вона
"правильна", сервер відправляє відповідь, підписаний тим же ключем. p>
Механізм
TSIG дуже ефективний при передачі інформації про зону, повідомлень про зміну
зони і рекурсивних повідомлень. Погодьтеся, перевірка підпису надійніше, ніж
перевірка IP-адреси. Зловмисник може вивести вторинний сервер DNS банальної
атакою на відмову, і, поки адміністратор буде "піднімати" вторинний
сервер, він замінить свою IP-адресу адресою вторинного сервера. При використанні
TSIG завдання зловмисника значно ускладнюється: адже йому доведеться
"підібрати" 128-бітний MD5-ключ, а ймовірність такого підбору
прагне до нуля. p>
Отже,
приступимо до налаштування. Зупинимо сервіс named, якщо він запущений: p>
service
p>
named
stop p>
Згенеруємо
загальні ключі для кожної пари вузлів. Загальні ключі використовуються при
"спілкуванні" первинного та вторинного серверів DNS. p>
[root @ dns] # dnssec-keygen-a
hmac-md5-b 128-n HOST ns1-ns2 Kns1-ns2. +157 +49406 p>
Ми
використовуємо алгоритм HMAC-MD5, 128-бітне шифрування, ns1-ns2 - це ім'я ключа.
Після виконання цієї команди буде створено файл Kns1-ns2. +176 +40946. Private.
Відкрийте його в будь-якому текстовому редакторі. Ви побачите приблизно наступне: p>
Private-key-format:
p>
v1.2
Algorithm: 157 (HMAC_MD5) Key: ms7dfts87Cjhj7FD9lk7a3 == p>
Ключ
"ms7dfts87Cjhj7FD9lk7a3 ==" і буде тим секретом, який буде
передаватися між серверами. Запишіть цей ключ на папері (яку потім
потрібно буде знищити) і видаліть файли: p>
rm-f Kns1-ns2. +157 +49406. key rm-f
Kns1-ns2. +157 +49406. Private p>
Додамо
у файл/etc/named.conf (або/root-dns/etc/named.conf) первинного та вторинного
серверів DNS наступні рядки: p>
key ns1-ns2 (algorithm hmac-md5; p>
secret
"ms7dfts87Cjhj7FD9lk7a3 ==";); p>
Зазначимо сервера BIND використовувати ключ ns1-ns2. Для цього у файлі named.conf первинного DNS-сервера
додамо опцію server: p>
Лістинг
1. Фрагмент файла named.conf первинного DNS-сервера p>
key
ns1-ns2 (algorithm hmac-md5; secret "ms7dfts87Cjhj7FD9lk7a3 ==";); #
прописуємо p>
вторинний
DNS-сервер - 192.168.1.2: server 192.168.1.2 (keys (ns1-ns2;);); p>
options
(# Дозволяємо передачу зони вторинного сервера DNS allow-transfer (
192.168.1.2; p>
);
? );?. Лістинг 2. Фрагмент файла named.conf ВТОРИННОЇ сервера DNS key ns1-ns2
p>
(
algorithm hmac-md5; secret "ms7dfts87Cjhj7FD9lk7a3 ==";); #
прописуємо первинний p>
DNS-сервер - 192.168.1.1: server
192.168.1.1 (keys (ns1-ns2;);); options ( p>
#
нікому не передаємо зону allow-transfer (none);? );?. p>
Можна
також налаштувати передачу зони "по ключу". Для цього у файлі
конфігурації первинного DNS-сервера замініть рядок p>
allow-transfer (192.168.1.2;); p>
рядком p>
allow-transfer (key ns1-ns2;); p>
Нам
залишилося тільки "сховати" файли конфігурації обох серверів DNS від
сторонніх очей - адже вони містять ключі у відкритому вигляді. p>
chmod
600 named.conf p>
Запускаємо
сервіс named: p>
service
named start p>
Тепер
про безпеку вашого BIND подбає TSIG. p>
Список літератури h2>
Для
підготовки даної роботи були використані матеріали з сайту http://www.soch.imperium.by
p>