Si të bëni që koha per se të mos gabojë, nëse keni një milion pajisje të mëdha e të vogla që ndërveprojnë përmes TCP/IP? Sepse secila prej tyre ka orën e vet, ndërsa koha duhet të jetë e saktë në të gjitha. Këtë problem nuk mund ta shmangni pa ntp.
Le të imagjinojmë për një minutë se në një segment të infrastrukturës industriale IT kanë lindur probleme me sinkronizimin kohor të shërbimeve. Menjëherë fillon të dështojë stack-u i klasterit të software-it Enterprise, domenet shpërbëhen dhe nyjet master dhe Standby përpiqen më kot të rikthejnë status quo-në.
Mund të ndodhë gjithashtu që një sulmues të përpiqet qëllimisht të prishë kohën përmes një sulmi MiTM ose DDOS. Në një situatë të tillë mund të ndodhë gjithçka:
- do të skadojnë fjalëkalimet e llogarive të përdoruesve;
- do të skadojnë certifikatat X.509;
- autentifikimi me dy faktorë TOTP do të ndalojë së funksionuari;
- backup-et do tĂ« âvjetrohenâ dhe sistemi do tâi fshijĂ«;
- DNSSec do të prishet.
ĂshtĂ« e qartĂ« se pothuajse çdo departament IT Ă«shtĂ« i interesuar pĂ«r funksionimin e qĂ«ndrueshĂ«m tĂ« shĂ«rbimeve tĂ« sinkronizimit tĂ« kohĂ«s, dhe do tĂ« ishte mirĂ« qĂ« ato tĂ« ishin tĂ« besueshme dhe tĂ« sigurta nĂ« pĂ«rdorim industrial.
Si të prishet NTP për 25 minuta
Protokollet e rrjetit â milenialĂ«t kanĂ« njĂ« veçori: ata prej kohĂ«sh nuk vlejnĂ« mĂ« askund, por tâi zĂ«vendĂ«sosh nuk Ă«shtĂ« aq e lehtĂ« edhe kur krijohet njĂ« masĂ« kritike entuziastĂ«sh dhe financimi.
Ankesa kryesore ndaj NTP klasik është mungesa e mekanizmave të besueshëm mbrojtës kundër sulmeve të keqbërësve. Janë bërë përpjekje të ndryshme për ta zgjidhur këtë problem. Për këtë fillimisht u zbatua mekanizmi i çelësave të parainstaluar (PSK) për shkëmbimin e çelësave simetrikë.
FatkeqĂ«sisht, kjo qasje nuk e justifikoi veten pĂ«r njĂ« arsye tĂ« thjeshtĂ« â ajo shkallĂ«zohet dobĂ«t. KĂ«rkohet konfigurim manual nĂ« anĂ«n e klientit, nĂ« varĂ«si tĂ« serverit. Kjo do tĂ« thotĂ« se nuk mund tĂ« shtoni thjesht edhe njĂ« klient tjetĂ«r. NĂ«se ndryshon diçka nĂ« serverin NTP, duhet tĂ« rikonfiguroni tĂ« gjithĂ« klientĂ«t.
Më pas u shpik AutoKey, por shumë shpejt në të u zbuluan një sërë dobësish serioze në vetë dizajnin e algoritmit dhe prej tij u hoq dorë. E gjithë çështja është se numri fillestar (seed) përmban vetëm 32 bita; kjo është tepër pak dhe nuk ofron kompleksitet të mjaftueshëm llogaritës për një sulm bruteforce.
- Key ID â çelĂ«s simetrik 32-bitĂ«sh;
- MAC (message authentication code) â shuma e kontrollit e paketĂ«s NTP;
Autokey llogaritet si më poshtë.
Autokey=H(Sender-IP||Receiver-IP||KeyID||Cookie)Ku H() është funksion hash kriptografik.
Për llogaritjen e shumës së kontrollit të paketës përdoret i njëjti funksion.
MAC=H(Autokey||NTP packet)Kështu, rezulton se e gjithë integriteti i verifikimit të paketave mbështetet te autenticiteti i cookies. Duke i përvetësuar ato, mund të rikuperohet autokey dhe më pas të falsifikohet MAC. Megjithatë, serveri NTP gjatë gjenerimit të tyre përdor një numër fillestar (seed). Pikërisht këtu qëndron problemi.
Cookie=MSB_32(H(Client IP||Server IP||0||Server Seed))Funksioni MSB_32 i pret 32 bitët më të lartë nga rezultati i llogaritjes së hash-it md5. Cookie i klientit nuk ndryshon për aq kohë sa parametrat e serverit mbeten të pandryshuar. Më pas sulmuesit i mbetet vetëm të rikuperojë numrin fillestar dhe të fitojë mundësinë të gjenerojë vetë cookies.
Së pari duhet të lidheni me serverin NTP si klient dhe të merrni cookie. Pas kësaj, me metodën e provës së të gjitha varianteve, sulmuesi rikuperon numrin fillestar duke ndjekur një algoritëm të thjeshtë.
Algoritmi i sulmit për llogaritjen e numrit fillestar me metodën brute force.
for i=0:2^32 â 1 do
Ci=H(Server-IP||Client-IP||0||i)
if Ci=Cookie then
return i
end if
end forAdresat IP dihen, kështu që mbetet vetëm të krijohen 2^32 hash-e derisa cookie i krijuar të përputhet me atë të marrë nga serveri NTP. Në një kompjuter të zakonshëm shtëpiak me Intel Core i5, kjo do të marrë 25 minuta.
NTS â Autokey i ri
Ishte e pamundur të pajtohej me vrima të tilla sigurie në Autokey dhe në vitin 2012 u shfaq protokolli. Për shkak të emrit të kompromentuar, u vendos të kryhej një rebrandim, ndaj Autokey v.2 u quajt Network Time Security.
Protokolli NTS është një zgjerim sigurie i NTP dhe aktualisht mbështet vetëm mënyrën unicast. Ai ofron mbrojtje të besueshme kriptografike kundër manipulimit të paketave, parandalon gjurmimin, shkallëzohet mirë, është rezistent ndaj humbjes së paketave në rrjet dhe sjell humbjet më të vogla të saktësisë që shfaqen gjatë mbrojtjes së lidhjes.
Lidhja NTS përbëhet nga dy faza, ku përdoren protokolle të 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ë grupin shoqërues të të dhënave. Në fazën e dytë Në këtë fazë zhvillohet vetë sesioni i mbrojtur NTS midis klientit dhe serverit NTP.

NTS pĂ«rbĂ«het nga dy protokolle tĂ« nivelit mĂ« tĂ« ulĂ«t: Network Time Security Key Exchange (NTS-KE), qĂ« inicializon njĂ« lidhje tĂ« sigurt mbi TLS, dhe NTPv4 â versioni mĂ« i fundit i protokollit NTP. MĂ« poshtĂ« e shpjegojmĂ« kĂ«tĂ« mĂ« nĂ« detaje.
Faza e parĂ« â NTS KE
Në këtë fazë, klienti NTP nis një sesion TLS 1.2/1.3 përmes një lidhjeje të veçantë TCP me serverin NTS KE. Gjatë këtij sesioni ndodh sa vijon.
- Palët përcaktojnë parametrat të algoritmit për fazën e dytë.
- Palët përcaktojnë protokollin e dytë të nivelit më të ulët, por aktualisht mbështetet vetëm NTPv4.
- Palët përcaktojnë adresën IP dhe portën e serverit NTP.
- Serveri NTS KE lëshon cookie për NTPv4.
- Palët nxjerrin nga materiali i cookie-ve një çift çelësash simetrikë (C2S dhe S2C).
Kjo qasje ka një avantazh të madh: e gjithë ngarkesa e transmetimit të informacionit sekret dhe parametrave të lidhjes mbështetet te protokolli i provuar dhe i besueshëm TLS. Kështu, nuk ka nevojë të shpiket një zgjidhje e re për handshake-in e sigurt të NTP.
Faza e dytĂ« â NTP i mbrojtur nga NTS
Në fazën e dytë, klienti sinkronizon në mënyrë të sigurt kohën me serverin NTP. Për këtë qëllim, ai dërgon katër zgjerime të veçanta (extension field) në strukturën e paketës NTPv4.
- Unique Identifier Extension përmban një nonce të rastësishëm për të parandaluar sulmet me ripërsëritje.
- NTS Cookie Extension pĂ«rmban njĂ« nga cookie-t NTP qĂ« klienti ka nĂ« dispozicion. MeqenĂ«se vetĂ«m klienti zotĂ«ron çelĂ«sat simetrikĂ« AEAD C2S dhe S2C, serveri NTP duhet tâi nxjerrĂ« ata nga materiali i cookie-ve.
- NTS Cookie Placeholder Extension është një mënyrë që klienti të kërkojë cookie shtesë nga serveri. Ky zgjerim është i nevojshëm që përgjigjja e serverit NTP të mos jetë shumë më e gjatë se kërkesa. Kjo ndihmon në parandalimin e sulmeve të amplifikimit.
- NTS Authenticator and Encrypted Extension Fields Extension përmban shifrën e algoritmit AEAD me çelësin C2S, header-in NTP, vulat kohore dhe EF-të e përmendura më sipër si të dhëna shoqëruese. Pa këtë zgjerim, është e mundur të falsifikohen vulat kohore.

Pasi merr kërkesën nga klienti, serveri verifikon autenticitetin e paketës NTP. Për këtë, ai duhet të deshifrojë cookie-t dhe të nxjerrë algoritmin AEAD si edhe çelësat. Pas verifikimit të suksesshëm të vlefshmërisë së paketës NTP, serveri i përgjigjet klientit në formatin e mëposhtëm.
- Unique Identifier Extension është një kopje pasqyrë e kërkesës së klientit, si masë kundër sulmeve me ripërsëritje.
- NTS Cookie Extension shton më shumë cookie për të vazhduar seancën.
- NTS Authenticator and Encrypted Extension Fields Extension përmban një shifër AEAD me çelës S2C.
Shtrëngimi i dytë i duarve mund të përsëritet shumë herë duke anashkaluar fazën e parë, sepse çdo kërkesë dhe përgjigje i jep klientit cookie shtesë. Kjo sjell avantazhin që operacionet TLS relativisht të kushtueshme për llogaritje dhe transmetim të të dhënave PKI ndahen në një numër kërkesash të përsëritura. Kjo është veçanërisht e përshtatshme për kronometra të specializuar FPGA, kur i gjithë funksionaliteti kryesor mund të përmblidhet në disa funksione nga fusha e kriptografisë simetrike, ndërsa i gjithë stack-u TLS i delegohet një pajisjeje tjetër.
NTPSec
ĂfarĂ« e bĂ«n NTP tĂ« veçantĂ«? Edhe pse autori i projektit Dave Mills u pĂ«rpoq ta dokumentonte kodin e tij sa mĂ« mirĂ«, pak programues do tĂ« arrijnĂ« tĂ« kuptojnĂ« ndĂ«rlikimet e algoritmeve tĂ« sinkronizimit tĂ« kohĂ«s tĂ« krijuara 35 vjet mĂ« parĂ«. NjĂ« pjesĂ« e kodit Ă«shtĂ« shkruar para epokĂ«s POSIX, dhe API i Unix atĂ«herĂ« ndryshonte ndjeshĂ«m nga ai qĂ« pĂ«rdoret sot. PĂ«rveç kĂ«saj, duhen njohuri statistikore pĂ«r tĂ« pastruar sinjalin nga ndĂ«rhyrjet nĂ« linja me shumĂ« zhurmĂ«.
NTS nuk ishte përpjekja e parë për të rregulluar NTP. Pasi sulmuesit mësuan të shfrytëzonin dobësitë e NTP për të amplifikuar sulmet DDoS, u bë e qartë se nevojiteshin ndryshime rrënjësore. Ndërsa draftet e NTS po përgatiteshin dhe përpunoheshin, National Science Foundation e SHBA-së në fund të vitit 2014 akordoi urgjentisht një grant për modernizimin e NTP.
Grupin e punĂ«s nuk e drejtonte kushdo, por â njĂ« nga themeluesit dhe figurat kyçe tĂ« komunitetit Open Source dhe autor i librit . Fillimisht, Eric dhe ekipi i tij u pĂ«rpoqĂ«n tĂ« transferonin kodin e NTP nga platforma BitKeeper nĂ« git, por kjo nuk rezultoi e mundur. UdhĂ«heqĂ«si i projektit Harlan Stenn ishte kundĂ«r kĂ«tij vendimi dhe negociatat ngecĂ«n. AtĂ«herĂ« u vendos tĂ« bĂ«hej njĂ« fork i kodit tĂ« projektit, dhe kĂ«shtu lindi NTPSec.
Me përvojë të gjerë, përfshirë punën në GPSD, me një bazë të fortë matematikore dhe me aftësinë pothuajse magjike për të lexuar kod të lashtë, Eric Raymond ishte pikërisht ai haker që mund ta çonte përpara një projekt të tillë. Në ekip u gjend edhe një specialist për migrimin e kodit dhe për vetëm 10 javë NTP në GitLab. Puna mori vrull.
Ekipi i Eric Raymond iu qas punës njësoj si Auguste Rodin kur punonte me një bllok guri. Duke hequr 175 KLOC kod të vjetër, ata arritën ta zvogëlonin ndjeshëm sipërfaqen e sulmit, duke mbyllur shumë boshllëqe sigurie.
Ja një listë jo e plotë e asaj që u hoq:
- Refclock të padokumentuara, të vjetruara ose të dëmtuara.
- Biblioteka e papërdorur ICS.
- libopts/autogen.
- Kod i vjetër për Windows.
- ntpdc.
- Autokey.
- Kodi C i ntpq u rishkrua në Python.
- Kodi C i sntp/ntpdig u rishkrua në Python.
Përveç pastrimit të kodit, projekti kishte edhe objektiva të tjera. Ja një listë jo e plotë e arritjeve:
- Mbrojtja e kodit nga tejmbushja e buffer-it u forcua ndjeshëm. Për të parandaluar tejmbushjen e buffer-it, të gjitha funksionet e pasigurta të vargjeve (strcpy / strcat / strtok / sprintf / vsprintf / gets) u zëvendësuan me versione të sigurta që zbatojnë kufizimin e madhësisë së buffer-it.
- U shtua mbështetja për NTS.
- Saktësia e hapit kohor u rrit dhjetëfish me anë të lidhjes me pajisje fizike. Kjo lidhet me faktin se orët e kompjuterëve modernë janë bërë shumë më të sakta se ato që ekzistonin në kohën kur lindi NTP. Përfitimin më të madh e morën GPSDO dhe stacionet e dedikuara të radios për kohën.
- Numri i gjuhëve të programimit u reduktua në dy. Në vend të skripteve Perl, awk dhe madje S, tani përdoret kudo Python. Kjo sjell më shumë mundësi për ripërdorimin e kodit.
- Në vend të rrëmujës së skripteve autotools, projekti filloi të përdorë sistemin e ndërtimit të softuerit .
- Dokumentacioni i projektit u përditësua dhe u riorganizua. Nga një koleksion dokumentesh kontradiktore dhe herë-herë arkaike, u krijua një dokumentacion mjaft i mirë. Tani çdo çelës i linjës së komandës dhe çdo entitet konfigurimi kanë një burim të vetëm të së vërtetës. Për më tepër, faqet e manualit dhe dokumentacioni web tani gjenerohen nga të njëjtat skedarë bazë.
NTPSec është i disponueshëm për një sërë shpërndarjesh Linux. Aktualisht, versioni i fundit stabil është 1.1.8, ndërsa për Gentoo Linux është i parafundit.
(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
U bë edhe një përpjekje tjetër për të zëvendësuar NTP-në e vjetër me një alternativë më të sigurt. Ndryshe nga NTPSec, Chrony është shkruar nga e para dhe është projektuar për funksionim të qëndrueshëm në një gamë të gjerë kushtesh, përfshirë lidhje rrjeti të paqëndrueshme, disponueshmëri të pjesshme ose mbingarkesë të rrjetit, si edhe ndryshime të temperaturës. Përveç kësaj, chrony ka edhe përparësi të tjera:
- chrony mund të sinkronizojë më shpejt orën e sistemit me saktësi më të lartë;
- chrony është më i lehtë, përdor më pak memorie dhe ngarkon CPU-në vetëm kur është e nevojshme. Kjo është një përparësi e madhe për kursimin e burimeve dhe energjisë;
- chrony mbështet shenjat kohore në nivel hardueri në Linux, gjë që siguron sinkronizim jashtëzakonisht të saktë në rrjetet lokale.
Megjithatë, chrony nuk i ka disa funksione të NTP-së së vjetër, si klient/server me transmetim të gjerë dhe multicast. Përveç kësaj, NTP klasik mbështet një numër më të madh sistemesh operative dhe platformash.
Për të çaktivizuar funksionalitetin e serverit dhe kërkesat NTP ndaj procesit chronyd, mjafton të shtoni port 0 në skedarin chrony.conf. Kjo bëhet kur nuk ka nevojë të ofrohet koha për klientët NTP ose nyjet peer. Duke filluar nga versioni 2.0, porta e serverit NTP hapet vetëm kur qasja lejohet nga direktiva allow ose nga komanda përkatëse, ose kur është konfiguruar një nyje NTP peer, ose përdoret direktiva broadcast.
Programi përbëhet nga dy module.
- chronyd është një shërbim që funksionon në sfond. Ai merr informacion për diferencën e orës së sistemit nga një server i jashtëm kohe dhe korrigjon kohën lokale. Ai gjithashtu zbaton protokollin NTP dhe mund të funksionojë si klient ose server.
- chronyc është një mjet i linjës së komandës për monitorimin dhe kontrollin e programit. Përdoret për rregullim të imët të parametrave të ndryshëm të shërbimit; për shembull, lejon shtimin ose heqjen e serverëve NTP ndërsa chronyd vazhdon të punojë.
Duke filluar nga versioni 7 i RedHat Linux chrony si shërbim për sinkronizimin e kohës. Paketa është gjithashtu e disponueshme për shpërndarjet e tjera Linux. Versioni i fundit stabil është 3.5, ndërsa v4.0 është në përgatitje për publikim.
(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]
Si të konfiguroni serverin tuaj të largët Chrony në internet për sinkronizimin e kohës në rrjetin e zyrës. Më poshtë është një shembull konfigurimi në VPS.
Shembull i konfigurimit të Chrony në RHEL / CentOS në VPS
Tani le të praktikojmë pak dhe të ngremë serverin tonë NTP në VPS. Kjo është shumë e thjeshtë: mjafton të zgjidhni një plan të përshtatshëm në faqen e RuVDS, të merrni një server të gatshëm dhe të ekzekutoni rreth dhjetë komanda të thjeshta. Për qëllimet tona, ky opsion është plotësisht i përshtatshëm.

Kalojmë te konfigurimi i shërbimit dhe, si hap i parë, instalojmë paketën chrony.
[root@server ~]$ yum install chronyRHEL 8 / CentOS 8 përdorin një menaxher tjetër paketash.
[root@server ~]$ dnf install chronyPas instalimit të chrony, duhet të nisni dhe aktivizoni 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 lokalë më të afërt për të ulur 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ë tej konfigurojmë 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 portën NTP për qasje nga jashtë, përndryshe firewall-i do të bllokojë lidhjet hyrëse nga nyjet kliente.
[root@server ~]$ firewall-cmd --add-service=ntp --permanent
[root@server ~]$ firewall-cmd --reload
Në anën e klientit mjafton të caktoni saktë zonën kohore.
[root@client ~]$ timedatectl set-timezone Europe/MoscowNë skedarin /etc/chrony.conf tregoni IP-në ose emrin e hostit të serverit tonë VPS, në të cilin është nisur serveri NTP Chrony.
server my.vps.serverDhe në fund, nisja e sinkronizimit të kohës në klient.
[root@client ~]$ systemctl enable --now chronyd
[root@client ~]$ timedatectl set-ntp true
Herën tjetër do të tregoj se cilat janë opsionet për sinkronizimin e kohës pa internet.
Burimi: habr.com
