- PVSM.RU - https://www.pvsm.ru -
Как сделать так, чтобы время per se не врало, если у вас есть миллион больших и малых устройств, взаимодействующих по TCP/IP? Ведь на каждом из них есть часы, а время должно быть верным на всех. Эту проблему без ntp невозможно обойти.
Представим себе на одну минуту, что в одном сегменте промышленной ИТ инфраструктуры возникли трудности с синхронизацией сервисов по времени. Немедленно начинает сбоить кластерный стек Enterprise ПО, распадаются домены, мастера и Standby узлы безуспешно стремятся восстановить status quo.
Возможна также ситуация, когда злоумышленник намеренно старается сбить время через MiTM, или DDOS атаку. В такой ситуации может произойти все что угодно:
Понятно, что каждый первый департамент ИТ заинтересован в надежной работе служб синхронизации времени, и хорошо бы они были надежны и безопасны в промышленной эксплуатации.
Сетевые протоколы — милленниалы имеют одну особенность, они давно устарели [1] и никуда уже не годятся, но заменить их не так-то легко даже тогда, когда набирается критическая масса энтузиастов и финансирования.
Основная претензия к классическому NTP в отсутствии надежных механизмов защиты от атак злоумышленников. Предпринимались разнообразные попытки решить эту проблему. Для этого сначала внедрили механизм заранее установленных ключей (PSK) для обмена симметричными ключами.
К сожалению этот способ себя не оправдал в сиду простой причины — он плохо масштабируется. Нужна ручная настройка на стороне клиента в зависимости от сервера. Это значит, что вот так вот просто нельзя добавить еще одного клиента. Если на сервере NTP что-то меняется, надо перенастраивать все клиенты.
Тогда придумали AutoKey, но сразу же в нем обнаружили ряд серьезных уязвимостей в самом дизайне алгоритма и от него пришлось отказаться. Все дело в том, что начальное число (seed) содержит всего лишь 32-бита, оно слишком мало и не содержит достаточно вычислительной сложности для лобовой атаки.
Autokey рассчитывается следующим образом.
Autokey=H(Sender-IP||Receiver-IP||KeyID||Cookie)
Где H() — криптографическая хэш функция.
Для расчета контрольной суммы пакеты используется та же функция.
MAC=H(Autokey||NTP packet)
Так получается, что вся целостность проверок пакетов держится на аутентичности кукис. Завладев ими, можно восстановить autokey и затем подделать MAC. Однако сервер NTP при их генерации использует начальное число (seed). Именно тут кроется подвох.
Cookie=MSB_32(H(Client IP||Server IP||0||Server Seed))
Функция MSB_32 отрезает от результата вычисления md5 хэша 32 старших бита. Клиентский куки не меняется до тех пор, пока параметры сервера неизменны. Дальше злоумышленнику остается лишь восстановить начальное число и получить возможность самостоятельно генерить куки.
Для начала следует подключиться к серверу NTP в качестве клиента и получить куки. После этого методом перебора злоумышленник восстанавливает начальное число следуя простому алгоритму.
Алгоритм атаки на вычисление начального числа методом перебора.
for i=0:2^32 − 1 do
Ci=H(Server-IP||Client-IP||0||i)
if Ci=Cookie then
return i
end if
end for
IP адреса известны, так что остается лишь создать 232 хэша до тех пор пока созданный куки не совпадет с тем, что получен от NTP сервера. На обычной домашней станции с Intel Core i5 на это уйдет 25 мин.
Мириться с такими дырами в безопасности Autokey было невозможно и в 2012 г. появилась новая версия [2] протокола. В целях скомпрометированного названия решили провести ребрендинг, так Autokey v.2 окрестили Network Time Security.
Протокол NTS является расширением безопасности NTP и в настоящее время поддерживает лишь одноадресный режим (unicast). Он дает надежную криптографическую защиту от манипуляций пакетами, предотвращает отслеживание, хорошо масштабируется, устойчив к потере сетевых пакетов и приводит к наименьшим потерям точности, возникающим в процессе защиты соединения.
NTS соединение состоит из двух этапов, в которых используются протоколы нижнего уровня. На первом этапе клиент и сервер договариваются о различных параметрах соединения и обмениваются куки, содержащими ключи со всем сопутствующим набором данных. На втором этапе происходит собственно защищенный NTS сеанс между клиентом и сервером NTP.
NTS состоит из двух протоколов нижнего уровня: Network Time Security Key Exchange (NTS-KE), инициализация безопасного соединения поверх TLS, и NTPv4 — последней инкарнации протокола NTP. Чуть подробнее об этом ниже.
На данном этапе NTP клиент инициирует TLS 1.2/1.3 сеанс по отдельному TCP соединению с сервером NTS KE. Во время этой сессии происходит следующее.
Такой подход имеет большое преимущество в том, что вся нагрузка по передаче секретной информации параметров соединения ложится на проверенный и надежный протокол TLS. Тем самым отпадает необходимость изобретать собственный велосипед для безопасного NTP рукопожатия.
На втором этапе клиент безопасно синхронизирует время с NTP сервером. Для этой цели он передает четыре специальных расширения (extension field) в структуре NTPv4 пакета.
Получив запрос от клиента, сервер проверяет подлинность NTP пакета. Для этого он должен расшифровать куки, извлечь алгоритм AAED и ключи. После успешной проверки NTP пакета на валидность сервер отвечает клиенту в следующем формате.
Второе рукопожатие можно повторить много раз, минуя первый этап, так как каждый запрос и ответ дает клиенту дополнительные куки. Это дает то преимущество, что относительно ресурсоемкие TLS операции вычисления и передачи PKI данных делятся на число повторных запросов. Это особенно удобно для специализированных FPGA хронометров, когда весь основной функционал можно упаковать в несколько функций из области симметричной криптографии, передав весь TLS стек на другое устройство.
В чем особенность NTP? Несмотря на то, что автор проекта Dave Mills старался как можно лучше документировать свой код, редкий программист сумеет разобраться в хитросплетениях алгоритмов синхронизации времени 35-детней давности. Часть кода написана до эпохи POSIX, а Unix API тогда сильно отличался от того, что используется в наши дни. Кроме того, нужны знания по статистике, чтобы очистить сигнала от помех на шумных линиях.
NTS была не первой попыткой починить NTP. После того, как злоумышленники научились использовать уязвимости NTP для усиления DDoS атак, стало ясно, что нужны радикальные перемены. И пока готовились и доводились до ума черновики NTS, National Science Foundation США в конце 2014 г. срочно выделил грант на модернизацию NTP.
Рабочую группу возглавил не абы кто, а Эрик Стивен Реймонд [4] — один из основателей и столпов сообщества Open Source и автор книги Собор и Базар [5]. Первым делом Эрик со товарищи попробовали перенести код NTP из платформы BitKeeper на git, но не тут-то было. Лидер проекта Harlan Stenn был против этого решения и переговоры зашли в тупик. Тогда было решено форкнуть код проекта, так возник NTPSec.
Солидный опыт, в том числе работа над GPSD, математический бэкграунд и магический навык чтения древнего кода — Эрик Реймонд был именно тем хакером, который мог вытащить такой проект. В команде нашелся специалист по миграции кода и всего за 10 недель NTP обосновался [6]на GitLab-е. Работа закипела.
Команда Эрика Раймонда взялась за дело так же, как Огюст Роден при работе с глыбой камня. Удалив 175 KLOC старого кода, им удалось значительно сократить площадь атаки, закрыв множество дыр безопасности.
Вот неполный список попавших под раздачу:
Помимо очистки кода были и у проекта были и другие задачи. Вот неполный список достижений:
NTPSec доступен для ряда Linux дистрибутивов. В данный момент последняя стабильная версия 1.1.8, для Gentoo Linux — предпоследняя.
(1:696)$ sudo emerge -av ntpsec
These are the packages that would be merged, in order:
Calculating dependencies... done!
[ebuild R ] net-misc/ntpsec-1.1.7-r1::gentoo USE="samba seccomp -debug -doc -early -gdb -heat -libbsd -nist -ntpviz -rclock_arbiter -rclock_generic -rclock_gpsd -rclock_hpgps -rclock_jjy -rclock_local -rclock_modem -rclock_neoclock -rclock_nmea -rclock_oncore -rclock_pps -rclock_shm -rclock_spectracom -rclock_trimble -rclock_truetime -rclock_zyfer -smear -tests" PYTHON_TARGETS="python3_6" 0 KiB
Total: 1 package (1 reinstall), Size of downloads: 0 KiB
Would you like to merge these packages? [Yes/No]
Была еще одна попытка заменить старый NTP более безопасный аналог. Chrony в отличие от NTPSec написан с нуля и предназначен для надежной работы в широком диапазоне условий, включая нестабильные сетевые соединения, частичная доступность или перегрузки сети и изменения температуры. Кроме того chrony обладает и другими преимуществами:
Впрочем, в chrony отсутствуют некоторые возможности старого NTP такие, как широковещательный и многоадресный (multicast) клиент / сервер. В добавок классический NTP поддерживает большее число ОС и платформ.
Для отключения функциональности сервера и NTP запросов к процессу chronyd достаточно прописать port 0 в файл chrony.conf. Это делается в тех случаях, когда нет нужды обслуживать время для NTP клиентов или одноранговых узлов. Начиная с версии 2.0, порт сервера NTP открыт только в тех случаях, когда доступ разрешен директивой allow или соответствующей командой, либо же настроен одноранговый узел NTP, или используется директива broadcast.
Программа состоит из двух модулей.
Начиная с 7-й версии RedHat Linux использует [8] chrony в качестве службы синхронизации времени. Пакет также доступен для остальных дистрибутивов Linux. Последняя стабильная версия 3.5, готовится к выходу v4.0.
(1:712)$ sudo emerge -av chrony
These are the packages that would be merged, in order:
Calculating dependencies... done!
[binary N ] net-misc/chrony-3.5-r2::gentoo USE="adns caps cmdmon ipv6 ntp phc readline refclock rtc seccomp (-html) -libedit -pps (-selinux)" 246 KiB
Total: 1 package (1 new, 1 binary), Size of downloads: 246 KiB
Would you like to merge these packages? [Yes/No]
Как настроить собственный удаленный сервер chrony в интернете для синхронизации времени в офисной сети. Далее пример настройки на
Давайте теперь немного потренируемся и поднимем свой собственный NTP сервер на
Переходим к настройке сервиса и первым делом ставим пакет chrony.
[root@server ~]$ yum install chrony
RHEL 8 / CentOS 8 используют другой пакетный менеджер.
[root@server ~]$ dnf install chrony
После установки chrony нужно запустить и активировать сервис.
[root@server ~]$ systemctl enable chrony --now
При желании можно внести правки в /etc/chrony.conf, заменив сервера NPT на ближайшие локальные для сокращения времени отклика.
# Use public servers from the pool.ntp.org project.
# Please consider joining the pool (http://www.pool.ntp.org/join.html).
server 0.ru.pool.ntp.org iburst
server 1.ru.pool.ntp.org iburst
server 2.ru.pool.ntp.org iburst
server 3.ru.pool.ntp.org iburst
Далее настраиваем синхронизацию NTP сервера с узлами из указанного пула.
[root@server ~]$ timedatectl set-ntp true
[root@server ~]$ systemctl restart chronyd.service
Необходимо также открыть наружу NTP порт, иначе межсетевой экран будет блокировать входящие соединения от клиентских узлов.
[root@server ~]$ firewall-cmd --add-service=ntp --permanent
[root@server ~]$ firewall-cmd --reload
На стороне клиента достаточно правильно выставить часовой пояс.
[root@client ~]$ timedatectl set-timezone Europe/Moscow
В файле /etc/chrony.conf указывает IP или название хоста нашего
server my.vps.server
И наконец запуск синхронизации времени на клиенте.
[root@client ~]$ systemctl enable --now chronyd
[root@client ~]$ timedatectl set-ntp true
В следующий раз расскажу, какие есть варианты синхронизации времени без интернета.
Автор: oldadmin
Источник [10]
Сайт-источник PVSM.RU: https://www.pvsm.ru
Путь до страницы источника: https://www.pvsm.ru/hosting/353858
Ссылки в тексте:
[1] устарели: https://habr.com/en/post/321470/
[2] новая версия: https://datatracker.ietf.org/meeting/85/materials/slides-85-tictoc-5.pdf
[3] AEAD: https://en.wikipedia.org/wiki/Authenticated_encryption
[4] Эрик Стивен Реймонд: https://ru.wikipedia.org/wiki/%D0%A0%D0%B5%D0%B9%D0%BC%D0%BE%D0%BD%D0%B4,_%D0%AD%D1%80%D0%B8%D0%BA_%D0%A1%D1%82%D0%B8%D0%B2%D0%B5%D0%BD
[5] Собор и Базар: http://lib.ru/LINUXGUIDE/bazar.txt
[6] обосновался: https://gitlab.com/NTPsec/
[7] waf: https://waf.io/
[8] использует: https://red.ht/3ghfImW
[9] VPS: https://www.reg.ru/?rlink=reflink-717
[10] Источник: https://habr.com/ru/post/505938/?utm_source=habrahabr&utm_medium=rss&utm_campaign=505938
Нажмите здесь для печати.