Техническое: аутентификация в клиентском DNS
Тут спрашивают, достаточно ли устроить DNS-резолвер на собственном сервере или использовать сервис наподобие Google Public DNS, чтобы меньше беспокоиться о подмене ответов DNS (которые могут увести куда угодно)? Нет, не достаточно. Ключевой момент тут в IP-адресах. Предположим, что у вас настроен в качестве резолвера собственный сервер (пусть это будет BIND), доступный по IP-адресу 1.2.3.4. Откуда ваша локальная операционная система знает, что, отправляя запросы и получая ответы от 1.2.3.4, – она “разговаривает” именно с нужным резолвером?
Если в качестве точки перехвата трафика используются ближайший к вашему узлу шлюз, то очень легко сделать так, что по адресу 1.2.3.4 будет отвечать какой угодно подставной сервер. Посудите сами: сейчас даже новомодные точки доступа WiFi используют такую технологию, чтобы вместо нужного сайта показывать в браузере собственную страницу с сообщением об “ошибке соединения”, если там, например, кабель выпал (делать так, конечно, форменное безобразие). То же нередко реализуют интернет-провайдеры. Технология простая: маршрутизатор, вместо того, чтобы отправить пакеты в Интернет, перенаправляет их внутреннему узлу. Так что на запрос к 8.8.8.8 (гугловский DNS) может поступить самый неожиданный ответ: mail.google.com = 192.168.1.1. Более того, благодаря возможностям по спуфингу, существующим в типичной локальной сети, перехватить трафик может не только маршрутизатор. Ну и существует ещё несколько способов, позволяющих подставить другой сервер вместо вашего резолвера. Что, кстати, напоминает ситуацию со спуфингом GPS. (Как страшно жить.)
Возвращаемся к DNS. Что делать? А просто не нужно забывать об аутентификации. Так, если вы используете свой резловер без VPN, то потребуется настроить TSIG – то есть, подписывание запросов и ответов клиентом и сервером, стандартный механизм при обмене файлами зон.
Я делаю так: на локальной машине в качестве резолвера поднят BIND с поддержкой TSIG, для него в качестве “форвардера” настроен сервер резолвера – в файле конфигурации named.conf директива forwarders:
forwarders {
1.2.3.4;
};
(1.2.3.4 – IP-адрес резолвера).
Для удостоверения сообщений требуется общий секретный ключ. Его можно сгенерировать утилитой dnssec-keygen, входящей в пакет BIND9:
$ dnssec-keygen -a HMAC-MD5 -b 128 -n HOST megakey
(пояснения к параметрам: тип алгоритма HMAC-MD5, 128-бит, ключ для хоста).
Результатом работы является пара файлов, примерно с такими именами: Kmegakey.+157+14629.key и Kmegakey.+157+14629.private. Значение ключа, в виде строки Base64, можно взять из .private. Ключ, понятно, секретный.
Теперь в конфигурацию обоих BIND-ов, на клиенте, и на сервере, нужно добавить записи о ключе и директивы, предписывающие этот ключ использовать. Самый правильный способ: ключи вынести в отдельный файл, защитить его правами доступа, а в конфигурацию добавить с помощью include. Что, кстати, на отдельном виртуальном сервере может оказаться избыточным.
Описание ключа, для speckey.conf.key или прямо для named.conf:
key “resolver-key” {
algorithm hmac-md5;
secret “SuperMEGAKey==”;
};
Понятно, что SuperMEGAKey допустимо заменить на ваш собственный секретный ключ.
Назначение ключа узлу (серверу), в named.conf, ничего секретного в строке нет:
server 1.2.3.4 {
keys{
resolver-key;
};
};
Здесь 1.2.3.4 – адреса узлов: на клиенте – серверный адрес, на сервере – клиентский.
Собственно, это всё (после настройки нужно перезапустить BIND): при попытке подмены или перехвата ответов – получаем сообщение об ошибке, не более того.
Осталось напомнить, при чём здесь VPN. При установлении соединения VPN уже проводится аутентификация и сервера VPN, и клиента. По крайней мере, если VPN настроен правильно. Поэтому, если DNS-резолвер работает в той же виртуальной сети, что и шлюз VPN, особого смысла вводить дополнительную проверку транзакций нет. Хотя, можно и ввести, конечно. Всё зависит от типа паранойи.
Адрес записки: https://dxdt.ru/2012/07/26/5033/
Похожие записки:
- DNS-over-TLS на авторитативных серверах DNS
- Техническое описание TLS: обновление 2022
- TLS 1.3 и постквантовые криптосистемы
- Ретроспектива заметок: сентябрь 2013 года
- Chrome и УЦ Entrust
- Спагеттизация Интернета как проявление битвы за банхаммер
- Браузер Chrome 122 и Kyber768
- Обновления сервиса audit.statdom.ru
- IP-адреса и октеты
- Техническое: имена в TLS и Nginx
- Построение CVE-2025-0282 в Ivanti Connect Secure
Комментарии читателей блога: 4
1 <t> // 26th July 2012, 17:49 // Читатель jno написал:
Если я чего-то понимаю, то ключей должно быть ДВЕ пары…
Нет?
2 <t> // 26th July 2012, 18:12 // Александр Венедюхин:
Зачем? Там всё равно общий секретный ключ. Это особенность TSIG.
3 <t> // 26th July 2012, 18:53 // Читатель jno написал:
общий секретный?
симметричное, что ли?
4 <t> // 26th July 2012, 19:20 // Александр Венедюхин:
Ага.