Kako zagotoviti, da čas sam po sebi ne laže, če imate milijon velikih in majhnih naprav, ki komunicirajo prek TCP/IP? Konec koncev ima vsak od njih uro in čas mora biti točen za vse. Te težave ni mogoče zaobiti brez ntp.
Za trenutek si predstavljajmo, da v enem segmentu industrijske IT infrastrukture prihaja do težav s časovno sinhronizacijo storitev. Takoj začne odpovedovati sklad gruče programske opreme Enterprise, domene razpadejo, glavna vozlišča in vozlišča v pripravljenosti si neuspešno prizadevajo obnoviti status quo.
Možno je tudi, da napadalec namerno poskuša zmotiti čas z napadom MiTM ali DDOS. V takšni situaciji se lahko zgodi karkoli:
- Gesla uporabniških računov bodo potekla;
- Potrdila X.509 bodo potekla;
- Dvostopenjska avtentikacija TOTP bo prenehala delovati;
- varnostne kopije bodo zastarele in sistem jih bo izbrisal;
- DNSSec se bo zlomil.
Jasno je, da je vsak IT oddelek zainteresiran za zanesljivo delovanje storitev časovne sinhronizacije in lepo bi bilo, če bi bile zanesljive in varne v industrijskem delovanju.
Prekinite NTP v 25 minutah
Omrežni protokoli – milenijci imajo eno posebnost, bili in niso več dobri za nič, vendar jih zamenjava ni tako enostavna, tudi ko se nabere kritična masa zanesenjakov in sredstev.
Glavni očitek klasičnemu NTP je pomanjkanje zanesljivih mehanizmov za zaščito pred napadi vsiljivcev. Ta problem so poskušali rešiti na različne načine. Da bi to dosegli, smo najprej implementirali mehanizem vnaprej deljenih ključev (PSK) za izmenjavo simetričnih ključev.
Na žalost se ta metoda ni obrestovala iz preprostega razloga – ni dobro skalirana. Glede na strežnik je potrebna ročna konfiguracija na strani odjemalca. To pomeni, da drugega odjemalca preprosto ne morete dodati kar tako. Če se kaj spremeni na strežniku NTP, je treba vse odjemalce znova konfigurirati.
Potem so se domislili AutoKeya, vendar so takoj odkrili številne resne ranljivosti v samem dizajnu algoritma in so ga morali opustiti. Dejstvo je, da seme vsebuje samo 32 bitov, je premajhno in ne vsebuje dovolj računske kompleksnosti za frontalni napad.
- ID ključa - simetrični 32-bitni ključ;
- MAC (koda za preverjanje pristnosti sporočila) - kontrolna vsota paketa NTP;
Autokey se izračuna na naslednji način.
Autokey=H(Sender-IP||Receiver-IP||KeyID||Cookie)Kjer je H() kriptografska zgoščevalna funkcija.
Ista funkcija se uporablja za izračun kontrolne vsote paketov.
MAC=H(Autokey||NTP packet)Izkazalo se je, da celotna celovitost preverjanja paketov temelji na pristnosti piškotkov. Ko jih imate, lahko obnovite samodejni ključ in nato ponaredite MAC. Vendar pa strežnik NTP pri njihovem ustvarjanju uporablja seme. Tu se skriva zanka.
Cookie=MSB_32(H(Client IP||Server IP||0||Server Seed))Funkcija MSB_32 odreže 5 najpomembnejših bitov iz rezultata izračuna zgoščene vrednosti md32. Piškotek odjemalca se ne spremeni, dokler ostanejo parametri strežnika nespremenjeni. Nato lahko napadalec le obnovi začetno številko in lahko samostojno ustvari piškotke.
Najprej se morate kot odjemalec povezati s strežnikom NTP in prejeti piškotke. Po tem z uporabo metode surove sile napadalec po preprostem algoritmu obnovi začetno številko.
Algoritem za napad na izračun začetnega števila z metodo surove sile.
for i=0:2^32 − 1 do
Ci=H(Server-IP||Client-IP||0||i)
if Ci=Cookie then
return i
end if
end forNaslovi IP so znani, tako da ostane le še ustvarjanje 2^32 zgoščenih vrednosti, dokler se ustvarjeni piškotek ne ujema s tistim, prejetim s strežnika NTP. Na običajni domači postaji z Intel Core i5 bo to trajalo 25 minut.
NTS - nov avtoključ
S takimi varnostnimi luknjami v Autokeyju se ni bilo mogoče sprijazniti in leta 2012 se je pojavila protokol. Da bi ogrozili ime, so se odločili za preimenovanje, zato so Autokey v.2 poimenovali Network Time Security.
Protokol NTS je razširitev varnosti NTP in trenutno podpira samo način unicast. Zagotavlja močno kriptografsko zaščito pred manipulacijo paketov, preprečuje vohljanje, dobro se prilagaja, je odporen na izgubo omrežnih paketov in povzroča najmanjšo izgubo natančnosti, ki nastane med varnostjo povezave.
Povezava NTS je sestavljena iz dveh stopenj, ki uporabljata protokole nižje plasti. Vklopljeno prvi Na tej stopnji se odjemalec in strežnik dogovorita o različnih parametrih povezave in izmenjata piškotke, ki vsebujejo ključe z vsem pripadajočim naborom podatkov. Vklopljeno drugi Na tej stopnji poteka dejanska zaščitena seja NTS med odjemalcem in strežnikom NTP.

NTS je sestavljen iz dveh protokolov nižjega sloja: izmenjave omrežnih časovnih varnostnih ključev (NTS-KE), ki vzpostavi varno povezavo prek TLS, in NTPv4, najnovejše inkarnacije protokola NTP. Nekaj več o tem spodaj.
Prva stopnja - NTS KE
Na tej stopnji odjemalec NTP sproži sejo TLS 1.2/1.3 prek ločene povezave TCP s strežnikom NTS KE. Med to sejo se zgodi naslednje.
- Stranke določijo parametre algoritem za drugo stopnjo.
- Stranki definirata drugi protokol nižje ravni, vendar je trenutno podprt samo NTPv4.
- Stranke določijo naslov IP in vrata strežnika NTP.
- Strežnik NTS KE izdaja piškotke pod NTPv4.
- Stranki izvlečeta par simetričnih ključev (C2S in S2C) iz materiala piškotka.
Ta pristop ima veliko prednost, saj celotno breme prenosa tajnih informacij glede parametrov povezave pade na preverjen in zanesljiv protokol TLS. To odpravlja potrebo po ponovnem odkrivanju lastnega kolesa za varno rokovanje NTP.
Druga stopnja - NTP pod zaščito NTS
V drugem koraku odjemalec varno sinhronizira čas s strežnikom NTP. V ta namen posreduje štiri posebne razširitve (razširitvena polja) v strukturi paketa NTPv4.
- Razširitev Unique Identifier Extension vsebuje naključni nonce za preprečevanje napadov ponovnega predvajanja.
- Razširitev piškotkov NTS vsebuje enega od piškotkov NTP, ki so na voljo odjemalcu. Ker ima samo odjemalec simetrične ključe AAED C2S in S2C, jih mora strežnik NTP ekstrahirati iz gradiva piškotkov.
- NTS Cookie Placeholder Extension je način, s katerim odjemalec zahteva dodatne piškotke od strežnika. Ta razširitev je potrebna za zagotovitev, da odgovor strežnika NTP ni veliko daljši od zahteve. To pomaga preprečiti napade ojačanja.
- NTS Authenticator in Encrypted Extension Fields Extension vsebuje šifro AAED s ključem C2S, glavo NTP, časovne žige in zgornji EF kot spremne podatke. Brez te razširitve je mogoče ponarediti časovne žige.

Po prejemu zahteve odjemalca strežnik preveri pristnost paketa NTP. Za to mora dešifrirati piškotke, ekstrahirati algoritem AAED in ključe. Po uspešnem preverjanju veljavnosti paketa NTP strežnik odgovori odjemalcu v naslednji obliki.
- Unique Identifier Extension je zrcalna kopija odjemalčeve zahteve, ukrep proti napadom ponavljanja.
- NTS razširitev piškotkov več piškotkov za nadaljevanje seje.
- NTS Authenticator in Encrypted Extension Fields Extension vsebuje šifro AEAD s ključem S2C.
Drugo rokovanje se lahko večkrat ponovi, mimo prvega koraka, saj vsaka zahteva in odgovor stranki da dodatne piškotke. Prednost tega je, da so razmeroma zahtevne operacije TLS pri računanju in prenosu podatkov PKI deljene s številom ponovljenih zahtev. To je še posebej priročno za specializirane merilnike časa FPGA, ko lahko vse glavne funkcionalnosti zapakiramo v več funkcij s področja simetrične kriptografije, s čimer prenesemo celoten sklad TLS na drugo napravo.
NTPSec
Kaj je posebnega pri NTP? Kljub dejstvu, da je avtor projekta Dave Mills poskušal čim bolje dokumentirati svojo kodo, je redek programer, ki bo lahko razumel zapletenost algoritmov za sinhronizacijo časa, ki so stari 35 let. Nekatera koda je bila napisana pred dobo POSIX-a in takratni API Unix se je zelo razlikoval od tega, kar se uporablja danes. Poleg tega je potrebno poznavanje statistike za odstranitev signala pred motnjami na šumnih linijah.
NTS ni bil prvi poskus popravka NTP. Ko so se napadalci naučili izkoriščati ranljivosti NTP za okrepitev napadov DDoS, je postalo jasno, da so potrebne korenite spremembe. In medtem ko so se osnutki NTS pripravljali in dokončali, je ameriška nacionalna znanstvena fundacija konec leta 2014 nujno dodelila nepovratna sredstva za posodobitev NTP.
Delovne skupine ni vodil kdorkoli, ampak - eden od ustanoviteljev in stebrov odprtokodne skupnosti ter avtor knjige . Eric in njegovi prijatelji so najprej poskušali premakniti kodo NTP s platforme BitKeeper na git, a ni šlo tako. Vodja projekta Harlan Stenn je bil proti tej odločitvi in pogajanja so zastala. Nato je bilo odločeno, da se projektna koda razcepi in rodil se je NTPSec.
Solidne izkušnje, vključno z delom na GPSD, matematično podlago in čarobno veščino branja starodavne kode – Eric Raymond je bil natanko tisti heker, ki bi lahko izvedel tak projekt. Ekipa je našla strokovnjaka za selitev kode in v samo 10 tednih NTP na GitLabu. Delo je bilo v polnem teku.
Ekipa Erica Raymonda se je naloge lotila na enak način kot Auguste Rodin s kamnitim blokom. Z odstranitvijo 175 KLOC stare kode so lahko znatno zmanjšali površino napada z zapiranjem številnih varnostnih lukenj.
Tukaj je nepopoln seznam tistih, ki so vključeni v distribucijo:
- Nedokumentiran, zastarel, zastarel ali pokvarjen refclock.
- Neuporabljena knjižnica ICS.
- libopts/avtogen.
- Stara koda za Windows.
- ntpdc.
- Avtoključ.
- Koda ntpq C je bila prepisana v Python.
- Koda sntp/ntpdig C je bila prepisana v Python.
Poleg čiščenja kode je imel projekt še druge naloge. Tukaj je delni seznam dosežkov:
- Zaščita kode pred prekoračitvijo medpomnilnika je bila bistveno izboljšana. Da bi preprečili prelivanje medpomnilnika, so bile vse nevarne funkcije nizov (strcpy/strcat/strtok/sprintf/vsprintf/gets) nadomeščene z varnimi različicami, ki izvajajo omejitve velikosti medpomnilnika.
- Dodana podpora za NTS.
- Izboljšana natančnost časovnega koraka za desetkrat s povezovanjem fizične strojne opreme. To je posledica dejstva, da so sodobne računalniške ure postale veliko natančnejše od tistih, ko se je NTP rodil. Največje koristi od tega so imeli GPSDO in radijski sprejemniki z namenskim časom.
- Število programskih jezikov se je zmanjšalo na dva. Namesto skriptov Perl, awk in celo S je zdaj vse Python. Zaradi tega je več možnosti za ponovno uporabo kode.
- Namesto rezancev skriptov autotools je projekt začel uporabljati sistem za gradnjo programske opreme .
- Posodobljena in preurejena projektna dokumentacija. Iz protislovne in mestoma arhaične zbirke dokumentov so ustvarili precej sprejemljivo dokumentacijo. Vsako stikalo ukazne vrstice in vsaka konfiguracijska entiteta ima zdaj eno samo različico resnice. Poleg tega so strani z navodili in spletna dokumentacija zdaj ustvarjene iz istih osnovnih datotek.
NTPSec je na voljo za številne distribucije Linuxa. Trenutno je zadnja stabilna različica 1.1.8, za Gentoo Linux pa predzadnja.
(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]
Chrony
Bil je še en poskus zamenjave starega NTP z varnejšo alternativo. Chrony je za razliko od NTPSec napisan od začetka in je zasnovan tako, da zanesljivo deluje v najrazličnejših pogojih, vključno z nestabilnimi omrežnimi povezavami, delno razpoložljivostjo ali prezasedenostjo omrežja in temperaturnimi spremembami. Poleg tega ima chrony še druge prednosti:
- chrony lahko hitreje sinhronizira sistemsko uro z večjo natančnostjo;
- chrony je manjši, porabi manj pomnilnika in dostopa do CPE le, ko je to potrebno. To je velik plus za varčevanje z viri in energijo;
- chrony podpira časovne žige strojne opreme v sistemu Linux, kar omogoča izjemno natančno sinhronizacijo v lokalnih omrežjih.
Vendar chrony nima nekaterih funkcij starega NTP-ja, kot sta odjemalec in multicast odjemalec/strežnik. Poleg tega klasični NTP podpira večje število operacijskih sistemov in platform.
Če želite onemogočiti delovanje strežnika in zahtev NTP za proces chronyd, preprosto vpišite vrata 0 v datoteko chrony.conf. To se naredi v primerih, ko ni potrebe po vzdrževanju časa za odjemalce ali vrstnike NTP. Od različice 2.0 naprej so vrata strežnika NTP odprta le, če je dostop dovoljen z direktivo dovoljenja ali ustreznim ukazom ali če je konfiguriran vrstnik NTP ali je uporabljena direktiva za oddajanje.
Program je sestavljen iz dveh modulov.
- chronyd je storitev, ki deluje v ozadju. Prejema informacije o razliki med sistemsko uro in zunanjim časovnim strežnikom ter prilagaja lokalni čas. Izvaja tudi protokol NTP in lahko deluje kot odjemalec ali strežnik.
- chronyc je pripomoček ukazne vrstice za spremljanje in nadzor programa. Uporablja se za natančno nastavitev različnih parametrov storitev, na primer omogoča dodajanje ali odstranjevanje strežnikov NTP, medtem ko chronyd še naprej deluje.
Od različice 7 RedHat Linux chrony kot storitev za časovno sinhronizacijo. Paket je na voljo tudi za druge distribucije Linuxa. Najnovejša stabilna različica je 3.5, ki se pripravlja na izdajo 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]
Kako nastaviti svoj oddaljeni strežnik chrony na internetu za sinhronizacijo časa v pisarniškem omrežju. Spodaj je primer nastavitve VPS.
Primer nastavitve Chrony na RHEL / CentOS na VPS
Zdaj pa malo vadimo in nastavimo lasten strežnik NTP na VPS. Zelo preprosto je, samo izberite ustrezno tarifo na spletnem mestu RuVDS, dobite že pripravljen strežnik in vnesite ducat preprostih ukazov. Za naše namene je ta možnost povsem primerna.

Preidimo na nastavitev storitve in najprej namestimo paket chrony.
[root@server ~]$ yum install chronyRHEL 8 / CentOS 8 uporablja drugega upravitelja paketov.
[root@server ~]$ dnf install chronyPo namestitvi chrony morate zagnati in aktivirati storitev.
[root@server ~]$ systemctl enable chrony --nowČe želite, lahko spremenite /etc/chrony.conf in zamenjate strežnike NPT z najbližjimi lokalnimi, da skrajšate odzivni čas.
# 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
Nato nastavimo sinhronizacijo strežnika NTP z vozlišči iz podanega bazena.
[root@server ~]$ timedatectl set-ntp true
[root@server ~]$ systemctl restart chronyd.service
Prav tako je treba vrata NTP odpreti navzven, sicer bo požarni zid blokiral dohodne povezave iz odjemalskih vozlišč.
[root@server ~]$ firewall-cmd --add-service=ntp --permanent
[root@server ~]$ firewall-cmd --reload
Na strani odjemalca je dovolj, da pravilno nastavimo časovni pas.
[root@client ~]$ timedatectl set-timezone Europe/MoscowDatoteka /etc/chrony.conf določa IP ali ime gostitelja našega strežnika VPS, ki izvaja NTP strežnik chrony.
server my.vps.serverIn končno, začetek sinhronizacije časa na odjemalcu.
[root@client ~]$ systemctl enable --now chronyd
[root@client ~]$ timedatectl set-ntp true
Naslednjič vam bom povedal, katere možnosti obstajajo za sinhronizacijo časa brez interneta.
Vir: www.habr.com
