Kako osigurati da vrijeme samo po sebi ne vara, ako imate milijun velikih i malih uređaja koji komuniciraju putem TCP/IP? Na svakom od njih postoje satovi, a vrijeme bi trebalo biti točno na svim uređajima. Ovaj problem se ne može riješiti bez NTP-a.
Zamislimo na trenutak da u jednom segmentu industrijske IT infrastrukture nastaju problemi s usklađivanjem usluga po vremenu. Odmah se počinje rušiti klasterski sloj Enterprise softvera, raspadaju se domene, a master i standby čvorovi bezuspješno pokušavaju obnoviti status quo.
Može se dogoditi i situacija kada zlonamjerni korisnik namjerno pokušava srušiti vrijeme putem MiTM-a ili DDoS napada. U toj situaciji može se dogoditi bilo što:
- istek čeka za korisničke račune;
- istek važenja X.509 certifikata;
- dvostruka autentifikacija TOTP prestaje raditi;
- backup će postati 'nevažeći' i sustav će ih ukloniti;
- DNSSec će prestati raditi.
Jasno je da svaki IT odjel želi pouzdano funkcioniranje usluga za usklađivanje vremena, a idealno bi bilo da su pouzdane i sigurne u industrijskoj primjeni.
Srušiti NTP za 25 minuta
Mrežni protokoli — milenijalci imaju jednu posebnost, oni su već dugo i nikako više nisu upotrebljivi, ali njihova zamjena nije tako jednostavna, čak ni kada se okupi kritična masa entuzijasta i financiranja.
Glavna zamjerka klasičnom NTP-u je nedostatak pouzdanih mehanizama zaštite od napada zlonamjernih korisnika. Poduzete su razne pokušaje riješiti ovaj problem. Prvo su uvedeni mehanizmi unaprijed postavljenih ključeva (PSK) za razmjenu simetričnih ključeva.
Nažalost, ovaj način nije uspio zbog jednostavnog razloga — slabo se skalira. Potrebna je ručna konfiguracija s korisničke strane ovisno o serveru. To znači da se ne može jednostavno dodati još jedan klijent. Ako se nešto mijenja na NTP serveru, potrebno je rekonfigurirati sve klijente.
Tada je razvijen AutoKey, ali odmah su otkrivene brojne ozbiljne ranjivosti u samom dizajnu algoritma i od njega se moralo odustati. Problem je što početni broj (seed) sadrži samo 32 bita, što je vrlo malo i ne pruža dovoljno računalne složenosti za napad.
- Key ID — simetrični 32-bitni ključ;
- MAC (kod autentifikacije poruka) — kontrolna suma NTP paketa;
Autokey se izračunava na sljedeći način.
Autokey=H(Sender-IP||Receiver-IP||KeyID||Cookie)Gdje je H() — kriptografska hash funkcija.
Za izračun kontrolne sume koristi se ista funkcija.
MAC=H(Autokey||NTP paket)Tako se pokazuje da cijela cjelovitost provjera paketa ovisi o autentičnosti kolačića. Ako ih se dobiju, može se obnoviti autokey i potom falsificirati MAC. Međutim, NTP poslužitelj prilikom njihove generacije koristi inicijalni broj (seed). Upravo tu leži zamka.
Cookie=MSB_32(H(Client IP||Server IP||0||Server Seed))Funkcija MSB_32 skraćuje rezultat izračunavanja md5 hasha na 32 najstarija bita. Klijentski kolačić ne mijenja se sve dok su parametri poslužitelja nepromijenjeni. Zaječnik zatim samo treba obnoviti inicijalni broj i steći mogućnost samostalnog generiranja kolačića.
Za početak, treba se povezati s NTP poslužiteljem kao klijent i dobiti kolačić. Nakon toga, metodom pretraživanja, zlonamjeran korisnik obnavlja inicijalni broj slijedeći jednostavan algoritam.
Algoritam napada za izračunavanje inicijalnog broja metodom pretraživanja.
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 adrese su poznate, tako da ostaje samo stvoriti 2^32 hashova sve dok generirani kolačić ne odgovara onome što je dobiveno od NTP poslužitelja. Na običnoj kućnoj stanici s Intel Core i5, to će trajati 25 minuta.
NTS — novi Autokey
Bilo je nemoguće pomiriti se s takvim sigurnosnim propustima Autokey-a, te je 2012. godine došlo do pojave protokola. S ciljem kompromitiranog naziva odlučeno je provesti rebranding, tako je Autokey v.2 nazvan Network Time Security.
NTS protokol je proširenje sigurnosti NTP i trenutno podržava samo unicast način. Pruža pouzdanu kriptografsku zaštitu od manipulacije paketima, sprečava praćenje, dobro se skalira, otporan je na gubitak mrežnih paketa i dovodi do minimalnih gubitaka u točnosti tijekom zaštite veze.
NTS veza sastoji se od dva koraka, u kojima se koriste protokoli niže razine. Na prvom koraku klijent i poslužitelj dogovaraju različite parametre veze i razmjenjuju kolačiće koji sadrže ključeve s cijelim pratećim skupom podataka. Na drugom koraku odvija se zapravo zaštićena NTS sesija između klijenta i NTP poslužitelja.

NTS se sastoji od dva protokola niskog nivoa: Network Time Security Key Exchange (NTS-KE), koji inicira sigurno povezivanje preko TLS-a, i NTPv4 — posljednja inkarnacija NTP protokola. Malo detaljnije o tome u nastavku.
Prva faza — NTS KE
U ovoj fazi NTP klijent inicira TLS 1.2/1.3 sesiju preko zasebne TCP veze sa NTS KE serverom. Tokom ove sesije dešava se sljedeće.
- Strane određuju parametre algoritma za drugu fazu.
- Strane određuju drugi protokol niskog nivoa, ali trenutno se podržava samo NTPv4.
- Strane određuju IP adresu i port NTP servera.
- NTS KE server izdaje kolačiće pod NTPv4.
- Strane izvode par simetričnih ključeva (C2S i S2C) iz materijala kolačića.
Ovaj pristup ima veliku prednost u tome što se sav teret prenošenja tajnih informacija o parametrima veze prebacuje na provjereni i pouzdani protokol TLS. Tako da otpada potreba za izumom vlastitog načina za sigurno NTP rukovanje.
Druga faza — NTP pod zaštitom NTS
U drugoj fazi klijent sigurno usklađuje vrijeme s NTP serverom. U tu svrhu šalje četiri posebna proširenja (extension field) unutar strukture NTPv4 paketa.
- Unique Identifier Extension sadrži nasumični nonce za sprječavanje napada ponavljanjem.
- NTS Cookie Extension sadrži jedan od dostupnih NTP kolačića klijenta. Budući da samo klijent posjeduje simetrične AAED ključeve C2S i S2C, NTP server ih mora izvući iz materijala kolačića.
- NTS Cookie Placeholder Extension je način za klijenta da zatraži dodatne kolačiće sa servera. Ovo proširenje je neophodno kako bi odgovor NTP servera bio približno iste dužine kao i zahtjev. To pomaže spriječiti napade pojačanja.
- NTS Authenticator and Encrypted Extension Fields Extension sadrži šifru algoritma AAED s C2S ključem, NTP zaglavljem, vremenskim oznakama, i prethodno spomenutim EF kao pomoćnim podacima. Bez ovog proširenja moguće je falsifikovati vremenske oznake.

Primajući zahtjev od klijenta, server provjerava autentičnost NTP paketa. Za to mora dešifrovati kolačiće, izvući AAED algoritam i ključeve. Nakon uspješne provjere valjanosti NTP paketa, server odgovara klijentu u sljedećem formatu.
- Unique Identifier Extension je ogledna slika klijentskog zahtjeva, mjera protiv napada ponavljanjem.
- NTS Cookie Extension još kolačića za nastavak sesije.
- NTS Authenticator i Encrypted Extension Fields Extension sadržava šifru AEAD s S2C ključem.
Drugo rukovanje može se ponoviti više puta, preskočivši prvu fazu, jer svaki zahtev i odgovor daje klijentu dodatne kolačiće. To donosi prednost jer se relativno resursno zahtevne TLS operacije izračunavanja i prenosa PKI podataka dele na broj ponovljenih zahteva. Ovo je posebno povoljno za specijalizovane FPGA hronometre, kada se čitava osnovna funkcionalnost može pakovati u nekoliko funkcija iz simetrične kriptografije, prebacujući ceo TLS stek na drugi uređaj.
NTPSec
Šta je specifično za NTP? Iako je autor projekta Dave Mills nastojao što bolje dokumentovati svoj kod, retki programer će uspeti da razjasni zamršenosti algoritama sinhronizacije vremena starih 35 godina. Deo koda je napisan pre ere POSIX, a Unix API se tada značajno razlikovao od onog koji se koristi danas. Pored toga, potrebna su znanja iz statistike kako bi se signal očistio od smetnji na bučnim linijama.
NTS nije bio prvi pokušaj popravljanja NTP-a. Nakon što su napadači naučili koristiti ranjivosti NTP-a za pojačavanje DDoS napada, postalo je jasno da su potrebne radikalne promene. Dok su se pripremali i dorađivali nacrti NTS-a, National Science Foundation Sjedinjenih Država je krajem 2014. godine hitno odobrio grant za modernizaciju NTP-a.
Radnu grupu predvodio je niko drugi nego — jedan od osnivača i stubova Open Source zajednice i autor knjige . Prvo što je Eric i tim pokušao bilo je da prenese NTP kod s platforme BitKeeper na git, ali to nije bilo moguće. Vođa projekta Harlan Stenn bio je protiv tog rešenja i pregovori su zapeli. Tada je odlučeno da se forkne kod projekta, tako je nastao NTPSec.
Impresivno iskustvo, uključujući rad na GPSD-u, matematičku pozadinu i magičnu veštinu čitanja starog koda — Eric Raymond je bio upravo taj haker koji je mogao izvući takav projekat. U timu se našao stručnjak za migraciju koda i za samo 10 nedelja NTP na GitLab-u. Rad je počeo.
Tim Erika Raymonda pristupio je poslu kao Auguste Rodin dok je radio sa gromadom kamena. Uklanjanjem 175 KLOC starog koda, uspeli su značajno smanjiti površinu napada, zatvarajući mnoge sigurnosne propuste.
Evo nepotpunog spiska koji su pali pod udar:
- Nedokumentirani, zastarjeli ili pokvareni refclock.
- Nepotrebna ICS biblioteka.
- libopts/autogen.
- Stari kod za Windows.
- ntpdc.
- Autokey.
- C kod ntpq prepisan u Python.
- C kod sntp/ntpdig prepisan u Python.
Osim čišćenja koda, projekt je imao i druge zadatke. Ovo je nepotpun popis postignuća:
- Znatan je napredak u zaštiti koda od prelivanja bafera. Da bi se spriječilo prelivanje, sve nesigurne funkcije za rad sa stringovima (strcpy / strcat / strtok / sprintf / vsprintf / gets) zamijenjene su sigurnim verzijama koje implementiraju ograničenje veličine bafera.
- Dodana je podrška za NTS.
- Deset puta je povećana preciznost vremenskog koraka vezanjem na fizičku opremu. To je rezultat toga što su moderni računalni satovi puno precizniji od onih koji su postojali u vrijeme osnivanja NTP-a. Najviše su profitirali GPSDO i posvećene vremenske stanice.
- Broj programskih jezika sveden je na dva. Umjesto Perl, awk i čak S skripti, sada je sve u Pythonu. To je omogućilo veće mogućnosti ponovne upotrebe koda.
- Umjesto 'Noodle' skripti, autotools projekt koristi sustav za izgradnju softvera. .
- Ažurirali i reorganizirali smo dokumentaciju projekta. Od proturječne i s vremena na vrijeme arhaične zbirke dokumenata stvorena je pristojna dokumentacija. Svaka ključna naredba i svaki entitet konfiguracije sada imaju jednu verziju istine. Osim toga, stranice za priručnike i web dokumentacija sada se generiraju iz istih osnovnih datoteka.
NTPSec je dostupan za nekoliko Linux distribucija. Trenutno je posljednja stabilna verzija 1.1.8, za Gentoo Linux – pretposljednja.
(1:696)$ sudo emerge -av ntpsec
Ovo su paketi koji bi bili spojeni, u redu:
Izračunavanje zavisnosti... gotovo!
[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
Ukupno: 1 paket (1 ponovna instalacija), Veličina preuzimanja: 0 KiB
Želite li spojiti ove pakete? [Da/Ne]
Chrony
Postojala je još jedna tentativa da se stari NTP zameni sigurnijom alternativom. Chrony, za razliku od NTPSec, pisan je ispočetka i namenjen je pouzdanom radu u širokom spektru uslova, uključujući nestabilne mrežne veze, delimičnu dostupnost ili preopterećenja mreže i promene temperature. Pored toga, chrony ima i druge prednosti:
- chrony može brže sinhronizovati sistemske satove sa većom preciznošću;
- chrony manje troši memorije i obraća se procesoru samo kada je to neophodno. Ovo je veliki plus za štednju resursa i energije;
- chrony podržava vremenske oznake na hardverskom nivou u Linuxu, što obezbeđuje izuzetno preciznu sinhronizaciju u lokalnim mrežama.
Međutim, chrony nema neke mogućnosti starog NTP-a kao što su broadcast i multicast klijent/server. Pored toga, klasični NTP podržava veći broj operativnih sistema i platformi.
Da biste onemogućili funkcionalnost servera i NTP zahteva za proces chronyd, dovoljno je uneti port 0 u datoteku chrony.conf. Ovo se radi u slučajevima kada nije potrebna usluga vremena za NTP klijente ili peer nodove. Počevši sa verzijom 2.0, NTP server port je otvoren samo kada je pristup dozvoljen direktivom allow ili odgovarajućom komandom, ili kada je postavljen peer NTP čvor, ili se koristi direktiva broadcast.
Program se sastoji od dva modula.
- chronyd — usluga koja radi u pozadini. Ona prima informacije o razlici sistemskih satova sa spoljnim vremenom servera i koriguje lokalno vreme. Takođe implementira NTP protokol i može delovati kao klijent ili server.
- chronyc — komanda u terminalu za nadgledanje i kontrolu programa. Koristi se za fino podešavanje različitih parametara usluge, na primer, omogućava dodavanje ili uklanjanje NTP servera dok chronyd nastavlja da radi.
Počevši od 7. verzije RedHat Linux chrony kao usluga za sinhronizaciju vremena. Paket je takođe dostupan za ostale distribucije Linuxa. Poslednja stabilna verzija je 3.5, a priprema se izlazak verzije 4.0.
(1:712)$ sudo emerge -av chrony
Ovo su paketi koji bi bili spojeni:
Izračunavanje zavisnosti... gotovo!
[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
Ukupno: 1 paket (1 novi, 1 binarni), Veličina preuzimanja: 246 KiB
Da li želite da spojite ove pakete? [Da/Ne]
Kako postaviti vlastiti udaljeni chrony server na internetu za sinkronizaciju vremena u uredskoj mreži. U nastavku je primjer postavljanja na VPS-u.
Primjer postavljanja Chrony na RHEL / CentOS na VPS-u
Sada se možemo malo vježbati i podići vlastiti NTP server na VPS-u. To je vrlo jednostavno, dovoljno je odabrati odgovarajući tarifni plan na web stranici RuVDS, dobiti gotov server i unijeti desetak jednostavnih naredbi. Za naše potrebe ovakav bi opcija bila dovoljna.

Prelazimo na postavljanje usluge i prvo instaliramo paket chrony.
[root@server ~]$ yum install chronyRHEL 8 / CentOS 8 koriste drugi paketni menadžer.
[root@server ~]$ dnf install chronyNakon instalacije chrony-a potrebno je pokrenuti i aktivirati uslugu.
[root@server ~]$ systemctl enable chrony --nowAko želite, možete unijeti izmjene u /etc/chrony.conf, zamijenivši NTP servere s najbližima lokalnim radi smanjenja vremena odaziva.
# 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
Zatim postavljamo sinkronizaciju NTP servera s čvorovima iz navedenog bazena.
[root@server ~]$ timedatectl set-ntp true
[root@server ~]$ systemctl restart chronyd.service
Također je potrebno otvoriti NTP port, inače će vatrozid blokirati dolazne veze od klijentskih čvorova.
[root@server ~]$ firewall-cmd --add-service=ntp --permanent
[root@server ~]$ firewall-cmd --reload
Na strani klijenta dovoljno je ispravno postaviti vremensku zonu.
[root@client ~]$ timedatectl set-timezone Europe/MoscowU datoteci /etc/chrony.conf navode se IP ili naziv hosta našeg VPS servera na kojem je pokrenut NTP server chrony.
server my.vps.serverI konačno pokretanje sinkronizacije vremena na klijentu.
[root@client ~]$ systemctl enable --now chronyd
[root@client ~]$ timedatectl set-ntp true
Sljedeći put ću pričati o mogućnostima sinkronizacije vremena bez interneta.
Izvor: habr.com
