Kuidas teha nii, et aeg per se ei petaks, kui teil on miljon suurt ja väikest seadet, mis suhtlevad TCP/IP kaudu? Igal neist on kell, ja aeg peab olema kõigil õige. Seda probleemi ei saa NTP-ta lahendada.
Kujutame ette hetkeks, et ühe sektori tööstuslikus IT-infrastruktuuris tekivad ajasünkroniseerimisega seotud probleemid. Koheselt hakkab ebaõnnestuma ettevõtte tarkvara klastritekk, domeenid lagunevad, ja meistrid ning varuvõrgud püüavad tulutult taastada status quo'd.
Võimalik on ka olukord, kus kurjategija püüab tahtlikult aega segamini ajada MiTM või DDoS rünnaku kaudu. Sellises olukorras võib juhtuda kõike:
- kasutajakontode paroolide aegumine;
- X.509 sertifikaatide aegumine;
- TOTP kahefaktoriline autentimine lõpetab töötamise;
- varukoopiad "kannavad" ja süsteem eemaldab need;
- DNSSec puruneb.
Selge on, et iga IT-osakond on huvitatud usaldusväärsatest ajasünkroniseerimise teenustest ja oleks hea, kui need oleksid usaldusväärsed ja turvalised tööstuslikus kasutuses.
Purusta NTP 25 minutiga
Võrguprotokollidel — millenniaalidel on üks eripära, nad on juba ammu ja ei sobi enam kuhugi, kuid nende asendamine ei ole nii lihtne isegi siis, kui entusiaste ja rahastamist on piisavalt.
Peamine kaebus traditsioonilise NTP suhtes on usaldusväärsete kaitsemehhanismide puudumine kurjategijate rünnakute eest. Erinevaid katseid selle probleemi lahendamiseks on tehtud. Esiteks rakendati üksteisega salajaste võtmete (PSK) vahetamiseks ettemääratud võtmete mehhanism.
Kahjuks ei õigustanud see meetod ennast lihtsal põhjusel — see ei skaaleeru hästi. Klientide käsitsi seadistamine sõltub serverist. See tähendab, et ei saa lihtsalt veel ühte klienti lisada. Kui NTP-serveris midagi muutub, tuleb kõik kliendid uuesti seadistada.
Siis leiutati AutoKey, kuid kohe avastati selles mitmeid tõsiseid haavatavusi algoritmi enda disainis ja selle kasutamisest tuli loobuda. Probleem on selles, et algne number (seed) sisaldab vaid 32 bitti, mis on liiga vähe ja ei sisalda piisavalt arvutuslikku keerukust rünnaku jaoks.
- Key ID — sümmeetriline 32-bitine võti;
- MAC (sõnumi autentimise kood) — NTP paketi kontrollsummad;
Autokood arvutatakse järgmiselt.
Autokood=H(Sender-IP||Receiver-IP||KeyID||Cookie)Kus H() — krüptograafiline räsifunktsioon.
Pakettide kontrollsummade arvutamiseks kasutatakse sama funktsiooni.
MAC=H(Autokood||NTP paket)Seega sõltub kõigi pakettide terviklikkuse kontroll autentsustest küpsistest. Neid omades on võimalik autokood taastada ja seejärel MAC-i võltsida. Siiski kasutab NTP server nende genereerimisel algarvu (seed). Just siin peitub nõrkus.
Cookie=MSB_32(H(Cliente IP||Server IP||0||Server Seed))Funktsioon MSB_32 lõikab md5 räsi 32 kõige olulisemat bitti. Klientide küpsis ei muutu seni, kuni serveri parameetrid on muutumatud. Jätkuks jääb ründajale vaid algarv taastada ja saada võimalus küpsiseid ise genereerida.
Esmalt tuleb NTP serveriga kliendina ühendada ja küpsised saada. Seejärel taastab ründaja algarvu, järgides lihtsat algoritmi.
Algoritm algarvu taastamiseks brute-force meetodiga.
for i=0:2^32 − 1 do
Ci=H(Server-IP||Client-IP||0||i)
if Ci=Cookie then
return i
end if
end forIP-aadressid on teada, seega jääb vaid luua 2^32 räsi, kuni loodud küpsis ei kattu NTP serverilt saadud küpsisega. Tavalise koduklientiga, millel on Intel Core i5, kulub sellele 25 minutit.
NTS — uus Autokood
Selliste turvanõrkustega Autokoodiga leppimine ei olnud võimalik ja 2012. aastal ilmus protokoll. Kompromiteeritud nime tõttu otsustati läbi viia brändiuuendus, seega nimetati Autokood v.2 Network Time Security.
NTS protokoll on NTP turbekihi laiendus ja praegu toetab see ainult unikaalsuse režiimi (unicast). See pakub usaldusväärset krüptograafiat pakettide manipuleerimise kaitsmiseks, ennetab jälgimist, skaleerub hästi, on vastupidav võrgu pakettide kadumise korral ja toob kaasa minimaalsed täpsuse kadumised, mis tekivad ühenduse kaitsmise protsessis.
NTS-ühendus koosneb kahest etapist, kus kasutatakse madalama taseme protokolle. Esimeses etapis lepivad klient ja server kokku erinevates ühenduse parameetrites ning vahetavad küpsiseid, mis sisaldavad võtmeid koos kõigi seotud andmete komplektiga. Teises etapis toimub kaitstud NTS sessioon kliendi ja NTP serveri vahel. teises etapil toimub kaitstud NTS seanss kliendi ja NTP serveri vahel.

NTS koosneb kahest madalama taseme protokollist: Network Time Security Key Exchange (NTS-KE), mis initsialiseerib turvalise ühenduse TLSi kaudu, ja NTPv4 — NTP protokolli viimasest versioonist. Veidi rohkem sellest allpool.
Esimene etapp — NTS KE
Selles etapis käivitab NTP klient TLS 1.2/1.3 seansi eraldi TCP-ühenduse kaudu NTS KE serveriga. Selle seansi jooksul toimub järgmist.
- Osalised määravad teise etapi algoritmi.
- Osalised määravad teise madalama taseme protokolli, kuid hetkel toetab ainult NTPv4.
- Osalised määravad NTP serveri IP-aadressi ja pordi.
- NTS KE server väljastab küpsiseid NTPv4 jaoks.
- Osalised saavad küpsiste materjalist välja paar sümmeetrilisi võtmeid (C2S ja S2C).
Selline lähenemine omab suurt eelist, et kogu koormus salajaste ühenduse parameetrite edastamiseks langeb usaldusväärse ja tõestatud TLS protokolli kanda. Seeläbi kaob vajadus leiutada omaenda turvaline NTP käepigistus.
Teine etapp — NTP NTS kaitse all
Teises etapis sünkroniseerib klient turvaliselt aega NTP serveriga. Selle eesmärgi saavutamiseks edastab ta neli spetsiaalset laiendust (extension field) NTPv4 paketi struktuuris.
- Unique Identifier Extension sisaldab juhuslikku nonce'i ründe ennetamiseks korduskatsete kaudu.
- NTS Cookie Extension sisaldab ühte klientide olemasolevatest NTP küpsistest. Kuna ainult klient omab sümmeetrilisi AAED võtmeid C2S ja S2C, peab NTP server need küpsiste materjalist välja võtma.
- NTS Cookie Placeholder Extension võimaldab kliendil serverilt küsida täiendavaid küpsiseid. See laiendus on vajalik, et NTP serveri vastus ei oleks märkimisväärselt pikem kui päring. See aitab vältida tugevdamisrünnakuid.
- NTS Authenticator and Encrypted Extension Fields Extension sisaldab AAED algoritmi šifrit C2S võtmega, NTP pealkirja, ajatempe ja eespool mainitud EF kui täiendavaid andmeid. Ilma selle laienduseta on võimalik ajatempe vale esitada.

Pärast kliendi päringu saamist kontrollib server NTP paketi autentsust. Selleks peab ta küpsiseid dekrüpteerima, välja võtma AAED algoritmi ja võtmed. Pärast NTP paketi edukat kehtivuse kontrollimist vastab server kliendile järgmises formaadis.
- Unique Identifier Extension on kliendi päringu peegelduse koopia, meede kordusrünnakute vastu.
- NTS Cookie Extension veel küpsiseid seansi jätkamiseks.
- NTS Authenticator ja krüpteeritud laiendite väljad sisaldavad AEAD krüpto S2C võtmega.
Teist käepigistust saab korrata mitu korda, jättes vahele esimese etapi, kuna iga päring ja vastus annavad kliendile täiendavaid küpsiseid. See annab eelise, et suhteliselt ressursimahukad TLS operatsioonid ja PKI andmete edastamine jagatakse korduvate päringute arvuga. See on eriti mugav spetsialiseeritud FPGA ajastite jaoks, kus kogu peamine funktsionaalsus saab pakkida mitmesse sümmeetrilise krüptograafia funktsiooni, edastades kogu TLS kihi teisele seadmele.
NTPSec
Mis on NTP eripära? Kuigi projekti autor Dave Mills püüdis oma koodi võimalikult hästi dokumenteerida, on harva, kui mõni programmeerija suudab aru saada 35 aastat tagasi välja töötatud ajasünkroniseerimise algoritmide keerukusest. Osa koodist on kirjutatud veel enne POSIX-i ajastut ja Unix API erineb sel ajal kasutatavast oluliselt. Lisaks on statistikaalased teadmised vajalikud, et filtreerida signaali müra üles öeldest.
NTS ei olnud esimene katse NTP parandada. Pärast seda, kui ründajad õppisid ära kasutama NTP haavatavusi DDoS rünnakute suurendamiseks, sai selgeks, et on vajalikud radikaalsed muutused. Samal ajal, kui NTS-i mustandid valmistati ja viidi toimivaks, eraldas USA Rahvuslik Teadusfond 2014. aasta lõpus kiiresti toetuse NTP moderniseerimiseks.
Töörühma juht oli mitte keegi muu kui — üks Open Source'i kogukonna rajajatest ja raamatu autori . Esiteks üritasid Eric ja tema meeskond NTP koodi BitKeeperist git-i üle kanda, kuid see ei õnnestunud. Projektijuht Harlan Stenn oli vastu sellele lahendusele ja läbirääkimised jõudsid ummikusse. Seetõttu otsustati projekti koodifotograafia moodustada ja nii sündis NTPSec.
Väärikas kogemus, sealhulgas töö GPSD-ga, matemaatiline taust ja maagiline oskus vana koodi lugeda — Eric Raymond oli just see häkker, kes suutis sellist projekti ellu viia. Meeskonnas oli koodimigratsiooni spetsialist ja vaid 10 nädala jooksul asus NTP Töö läks hoogsalt edasi.
Eric Raymondi meeskond lähenes asjale nii, nagu Auguste Rodin töötas kivitükiga. Eemaldades 175 KLOC vana koodi, suudeti oluliselt vähendada rünnaku pinda, sulgedes mitmeid turvaauke.
Siin on mittetäielik nimekiri, mis jäi alla:
- Dokumendita, aegunud, vananenud või katkenud refclock.
- Kasutamata ICS raamatukogu.
- libopts/autogen.
- Vana kood Windowsile.
- ntpdc.
- Autokey.
- C kood ntpq on ümber kirjutatud Pythonisse.
- C kood sntp/ntpdig on ümber kirjutatud Pythonisse.
Lisaks koodi puhastamisele olid projektil ka teised ülesanded. Siin on mittetäielik nimekiri saavutustest:
- Koodi kaitset on märkimisväärselt tugevdatud puhveri ülevoolu vältimiseks. Puufferi ülevoolu ennetamiseks on kõik ohtlikud stringifunktsioonid (strcpy / strcat / strtok / sprintf / vsprintf / gets) asendatud turvaliste versioonidega, mis rakendavad puhveri suuruse piirangu.
- Lisatud NTS-i tugi.
- Ajabloki täpsus on künnise füüsilise seadme sidumise abil kümme korda suurenenud. See on tingitud sellest, et tänapäeva arvutih kellad on palju täpsemad kui need, mis olid NTP sündimise ajal. Kõige rohkem kasu on saanud GPSDO ja spetsialiseeritud ajakomplektid.
- Programmeermiskeelte arv on vähenenud kahte. Perl, awk ja isegi S skeemide asemel on nüüd täiesti Pythoni skeem. See võimaldab rohkem koodi taaskasutusvõimalusi.
- Autotools'i skriptihäire asendamine tarkvarakuve süsteemiga. .
- Projekti dokumentatsioon on uuendatud ja ümber korraldatud. Vastandlikust ja kohati arhaistlikust dokumendikollektsioonist on loodud täiesti vastuvõetav dokumentatsioon. Iga käsurea võtme ja iga konfigureerimise üksuse kohta on nüüd üksainus tõde. Lisaks luuakse käsiraamatud ja veebidokumentatsioon nüüd samadest põhifailidest.
NTPSec on saadaval mitmesugustes Linuxi distributsioonides. Praegu on viimane stabiilne versioon 1.1.8, Gentoo Linuxi jaoks — eelviimane.
(1:696)$ sudo emerge -av ntpsec
Need on paketid, mis ostetakse, järjekorras:
Sõltuvuste arvutamine... tehtud!
[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
Kokku: 1 pakett (1 uuestiinstallimine), allalaadimise suurus: 0 KiB
Kas soovite need paketid ühendusse viia? [Jah/Ei]
Chrony
Katses prooviti asendada vana NTP turvalisema alternatiiviga. Chrony on erinevalt NTPSec-st kirjutatud nullist ja on kavandatud usaldusväärseks toimimiseks laias valikus tingimustes, sealhulgas ebastabiilsete võrguühenduste, osalise kättesaadavuse, võrgu ülekoormuse ja temperatuuri kõikumiste korral. Lisaks on chronyl ka teisi eeliseid:
- chrony suudab kiiremini sünkroniseerida süsteemi kellasid suure täpsusega;
- chrony on väiksem, tarbib vähem mälu ja pöördub protsessori poole ainult siis, kui see on vajalik. See on suur pluss ressursside ja energia säästmiseks;
- chrony toetab riistvarataseme ajatempleid Linuxis, mis tagab äärmiselt täpse sünkroniseerimise kohalikes võrgustikes.
Kuid chronyst puuduvad mõned vana NTP funktsioonid, nagu levitamise ja mitme aadressi (multicast) klient / server. Lisaks toetab klassikaline NTP rohkem operatsioonisüsteeme ja platvorme.
Serveri ja NTP päringute funktsionaalsuse keelamiseks chronyd protsessis piisab, kui seadistada port 0 failis chrony.conf. Seda tehakse siis, kui pole vaja aega NTP klientidele või võrdsuspunktidele teenindada. Alates versioonist 2.0 on NTP serveri port avatud ainult siis, kui juurdepääs on lubatud direktiiviga allow või vastava käsuga, või on seadistatud NTP võrdsuspunkt, või on kasutatud direktiivi broadcast.
Programm koosneb kahest moodulist.
- chronyd on teenus, mis töötab taustal. See saadab teavet süsteemi kellade erinevuse kohta välisest aja serverist ja korrigeerib kohalikku aega. See rakendab ka NTP protokolli ja võib toimida nii kliendi kui ka serverina.
- chronyc on käsurea tööriist programmi jälgimiseks ja juhtimiseks. Seda kasutatakse teenuse erinevate parameetrite täpseks seadistamiseks, näiteks võimaldab lisada või eemaldada NTP-servereid samal ajal, kui chronyd jätkab töötamist.
Alates 7. versioonist RedHat Linuxist chrony ajasüncroniseerimise teenusena. Pakett on saadaval ka teistele Linuxi jaotustele. Viimane stabiilne versioon on 3.5, versioon 4.0 on valmimas.
(1:712)$ sudo emerge -av chrony
Need on pakettide, mida soovitakse ühendada, järjekord:
Sõltuvuste arvutamine... tehtud!
[binaarne 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
Kokku: 1 pakett (1 uus, 1 binaarne), allalaadimise suurus: 246 KiB
Kas soovite need paketid ühendada? [Jah/ei]
Kuidas seadistada oma kaugserverit chrony internetis, et sünkroniseerida aega kontori võrgus. Siin on näide seadistamisest VPS-i peal.
Chrony seadistamise näide RHEL / CentOS süsteemidel VPS-is
Vaatame nüüd veidi harjutusi ja tõstame omaenda NTP serveri VPS-is. See on väga lihtne, piisab sobiva paketi valimisest RuVDS veebilehelt, saada valmis server ja sisestada paar lihtsat käsku. Meie vajaduste jaoks sobib hästi järgmine valik.

Jõuame teenuse seadistamise juurde ja kõigepealt installime chrony paketi.
[root@server ~]$ yum install chronyRHEL 8 / CentOS 8 kasutavad teistsugust paketihaldurit.
[root@server ~]$ dnf install chronyPärast chrony installimist tuleb teenus käivitada ja aktiveerida.
[root@server ~]$ systemctl enable chrony --nowSoovi korral saab teha muudatusi failis /etc/chrony.conf, asendades NPT serverid lähimate kohalikega, et vähendada reageerimise aega.
# 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
Seejärel seadistame NTP serveri sünkroniseerimise näidatud basseini sõlmedega.
[root@server ~]$ timedatectl set-ntp true
[root@server ~]$ systemctl restart chronyd.service
Samuti tuleb NTP port avada, vastasel juhul blokeerib tulemüür sissetulevaid ühendusi kliendi sõlmedelt.
[root@server ~]$ firewall-cmd --add-service=ntp --permanent
[root@server ~]$ firewall-cmd --reload
Kliendi poolel on piisavalt õigesti seadistada ajavöönd.
[root@client ~]$ timedatectl set-timezone Europe/MoscowFailis /etc/chrony.conf näidake meie VPS serveri IP-d või hostinime, millel töötab NTP server chrony.
server my.vps.serverJa lõpuks käivitame aja sünkroniseerimise kliendil.
[root@client ~]$ systemctl enable --now chronyd
[root@client ~]$ timedatectl set-ntp true
Järgmine kord räägin, millised on aja sünkroniseerimise variantide kasutamine ilma internetita.
Allikas: habr.com
