Сетевой протокол времени ( NTP ) — сетевой протокол для синхронизации часов между компьютерными системами по сетям передачи данных с коммутацией пакетов и переменной задержкой . NTP, работающий с 1985 года, является одним из старейших интернет-протоколов, используемых в настоящее время. NTP был разработан Дэвидом Л. Миллсом из Университета Делавэра .
NTP предназначен для синхронизации участвующих компьютеров с точностью до нескольких миллисекунд относительно всемирного координированного времени (UTC). [1] : 3 Он использует алгоритм пересечения , модифицированную версию алгоритма Марзулло , для выбора точных серверов времени и предназначен для смягчения последствий переменной сетевой задержки . NTP обычно может поддерживать время с точностью до десятков миллисекунд в общедоступном Интернете и может достигать точности лучше одной миллисекунды в локальных сетях при идеальных условиях. Асимметричные маршруты и перегрузка сети могут вызывать ошибки в 100 мс и более. [2] [3]
Протокол обычно описывается в терминах модели клиент-сервер , но может также легко использоваться в одноранговых отношениях, где оба одноранговых узла рассматривают друг друга как потенциальный источник времени. [1] : 20 Реализации отправляют и получают временные метки с помощью протокола пользовательских датаграмм (UDP) на порту номер 123. [4] [5] : 16 Они также могут использовать широковещательную или многоадресную рассылку , когда клиенты пассивно слушают обновления времени после первоначального двустороннего калибровочного обмена. [3] NTP предоставляет предупреждение о любой предстоящей корректировке секунды координации, но никакая информация о местных часовых поясах или летнем времени не передается. [2] [3]
Текущий протокол — версия 4 (NTPv4), [5] которая обратно совместима с версией 3. [6]
В 1979 году технология синхронизации времени сети была использована в том, что, возможно, было первой публичной демонстрацией интернет- сервисов, работающих через трансатлантическую спутниковую сеть, на Национальной компьютерной конференции в Нью-Йорке. Позднее эта технология была описана в 1981 году в Internet Engineering Note (IEN) 173 [18] , и на ее основе был разработан общедоступный протокол, задокументированный в RFC 778. Технология была впервые развернута в локальной сети как часть протокола маршрутизации Hello и реализована в маршрутизаторе Fuzzball , экспериментальной операционной системе, используемой при создании сетевых прототипов, где она работала в течение многих лет.
Другие связанные сетевые инструменты были доступны и тогда, и сейчас. Они включают протоколы Daytime и Time для записи времени событий, а также сообщения ICMP Timestamp и опцию IP Timestamp ( RFC 781). Более полные системы синхронизации, хотя и лишенные алгоритмов анализа данных и дисциплинирования часов NTP, включают демон Unix timed , который использует алгоритм выборов для назначения сервера для всех клиентов; [19] и службу цифровой синхронизации времени (DTSS), которая использует иерархию серверов, похожую на модель стратума NTP.
В 1985 году версия NTP 0 (NTPv0) была реализована как в Fuzzball, так и в Unix, а заголовок пакета NTP, а также расчеты задержки приема-передачи и смещения, которые сохранились в NTPv4, были задокументированы в RFC 958. Несмотря на относительно медленные компьютеры и сети, доступные в то время, точность лучше 100 миллисекунд обычно достигалась на атлантических связующих соединениях, а точность в десятки миллисекунд — в сетях Ethernet .
В 1988 году гораздо более полная спецификация протокола NTPv1 с соответствующими алгоритмами была опубликована в RFC 1059. Она опиралась на экспериментальные результаты и алгоритм фильтра часов, задокументированные в RFC 956, и была первой версией, описывающей режимы клиент-сервер и одноранговый режим . В 1991 году архитектура, протокол и алгоритмы NTPv1 были представлены вниманию более широкого инженерного сообщества с публикацией статьи Дэвида Л. Миллса в IEEE Transactions on Communications . [20]
В 1989 году был опубликован RFC 1119, определяющий NTPv2 посредством конечного автомата с псевдокодом для описания его работы. Он ввел протокол управления и схему криптографической аутентификации , которые сохранились в NTPv4, вместе с основной частью алгоритма. Однако дизайн NTPv2 подвергся критике за отсутствие формальной корректности со стороны сообщества DTSS, и процедура выбора часов была изменена для включения алгоритма Марзулло для NTPv3 и далее. [21]
В 1992 году RFC 1305 определил NTPv3. RFC включал анализ всех источников ошибок, от опорных часов до конечного клиента, что позволило рассчитать метрику , которая помогает выбрать лучший сервер, когда несколько кандидатов, по-видимому, не согласны. Был введен режим широковещательной передачи.
В последующие годы, по мере добавления новых функций и усовершенствования алгоритмов, стало очевидно, что требуется новая версия протокола. [22] В 2010 году был опубликован RFC 5905, содержащий предлагаемую спецификацию для NTPv4. [23] После ухода Миллса из Университета Делавэра , эталонная реализация в настоящее время поддерживается как проект с открытым исходным кодом под руководством Харлана Стенна. [24] [25] Со стороны IANA рабочая группа ntp ( протоколы сетевого времени ) отвечает за рассмотрение предлагаемых проектов. [26]
Протокол значительно продвинулся со времени NTPv4. [23] По состоянию на 2022 год [update]было опубликовано три документа RFC, описывающих обновления протокола, [5] не считая многочисленных периферийных стандартов, таких как NTS ( RFC 8915). [26] Миллс упомянул на своей странице планы относительно «NTPv5», но ни один из них так и не был опубликован. [23] Несвязанный проект под названием «NTPv5» был инициирован М. Личваром из chrony в 2020 году и включает изменения в области безопасности, точности и масштабирования. [27]
Поскольку NTP заменил использование старого протокола времени , некоторые варианты использования, тем не менее, обнаружили, что полный протокол слишком сложен. В 1992 году был определен Simple Network Time Protocol ( SNTP ), чтобы заполнить эту нишу. Стандарт SNTPv3 описывает способ использования NTPv3, при котором не требуется хранение состояния в течение длительного периода. Топология становится по сути такой же, как и в протоколе времени, поскольку используется только один сервер. [10] В 1996 году SNTP был обновлен до SNTPv4 [12] с некоторыми функциями тогда еще находившегося в разработке NTPv4. Текущая версия SNTPv4 была объединена с основным стандартом NTPv4 в 2010 году. [5] SNTP полностью совместим с NTP, поскольку он не определяет новый протокол. [28] : §14 Однако простые алгоритмы предоставляют время с пониженной точностью, и поэтому нецелесообразно синхронизировать время с источником SNTP. [13]
NTP использует иерархическую, полууровневую систему источников времени. Каждый уровень этой иерархии называется стратой и ему присваивается номер, начинающийся с нуля, для опорных часов наверху. Сервер, синхронизированный с сервером страт n, работает на страте n + 1. Номер представляет собой расстояние от опорных часов и используется для предотвращения циклических зависимостей в иерархии. Страта не всегда является показателем качества или надежности; часто можно найти источники времени страт 3, которые имеют более высокое качество, чем другие источники времени страт 2. [a] Краткое описание страт 0, 1, 2 и 3 приведено ниже.
Верхний предел для стратума — 15; стратум 16 используется для указания того, что устройство не синхронизировано. Алгоритмы NTP на каждом компьютере взаимодействуют для построения кратчайшего связующего дерева Беллмана–Форда , чтобы минимизировать накопленную задержку кругового обхода для серверов стратума 1 для всех клиентов. [1] : 20
Помимо Stratum, протокол способен идентифицировать источник синхронизации для каждого сервера с помощью ссылочного идентификатора (refid).
Для серверов на уровне 2 и ниже refid представляет собой закодированную форму IP-адреса сервера времени вышестоящего уровня. Для IPv4 это просто 32-битный адрес; для IPv6 это будут первые 32 бита MD5-хэша исходного адреса. Refid служат для обнаружения и предотвращения циклов синхронизации первой степени. [5]
Поле refid заполняется статусными словами в случае пакетов kiss-o'-death (KoD), которые сообщают клиенту о необходимости прекратить отправку запросов, чтобы сервер мог отдохнуть. [5] Вот некоторые примеры: INIT (инициализация), STEP (изменение времени шага) и RATE (клиент запрашивает слишком быстро). [33] Выходные данные программы могут дополнительно использовать коды, не переданные в пакете, для указания на ошибку, например XFAC для указания на отключение сети. [32]
IANA ведет реестр имен источников refid и кодов KoD. Неофициальные назначения все еще могут появляться. [34]
64-битные двоичные метки времени с фиксированной точкой, используемые NTP, состоят из 32-битной части для секунд и 32-битной части для дробной секунды, что дает шкалу времени, которая переворачивается каждые 2 32 секунды (136 лет) и теоретическое разрешение 2 −32 секунды (233 пикосекунды). NTP использует эпоху 1 января 1900 года. Таким образом, первый переворот происходит 7 февраля 2036 года. [35] [36]
NTPv4 вводит 128-битный формат даты: 64 бита для секунды и 64 бита для дробной части секунды. Наиболее значимые 32 бита этого формата — это номер эры , который в большинстве случаев разрешает неоднозначность переворачивания. [37] По словам Миллса, «64-битного значения для дроби достаточно, чтобы определить количество времени, необходимое фотону для прохождения электрона со скоростью света. 64-битного значения секунды достаточно, чтобы обеспечить однозначное представление времени до тех пор, пока вселенная не померкнет». [38] [b]
Типичный клиент NTP регулярно опрашивает один или несколько серверов NTP. Клиент должен вычислить свое смещение времени и задержку приема-передачи . Смещение времени θ — это положительная или отрицательная (время клиента > время сервера) разница в абсолютном времени между двумя часами. Она определяется как
и задержка приема-передачи δ равна где
Чтобы вывести выражение для смещения, обратите внимание, что для пакета запроса и пакета ответа решение относительно θ дает определение смещения по времени.
Значения θ и δ пропускаются через фильтры и подвергаются статистическому анализу («смягчение»). Выбросы отбрасываются, и оценка смещения времени выводится из трех лучших оставшихся кандидатов. Затем тактовая частота корректируется для постепенного уменьшения смещения («дисциплина»), создавая петлю обратной связи . [1] : 20
Точная синхронизация достигается, когда и входящие, и исходящие маршруты между клиентом и сервером имеют симметричную номинальную задержку. Если маршруты не имеют общей номинальной задержки, существует систематическое смещение в половину разницы между временем прямого и обратного перемещения. Было предложено несколько подходов для измерения асимметрии, [39] но среди практических реализаций, похоже, только chrony включает один. [40] [41]
Реализация эталонного NTP , наряду с протоколом, непрерывно развивалась в течение более 20 лет. Обратная совместимость поддерживалась по мере добавления новых функций. Она содержит несколько чувствительных алгоритмов, особенно для дисциплинирования часов, которые могут работать неправильно при синхронизации с серверами, использующими другие алгоритмы. Программное обеспечение было портировано практически на все вычислительные платформы, включая персональные компьютеры. Оно работает как демон под названием ntpd в Unix или как служба в Windows. Поддерживаются эталонные часы, а их смещения фильтруются и анализируются так же, как и удаленные серверы, хотя они обычно опрашиваются чаще. [1] : 15–19 Эта реализация была проверена в 2017 году, и было обнаружено 14 потенциальных проблем безопасности. [42]
Все версии Microsoft Windows , начиная с Windows 2000, включают службу времени Windows (W32Time), [43] которая позволяет синхронизировать часы компьютера с сервером NTP.
W32Time изначально был реализован для протокола аутентификации Kerberos версии 5, который требовал, чтобы время находилось в пределах 5 минут от правильного значения для предотвращения атак повторного воспроизведения . Сетевой сервер времени в Windows 2000 Server (и Windows XP) не реализует дисциплинированную синхронизацию NTP, а только локально дисциплинированную синхронизацию с коррекцией NTP/SNTP. [44]
Начиная с Windows Server 2003 и Windows Vista , поставщик NTP для W32Time стал совместим со значительным подмножеством NTPv3. [45] Microsoft заявляет, что W32Time не может надежно поддерживать синхронизацию времени с точностью до одной секунды. [46] Если требуется более высокая точность, Microsoft рекомендует использовать более новую версию Windows или другую реализацию NTP. [47]
Начиная с Windows 10 версии 1607 и Windows Server 2016 , W32Time можно настроить для достижения точности времени 1 с, 50 мс или 1 мс при определенных заданных условиях эксплуатации. [48] [46] [49]
В 2004 году Хеннинг Брауэр из OpenBSD представил OpenNTPD , реализацию NTPv3/SNTPv4 [50], ориентированную на безопасность и охватывающую дизайн с разделением привилегий. Хотя она больше нацелена на более простые общие потребности пользователей OpenBSD, она также включает некоторые улучшения безопасности протокола, оставаясь при этом совместимой с существующими серверами NTP. Более простая кодовая база жертвует точностью, что считается ненужным в этом варианте использования. [51] Переносимая версия доступна в репозиториях пакетов Linux.
NTPsec — это ответвление эталонной реализации, которая систематически укреплялась с точки зрения безопасности . Точка ответвления пришлась на июнь 2015 года и стала ответом на ряд компромиссов в 2014 году. [52] Первый производственный релиз был отправлен в октябре 2017 года. [53] Между удалением небезопасных функций, удалением поддержки устаревшего оборудования и удалением поддержки устаревших вариантов Unix, NTPsec смог сократить 75% исходной кодовой базы, что упростило аудит оставшейся части . [54] Аудит кода 2017 года выявил восемь проблем безопасности, включая две, которых не было в исходной эталонной реализации, но NTPsec не страдал от восьми других проблем, которые оставались в эталонной реализации. [55]
chrony — это независимая реализация NTP, в основном спонсируемая Red Hat , которая использует ее в качестве программы времени по умолчанию в своих дистрибутивах. [56] Будучи написанной с нуля, chrony имеет более простую кодовую базу, что обеспечивает лучшую безопасность [57] и меньшее потребление ресурсов. [58] Однако она не идет на компромисс с точностью, вместо этого синхронизируясь быстрее и лучше, чем эталонный ntpd во многих обстоятельствах. Она достаточно универсальна для обычных компьютеров, которые нестабильны, переходят в спящий режим или имеют прерывистое подключение к Интернету. Она также разработана для виртуальных машин, более нестабильной среды. [59]
Chrony был оценен как «заслуживающий доверия», с несколькими инцидентами. [60] Он способен достигать повышенной точности в LAN-соединениях, используя аппаратную отметку времени на сетевом адаптере. [40] Поддержка Network Time Security (NTS) была добавлена в версии 4.0. [61] chrony доступен по лицензии GNU General Public License версии 2 , был создан Ричардом Курновом в 1997 году и в настоящее время поддерживается Мирославом Личваром. [58]
В день события високосной секунды ntpd получает уведомление либо из файла конфигурации , либо из прикрепленных эталонных часов, либо из удаленного сервера. Хотя часы NTP фактически останавливаются во время события, из-за требования, чтобы время казалось строго возрастающим , любые процессы, которые запрашивают системное время, заставляют его увеличиваться на небольшую величину, сохраняя порядок событий. Если когда-либо понадобится отрицательная високосная секунда, она будет удалена с последовательностью 23:59:58, 00:00:00, пропуская 23:59:59. [65]
Альтернативная реализация, называемая leap smearing, заключается во введении високосной секунды постепенно в течение 24 часов, с полудня до полудня по времени UTC. Эта реализация используется Google (как внутри компании, так и на их публичных серверах NTP), Amazon AWS, [66] и Facebook. [67] Chrony поддерживает leap smear в конфигурациях smoothtime и leapsecmode , но такое использование не следует смешивать с публичным пулом NTP, поскольку leap smear нестандартен и в смеси сбивает клиентские вычисления. [68]
Поскольку настройка системного времени, как правило, является привилегированной операцией, часть или весь код NTP должен быть запущен с некоторыми привилегиями для поддержки его основных функций. В эталонной реализации кодовой базы NTP было выявлено всего несколько других проблем безопасности, но те, которые появились в 2009 году [ какие? ], стали причиной серьезного беспокойства. [69] [70] Протокол подвергался пересмотру и проверке на протяжении всей своей истории. Кодовая база для эталонной реализации подвергалась аудитам безопасности из нескольких источников в течение нескольких лет. [71]
Эксплойт переполнения буфера стека был обнаружен и исправлен в 2014 году. [72] Apple была достаточно обеспокоена этой уязвимостью, чтобы впервые использовать свою возможность автоматического обновления. [73] В системах, использующих эталонную реализацию, которая работает с учетными данными пользователя root, это может разрешить неограниченный доступ. Некоторые другие реализации, такие как OpenNTPD , имеют меньшую кодовую базу и приняли другие меры по смягчению, такие как разделение привилегий, и не подвержены этой уязвимости. [74]
Аудит безопасности трех реализаций NTP, проведенный в 2017 году по поручению Linux Foundation Core Infrastructure Initiative, показал, что NTP [75] [76] и NTPsec [77] были более проблематичными, чем Chrony [78] с точки зрения безопасности. [79]
Серверы NTP могут быть подвержены атакам типа «человек посередине» , если пакеты не подписаны криптографически для аутентификации. [80] Вычислительные издержки могут сделать это непрактичным на загруженных серверах, особенно во время атак типа «отказ в обслуживании» . [81] Подделка сообщений NTP от атаки типа «человек посередине» может использоваться для изменения часов на клиентских компьютерах и позволяет проводить ряд атак, основанных на обходе истечения срока действия криптографического ключа. [82] Некоторые из выявленных служб, затронутых поддельными сообщениями NTP, включают TLS , DNSSEC , различные схемы кэширования (например, кэш DNS), протокол пограничного шлюза (BGP), Bitcoin [ требуется ссылка ] и ряд постоянных схем входа в систему. [83] [84]
NTP использовался в распределенных атаках типа «отказ в обслуживании» . [85] [86] Небольшой запрос отправляется на сервер NTP с поддельным обратным IP-адресом, который является целевым адресом. Подобно атаке с усилением DNS , сервер отвечает гораздо большим ответом, что позволяет злоумышленнику существенно увеличить объем данных, отправляемых цели. Чтобы избежать участия в атаке, программное обеспечение сервера NTP можно обновить или настроить серверы на игнорирование внешних запросов. [87]
Сам NTP включает поддержку аутентификации серверов для клиентов. NTPv3 поддерживает симметричный режим ключа , который бесполезен против MITM. Система открытого ключа, известная как «autokey» в NTPv4, адаптированная из IPSec, предлагает полезную аутентификацию, [80] но непрактична для загруженного сервера. [81] Позже было обнаружено, что Autokey также страдает от нескольких недостатков дизайна, [88] без опубликованных исправлений, за исключением изменения кода аутентификации сообщений . [16]
Network Time Security (NTS) — это защищенная версия NTPv4 с TLS и AEAD . [89] Главное улучшение по сравнению с предыдущими попытками заключается в том, что отдельный сервер «установления ключа» обрабатывает тяжелую асимметричную криптографию, которую нужно выполнить только один раз. Если сервер выйдет из строя, предыдущие пользователи все равно смогут получить время, не опасаясь MITM. [90] NTS в настоящее время поддерживается несколькими серверами времени, [91] [92] включая Cloudflare . Он поддерживается NTPSec и chrony. [93]
У Microsoft также есть подход к аутентификации пакетов NTPv3/SNTPv4 с использованием идентификатора домена Windows , известного как MS-SNTP. [94] Эта система реализована в эталонных ntpd и chrony, использующих samba для подключения к домену. [95]
Процедура выбора часов была изменена, чтобы удалить первый из двух этапов сортировки/отбрасывания и заменить его алгоритмом, впервые предложенным Марзулло и позднее включенным в Цифровую службу времени. Эти изменения не оказывают существенного влияния на обычную работу или совместимость с различными версиями NTP, но они обеспечивают основу для формальных заявлений о корректности.
Первичные серверы и клиенты, соответствующие подмножеству NTP, называемому Simple Network Time Protocol (SNTPv4) [...], не нуждаются в реализации алгоритмов смягчения [...] Полностью разработанная реализация NTPv4 предназначена для [...] серверов с несколькими вышестоящими серверами и несколькими нижестоящими серверами [...] За исключением этих соображений, серверы и клиенты NTP и SNTP полностью совместимы и могут смешиваться [...]
Программы из пакета linuxptp могут использоваться в сочетании с демоном NTP. Часы PTP на сетевой карте синхронизируются ptp4l и используются в качестве опорных часов chronyd или ntpd для синхронизации системных часов.
Коды Refid используются в пакетах kiss-o'-death (KoD), поле идентификатора ссылки в дисплеях ntpq и ntpmon billboard и сообщениях журнала.
Эта директива включает аппаратную временную метку пакетов NTP, отправляемых и получаемых с указанного сетевого интерфейса.
Он реализует Simple Network Time Protocol версии 4, как описано в RFC 5905, и Network Time Protocol версии 3, как описано в RFC 1305.
с Red Hat Enterprise Linux 7.0 (а теперь и в Red Hat Enterprise Linux 6.8) более универсальная реализация NTP также предоставляется через пакет chrony
целом, программное обеспечение Chrony NTP надежно и может считаться заслуживающим доверия.
Программное обеспечение поддерживается на Linux, FreeBSD, NetBSD, macOS и Solaris.
Выдержав одиннадцать полных дней удаленного тестирования в августе 2017 г., Chrony стал надежным, сильным и разработанным с учетом безопасности.
Таким образом, по сути, systemd-timesyncd стал демоном NTP по умолчанию в Debian в bookworm, что я нахожу несколько удивительным.