Кіріспе

Желілік уақыт протоколы (Network Time Protocol, NTP) – компьютерлік жүйелер арасындағы сағатты синхрондауға арналған желілік протокол. 1985 жылдан бері қолданылып келе жатқан NTP, қазіргі уақытта қолданылатын ең көне интернет-протоколдарының бірі болып табылады. NTP-ні Делавэр университетінің Дэвид Л. Миллс жасаған. NTP-нің мақсаты – барлық қатысушы компьютерлерді әмбебап координацияланған уақытқа (UTC) бірнеше миллисекундқа дейін синхрондау. Протокол көбінесе клиент-сервер моделі тұрғысынан сипатталады, бірақ оны екі тараптың да бір-бірін уақыт көзі деп санайтын, өзара қарым-қатынаста да қолдануға болады. Олар сондай-ақ, клиенттер бастапқы калибрлеу алмасуынан кейін уақыт жаңартуларын пассивті түрде тыңдайтын хабар тарату немесе көптеп таратуды пайдалана алады. Бұл технология алғаш рет жергілікті желіде Hello маршруттау протоколының бір бөлігі ретінде қолданылды және желілік прототиптеуде қолданылатын тәжірибелік операциялық жүйе Fuzzball маршрутизаторында көп жылдар бойы жұмыс істеді. Сол кезде де, қазір де басқа да желілік құралдар қол жетімді. Оларға оқиғалардың уақытын тіркеуге арналған Daytime және Time протоколдары, сондай-ақ ICMP Timestamp хабарламалары мен IP Timestamp опциясы кіреді. NTP-нің деректерді талдау және сағатты реттеу алгоритмдері болмаса да, толық синхрондау жүйелері Unix daemon-ды қамтиды, ол барлық клиенттер үшін серверді тағайындау үшін сайлау алгоритмін қолданады; және NTP стратификациялық моделіне ұқсас серверлер иерархиясын пайдаланатын Digital Time Synchronization Service (DTSS). 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-ті пайдаланудың бір жолын сипаттайды, онда ұзақ мерзімге күйді сақтау қажеттілігі болмайды. Топология негізінен Уақыт протоколымен ұқсас, себебі тек бір сервер қолданылады. 1996 жылы SNTP SNTPv4 нұсқасына жаңартылды, онда сол кезде әзірленіп жатқан NTPv4-тің кейбір мүмкіндіктері енгізілді. SNTPv4-тің ағымдағы нұсқасы 2010 жылы негізгі NTPv4 стандартына біріктірілді. SNTP жаңа протоколды анықтамайтындықтан NTP-мен толық үйлесімді. Дегенмен, қарапайым алгоритмдер азырақ дәлдікпен уақытты қамтамасыз етеді, сондықтан SNTP көзінен уақытты синхрондауға кеңес берілмейді.

Уақыт белгілері

NTP қолданған 64 биттік бинарлық тұрақты нүктелік уақыт белгілері секундтар үшін 32 биттік бөлік пен секундының бөлшек бөлігіне 32 биттік бөліктен тұрады, бұл 232 секунд сайын (136 жыл) айналатын уақыт шкаласын және 2−32 секунд (233 пикосекунд) теориялық дәлдігін қамтамасыз етеді. NTP 1900 жылдың 1 қаңтарын эпоха ретінде пайдаланады. Сондықтан, бірінші айналым 2036 жылдың 7 ақпанында болады. NTPv4 128 биттік дата форматын енгізеді: секунд үшін 64 бит және бөлшек секунд үшін 64 бит. Бұл форматтың ең маңызды 32 биті – Эра нөмірі, ол көп жағдайда айналымның белгісіздігін шешеді. Миллстің сөзіне сәйкес, "бөлшектің 64 биттік мәні фотонның жарық жылдамдығымен электронды басып өтуіне кеткен уақытты анықтауға жеткілікті. 64 биттік секунд мәні ғаламның сөнуіне дейін уақытты нақты көрсетуге жетеді."

Анықтамалық іске асыру

NTP эталондық іске асыру, протоколмен бірге, 20 жылдан астам уақыт бойы үздіксіз дамытылып келеді. Жаңа мүмкіндіктер қосылған сайын, кері үйлесімділік сақталды. Ол, әсіресе сағатты синхрондау үшін, сезімтал алгоритмдерді қамтиды, олар басқа алгоритмдерді қолданатын серверлерге синхрондалғанда қате жұмыс істеуі мүмкін. Бағдарламалық құрал дерлік барлық есептеу платформаларына, соның ішінде жеке компьютерлерге көшірілді. Unix жүйесінде ntpd деп аталатын демон ретінде немесе Windows жүйесінде қызмет ретінде жұмыс істейді. Эталондық сағаттар қолдау көрсетіледі және олардың ауытқулары қашық серверлер сияқты сүзгіленіп және талданады, бірақ олар әдетте жиірек тексеріледі.

Windows уақыты

Windows 2000-ден бастап барлық Microsoft Windows нұсқаларында Windows Time қызметі (W32Time) бар, ол компьютер сағатын NTP серверімен синхрондау мүмкіндігіне ие. W32Time бастапқыда Kerberos 5 куәліктеу протоколы үшін жасалған, ол қайта ойнату шабуылдарын болдырмау үшін уақыттың нақты уақыттан 5 минут ішінде болуын қажет етеді. Windows 2000 Server (және Windows XP) желілік уақыт сервері NTP бойынша синхрондауды қолдамайды, тек NTP/SNTP түзетулерімен жергілікті синхрондауды ғана жүзеге асырады. Windows Server 2003 және Windows Vista-дан бастап W32Time үшін NTP провайдері NTPv3 протоколының маңызды бөлігімен үйлесімді болды. Microsoft W32Time уақытты бір секундтық дәлдікпен сенімді түрде синхрондауды қамтамасыз ете алмайтынын мәлімдейді. Егер жоғары дәлдік қажет болса, Microsoft Windows-тың жаңа нұсқасын немесе басқа NTP жүзеге асыруын пайдалануды ұсынады. Windows 10 1607 нұсқасынан және Windows Server 2016-дан бастап W32Time белгілі бір операциялық жағдайларда 1 секунд, 50 миллисекунд немесе 1 миллисекунд уақыт дәлдігіне жету үшін конфигурациялануы мүмкін.

OpenNTPD-нің атауы

2004 жылы OpenBSD-дің Хеннинг Брауэрі OpenNTPD-ді ұсынды, ол NTPv3/SNTPv4 протоколының қауіпсіздікке баса назар аударатын және құқықтарды бөліп пайдаланатын архитектураға негіделген іске асырылуы. Бұл, негізінен OpenBSD пайдаланушыларының қарапайым, жалпы қажеттіліктеріне арналған, бірақ қазіргі NTP серверлерімен үйлесімділікті сақтай отырып, протокол қауіпсіздігін жақсартады. Кодтың қарапайым болуы дәлдікті төмендетуге әкеледі, бірақ бұл қолданыс үшін қажет емес деп есептеледі. Портативті нұсқасы Linux пакеттерінің репозиторийлерінде қолжетімді.

NTPsec

NTPsec – жүйелі түрде қауіпсіздігі күшейтілген эталондық іске асырудың түйінді нұсқасы. Бұл 2015 жылдың маусым айында жасалды және 2014 жылы болған бірқатар бұзушылықтарға жауап ретінде пайда болды. Алғашқы өндірістік релизі 2017 жылдың қазан айында жарық көрді. Қауіпсіз емес мүмкіндіктерді жою, ескірген аппараттық құралдарды қолдауды тоқтату және ескі Unix нұсқаларын қолдаудан бас тарту арқасында NTPsec бастапқы код базасының 75% -ын қысқартып, қалған бөлігін аудиттеуді жеңілдетті. Кодтың 2017 жылғы аудиті сегіз қауіпсіздік мәселесін көрсетті, оның ішінде бастапқы эталондық іске асыруда болмаған екі мәселе де бар еді. Бірақ NTPsec эталондық іске асыруда қалған тағы сегіз мәселеден зардап көрмеді.

хрониялық

chrony - негізінен Red Hat компаниясының демеушілігімен жасалған тәуелсіз NTP іске асыру, оны өз дистрибутивтерінде стандартты уақыт бағдарламасы ретінде пайдаланады. Бастапқыдан жазылғандықтан, chrony-де қарапайым код базасы бар, бұл қауіпсіздікті арттырады және ресурстарды аз қолданады. Chrony «сенімді» деп бағаланған, және тек бірнеше жағдай тіркелген. Ол желілік адаптердегі аппараттық уақытты белгілеуді пайдалана отырып, LAN қосылымдарында дәлдікті жақсарта алады. Network Time Security (NTS) қолдауы 4.0 нұсқасында қосылды. Бұл бағдарлама GNU General Public License нұсқасы 2 бойынша қолжетімді, 1997 жылы Ричард Курнов жасаған және қазіргі уақытта Мирослав Личвар қолдайды.

Басқалар

FreeBSD-нің Поул Хеннинг Камп 2014 жылы бастап, 2015 жылы тоқтатқан. Іске асыруға Linux Foundation демеушілік еткен. Бұл systemd құрамына енген SNTP клиенті. Оны 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 жылы Linux Foundation's Core Infrastructure Initiative тапсырысымен жүргізілген үш NTP нұсқасының қауіпсіздік аудитінде NTP және NTPsec Chrony-ге қарағанда қауіпсіздік тұрғысынан қиын екені анықталды. NTP серверлері пакеттерді криптографиялық қолтаңбамен растамаса, «ортадағы адам» шабуылдарына ұшырауы мүмкін. Бұл процеске байланысты есептеу жүктемесі, әсіресе қызметтен бас тарту шабуылдары кезінде, серверлер үшін қиындық тудыруы мүмкін. «Ортадағы адам» шабуылдары арқылы NTP хабарламаларын бұрмалау клиенттік компьютерлердегі уақытты өзгертуге және криптографиялық кілттердің мерзімі өтуін айналып өтуге негізделген шабуылдарға жол ашуы мүмкін. Жалған NTP хабарламаларының әсеріне ұшыраған қызметтерге TLS, DNSSEC, әртүрлі кэштік схемалар (мысалы, DNS кэші), Border Gateway Protocol (BGP), Bitcoin және тұрақты кіру схемалары жатады. NTP қызметтен бас тартуға бағытталған шабуылдарда қолданылған. NTP серверіне кішкентай сұраныс жіберіледі, ал қайтарылатын IP мекенжайы нысана мекенжайы ретінде жалғандалады. DNS күшейткіш шабуылына ұқсас, сервер әлдеқайда үлкен жауаппен жауап береді, бұл шабуылшыға нысанаға жіберілетін деректер көлемін едәуір арттыруға мүмкіндік береді. Шабуылға қатысудан аулақ болу үшін NTP серверінің бағдарламалық жасақтамасын жаңартуға болады немесе серверлерді сыртқы сұраныстарды қабылдамауға конфигурациялауға болады.

Қауіпсіз кеңейтулер

NTP-нің өзі клиенттерге серверлерді растау мүмкіндігін қамтиды. NTPv3 симметриялық кілт режимін қолдайды, бірақ ол MITM шабуылына қарсы тиімді емес. IPSec-тен бейімделген NTPv4-тегі "автокілт" деп аталатын ашық кілт жүйесі, хабарламаның растау кодына енгізілген өзгерістен басқа, пайдалы растауды ұсынады және түзетулер жарияланбаған. Желілік уақыт қауіпсіздігі (NTS) – бұл TLS және AEAD қолданатын NTPv4-тің қауіпсіз нұсқасы. Алдыңғы әрекеттермен салыстырғандағы басты жетістік – ауыр асимметриялық криптографияны жеке "кілт құру" сервері басқарады, оны бір рет ғана жасау қажет. Егер сервер істен шықса, бұрынғы пайдаланушылар MITM қаупінсіз уақытты алуға жалғастыра береді. NTS қазіргі уақытта бірнеше уақыт серверлері, соның ішінде Cloudflare қолдайды. Оны NTPSec және chrony қолданады. Microsoft та Windows домендік идентификациясын пайдаланып NTPv3/SNTPv4 пакеттерін растауға MS SNTP деп аталатын тәсілге ие. Бұл жүйе ntpd және chrony-де іске асырылған, ал доменмен байланыс үшін samba қолданылады.