Поиск по сайту:

Как настроить DNSSEC на полномочном DNS-сервере BIND


О DNSSEC

Все мы знаем, что DNS — это протокол, который преобразует доменные имена в IP-адреса, но как узнать подлинность возвращенного IP-адреса? Злоумышленник может подделать ответ DNS или отравить кеш DNS и перенаправить пользователей на вредоносный сайт с допустимым доменным именем в адресной строке. Расширения безопасности DNS (DNSSEC) — это спецификация, направленная на поддержание целостности данных ответов DNS. DNSSEC подписывает все записи ресурсов DNS (A, MX, CNAME и т. д.) зоны, используя PKI (инфраструктура открытых ключей). Теперь преобразователи DNS с поддержкой DNSSEC (например, Google Public DNS) могут проверять подлинность ответа DNS (содержащего IP-адрес) с помощью общедоступной записи DNSKEY.

Ресурсные записи DNSSEC

Запись ресурса (RR) содержит определенную информацию о домене. Некоторые распространенные из них: запись A, которая содержит IP-адрес домена, запись AAAA, которая содержит информацию IPv6, и запись MX, которая содержит почтовые серверы домена. Полный список DNS RR можно найти здесь.

Точно так же для DNSSEC требуется несколько RR.

  • DNSKEY Содержит открытый ключ, который резолверы используют для проверки.
  • RRSIG Существует для каждой RR и содержит цифровую подпись записи.
  • DS – лицо, подписывающее делегирование – эта запись существует на серверах имен TLD. Таким образом, если вашим доменным именем было example.com, TLD — \com, а его серверы имен — a.gtld-servers.net., b.gtld-servers.net. до m.gtld-servers.net.. Целью этой записи является проверка подлинности самого DNSKEY.

Настройка среды

Имя домена: example.com

Для этого я использовал настоящий домен .COM, но для этой статьи заменил его на example.com.

Главный сервер имен:

Подчиненный сервер имен:

Расположение файлов и имена

Имена и расположение файлов конфигурации и зон BIND различаются в зависимости от используемого дистрибутива Linux.

Дебиан/Убунту

Наименование услуги:

CentOS/Федора

Наименование услуги:

Они могут измениться, если вы используете bind-chroot. В этом руководстве я использовал Debian для Master NS и CentOS для Slave NS, поэтому измените его в соответствии с вашим дистрибутивом.

Основная конфигурация DNSSEC

Включите DNSSEC, добавив следующие директивы конфигурации в options{ }

нано /etc/bind/named.conf.options

dnssec-enable yes;
dnssec-validation yes;
dnssec-lookaside auto;

Возможно, они уже добавлены в некоторые дистрибутивы. Перейдите к расположению ваших файлов зоны.

cd /var/cache/bind

Создайте ключ подписи зоны (ZSK) с помощью следующей команды.

dnssec-keygen -a NSEC3RSASHA1 -b 2048 -n ZONE example.com

Если вы установили haveged, для генерации этого ключа потребуется всего несколько секунд; иначе это займет очень много времени. Образец вывода.

root@master:/var/cache/bind# dnssec-keygen -a NSEC3RSASHA1 -b 2048 -n ZONE example.com
Generating key pair..................+++ .............+++
Kexample.com.+007+40400

Создайте ключ подписи ключа (KSK) с помощью следующей команды.

dnssec-keygen -f KSK -a NSEC3RSASHA1 -b 4096 -n ZONE example.com

Образец вывода.

root@master:/var/cache/bind# dnssec-keygen -f KSK -a NSEC3RSASHA1 -b 4096 -n ZONE example.com
Generating key pair......................++ .............................................................................................................................................................................................................++
Kexample.com.+007+62910

Каталог теперь будет иметь 4 ключа — пары закрытый/открытый ZSK и KSK. Мы должны добавить открытые ключи, содержащие запись DNSKEY, в файл зоны. Это сделает следующий цикл for.

for key in `ls Kexample.com*.key`
do
echo "\$INCLUDE $key">> example.com.zone
done

Подпишите зону командой dnssec-signzone.

dnssec-signzone -3 <salt> -A -N INCREMENT -o <zonename> -t <zonefilename>

Замените соль чем-то случайным. Вот пример с выводом.

root@master:/var/cache/bind# dnssec-signzone -A -3 $(head -c 1000 /dev/random | sha1sum | cut -b 1-16) -N INCREMENT -o example.com -t example.com.zone
Verifying the zone using the following algorithms: NSEC3RSASHA1.
Zone signing complete:
Algorithm: NSEC3RSASHA1: KSKs: 1 active, 0 stand-by, 0 revoked
                        ZSKs: 1 active, 0 stand-by, 0 revoked
example.com.zone.signed
Signatures generated:                       14
Signatures retained:                         0
Signatures dropped:                          0
Signatures successfully verified:            0
Signatures unsuccessfully verified:          0
Signing time in seconds:                 0.046
Signatures per second:                 298.310
Runtime in seconds:                      0.056

В качестве соли необходимо ввести строку из 16 символов. Следующая команда

head -c 1000 /dev/random | sha1sum | cut -b 1-16

выводит случайную строку из 16 символов, которая будет использоваться в качестве соли.

При этом создается новый файл с именем example.com.zone.signed, который содержит записи RRSIG для каждой записи DNS. Мы должны указать BIND загрузить эту «подписанную» зону.

nano /etc/bind/named.conf.local

Измените параметр file в разделе zone { }.

zone "example.com" IN {
    type master;
    file "example.com.zone.signed";
    allow-transfer { 2.2.2.2; };
    allow-update { none; };
};

Сохраните этот файл и перезагрузите привязку

service bind9 reload

Проверьте наличие записи DNSKEY с помощью dig на том же сервере.

dig DNSKEY example.com. @localhost +multiline

Пример вывода

root@master:/var/cache/bind# dig DNSKEY example.com. @localhost +multiline
;; Truncated, retrying in TCP mode.

; <<>> DiG 9.8.4-rpz2+rl005.12-P1 <<>> DNSKEY example.com. @localhost +multiline
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 43986
;; flags: qr aa rd; QUERY: 1, ANSWER: 2, AUTHORITY: 0, ADDITIONAL: 0
;; WARNING: recursion requested but not available

;; QUESTION SECTION:
;example.com.       IN DNSKEY

;; ANSWER SECTION:
example.com.        86400 IN DNSKEY   256 3 7 (
                AwEAActPMYurNEyhUgHjPctbLCI1VuSj3xcjI8QFTpdM
                8k3cYrfwB/WlNKjnnjt98nPmHv6frnuvs2LKIvvGzz++
                kVwVc8uMLVyLOxVeKhygDurFQpLNNdPumuc2MMRvV9me
                fPrdKWtEEtOxq6Pce3DW2qRLjyE1n1oEq44gixn6hjgo
                sG2FzV4fTQdxdYCzlYjsaZwy0Kww4HpIaozGNjoDQVI/
                f3JtLpE1MYEb9DiUVMjkwVR5yH2UhJwZH6VVvDOZg6u6
                YPOSUDVvyofCGcICLqUOG+qITYVucyIWgZtHZUb49dpG
                aJTAdVKlOTbYV9sbmHNuMuGt+1/rc+StsjTPTHU=
                ) ; key id = 40400
example.com.        86400 IN DNSKEY   257 3 7 (
                AwEAAa2BE0dAvMs0pe2f+D6HaCyiFSHw47BA82YGs7Sj
                qSqH3MprNra9/4S0aV6SSqHM3iYZt5NRQNTNTRzkE18e
                3j9AGV8JA+xbEow74n0eu33phoxq7rOpd/N1GpCrxUsG
                kK4PDkm+R0hhfufe1ZOSoiZUV7y8OVGFB+cmaVb7sYqB
                RxeWPi1Z6Fj1/5oKwB6Zqbs7s7pmxl/GcjTvdQkMFtOQ
                AFGqaaSxVrisjq7H3nUj4hJIJ+SStZ59qfW3rO7+Eqgo
                1aDYaz+jFHZ+nTc/os4Z51eMWsZPYRnPRJG2EjJmkBrJ
                huZ9x0qnjEjUPAcUgMVqTo3hkRv0D24I10LAVQLETuw/
                QOuWMG1VjybzLbXi5YScwcBDAgtEpsQA9o7u6VC00DGh
                +2+4RmgrQ7mQ5A9MwhglVPaNXKuI6sEGlWripgTwm425
                JFv2tGHROS55Hxx06A416MtxBpSEaPMYUs6jSIyf9cjB
                BMV24OjkCxdz29zi+OyUyHwirW51BFSaOQuzaRiOsovM
                NSEgKWLwzwsQ5cVJBEMw89c2V0sHa4yuI5rr79msRgZT
                KCD7wa1Hyp7s/r+ylHhjpqrZwViOPU7tAGZ3IkkJ2SMI
                e/h+FGiwXXhr769EHbVE/PqvdbpcsgsDqFu0K2oqY70u
                SxnsLB8uVKYlzjG+UIoQzefBluQl
                ) ; key id = 62910

;; Query time: 0 msec
;; SERVER: 127.0.0.1#53(127.0.0.1)
;; WHEN: Wed Nov 27 18:18:30 2013
;; MSG SIZE  rcvd: 839

Проверьте наличие записей RRSIG.

dig A example.com. @localhost +noadditional +dnssec +multiline
; <<>> DiG 9.8.4-rpz2+rl005.12-P1 <<>> A example.com. @localhost +noadditional +dnssec +multiline
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 32902
;; flags: qr aa rd; QUERY: 1, ANSWER: 2, AUTHORITY: 3, ADDITIONAL: 5
;; WARNING: recursion requested but not available

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags: do; udp: 4096
;; QUESTION SECTION:
;example.com.         IN A

;; ANSWER SECTION:
example.com.          86400 IN A 93.184.216.119
example.com.          86400 IN RRSIG A 7 2 86400 20131227171405 (
                            20131127171405 40400 example.com.
                            JCoL8L7As1a8CXnx1W62O94eQl6zvVQ3prtNK7BWIW9O
                            lir/4V+a6c+0tbt4z4lhgmb0sb+qdvqRnlI7CydaSZDb
                            hlrJA93fHqFqNXw084YD1gWC+M8m3ewbobiZgBUh5W66
                            1hsVjWZGvvQL+HmobuSvsF8WBMAFgJgYLg0YzBAvwHIk
                            886be6vbNeAltvPl9I+tjllXkMK5dReMH40ulgKo+Cwb
                            xNQ+RfHhCQIwKgyvL1JGuHB125rdEQEVnMy26bDcC9R+
                            qJNYj751CEUZxEEGI9cZkD44oHwDvPgF16hpNZGUdo8P
                            GtuH4JwP3hDIpNtGTsQrFWYWL5pUuuQRwA== )

;; AUTHORITY SECTION:
example.com.          86400 IN NS master.example.com.
example.com.          86400 IN NS slave.example.com.
example.com.          86400 IN RRSIG NS 7 2 86400 20131227171405 (
                            20131127171405 40400 example.com.
                            hEGzNvKnc3sXkiQKo9/+ylU5WSFWudbUc3PAZvFMjyRA
                            j7dzcVwM5oArK5eXJ8/77CxL3rfwGvi4LJzPQjw2xvDI
                            oVKei2GJNYekU38XUwzSMrA9hnkremX/KoT4Wd0K1NPy
                            giaBgyyGR+PT3jIP95Ud6J0YS3+zg60Zmr9iQPBifH3p
                            QrvvY3OjXWYL1FKBK9+rJcwzlsSslbmj8ndL1OBKPEX3
                            psSwneMAE4PqSgbcWtGlzySdmJLKqbI1oB+d3I3bVWRJ
                            4F6CpIRRCb53pqLvxWQw/NXyVefNTX8CwOb/uanCCMH8
                            wTYkCS3APl/hu20Y4R5f6xyt8JZx3zkZEQ== )

;; Query time: 0 msec
;; SERVER: 127.0.0.1#53(127.0.0.1)
;; WHEN: Thu Nov 28 00:01:06 2013
;; MSG SIZE  rcvd: 1335

Настройка главного сервера завершена.

Конфигурация подчиненного устройства DNSSEC

Подчиненные серверы требуют только включения DNSSEC и изменения местоположения файла зоны. Отредактируйте основной файл конфигурации BIND.

nano /etc/named.conf

Поместите эти строки в раздел options { , если они не существуют.

dnssec-enable yes;
dnssec-validation yes;
dnssec-lookaside auto;

Отредактируйте параметр file в разделе zone { }.

zone "example.com" IN {
    type slave;
    file "example.com.zone.signed";
    masters { 1.1.1.1; };
    allow-notify { 1.1.1.1; };
};

Перезагрузите службу BIND.

service named reload

Проверьте, есть ли новый файл зоны .signed.

[root@slave ~]# ls -l /var/named/slaves/
total 16
-rw-r--r-- 1 named named  472 Nov 27 17:25 example.com.zone
-rw-r--r-- 1 named named 9180 Nov 27 18:29 example.com.zone.signed

Вуаля! Вот и все. Просто чтобы убедиться, что все работает как надо, запросите DNSKEY с помощью dig, как упоминалось в предыдущем разделе.

Настройка записей DS у регистратора

Когда мы запускали команду dnssec-signzone, кроме файла зоны .signed, также был создан файл с именем dsset-example.com, этот содержит записи DS.

root@master:/var/cache/bind# cat dsset-example.com.
example.com.        IN DS 62910 7 1 1D6AC75083F3CEC31861993E325E0EEC7E97D1DD
example.com.        IN DS 62910 7 2 198303E265A856DE8FE6330EDB5AA76F3537C10783151AEF3577859F FFC3F59D

Их необходимо ввести в панели управления вашего регистратора доменов. Скриншоты ниже иллюстрируют шаги на GoDaddy.

Войдите в панель управления вашего регистратора домена, выберите свой домен и выберите параметр для управления записями DS. Панель управления GoDaddy выглядит так.

Вот разбивка данных в файле dsset-example.com..

DS-запись 1:

Ключевой тег: 62910

DS-запись 2:

Ключевой тег: 62910

Вторая запись DS в файле dsset-example.com. содержала пробел в дайджесте, но при вводе его в форму его следует опускать. Нажмите Далее, нажмите Готово и Сохранить записи.

Сохранение этих изменений займет несколько минут. Чтобы проверить, были ли созданы записи DS, запросите серверы имен вашего TLD. Вместо поиска серверов имен TLD мы можем выполнить dig +trace, что намного проще.

root@master:~# dig +trace +noadditional DS example.com. @8.8.8.8 | grep DS
; <<>> DiG 9.8.2rc1-RedHat-9.8.2-0.17.rc1.el6_4.6 <<>> +trace +noadditional DS example.com. @8.8.8.8
example.com.          86400   IN      DS      62910 7 2 198303E265A856DE8FE6330EDB5AA76F3537C10783151AEF3577859F FFC3F59D
example.com.          86400   IN      DS      62910 7 1 1D6AC75083F3CEC31861993E325E0EEC7E97D1DD

Как только это подтвердится, мы сможем проверить, нормально ли работает DNSSEC, используя любой из следующих онлайн-сервисов.

  • http://dnssec-debugger.verisignlabs.com
  • http://dnsviz.net/

Первый инструмент простой, а второй дает визуальное представление вещей. Вот скриншот из первого инструмента.

Обратите внимание на линии, которые я отметил. В первом упоминается значение тега ключа (62910) записи DS, а во втором — идентификатор ключа (40400) записи DNSKEY, которая содержит ZSK (ключ подписи зоны). ).

Изменение записей зоны

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

root@master# nano /usr/sbin/zonesigner.sh

#!/bin/sh
PDIR=`pwd`
ZONEDIR="/var/cache/bind" #location of your zone files
ZONE=$1
ZONEFILE=$2
DNSSERVICE="bind9" #On CentOS/Fedora replace this with "named"
cd $ZONEDIR
SERIAL=`/usr/sbin/named-checkzone $ZONE $ZONEFILE | egrep -ho '[0-9]{10}'`
sed -i 's/'$SERIAL'/'$(($SERIAL+1))'/' $ZONEFILE
/usr/sbin/dnssec-signzone -A -3 $(head -c 1000 /dev/random | sha1sum | cut -b 1-16) -N increment -o $1 -t $2
service $DNSSERVICE reload
cd $PDIR

Сохраните файл и сделайте его исполняемым.

root@master# chmod +x /usr/sbin/zonesigner.sh

Всякий раз, когда вы хотите добавить или удалить записи, отредактируйте example.com.zone, а НЕ файл .signed. Этот файл также обеспечивает увеличение серийного номера, поэтому вам не нужно делать это каждый раз, когда вы редактируете файл. После его редактирования запустите скрипт, передав в качестве параметров имя домена и имя файла зоны.

root@master# zonesigner.sh example.com example.com.zone

Вам не нужно ничего делать на подчиненном сервере имен, так как увеличенный серийный номер обеспечит передачу и обновление зоны.

Защита настройки DNSSEC от Zone Walking

Обход зоны — это метод, используемый для поиска всех записей ресурсов зоны путем запроса записи NSEC (Next-Secure). Был выпущен NSEC3, который хэшировал эту информацию с помощью соли. Вспомните команду dnssec-signzone, в которой мы указали параметр -3, за которым следовала с помощью другой сложной команды для генерации случайной строки. Это соль, которую можно найти с помощью следующего запроса dig.

# dig NSEC3PARAM example.com. @master.example.com. +short
1 0 10 7CBAA916230368F2

Все это делает зональную ходьбу сложной, но не невозможной. Решительный хакер, использующий Kexample.com.*.private).

root@master:~# crontab -e

0       0       */3     *       *       /usr/sbin/zonesigner.sh example.com example.com.zone

Это будет подписывать зону каждые 3 дня, и в результате будет генерироваться новая соль. Вы также получите электронное письмо с выводом команды dnssec-signzone.

Прислал: Джесин А