Настройка DNSSEC на Ubuntu Server

Технология DNS в нынешнем виде была разработана более 20 лет назад, когда о защите информации мало кто задумывался. Поэтому в сегодняшним состоянии система DNS имеет несколько ключевых уязвимостей.

  • Достоверность ответа DNS-сервера никак не проверяется. Это позволяет отправить пользователя, обратившегося к доменному имени, на произвольный IP-адрес, подменив ответ сервера.
  • Также уязвимы кэширующие DNS-серверы провайдеров, выступающие как резолверы для клиентов: Атака Каминского.

Сегодня существуют технологии, предусматривающие хранение открытых ключей в DNS-записях, например, DKIM-подписи в электронной почте, SSH-ключей в записях SSHFP и т.д. Все эти технологии требуют защиты от подделки DNS.Поэтому была разработана технология DNSSEC позволяющая убедиться, что DNS сервер является подлинным.DNSSEC — технология, позволяющая однозначно удостовериться в подлинности DNS информации при помощи криптографической подписи.В этой статье разберём как можно внедрить данную технологию на наш сервер с операционной системой Ubuntu.

Начальная конфигурация:

  • ОС — Ubuntu Server 16.04 LTS
  • DNS сервер — Bind v.9.x
  • Domen — Ваш зарегистрированный домен (в примере будет использоваться домен от регистратора Reg.ru).

Формирование ключей

Создаем каталог, в котором будем хранить ключи и сразу переходим в него.

На CentOS / Red Hat:

sudo mkdir /var/named/keys 
cd /var/named/keys

На Ubuntu / Debian:

sudo mkdir /var/lib/bind/keys 
cd /var/lib/bind/keys

Генерируем мастер ключ для зоны (KSK):

sudo dnssec-keygen -f KSK -a RSASHA1 -b 2048 -n ZONE -r /dev/urandom pro-gram.ru

где:

-f KSK — флаг, который говорит, что формируется мастер ключ.
-a RSASHA1 — используемый алгоритм шифрования.
-b 2048 — размер ключа в битах.
-n ZONE — для DNS-зоны.
-r /dev/urandom — путь к файлу со случайными данными. В различных версиях системы путь может отличаться. Если упустить этот ключ в CentOS / Ubuntu, процесс генерации сертификата может зависнуть.
pro-gram.ru — домен, для которого предназначен ключ.
* подробное описание ключей можно посмотреть командой dnssec-keygen -help или man dnssec-keygen.

Генерируем ключ для зоны (ZSK):

sudo dnssec-keygen -a RSASHA1 -b 2048 -n ZONE -r /dev/urandom pro-gram.ru

Ключи ГОСТ

Формируются при помощи ключа -a ECCGOST.

Генерируем мастер ключ для зоны (KSK):

sudo dnssec-keygen -f KSK -a ECCGOST -b 2048 -n ZONE -r /dev/urandom pro-gram.ru

Генерируем ключ для зоны (ZSK):

sudo dnssec-keygen -a ECCGOST -b 2048 -n ZONE -r /dev/urandom pro-gram.ru

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

На CentOS / Red Hat:

sudo chown -R named:named /var/named/keys

На Ubuntu / Debian:

sudo chown -R bind:bind /var/lib/bind/keys

Подпись зоны

Ручное подписывание зоны

Переходим в каталог, где хранится наша зона.

CentOS / Red Hat:

cd /var/named/master

Ubuntu / Debian:

cd /var/lib/bind/

*Пути могут отличаться (зависит от ваших настроек)

Подписываем зону:

sudo dnssec-signzone -N INCREMENT -K /var/lib/bind/keys pro-gram.ru

где:

-N INCREMENT — использовать формат серийного номера SOA из файла.
-K /var/lib/bind/keys — путь хранения сгенерированных ключей.
pro-gram.ru — домен, который подписываем.

Система должна вернуть, примерно, следующее:

Verifying the zone using the following algorithms: RSASHA1.
Zone fully signed:
Algorithm: RSASHA1: KSKs: 1 active, 0 stand-by, 0 revoked
ZSKs: 1 active, 0 stand-by, 0 revoked

В каталоге хранения зон мы должны увидеть pro-gram.ru.signed — это файл подписанной зоны.

Далее открываем конфигурационный файл bind.

На CentOS / Red Hat:

sudo nano /etc/named.conf

На Ubuntu / Debian:

sudo nano /etc/bind/named.conf.local

Проверяем, чтобы dnssec был включен:

options {
...
dnssec-enable yes;
dnssec-validation yes;
dnssec-lookaside auto;
}

где

dnssec-enable yes — включение или отключение dnssec на уровне сервера;
dnssec-validation yes — проверка корректности ответов;
dnssec-lookaside — разрешение использовать сторонние корни DNSSEC.

В настройке зоны меняем путь к файлу:

zone "pro-gram.ru" {
    type master; file "/var/lib/bind/pro-gram.signed";};
};

Перезапускаем bind:

На CentOS / Red Hat:

sudo systemctl reload named

На Ubuntu / Debian:

sudo systemctl reload bind

Автоматическое подписывание зоны

Каждый раз после редактирования зоны не очень удобно ее переподписывать командой dnssec-signzone.

Для автоматизации процесса в конфигурационном файле bind добавим следующие опции:

options {
...
    dnssec-enable yes; 
    dnssec-validation yes; 
    dnssec-lookaside auto;
    key-directory "/var/lib/bind/keys";
    sig-validity-interval 20 10;
    update-policy local;
}

где

key-directory — каталог для хранения сгенерированных ключей, необходимо прописать тот, в котором мы формировали последние командой dnssec-keygen;
sig-validity-interval — период действия ключей: дней / период обновления.

Для зоны редактируем:

zone "pro-gram.ru" {
    type master;
    file "/var/lib/bind/keys/pro-gram.ru";
    inline-signing yes;
    auto-dnssec maintain;
};

где

inline-signing — включение или отключение прозрачного формирования подписей (без необходимости менять файл зоны);
auto-dnssec — уровень автоматической настройки DNSSEC для зоны.

Также обращаем внимание, что мы убрали в пути .signed.

Проверяем, что у пользователя named/bind есть права на запись в каталог хранения зоны. При необходимости, меняем владельца:

sudo chown -R bind:bind /var/lib/bind/

Удаляем старый файл подписанной зоны:

sudo rm -f /var/lib/bind/pro-gram.ru.signed

Открываем на редактирование файл зоны и меняем серийный номер.

Перезапускаем bind.

На CentOS / Red Hat:

sudo systemctl restart named

На Ubuntu / Debian:

sudo systemctl restart bind9

В каталоге зоны должны появиться дополнительные 3 файла: pro-gram.ru.jbk, pro-gram.ru.signed, pro-gram.ru.signed.jnl

Так как DNSSEC основан на обеспечении цепочки доверия, чтобы процесс верификации заработал, требуется чтобы регистратор заверил созданный KSK-ключ,подтвердив своё доверие. Для этого создадим на основе KSK-ключа DSKEY-ключ (Delegation Signature Key)

dnssec-dsfromkey Kpro-gram.ru.+005+40201

Команда выдаст примерно следующее

pro-gram.ru. IN DS 40201 5 1 4A6BD188AA7D40BA2F0D1B8CE3D46794274B19DC
pro-gram.ru. IN DS 40201 5 2 584EDC23334582812FD36AED39713BE79080F319AC55AE48BB1F4CFE56DC337B

Копируем две сгенерированные строки в интерфейсе ввода DSKEY на сайте регистратора домена. Верификация заработает после того как регистратор обновит параметры первичной зоны.

Однако для полноты счастья, если регистратору вместо KSK потребуется именно запись формата DS, мы сгенерируем записи DS от созданного ранее KSK (Kpro-gram.ru.+005+40201.key) с использованием трёх различных алгоритмов хэширования (SHA-1 (type 1), SHA-256 (type 2) и SHA-384 (type 4) соответственно):

cd /var/lib/bind/keys/
sudo dnssec-dsfromkey -a SHA-1 Kpro-gram.ru.+005+40201.key 
pro-gram.ru. IN DS 40201 5 1 4A6BD188AA7D40BA2F0D1B8CE3D46794274B19DC 

sudo dnssec-dsfromkey -a SHA-256 Kpro-gram.ru.+005+40201.key
pro-gram.ru. IN DS 40201 5 2 584EDC23334582812FD36AED39713BE79080F319AC55AE48BB1F4CFE56DC337B 

sudo dnssec-dsfromkey -a SHA-384 Kpro-gram.ru.+005+40201.key
pro-gram.ru. IN DS 40201 8 4 A7D507EF058F0C8A03EE03FC4BEWG4EE271F4C3F2AF9EA7984C0F710002E79EE3F47E7F5297779BFED280D1A94FE171

В итоге, для завершения активации DNSSEC на нашем домене pro-gram.ru, мы должны отправить нашему регистратору доменных имён такую вот инфу:

Digest type 1 (SHA-1) 
pro-gram.ru. IN DS 40201 5 1 4A6BD188AA7D40BA2F0D1B8CE3D46794274B19DC 

Digest type 2 (SHA-256) 
pro-gram.ru. IN DS 40201 5 2 584EDC23334582812FD36AED39713BE79080F319AC55AE48BB1F4CFE56DC337B

Digest type 4 (SHA-384) 
pro-gram.ru. IN DS 40201 5 4 368E486E7180A6018C45D6277C3BE41F0B76590A873BF38B69049F4364EBBABDA4C836672F898425A0F05F3F5261D19B

DNSKEY (flags 257, KSK) 
AwEAAZsoe6EOeUXWfn3hnelwRVobfZzRLD3BShe5jahasPcdc66oyhAtt8mjMQJrnsUEgDgpu3wUNA1FMQtqQ2g+s+1EXjm/2bao6wW06LclvypdPUYA9DTBbnnY9nv5LFSMjPB2cU1zmfJGalPrtbH1qy7UBZtv8uhNlr6+z8WmBnHBFR4u6VQs4v8kwQFsVI/VJrmn72Zw81xtFsKU988NJAV3fmcpIFHcs9ZnUSJJz/iTAgOaMfZ9ex9g/Q6/eIkmZxS2IYG+L/5ugHCuNZ+mm5pBMVQzHFdAfnJfDB9hu69d5lJ6uQDGqSbyLz31c39QFUfePg8Omec/nYbc6ktIvl8Pc=

Проверка DNS сервера на DNSSEC записи

Чтобы проверить, отдает ли наш сервер bind ответы с цифровыми подписями, вводим команду:

dig www.pro-gram.ru +dnssec

* в данном примере мы запросили IP-адрес для записи www.pro-gram.ru, а +dnssec означает, что также клиент запрашивает RRSIG для этой записи.

Мы должны увидеть записи вместе с их RRSIG, например:

www.pro-gram.ru.	14399	IN	A	111.111.111.1111
www.pro-gram.ru.	14399	IN	RRSIG	A 5 3 14400 20180923003604 20180824003109 27942 pro-gram.ru. iC2nPBz016QLRK/vZuLsk1eUpfWMd99x8jiJMV1AwLyK3MT1YBJ70GjQ ICOqlXAsa/igqzd6DjWyEbF3F2svr//ZU0ZHaszr2tkRguPvVl1jg/aW F+/F3Nj8umQvE60M1hTXBB80aF3ulPUC3B0TbgP6b04so63ZM82uqd7s DPgagVuSwbJ1m4K1/VJdHhrh0XfSEF4ybcRPrnUv6fUFdHK4V1F8GEIw snkkPmarfavpUytdDPsHPFhLEfX6jcPf6wMWmUWdGh9qOBqnSXyyvsdu +jxFJ/W04oAq6XABIyA2NPFWTtO1nUifYg+WSti4n+wwGsujyEdYrvLT Bf82mA==
Если есть вопросы, то пишем в комментариях и не забываем проголосовать за статью.
Настройка DNSSEC на Ubuntu Server
5 (100%) 4 votes

Оставить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *