Si të bëni që koha vetë të mos gënjejë, nëse keni një milion pajisje të mëdha e të vogla që komunikojnë përmes TCP/IP? Sepse secila ka orën e saj, dhe koha duhet të jetë e saktë për të gjitha. Ky problem nuk mund të zgjidhet pa NTP.
Le të imagjinojmë për një minutë se në një segment të infrastrukturës industriale IT ka probleme me sinkronizimin e shërbimeve përmes kohës. Menjëherë fillon të dështon struktura e klastrit të software-it Enterprise, ndërsa domainet, masterat dhe nodet Standby luftojnë pa sukses për të rikthyer statusin quo.
Po ashtu mund të ndodhë që një sulmues përpiqet qartë të manipulojë kohën përmes MiTM, ose një sulmi DDoS. Në këtë situatë mund të ndodhin gjithçka:
- skadon data e fjalëkalimeve të llogarive të përdoruesve;
- skadon data e certifikatave X.509;
- verifikimi dy-faktorësh TOTP pushon së funksionuari;
- kopjet rezervë "prishen" dhe sistemi i fshin ato;
- do të dështojë DNSSec.
E qartë, çdo departament i parë IT është i interesuar për funksionimin e besueshëm të shërbimeve të sinkronizimit të kohës, dhe do të ishte mirë që ato të ishin të besueshme dhe të sigurta për përdorim industrial.
Të shkatërrosh NTP në 25 minuta
Protokollet rrjetĂ«sore â milenialĂ«t kanĂ« njĂ« karakteristikĂ« tĂ« veçantĂ«, ata janĂ« tĂ« vjetĂ«r dhe nuk janĂ« tĂ« pĂ«rshtatshĂ«m mĂ«, por nuk Ă«shtĂ« kaq e lehtĂ« t'i zĂ«vendĂ«sosh edhe kur grumbullohet njĂ« masĂ« kritike e entuziastĂ«ve dhe financimeve.
Kritika kryesore ndaj NTP klasike është mungesa e mekanizmave të besueshëm të mbrojtjes nga sulmet e hakerave. Janë bërë përpjekje të ndryshme për të zgjidhur këtë problem. Për këtë, në fillim u implementua një mekanizëm i çelësave të vendosur më përpara (PSK) për shkëmbimin e çelësave simetrikë.
FatkeqĂ«sisht, ky mĂ«nyrĂ« nuk e justifikoi veten pĂ«r njĂ« arsye tĂ« thjeshtĂ« â nuk skalohet mirĂ«. KĂ«rkon konfigurim manual nĂ« anĂ«n e klientit ndikuar nga serveri. Kjo do tĂ« thotĂ« se nuk mund tĂ« shtoni thjesht njĂ« klient tjetĂ«r. NĂ«se diçka ndryshon nĂ« serverin NTP, duhet ricilĂ«suar tĂ« gjithĂ« klientĂ«t.
Atëherë u krijua AutoKey, por u zbuluan menjëherë disa vulnerabilitete serioze në dizajnin e algoritmit dhe duhej të hiqej. Të gjitha për shkak se numri fillestar (seed) përmban vetëm 32-bit, shumë i vogël dhe nuk ka mjaft kompleksitet për një sulm të dhunshëm.
- Key ID â çelĂ«s simetrik 32-bit;
- MAC (kode autentikimi mesazhi) â kontrolli i paketĂ«s NTP;
Autokey llogaritet si në vijim.
Autokey=H(Sender-IP||Receiver-IP||KeyID||Cookie)Ku H() â funksioni i hash-it kriptografik.
Për llogaritjen e kontrollit të paketave përdoret e njëjta funksion.
MAC=H(Autokey||NTP packet)Kështu, tërësia e kontrollit të paketave mbështetet në autentikimin e cookies. Nëse dikush i merr ato, mund të rikuperojë autokey dhe më pas të falsifikojë MAC-un. Sidoqoftë, serveri NTP përdor numrin fillestar (seed) gjatë gjenerimit të tyre. Këtu qëndron mashtimi.
Cookie=MSB_32(H(Client IP||Server IP||0||Server Seed))Funksioni MSB_32 prish 32 bitët e parë më të rëndësishëm të rezultatit të llogaritjes së hash-it md5. Cookie i klientit nuk ndryshon derisa parametrat e serverit të mbeten të paprekur. Pas kësaj, sulmuesi duhet vetëm të rikuperojë numrin fillestar dhe të ketë mundësi për të gjeneruar cookies vetë.
Në fillim, duhen lidhur me serverin NTP si klient dhe të marrin cookies. Pas kësaj, duke përdorur një metodë probabiliste, sulmuesi rikuperon numrin fillestar sipas një algoritmi të thjeshtë.
Algoritmi i sulmit për llogaritjen e numrit fillestar me metodën probabilistike.
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 adresat njihen, kështu që duhet të krijosh vetëm 2^32 hash-et deri sa cookie i krijuar të përputhet me atë që është marrë nga serveri NTP. Në një stacion të zakonshëm të shtëpisë me Intel Core i5 do të duhen 25 minuta për këtë.
NTS â Autokey i ri
Ishte e papranueshme të pranohej një siguri kaq e dobët në Autokey dhe në vitin 2012 erdhi i protokollit. Për këtë arsye, vendosën të bëjnë ripërmëndjen, kështu që Autokey v.2 u quajt Network Time Security.
Protokolli NTS është një zgjerim i sigurisë NTP dhe aktualisht mbështet vetëm modin unicast. Ai ofron mbrojtje kriptografike të besueshme nga manipulimet e paketa, parandalon përgjimin, është mirë i skalueshëm, qëndron ndaj humbjeve të paketa rrjeti dhe shkakton humbje minimale të saktësisë që ndodhin gjatë mbrojtjes së lidhjes.
NTS lidhja përbëhet nga dy faza, në të cilat përdoren protokollet e nivelit më të ulët. Në fazën e parë klienti dhe serveri bien dakord për parametra të ndryshëm të lidhjes dhe shkëmbejnë cookies që përmbajnë çelësa me të gjithë setin e të dhënave përkatëse. Në fazën e dytë ndodh sesi seanca e mbrojtur NTS midis klientit dhe serverit NTP.

NTS pĂ«rbĂ«het nga dy protokolle tĂ« nivelit tĂ« poshtĂ«m: ShkĂ«mbimi i ĂelĂ«save tĂ« SigurisĂ« sĂ« KohĂ«s sĂ« Rrjetit (NTS-KE), qĂ« inicializon njĂ« lidhje tĂ« sigurt mbi TLS, dhe NTPv4 â inkarnimi mĂ« i fundit i protokollit NTP. Pak mĂ« poshtĂ« do tĂ« flasim pĂ«r kĂ«tĂ«.
Hapi i parĂ« â NTS KE
Në këtë fazë, klienti NTP inicion një seancë TLS 1.2/1.3 nëpërmjet një lidhjeje TCP të veçantë me serverin NTS KE. Gjatë kësaj seance ndodhin sa vijon.
- Palët përcaktojnë parametrat e algoritmit për hapin e dytë.
- Palët përcaktojnë protokollin e dytë të nivelit të poshtëm, por deri tani mbështetet vetëm NTPv4.
- Palët përcaktojnë adresën IP dhe portin e serverit NTP.
- Serveri NTS KE lëshon cookie nën NTPv4.
- Palët nxjerrin nga materiali i cookie-t një çift çelësash simetrikë (C2S dhe S2C).
Ky qasje ka një avantazh të madh, që e gjithë ngarkesa e transmetimit të informacionit të fshehtë të parametrave të lidhjes bie mbi një protokol të verifikuar dhe të besueshëm si TLS. Kështu, nuk ka nevojë të shpikim një biçikletë të re për një dorëzim të sigurt NTP.
Hapi i dytĂ« â NTP i mbrojtur nga NTS
Në etapën e dytë, klienti sinkronizon kohën në mënyrë të sigurt me serverin NTP. Për këtë qëllim, ai dërgon katër zgjerime speciale (fushat e zgjerimit) në strukturën e paketa NTPv4.
- Zgjerimi Unique Identifier përmban një nonce rastësor për të parandaluar sulmet e ripërsëritjes.
- Zgjerimi NTS Cookie përmban një nga cookie-t NTP që klienti ka. Pasi vetëm klienti disponon çelësat simetrikë AAED C2S dhe S2C, serveri NTP duhet t'i nxjerrë ato nga materiali i cookie-t.
- Zgjerimi NTS Cookie Placeholder është mënyrë për klientin të kërkojë cookie shtesë nga serveri. Ky zgjerim është i nevojshëm që përgjigjja e serverit NTP të mos ishte ndjeshëm më e gjatë se kërkesa. Kjo ndihmon për të parandaluar sulmet e intensifikimit.
- Zgjerimi NTS Authenticator dhe Fushat e Zgjeruara të Kriptës përmban kriptimin e algoritmit AAED me çelësin C2S, kokën NTP, timestamps, dhe përmendoret e sipërpërmendura si të dhëna shoqëruese. Pa këtë zgjerim, është e mundur të falsifikohen timestamps.

Pas marrjes së kërkesës nga klienti, serveri verifikon autenticitetin e paketës NTP. Për këtë, ai duhet të dekriptojë cookie, të nxjerrë algoritmin AAED dhe çelësat. Pas një verifikimi të suksesshëm të paketës NTP, serveri i përgjigjet klientit në formatin e mëposhtëm.
- Zgjerimi Unique Identifier është një pasqyrë e kërkesës së klientit, një masë kundër sulmeve të ripërsëritjes.
- Zgjerimi NTS Cookie përmban më shumë cookie për vazhdimin e seancës.
- Zgjerimi NTS Authenticator dhe Fushat e Zgjeruara të Kriptës përmban kriptimin AEAD me çelësin S2C.
Duhet theksuar se dorëzimi i dytë mund të përsëritet shumë herë, duke anashkaluar hapat e parë, pasi çdo kërkesë dhe përgjigje i jep klientit cookie shtesë. Kjo ofron avantazhin që operacionet relativisht të kushtueshme të TLS për llogaritjet dhe dërgimin e të dhënave PKI ndahen në numrin e kërkesave të përsëritura. Kjo është veçanërisht e përshtatshme për kronometrat FPGA të specializuar, kur të gjithë funksionaliteti kryesor mund të paketizohet në disa funksione nga fusha e kriptografisë simetrike, duke kaluar të gjithë stakun TLS në një pajisje tjetër.
NTPSec
Cili është veçoriteti i NTP? Megjithëse autori i projektit Dave Mills përpiqej të dokumentonte sa më mirë kodin e tij, një programues i rrallë do të ishte në gjendje të kuptonte përzgjedhjet e algoritmeve për sinkronizimin e kohës 35-vjeçare. Disa pjesë të kodit janë shkruar para epokës POSIX, dhe API Unix atëherë ishte dukshëm ndryshe nga ajo që përdoret sot. Për më tepër, nevojiten njohuri në statistikë për të përjashtuar sinjalin nga zhurmat në linjat e zhurmshme.
NTS nuk ishte përpjekja e parë për të rregulluar NTP. Pasi kriminelët mësuan të shfrytëzojnë dobësitë e NTP për intensifikimin e sulmeve DDoS, u kuptua se ishin të nevojshme ndryshime të thella. Dhe ndërsa po përgatiteshin dhe përmirësoheshin skicat e NTS, Fondacioni Kombëtar i Shkencës në SHBA në fund të vitit 2014 nxitoi të japë një grant për modernizimin e NTP.
Grupin e punĂ«s e udhĂ«hoqi njĂ« figurĂ« e njohur, â njĂ« nga themeluesit dhe shtyllat e komunitetit Open Source dhe autor i librit . Herakulli i parĂ« ishte qĂ« Eric dhe shokĂ«t e tij u pĂ«rpoqĂ«n tĂ« transferonin kodin NTP nga platforma BitKeeper nĂ« git, por pa sukses. Lideri i projektit Harlan Stenn ishte kundĂ«r kĂ«tij vendimi dhe negociatat u bllokuan. AtĂ«herĂ«, u vendos qĂ« tĂ« bĂ«hej fork i kodit tĂ« projektit, duke krijuar kĂ«shtu NTPSec.
PĂ«rvoja e madhe, pĂ«rfshi punĂ«n mbi GPSD, backgroundin matematikor dhe aftĂ«sinĂ« magjike pĂ«r tĂ« lexuar kodin e lashtĂ« â Eric Raymond ishte pikĂ«risht hakeri qĂ« mund tĂ« nxirrte njĂ« projekt tĂ« tillĂ«. NĂ« ekip u gjet njĂ« specialist pĂ«r migrimin e kodit dhe brenda 10 javĂ«ve NTP nĂ« GitLab. Puna filloi tĂ« lĂ«vizte.
Ekipi i Eric Raymond filloi punën si Auguste Rodin me bllokun e tij të gurit. Duke fshirë 175 KLOC të kodit të vjetër, ata arritën të zvogëlojnë ndjeshëm sipërfaqen e sulmit, duke mbyllur shumë dobësi sigurie.
Ja një listë jo të plotë e atyre që u preken:
- Refclock të undocumented, të kaluara, të vjetra ose të prishura.
- Biblioteka e pa përdorur ICS.
- libopts/autogen.
- Kodi i vjetër për Windows.
- ntpdc.
- Autokey.
- Kodi C i ntpq është rishkruar në Python.
- Kodi C i sntp/ntpdig është rishkruar në Python.
Përveç pastrimit të kodit, projekti kishte edhe detyra të tjera. Këtu është një listë jo të plotë e arritjeve:
- Mbrojtja e kodit nga tejkalimi i tamponit është forcuar ndjeshëm. Për të parandaluar tejkalimin e tamponit, të gjitha funksionet e vargjeve të pasigurta (strcpy / strcat / strtok / sprintf / vsprintf / gets) janë zëvendësuar me versione të sigurta që zbatojnë kufizimin e madhësisë së tamponit.
- ĂshtĂ« shtuar mbĂ«shtetje pĂ«r NTS.
- Saktësia e hapësirës temporale është rritur dhjetëfish duke lidhur pajisjet fizike. Kjo është për shkak se orët kompjuterike moderne janë bërë shumë më të sakta se ato që ishin në fillim të NTP. GPSDO dhe stacionet e dedikuara të kohës përfituan më shumë nga kjo.
- Numri i gjuhëve të programimit është reduktuar në dy. Në vend të skenarëve Perl, awk dhe madje S, tani përdoret vetëm Python. Kjo sjell më shumë mundësi për ripërdorimin e kodit.
- Në vend të një grumbulli skenari, autotools projekti tani përdor një sistem ndërtimi të softuerit. .
- Dokumentacioni i projektit Ă«shtĂ« pĂ«rditĂ«suar dhe reorganizuar. Nga njĂ« koleksion kontradiktor dhe herĂ« pas here arkaik dokumentesh, Ă«shtĂ« krijuar njĂ« dokumentacion mjaft i pranueshĂ«m. Ădo çelĂ«s i komandĂ«s nĂ« linjĂ« dhe çdo entitet i konfigurimit tani ka njĂ« version tĂ« vetĂ«m tĂ« sĂ« vĂ«rtetĂ«s. PĂ«r mĂ« tepĂ«r, faqet e manualeve dhe dokumentacioni nĂ« internet tani krijohen nga tĂ« njĂ«jtĂ«t skedarĂ« themelor.
NTPSec është i disponueshëm për një sërë distribucionesh Linux. Aktualisht, versioni i fundit stabil është 1.1.8, për Gentoo Linux është versioni para fundit.
(1:696)$ sudo emerge -av ntpsec
Këto janë paketat që do të bashkohen, në rend:
Po llogaritet varësitë... përfunduar!
[ebuild R ] net-misc/ntpsec-1.1.7-r1::gentoo PĂ«rdor:"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" PĂRMBUSHJET_PYTHON="python3_6" 0 KiB
Totali: 1 paketë (1 riparim), Madhësia e shkarkimeve: 0 KiB
A do të dëshironit të bashkoni këto paketa? [Po/Jo]
Chrony
Ishte një përpjekje tjetër për të zëvendësuar NTP-në e vjetër me një analog më të sigurt. Chrony, ndryshe nga NTPSec, është shkruar nga fillimi dhe është projektuar për të punuar besueshëm nën një gamë të gjerë kushtesh, duke përfshirë lidhjet rrjetore të paqëndrueshme, aksesin e pjesshëm ose ngarkesat e rrjetit dhe ndryshimet e temperaturës. Për më tepër, chrony ka edhe përfitime të tjera:
- chrony mund të sinkronizojë orët e sistemit më shpejt dhe me saktësi më të madhe;
- chrony është më i vogël, konsumon më pak memorie dhe i qaset procesorit vetëm kur është e nevojshme. Kjo është një përfitim i madh për kursimin e burimeve dhe energjisë;
- chrony mbështet marka të kohës në nivelin e pajisjeve në Linux, që siguron sinkronizim jashtëzakonisht të saktë në rrjetet lokale.
Megjithatë, chrony nuk ka disa funksionalitete të NTP-së së vjetër, si klienti/servari i shumëfishtë dhe të dërguara (multicast). Përveç kësaj, NTP klasik mbështet një numër më të madh sistemesh operativ dhe platformash.
Për të çaktivizuar funksionalitetin e serverit dhe kërkesat NTP nga procesi chronyd, mjafton të shkruani port 0 në skedarin chrony.conf. Kjo bëhet në ato raste kur nuk është e nevojshme të ofrohet koha për klientët NTP ose nyjet peer. Që nga versioni 2.0, porti i serverit NTP hapet vetëm kur aksesimi lejohet me direktivën allow ose me komandën përkatëse, ose ndryshe kur konfiguroni një nyje peer NTP, ose përdorni direktivën broadcast.
Programi përbëhet nga dy module.
- chronyd â njĂ« shĂ«rbim qĂ« punon nĂ« mĂ«nyrĂ« tĂ« fshehtĂ«. Ai merr informacion pĂ«r dallimin e orĂ«ve tĂ« sistemit nga njĂ« server kohe tĂ« jashtĂ«m dhe rregullon kohĂ«n lokale. Po ashtu zbaton protokollin NTP dhe mund tĂ« veprojĂ« si klient apo server.
- chronyc â njĂ« mjet komande pĂ«r monitorimin dhe kontrollin e programit. PĂ«rdoret pĂ«r optimizimin e parametrave tĂ« ndryshĂ«m tĂ« shĂ«rbimit, siç Ă«shtĂ« lehtĂ«simi i shtimit ose heqjes sĂ« serverĂ«ve NTP ndĂ«rkohĂ« qĂ« chronyd vazhdon tĂ« funksionojĂ«.
QĂ« nga versioni 7 tĂ« RedHat Linux chrony si shĂ«rbim pĂ«r sinkronizimin e kohĂ«s. Paketa Ă«shtĂ« gjithashtu e disponueshme pĂ«r distro tĂ« tjera Linux. Versioni i fundit stabil Ă«shtĂ« 3.5, pĂ«ćć€ohet versioni v4.0.
(1:712)$ sudo emerge -av chrony
Këto janë paketat që do të bashkohen, në rend:
Po llogaritet varësitë... përfunduar!
[binary N ] net-misc/chrony-3.5-r2::gentoo Përdor:"adns caps cmdmon ipv6 ntp phc readline refclock rtc seccomp (-html) -libedit -pps (-selinux)" 246 KiB
Totali: 1 paketë (1 e re, 1 binar), Madhësia e shkarkimeve: 246 KiB
A do të dëshironit të bashkoni këto paketa? [Po/Jo]
Si të konfiguroni serverin tuaj të largët chrony në internet për të sinkronizuar kohën në rrjetin e zyrës. Më poshtë është një shembull konfigurimi në VPS.
Shembull konfigurimi Chrony në RHEL / CentOS në VPS
Tani tĂ« ushtrojmĂ« pak dhe tĂ« ngremĂ« serverin tonĂ« NTP nĂ« VPS. ĂshtĂ« shumĂ« e thjeshtĂ«, mjafton tĂ« zgjidhni njĂ« plan tĂ« pĂ«rshtatshĂ«m nĂ« faqen RuVDS, tĂ« merrni njĂ« server tĂ« gatshĂ«m dhe tĂ« shkruani njĂ« duzinĂ« komandash tĂ« thjeshta. NjĂ« opsion i tillĂ« do tĂ« ishte mjaft i pĂ«rshtatshĂ«m pĂ«r qĂ«llimet tona.

Tani kalojmë në konfigurimin e shërbimit dhe e para gjë që bëjmë është të instalojmë paketën chrony.
[root@server ~]$ yum install chronyRHEL 8 / CentOS 8 përdorin një menaxher paketeshe tjetër.
[root@server ~]$ dnf install chronyPas instalimit të chrony, duhet ta aktivizoni dhe ta nisim shërbimin.
[root@server ~]$ systemctl enable chrony --nowNëse dëshironi, mund të bëni ndryshime në /etc/chrony.conf, duke zëvendësuar serverët NPT me ata më të afërt lokal për të shkurtuar kohën e përgjigjes.
# 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
MĂ« pas, konfiguroni sinkronizimin e serverit NTP me nyjet nga pool-i i specifikuar.
[root@server ~]$ timedatectl set-ntp true
[root@server ~]$ systemctl restart chronyd.service
Duhet gjithashtu të hapni portin e jashtëm NTP, përndryshe firewalla do të bllokojë lidhjet hyrëse nga nyjet klient.
[root@server ~]$ firewall-cmd --add-service=ntp --permanent
[root@server ~]$ firewall-cmd --reload
Në anën e klientit, mjafton të vendosni saktë zonën tuaj të kohës.
[root@client ~]$ timedatectl set-timezone Europe/MoscowNë skedarin /etc/chrony.conf, specifikoni IP-në ose emrin e hostit të serverit tonë VPS, ku është aktivizuar serveri NTP chrony.
server my.vps.serverDhe përfundimisht filloni sinkronizimin e kohës në klient.
[root@client ~]$ systemctl enable --now chronyd
[root@client ~]$ timedatectl set-ntp true
Në herën tjetër do t'ju tregoj për opsionet e sinkronizimit të kohës pa internet.
Burimi: habr.com
