Технология DNS в нынешнем виде была разработана более 20 лет назад, когда о защите информации мало кто задумывался. Поэтому в сегодняшним состоянии система DNS имеет несколько ключевых уязвимостей.
Достоверность ответа DNS-сервера никак не проверяется. Это позволяет отправить пользователя, обратившегося к доменному имени, на произвольный IP-адрес, подменив ответ сервера.
Также уязвимы кэширующие DNS-серверы провайдеров, выступающие как резолверы для клиентов: Атака Каминского.
Сегодня существуют технологии, предусматривающие хранение открытых ключей в DNS-записях, например, DKIM-подписи в электронной почте, SSH-ключей в записях SSHFP и т.д. Все эти технологии требуют защиты от подделки DNS.Поэтому была разработана технология DNSSEC позволяющая убедиться, что DNS сервер является подлинным.
DNSSEC — технология, позволяющая однозначно удостовериться в подлинности DNS информации при помощи криптографической подписи.
В этой статье разберём как можно внедрить данную технологию на наш сервер с операционной системой Ubuntu.
- ОС – Ubuntu Server 18.04 LTS
- DNS сервер – Bind v.9.x
- Domen – Ваш зарегистрированный домен (в примере будет использоваться домен от регистратора Reg.ru).
Создаём каталог, в котором будем хранить ключи и сразу переходим в него.
На CentOS / Red Hat:
sudo mkdir /var/named/
cd /var/named/На Ubuntu / Debian:
sudo mkdir /var/lib/bind/
cd /var/lib/bind/Генерируем мастер ключ для зоны (KSK):
sudo dnssec-keygen -f KSK -a RSASHA256 -b 1024 -n ZONE obu4alka.ru
- -f KSK — флаг, который говорит, что формируется мастер ключ.
- -a RSASHA1 — используемый алгоритм шифрования.
- -b 2048 — размер ключа в битах.
- -n ZONE — для DNS-зоны.
- -r /dev/urandom — путь к файлу со случайными данными. В различных версиях системы путь может отличаться. Если упустить этот ключ в CentOS / Ubuntu, процесс генерации сертификата может зависнуть.
- obu4alka.ru — домен, для которого предназначен ключ.
подробное описание ключей можно посмотреть командой man dnssec-keygen.
Генерируем ключ для зоны (ZSK):
sudo dnssec-keygen -a RSASHA256 -b 2048 -n ZONE obu4alka.ruФормируются при помощи ключа -a ECCGOST.
Генерируем мастер ключ для зоны (KSK):
sudo dnssec-keygen -f KSK -a ECCGOST -b 2048 -n ZONE obu4alka.ru
Генерируем ключ для зоны (ZSK):
sudo dnssec-keygen -a ECCGOST -b 2048 -n ZONE obu4alka.ruСмена прав и владельца для сгенерированных файлов.
На CentOS / Red Hat:
sudo chown -R named:named /var/namedНа Ubuntu / Debian:
sudo chown -R bind:bind /var/lib/bindРучное подписывание зоны
Переходим в каталог, где хранится наша зона.
CentOS / Red Hat:
cd /var/named/masterUbuntu / Debian:
cd /var/lib/bind/*Пути могут отличаться (зависит от ваших настроек)
Подписываем зону:
sudo dnssec-signzone -N INCREMENT -K /var/lib/bind/ obu4alka.ru
- -N INCREMENT — использовать формат серийного номера SOA из файла.
- -K /var/lib/bind/ — путь хранения сгенерированных ключей.
- obu4alka.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В каталоге хранения зон мы должны увидеть obu4alka.ru.signed — это файл подписанной зоны.
Редактируем конфигурационный файл bind.
На CentOS / Red Hat:
sudo nano /etc/named.confНа Ubuntu / Debian:
sudo nano /etc/bind/named.conf.localВ настройке зоны меняем путь к файлу:
zone "obu4alka.ru" {
type master; file "/var/lib/bind/obu4alka.signed";};
};
Перезапускаем bind:
На CentOS / Red Hat:
sudo systemctl reload namedНа Ubuntu / Debian:
sudo systemctl reload bindКаждый раз после редактирования зоны не очень удобно ее постоянно подписывать командой dnssec-signzone.
Для автоматизации процесса в конфигурационном файле bind добавим следующие опции:
sudo nano /etc/bind/named.conf.optionsoptions {
…
key-directory "/var/lib/bind/";
sig-validity-interval 20 10;
}- key-directory — каталог для хранения сгенерированных ключей, необходимо прописать тот, в котором мы формировали последние командой dnssec-keygen;
- sig-validity-interval — период действия ключей: дней / период обновления.
Для зоны редактируем:
zone "obu4alka.ru" {
type master;
file "/var/lib/bind/obu4alka.ru";
inline-signing yes;
auto-dnssec maintain;
};- inline-signing — включение или отключение прозрачного формирования подписей (без необходимости менять файл зоны);
- auto-dnssec — уровень автоматической настройки DNSSEC для зоны.
Также обращаем внимание, что мы убрали расширение
.signed.
Проверяем, что у пользователя named/bind есть права на запись в каталог хранения зоны. При необходимости, меняем владельца:
sudo chown -R bind:bind /var/lib/bind/Также права на файлы *.private должны быть выставлены в 400
sudo chmod -R 400 /var/lib/bind/*.privateУдаляем старый файл подписанной зоны:
sudo rm -f /var/lib/bind/obu4alka.ru.signedПерезапускаем bind.
На CentOS / Red Hat:
sudo systemctl restart namedНа Ubuntu / Debian:
sudo systemctl restart bind9В каталоге зоны должны появиться дополнительные 3 файла:
obu4alka.ru.jbk, obu4alka.ru.signed, obu4alka.ru.signed.jnlТак как DNSSEC основан на обеспечении цепочки доверия, чтобы процесс верификации заработал, требуется чтобы регистратор заверил созданный KSK-ключ,подтвердив своё доверие. Для этого создадим на основе KSK-ключа DSKEY-ключ (Delegation Signature Key)
dnssec-dsfromkey Kobu4alka.ru.+005+40201Команда выдаст примерно следующее
obu4alka.ru. IN DS 40201 5 1 4A6BD188AA7D40BA2F0D1B8CE3D46794274B19DC
obu4alka.ru. IN DS 40201 5 2 584EDC23334582812FD36AED39713BE79080F319AC55AE48BB1F4CFE56DC337BКопируем две сгенерированные строки в интерфейсе ввода DSKEY на сайте регистратора домена.
Верификация заработает после того как регистратор обновит параметры первичной зоны.
Однако для полноты счастья, если регистратору вместо KSK потребуется именно запись формата DS, мы сгенерируем записи DS от созданного ранее KSK (Kobu4alka.ru+005+40201.key) с использованием трёх различных алгоритмов хэширования (SHA-1 (type 1), SHA-256 (type 2) и SHA-384 (type 4) соответственно):
cd /var/lib/bind/
sudo dnssec-dsfromkey -a SHA-1 Kobu4alka.ru.+005+40201.key
obu4alka.ru IN DS 40201 5 1 4A6BD188AA7D40BA2F0D1B8CE3D46794274B19DC sudo dnssec-dsfromkey -a SHA-256 Kobu4alka.ru.+005+40201.key
obu4alka.ru. IN DS 40201 5 2 584EDC23334582812FD36AED39713BE79080F319AC55AE48BB1F4CFE56DC337B
sudo dnssec-dsfromkey -a SHA-384 Kobu4alka.ru.+005+40201.key
obu4alka.ru. IN DS 40201 8 4 A7D507EF058F0C8A03EE03FC4BEWG4EE271F4C3F2AF9EA7984C0F710002E79EE3F47E7F5297779BFED280D1A94FE171
В итоге, для завершения активации DNSSEC на нашем домене obu4alka.ru, мы должны отправить нашему регистратору доменных имён такую вот инфу:
Digest type 1 (SHA-1)
obu4alka.ru. IN DS 40201 5 1 4A6BD188AA7D40BA2F0D1B8CE3D46794274B19DC
Digest type 2 (SHA-256)
obu4alka.ru. IN DS 40201 5 2 584EDC23334582812FD36AED39713BE79080F319AC55AE48BB1F4CFE56DC337B
Digest type 4 (SHA-384)
obu4alka.ru. IN DS 40201 5 4 368E486E7180A6018C45D6277C3BE41F0B76590A873BF38B69049F4364EBBABDA4C836672F898425A0F05F3F5261D19B
DNSKEY (flags 257, KSK)
AwEAAZsoe6EOeUXWfn3hnelwRVobfZzRLD3BShe5jahasPcdc66oyhAtt8mjMQJrnsUEgDgpu3wUNA1FMQtqQ2g+s+1EXjm/2bao6wW06LclvypdPUYA9DTBbnnY9nv5LFSMjPB2cU1zmfJGalPrtbH1qy7UBZtv8uhNlr6+z8WmBnHBFR4u6VQs4v8kwQFsVI/VJrmn72Zw81xtFsKU988NJAV3fmcpIFHcs9ZnUSJJz/iTAgOaMfZ9ex9g/Q6/eIkmZxS2IYG+L/5ugHCuNZ+mm5pBMVQzHFdAfnJfDB9hu69d5lJ6uQDGqSbyLz31c39QFUfePg8Omec/nYbc6ktIvl8Pc=
Чтобы проверить, отдает ли наш сервер bind ответы с цифровыми подписями, вводим команду:
dig @obu4alka.ru www.obu4alka.ru +dnssecв данном примере мы запросили IP-адрес для записи www.obu4alka.ru, а +dnssec означает, что также клиент запрашивает RRSIG для этой записи.
Мы должны увидеть записи вместе с их RRSIG, например:
www.obu4alka.ru. 14399 IN A 111.111.111.1111
www.obu4alka.ru. 14399 IN RRSIG A 5 3 14400 20180923003604 20180824003109 27942 obu4alka.ru. iC2nPBz016QLRK/vZuLsk1eUpfWMd99x8jiJMV1AwLyK3MT1YBJ70GjQ ICOqlXAsa/igqzd6DjWyEbF3F2svr//ZU0ZHaszr2tkRguPvVl1jg/aW F+/F3Nj8umQvE60M1hTXBB80aF3ulPUC3B0TbgP6b04so63ZM82uqd7s DPgagVuSwbJ1m4K1/VJdHhrh0XfSEF4ybcRPrnUv6fUFdHK4V1F8GEIw snkkPmarfavpUytdDPsHPFhLEfX6jcPf6wMWmUWdGh9qOBqnSXyyvsdu +jxFJ/W04oAq6XABIyA2NPFWTtO1nUifYg+WSti4n+wwGsujyEdYrvLT Bf82mA==