Kako je sinkronizacija vremena postala sigurna

Kako je sinkronizacija vremena postala sigurna
Kako osigurati da vrijeme per se ne laže ako imate milijun velikih i malih uređaja koji komuniciraju putem TCP/IP-a? Uostalom, svaki od njih ima sat i svima mora biti točno vrijeme. Ovaj se problem ne može zaobići bez ntp-a.

Zamislimo na trenutak da u jednom segmentu industrijske IT infrastrukture postoje poteškoće sa sinkronizacijom usluga tijekom vremena. Istog trenutka hrpa klastera Enterprise softvera počinje otkazivati, domene se raspadaju, glavni i rezervni čvorovi neuspješno pokušavaju vratiti status quo.

Također je moguće da napadač namjerno pokuša poremetiti vrijeme putem MiTM ili DDOS napada. U takvoj situaciji svašta se može dogoditi:

  • Lozinke korisničkih računa će isteći;
  • X.509 certifikati će isteći;
  • TOTP autentifikacija u dva faktora više neće raditi;
  • sigurnosne kopije će zastarjeti i sustav će ih izbrisati;
  • DNSSec će se pokvariti.

Jasno je da je svaki informatički odjel zainteresiran za pouzdan rad servisa za sinkronizaciju vremena, a bilo bi lijepo da su pouzdani i sigurni u industrijskom radu.

Prekinite NTP za 25 minuta

Mrežni protokoli - milenijci imaju jednu posebnost, bili su zastario i više nisu dobri ni za što, ali njihova zamjena nije tako laka čak ni kada se skupi kritična masa entuzijasta i financijskih sredstava.

Glavna zamjerka klasičnom NTP-u je nedostatak pouzdanih mehanizama za zaštitu od napada uljeza. Učinjeni su različiti pokušaji da se riješi ovaj problem. Da bismo to postigli, prvo smo implementirali mehanizam unaprijed dijeljenog ključa (PSK) za razmjenu simetričnih ključeva.

Nažalost, ova se metoda nije isplatila iz jednostavnog razloga - ne mjeri se dobro. Potrebna je ručna konfiguracija na strani klijenta, ovisno o poslužitelju. To znači da jednostavno ne možete samo tako dodati drugog klijenta. Ako se nešto promijeni na NTP poslužitelju, svi se klijenti moraju ponovno konfigurirati.

Zatim su se dosjetili AutoKeya, ali su odmah otkrili niz ozbiljnih propusta u dizajnu samog algoritma i morali su ga napustiti. Stvar je u tome što seed sadrži samo 32 bita, premalen je i ne sadrži dovoljno računalne složenosti za frontalni napad.

  • Key ID - simetrični 32-bitni ključ;
  • MAC (kod za provjeru autentičnosti poruke) - kontrolni zbroj 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.

Ista se funkcija koristi za izračunavanje kontrolne sume paketa.

MAC=H(Autokey||NTP packet)

Ispostavilo se da cijeli integritet provjere paketa počiva na autentičnosti kolačića. Nakon što ih dobijete, možete vratiti autokey i potom lažirati MAC. Međutim, NTP poslužitelj koristi seed kada ih generira. Tu leži kvaka.

Cookie=MSB_32(H(Client IP||Server IP||0||Server Seed))

Funkcija MSB_32 odsijeca 5 najznačajnija bita iz rezultata izračuna raspršivanja md32. Kolačić klijenta ne mijenja se sve dok parametri poslužitelja ostaju nepromijenjeni. Tada napadač može samo vratiti početni broj i moći samostalno generirati kolačiće.

Prvo se trebate spojiti na NTP poslužitelj kao klijent i primati kolačiće. Nakon toga, koristeći brute force metodu, napadač vraća početni broj slijedeći jednostavan algoritam.

Algoritam za napad na izračun početnog broja metodom grube 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 for

IP adrese su poznate, tako da preostaje samo kreirati 2^32 hash-a dok kreirani kolačić ne odgovara onom primljenom od NTP poslužitelja. Na običnoj kućnoj stanici s Intel Core i5 to će trajati 25 minuta.

NTS - novi autoključ

Bilo je nemoguće pomiriti se s takvim sigurnosnim rupama u Autokeyju, a pojavile su se 2012. godine nova verzija protokol. Kako bi kompromitirali ime, odlučili su rebrendirati pa je Autokey v.2 prozvan Network Time Security.

NTS protokol je proširenje NTP sigurnosti i trenutno podržava samo jednosmjerni način rada. Pruža snažnu kriptografsku zaštitu od manipulacije paketima, sprječava njuškanje, dobro se mjeri, otporan je na gubitak mrežnih paketa i rezultira najmanjim gubitkom preciznosti tijekom sigurnosti veze.

NTS veza sastoji se od dvije faze koje koriste protokole nižeg sloja. Na prvi U ovoj fazi klijent i poslužitelj dogovaraju različite parametre veze i razmjenjuju kolačiće koji sadrže ključeve sa svim popratnim skupom podataka. Na drugi U ovoj fazi se odvija stvarna zaštićena NTS sesija između klijenta i NTP poslužitelja.

Kako je sinkronizacija vremena postala sigurna

NTS se sastoji od dva protokola nižeg sloja: Network Time Security Key Exchange (NTS-KE), koji inicira sigurnu vezu preko TLS-a, i NTPv4, najnovije inkarnacije NTP protokola. Nešto više o ovome u nastavku.

Prva faza - NTS KE

U ovoj fazi, NTP klijent pokreće TLS 1.2/1.3 sesiju preko zasebne TCP veze s NTS KE poslužiteljem. Tijekom ove sesije događa se sljedeće.

  • Stranke određuju parametre AEAD algoritam za drugu fazu.
  • Strane definiraju drugi protokol nižeg sloja, ali trenutno je podržan samo NTPv4.
  • Strane određuju IP adresu i port NTP poslužitelja.
  • NTS KE poslužitelj izdaje kolačiće pod NTPv4.
  • Strane izdvajaju par simetričnih ključeva (C2S i S2C) iz materijala kolačića.

Ovakav pristup ima veliku prednost jer sav teret prijenosa tajnih informacija o parametrima veze pada na provjereni i pouzdani TLS protokol. Ovo eliminira potrebu da ponovno izumite vlastiti kotač za sigurno NTP rukovanje.

Druga faza - NTP pod NTS zaštitom

U drugoj fazi klijent sigurno sinkronizira vrijeme s NTP poslužiteljem. U tu svrhu prenosi četiri posebna proširenja (polja proširenja) u strukturi NTPv4 paketa.

  • Proširenje jedinstvenog identifikatora sadrži slučajni nonce za sprječavanje napada ponavljanjem.
  • NTS Cookie Extension sadrži jedan od NTP kolačića dostupnih klijentu. Budući da samo klijent ima simetrične AAED C2S i S2C ključeve, NTP poslužitelj ih mora izdvojiti iz materijala kolačića.
  • NTS Cookie Placeholder Extension je način na koji klijent može zatražiti dodatne kolačiće od poslužitelja. Ovo proširenje je neophodno kako bi se osiguralo da odgovor NTP poslužitelja nije puno dulji od zahtjeva. To pomaže u sprječavanju napada pojačanja.
  • Proširenje NTS Authenticator i Encrypted Extension Fields sadrži AAED šifru s C2S ključem, NTP zaglavljem, vremenskim oznakama i gornjim EF-om kao popratnim podacima. Bez ovog proširenja moguće je krivotvoriti vremenske oznake.

Kako je sinkronizacija vremena postala sigurna

Po primitku zahtjeva od klijenta, poslužitelj provjerava autentičnost NTP paketa. Da bi to učinio, mora dešifrirati kolačiće, izdvojiti AAED algoritam i ključeve. Nakon uspješne provjere ispravnosti NTP paketa, poslužitelj odgovara klijentu u sljedećem formatu.

  • Unique Identifier Extension je zrcalna kopija zahtjeva klijenta, mjera protiv napada ponavljanjem.
  • NTS Cookie Extension više kolačića za nastavak sesije.
  • Proširenje NTS Authenticator i Encrypted Extension Fields sadrži AEAD šifru sa S2C ključem.

Drugo rukovanje može se ponoviti mnogo puta, zaobilazeći prvi korak, budući da svaki zahtjev i odgovor klijentu daje dodatne kolačiće. To ima prednost u tome što se relativno resursno intenzivne TLS operacije računanja i prijenosa PKI podataka dijele s brojem ponovljenih zahtjeva. Ovo je posebno zgodno za specijalizirane FPGA mjerače vremena, kada se sve glavne funkcionalnosti mogu upakirati u nekoliko funkcija iz područja simetrične kriptografije, prenoseći cijeli TLS stog na drugi uređaj.

NTPSec

Što je posebno kod NTP-a? Unatoč činjenici da je autor projekta, Dave Mills, pokušao što bolje dokumentirati svoj kod, rijetki su programeri koji će moći razumjeti zamršenost algoritama za sinkronizaciju vremena starih 35 godina. Dio koda napisan je prije POSIX ere, a Unix API tada je bio vrlo različit od onoga što se koristi danas. Osim toga, potrebno je poznavanje statistike kako bi se signal očistio od smetnji na linijama s šumom.

NTS nije bio prvi pokušaj da se popravi NTP. Nakon što su napadači naučili iskoristiti NTP ranjivosti za pojačavanje DDoS napada, postalo je jasno da su potrebne radikalne promjene. I dok su se nacrti NTS-a pripremali i finalizirali, američka Nacionalna zaklada za znanost krajem 2014. hitno je dodijelila bespovratna sredstva za modernizaciju NTP-a.

Na čelu radne skupine bio je ne bilo tko, nego Eric Stephen Raymond - jedan od utemeljitelja i stupova Open Source zajednice i autor knjige Katedrala i bazar. Prvo što su Eric i njegovi prijatelji pokušali napraviti bilo je premjestiti NTP kod s BitKeeper platforme na git, ali nije tako išlo. Voditelj projekta Harlan Stenn bio je protiv ove odluke i pregovori su zapeli. Tada je odlučeno da se račva projektni kod i tako je rođen NTPSec.

Solidno iskustvo, uključujući rad na GPSD-u, matematičku pozadinu i čarobnu vještinu čitanja drevnog koda - Eric Raymond bio je upravo haker koji je mogao pokrenuti takav projekt. Tim je pronašao stručnjaka za migraciju koda i za samo 10 tjedana NTP smirenna GitLabu. Radilo se punom parom.

Tim Erica Raymonda preuzeo je zadatak na isti način na koji je Auguste Rodin učinio s kamenim blokom. Uklanjanjem 175 KLOC starog koda, uspjeli su značajno smanjiti površinu napada zatvarajući mnoge sigurnosne rupe.

Evo nepotpunog popisa onih koji su uključeni u distribuciju:

  • Nedokumentiran, zastario, zastario ili pokvaren refclock.
  • Neiskorištena ICS biblioteka.
  • libopts/autogen.
  • Stari kod za Windows.
  • ntpdc.
  • Autoključ.
  • ntpq C kod je ponovno napisan u Pythonu.
  • Sntp/ntpdig C kôd je ponovno napisan u Pythonu.

Osim čišćenja koda, projekt je imao i druge zadatke. Evo djelomičnog popisa postignuća:

  • Zaštita koda od prekoračenja međuspremnika značajno je poboljšana. Kako bi se spriječilo prekoračenje međuspremnika, sve nesigurne funkcije niza (strcpy/strcat/strtok/sprintf/vsprintf/gets) zamijenjene su sigurnim verzijama koje implementiraju ograničenja veličine međuspremnika.
  • Dodana NTS podrška.
  • Poboljšana točnost vremenskog koraka deseterostruko povezivanjem fizičkog hardvera. To je zbog činjenice da su moderni računalni satovi postali mnogo precizniji od onih kada je rođen NTP. Najveće koristi od ovoga imali su GPSDO i radijski uređaji posvećeni vremenu.
  • Broj programskih jezika je smanjen na dva. Umjesto Perla, awk-a, pa čak i S skripti, sada je sve Python. Zbog toga postoji više mogućnosti za ponovnu upotrebu koda.
  • Umjesto rezanaca autotools skripti, projekt je počeo koristiti sustav za izradu softvera WAF.
  • Ažurirana i reorganizirana projektna dokumentacija. Od kontradiktorne i ponekad arhaične zbirke dokumenata stvorili su sasvim prohodnu dokumentaciju. Svaki prekidač naredbenog retka i svaki konfiguracijski entitet sada ima jednu verziju istine. Osim toga, stranice priručnika i web dokumentacija sada se stvaraju iz istih osnovnih datoteka.

NTPSec je dostupan za brojne distribucije Linuxa. Trenutno je posljednja stabilna verzija 1.1.8, za Gentoo Linux pretposljednja.

(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

Postojao je još jedan pokušaj da se stari NTP zamijeni sigurnijom alternativom. Chrony je, za razliku od NTPSec, napisan od temelja i dizajniran je za pouzdan rad u širokom rasponu uvjeta, uključujući nestabilne mrežne veze, djelomičnu dostupnost ili zagušenje mreže i temperaturne promjene. Osim toga, chrony ima i druge prednosti:

  • chrony može sinkronizirati sistemski sat brže s većom točnošću;
  • chrony je manji, troši manje memorije i pristupa CPU-u samo kada je to potrebno. Ovo je veliki plus za uštedu resursa i energije;
  • chrony podržava hardverske vremenske oznake na Linuxu, omogućujući izuzetno preciznu sinkronizaciju na lokalnim mrežama.

Međutim, chrony nema neke značajke starog NTP-a, kao što su emitiranje i multicast klijent/poslužitelj. Osim toga, klasični NTP podržava veći broj operativnih sustava i platformi.

Kako biste onemogućili funkcionalnost poslužitelja i NTP zahtjeva procesu chronyd, samo upišite port 0 u datoteku chrony.conf. To se radi u slučajevima kada nema potrebe za održavanjem vremena za NTP klijente ili peere. Od verzije 2.0, priključak NTP poslužitelja otvoren je samo kada je pristup dopušten direktivom dopuštanja ili odgovarajućom naredbom, ili je NTP peer konfiguriran, ili se koristi direktiva za emitiranje.

Program se sastoji od dva modula.

  • chronyd je servis koji radi u pozadini. Prima informacije o razlici između sistemskog sata i vanjskog vremenskog poslužitelja te prilagođava lokalno vrijeme. Također implementira NTP protokol i može djelovati kao klijent ili poslužitelj.
  • chronyc je uslužni program naredbenog retka za nadzor i kontrolu programa. Koristi se za fino podešavanje različitih parametara usluge, na primjer, omogućava vam dodavanje ili uklanjanje NTP poslužitelja dok chronyd nastavlja raditi.

Od verzije 7 RedHat Linuxa koristi chrony kao servis za sinkronizaciju vremena. Paket je također dostupan za druge distribucije Linuxa. Najnovija stabilna verzija je 3.5, priprema se za izdanje 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 postaviti vlastiti udaljeni chrony poslužitelj na internetu za sinkronizaciju vremena na uredskoj mreži. Ispod je primjer postavljanja VPS-a.

Primjer postavljanja Chronya na RHEL / CentOS na VPS

Idemo sada malo vježbati i postaviti vlastiti NTP poslužitelj na VPS. Vrlo je jednostavno, samo odaberite odgovarajuću tarifu na web stranici RuVDS-a, nabavite gotov poslužitelj i upišite desetak jednostavnih naredbi. Za naše potrebe ova je opcija sasvim prikladna.

Kako je sinkronizacija vremena postala sigurna

Prijeđimo na postavljanje servisa i prvo instalirajmo chrony paket.

[root@server ~]$ yum install chrony

RHEL 8 / CentOS 8 koristi drugi upravitelj paketa.

[root@server ~]$ dnf install chrony

Nakon instaliranja chronya potrebno je pokrenuti i aktivirati uslugu.

[root@server ~]$ systemctl enable chrony --now

Ako želite, možete napraviti promjene u /etc/chrony.conf, zamjenjujući NPT poslužitelje s najbližim lokalnim kako biste smanjili vrijeme odgovora.

# 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 poslužitelja s čvorovima iz navedenog skupa.

[root@server ~]$ timedatectl set-ntp true
[root@server ~]$ systemctl restart chronyd.service

Također je potrebno otvoriti NTP port prema van, inače će vatrozid blokirati dolazne veze s klijentskih čvorova.

[root@server ~]$ firewall-cmd --add-service=ntp --permanent 
[root@server ~]$ firewall-cmd --reload

Na strani klijenta dovoljno je točno postaviti vremensku zonu.

[root@client ~]$ timedatectl set-timezone Europe/Moscow

Datoteka /etc/chrony.conf navodi IP ili naziv hosta našeg VPS poslužitelja koji pokreće NTP poslužitelj chrony.

server my.vps.server

I na kraju, početak sinkronizacije vremena na klijentu.

[root@client ~]$ systemctl enable --now chronyd
[root@client ~]$ timedatectl set-ntp true

Sljedeći put ću vam reći koje mogućnosti postoje za sinkronizaciju vremena bez interneta.

Kako je sinkronizacija vremena postala sigurna

Kako je sinkronizacija vremena postala sigurna

Izvor: www.habr.com

Dodajte komentar