Введение

Стандартный протокол синхронизации времени между устройствами

Протокол сетевого времени (NTP) — это сетевой протокол для синхронизации часов между компьютерными системами в сетях передачи данных с пакетной коммутацией и переменной задержкой. NTP, находящийся в эксплуатации с начала 1985 года, является одним из старейших интернет-протоколов, используемых в настоящее время. NTP был разработан Дэвидом Л. Миллсом из Университета Делавера. NTP предназначен для синхронизации всех участвующих компьютеров с точностью до нескольких миллисекунд от Координированного универсального времени (UTC). Протокол обычно описывается в терминах модели «клиент-сервер», но также может быть легко использован во взаимосвязанных отношениях, где оба узла рассматривают друг друга как потенциальный источник времени. Они также могут использовать широковещание или многоадресную рассылку, где клиенты пассивно прослушивают обновления времени после первоначального обмена данными для калибровки в обе стороны. Технология была впервые развернута в локальной сети как часть протокола маршрутизации Hello и реализована в маршрутизаторе Fuzzball — экспериментальной операционной системе, используемой для прототипирования сетей, где она работала в течение многих лет. Другие связанные сетевые инструменты были доступны как тогда, так и сейчас. К ним относятся протоколы Daytime и Time для записи времени событий, а также сообщения ICMP Timestamp и опция IP Timestamp. Более полные системы синхронизации, хотя и не обладающие алгоритмами анализа данных и дисциплинирования часов NTP, включают в себя Unix-демон timed, который использует алгоритм выборов для назначения сервера для всех клиентов, и службу цифровой синхронизации времени (DTSS), которая использует иерархию серверов, аналогичную модели слоев NTP. В 1985 году NTP версии 0 (NTPv0) был реализован как в Fuzzball, так и в Unix, а заголовок пакета NTP и вычисления задержки и смещения, которые сохранились в NTPv4, были задокументированы. Несмотря на относительно медленные компьютеры и сети, доступные в то время, точность лучше 100 миллисекунд обычно достигалась на трансатлантических соединениях, а точность в десятки миллисекунд — в сетях Ethernet. В 1988 году была опубликована гораздо более полная спецификация протокола NTPv1 с сопутствующими алгоритмами. Она основывалась на экспериментальных результатах и алгоритме фильтрации часов, задокументированных, и была первой версией, описывающей режимы «клиент-сервер» и «узел-узел». В 1991 году архитектура, протокол и алгоритмы NTPv1 были представлены более широкому инженерному сообществу с публикацией статьи Дэвида Л. Миллса в IEEE Transactions on Communications. В 1989 году было опубликовано определение NTPv2 с использованием конечного автомата и псевдокодом для описания его работы. В нем был введен протокол управления и схема криптографической аутентификации, которые сохранились в NTPv4 вместе с большей частью алгоритма. Однако дизайн NTPv2 был подвергнут критике сообществом DTSS за отсутствие формальной корректности, и процедура выбора часов была изменена для включения алгоритма Марзулло начиная с NTPv3. В 1992 году был определен NTPv3. RFC включал анализ всех источников ошибок, от эталонных часов до конечного клиента, что позволило рассчитать метрику, помогающую выбрать лучший сервер, когда несколько кандидатов, по-видимому, не согласны. Был введен широковещательный режим. В последующие годы, по мере добавления новых функций и улучшения алгоритмов, стало очевидно, что требуется новая версия протокола. В 2010 году была опубликована спецификация NTPv4. После выхода Миллса на пенсию из Университета Делавера эталонная реализация в настоящее время поддерживается как проект с открытым исходным кодом под руководством Харлана Стенна. Со стороны IANA рабочая группа ntp (протоколы сетевого времени) отвечает за рассмотрение предлагаемых черновиков. Протокол значительно продвинулся с момента NTPv4.

СНТП

Поскольку NTP заменил использование старого протокола времени, некоторые сценарии использования всё же находили полный протокол слишком сложным. В 1992 году был определён Простой протокол сетевого времени (SNTP) для заполнения этой ниши. Стандарт SNTPv3 описывает способ использования NTPv3, не требующий хранения состояния в течение длительных периодов времени. Топология становится практически идентичной топологии протокола Time, поскольку используется только один сервер. В 1996 году SNTP был обновлён до SNTPv4 с некоторыми функциями разрабатываемого в то время NTPv4. Текущая версия SNTPv4 была включена в основной стандарт NTPv4 в 2010 году. SNTP полностью совместим с NTP, поскольку не определяет новый протокол. Однако, из-за использования упрощённых алгоритмов, он обеспечивает менее точное время, поэтому не рекомендуется синхронизировать время с источником SNTP.

Временные метки

64-битные двоичные метки времени с фиксированной точкой, используемые NTP, состоят из 32-битной части для секунд и 32-битной части для дробной секунды, что обеспечивает временную шкалу с периодом переполнения в 232 секунды (136 лет) и теоретическое разрешение в 2−32 секунды (233 пикосекунды). NTP использует эпоху, начинающуюся 1 января 1900 года. Следовательно, первое переполнение произойдет 7 февраля 2036 года. NTPv4 вводит 128-битный формат даты: 64 бита для секунд и 64 бита для дробной секунды. Наиболее значимые 32 бита этого формата – номер эры, который в большинстве случаев устраняет неоднозначность переполнения. По словам Миллса, "64-битного значения для дробной части достаточно, чтобы определить время, необходимое фотону для обгона электрона на скорости света. 64 бита для секунд достаточно, чтобы обеспечить однозначное представление времени до тех пор, пока вселенная не погаснет."

Референтная реализация

Референтная реализация NTP, вместе с протоколом, непрерывно разрабатывалась более 20 лет. Обратная совместимость поддерживалась при добавлении новых функций. Она содержит несколько критически важных алгоритмов, особенно для синхронизации часов, которые могут работать некорректно при синхронизации с серверами, использующими другие алгоритмы. Программное обеспечение было портировано практически на все вычислительные платформы, включая персональные компьютеры. Оно работает как демон ntpd в Unix или как служба в Windows. Поддерживаются опорные часы, а их отклонения фильтруются и анализируются так же, как и отклонения удаленных серверов, хотя обычно их опрос производится чаще.

Время Windows

Все версии Microsoft Windows, начиная с Windows 2000, включают службу Windows Time (W32Time), которая позволяет синхронизировать системное время с сервером NTP. Изначально W32Time был реализован для протокола аутентификации Kerberos версии 5, которому требовалось, чтобы время было точным с точностью до 5 минут для предотвращения атак повторного воспроизведения. Сетевой сервер времени в Windows 2000 Server (и Windows XP) не поддерживает дисциплинированную синхронизацию по NTP, а только локально дисциплинированную синхронизацию с коррекцией NTP/SNTP. Начиная с Windows Server 2003 и Windows Vista, NTP-провайдер для W32Time стал совместим с существенной частью NTPv3. Microsoft утверждает, что W32Time не может надежно поддерживать синхронизацию времени с точностью до одной секунды. Если требуется более высокая точность, Microsoft рекомендует использовать более новую версию Windows или другую реализацию NTP. Начиная с Windows 10 версии 1607 и Windows Server 2016, W32Time можно настроить для достижения точности времени 1 с, 50 мс или 1 мс при определенных рабочих условиях.

ОткрытьNTPD

В 2004 году Хеннинг Брауер из OpenBSD представил OpenNTPD – реализацию NTPv3/SNTPv4, ориентированную на безопасность и использующую разделение привилегий. Хотя она в большей степени предназначена для простых, общих нужд пользователей OpenBSD, она также включает в себя некоторые улучшения безопасности протокола, сохраняя при этом совместимость с существующими NTP-серверами. Упрощенная кодовая база жертвует точностью, которая считается излишней в данном сценарии использования. Портативная версия доступна в репозиториях пакетов Linux.

NTPsec

NTPsec — это ответвление эталонной реализации, прошедшее систематическую проверку и усиление безопасности. Ответвление было создано в июне 2015 года в ответ на серию инцидентов безопасности, произошедших в 2014 году. Первый стабильный релиз был выпущен в октябре 2017 года. За счёт удаления небезопасных функций, прекращения поддержки устаревшего оборудования и устаревших вариантов Unix, NTPsec удалось сократить исходную кодовую базу на 75%, что упростило её аудит. Аудит кода, проведённый в 2017 году, выявил восемь уязвимостей, включая две, отсутствовавшие в оригинальной эталонной реализации, однако NTPsec не подвергся восьми другим уязвимостям, которые остались в эталонной реализации.

хронический

chrony — независимая реализация NTP, в основном спонсируемая Red Hat, которая использует её в качестве программы времени по умолчанию в своих дистрибутивах. Написанная с нуля, chrony имеет более простую кодовую базу, что обеспечивает повышенную безопасность и меньшее потребление ресурсов. Chrony была признана "надежной" и имеет небольшое количество зафиксированных инцидентов. Она способна достигать повышенной точности при подключении к локальной сети, используя аппаратную метку времени на сетевом адаптере. Поддержка Network Time Security (NTS) была добавлена в версии 4.0. Программа распространяется под лицензией GNU General Public License версии 2, была создана Ричардом Курноу в 1997 году и в настоящее время поддерживается Мирославом Личваром.

Другие

был начат Полом Хеннингом Кампом из FreeBSD в 2014 году и заброшен в 2015 году. Реализация финансировалась Фондом Linux. Это SNTP-клиент, встроенный в systemd. Он используется Debian, начиная с версии "bookworm", и производными сборками Ubuntu.

Скольцевые секунды

В день события введения високосной секунды, ntpd получает уведомление из конфигурационного файла, от подключенных опорных часов или от удаленного сервера. Хотя во время события часы NTP фактически останавливаются, из-за требования, чтобы время всегда казалось строго возрастающим, любые процессы, обращающиеся к системному времени, приводят к его незначительному увеличению, сохраняя последовательность событий. Если когда-либо возникнет необходимость во введении отрицательной високосной секунды, она будет удалена последовательностью 23:59:58, 00:00:00, пропуская 23:59:59. Альтернативная реализация, называемая "размазыванием високосной секунды", заключается в постепенном введении високосной секунды в течение 24 часов, с полудня до полудня по времени UTC. Эту реализацию используют Google (как внутри компании, так и на своих публичных NTP-серверах), Amazon AWS и Facebook. Chrony поддерживает размазывание високосной секунды в конфигурациях , но такое использование не следует смешивать с публичным пулом NTP, поскольку размазывание високосной секунды не является стандартным и может привести к ошибкам в вычислениях клиентов при смешанном использовании.

Проблемы безопасности

Поскольку корректировка системного времени обычно является привилегированной операцией, часть или весь код NTP должна выполняться с определенными привилегиями для поддержки его основных функций. В эталонной реализации кодовой базы NTP было выявлено лишь несколько других проблем безопасности, однако те, что проявились в 2009 году, вызвали серьезную обеспокоенность. Протокол постоянно пересматривался и анализировался на протяжении всей своей истории. Кодовая база эталонной реализации в течение нескольких лет подвергалась аудитам безопасности, проводимым различными организациями. В 2014 году была обнаружена и устранена уязвимость, связанная с переполнением буфера стека. Компания Apple была настолько обеспокоена этой уязвимостью, что впервые использовала функцию автоматического обновления. На системах, использующих эталонную реализацию, работающую с правами пользователя root, это могло привести к неограниченному доступу. Некоторые другие реализации, такие как OpenNTPD, имеют меньший объем кода и используют другие меры защиты, такие как разделение привилегий, что делает их невосприимчивыми к этой уязвимости. Аудит безопасности 2017 года трех реализаций NTP, проведенный по заказу Инициативы по базовой инфраструктуре Linux Foundation, показал, что NTP и NTPsec представляли большую проблему с точки зрения безопасности, чем Chrony. Серверы NTP могут быть уязвимы для атак типа "человек посередине", если пакеты не подписаны криптографически для аутентификации. Вычислительные затраты могут сделать это непрактичным для загруженных серверов, особенно во время атак типа "отказ в обслуживании". Подделка сообщений NTP в атаке "человек посередине" может использоваться для изменения системного времени на клиентских компьютерах и позволяет проводить ряд атак, основанных на обходе истечения срока действия криптографических ключей. К числу сервисов, подверженных воздействию поддельных сообщений NTP, относятся TLS, DNSSEC, различные схемы кэширования (например, кэш DNS), протокол Border Gateway Protocol (BGP), Bitcoin и ряд схем постоянной аутентификации. NTP использовался в распределенных атаках типа "отказ в обслуживании". На сервер NTP отправляется небольшой запрос с подделанным обратным IP-адресом, указывающим на целевой адрес. Подобно атаке амплификации DNS, сервер отвечает гораздо большим пакетом, что позволяет злоумышленнику значительно увеличить объем данных, отправляемых на целевой адрес. Чтобы избежать участия в атаке, программное обеспечение сервера NTP можно обновить или настроить серверы на игнорирование внешних запросов.

Безопасные расширения

NTP включает в себя поддержку аутентификации серверов для клиентов. NTPv3 поддерживает режим симметричного ключа, который бесполезен против атак типа "человек посередине" (MITM). Система публичных ключей, известная как "autokey" в NTPv4, адаптированная из IPSec, обеспечивает надежную аутентификацию, без опубликованных исправлений, за исключением изменения кода аутентификации сообщений. Network Time Security (NTS) – это защищенная версия NTPv4, использующая TLS и AEAD. Главное преимущество перед предыдущими попытками заключается в том, что отдельный сервер установления ключей обрабатывает ресурсоемкую асимметричную криптографию, которую необходимо выполнить только один раз. Если сервер выйдет из строя, предыдущие пользователи все равно смогут получать точное время без опасений атак типа MITM. В настоящее время NTS поддерживается несколькими серверами времени, включая Cloudflare. Она поддерживается NTPSec и chrony. Microsoft также разработала подход к аутентификации пакетов NTPv3/SNTPv4 с использованием идентификатора домена Windows, известный как MS SNTP. Эта система реализована в эталонных реализациях ntpd и chrony с использованием samba для подключения к домену.