Si të siguroheni që koha në vetvete të mos gënjejë nëse keni një milion pajisje të mëdha dhe të vogla që komunikojnë përmes TCP/IP? Në fund të fundit, secili prej tyre ka një orë, dhe koha duhet të jetë e saktë për të gjithë. Ky problem nuk mund të anashkalohet pa ntp.
Le të imagjinojmë për një minutë se në një segment të infrastrukturës industriale të TI-së ka vështirësi me sinkronizimin e shërbimeve me kalimin e kohës. Menjëherë grupi i grupit të softuerit Enterprise fillon të dështojë, domenet shpërbëhen, masterat dhe nyjet e Standby përpiqen pa sukses për të rivendosur status quo-në.
Është gjithashtu e mundur që një sulmues të përpiqet qëllimisht të prishë kohën përmes një sulmi MiTM ose DDOS. Në një situatë të tillë, gjithçka mund të ndodhë:
- Fjalëkalimet e llogarisë së përdoruesit do të skadojnë;
- Certifikatat X.509 do të skadojnë;
- Autentifikimi me dy faktorë TOTP do të ndalojë së punuari;
- kopjet rezervë do të bëhen të vjetruara dhe sistemi do t'i fshijë ato;
- DNSSec do të prishet.
Është e qartë se çdo departament IT është i interesuar për funksionimin e besueshëm të shërbimeve të sinkronizimit të kohës dhe do të ishte mirë nëse ato të ishin të besueshme dhe të sigurta në funksionimin industrial.
Thye NTP në 25 minuta
Protokollet e rrjetit - mijëvjeçarët kanë një veçori, ato kanë qenë dhe nuk janë më të mira për asgjë, por zëvendësimi i tyre nuk është aq i lehtë edhe kur grumbullohet një masë kritike entuziastësh dhe fondesh.
Ankesa kryesore për NTP klasike është mungesa e mekanizmave të besueshëm për mbrojtjen nga sulmet nga ndërhyrës. Janë bërë përpjekje të ndryshme për të zgjidhur këtë problem. Për ta arritur këtë, ne fillimisht implementuam një mekanizëm të përbashkët të çelësit (PSK) për shkëmbimin e çelësave simetrik.
Fatkeqësisht, kjo metodë nuk u shpagua për një arsye të thjeshtë - nuk përshkallëzohet mirë. Kërkohet konfigurim manual nga ana e klientit në varësi të serverit. Kjo do të thotë që thjesht nuk mund të shtoni një klient tjetër ashtu si ai. Nëse diçka ndryshon në serverin NTP, të gjithë klientët duhet të rikonfigurohen.
Më pas ata dolën me AutoKey, por menjëherë zbuluan një sërë dobësish serioze në hartimin e vetë algoritmit dhe ata duhej ta braktisnin atë. Puna është se fara përmban vetëm 32 bit, është shumë e vogël dhe nuk përmban kompleksitet të mjaftueshëm llogaritës për një sulm frontal.
- ID e çelësit - çelësi simetrik 32-bit;
- MAC (kodi i vërtetimit të mesazhit) - shuma e kontrollit të paketës NTP;
Autokey llogaritet si më poshtë.
Autokey=H(Sender-IP||Receiver-IP||KeyID||Cookie)Ku H() është një funksion hash kriptografik.
I njëjti funksion përdoret për të llogaritur shumën e kontrollit të paketave.
MAC=H(Autokey||NTP packet)Rezulton se i gjithë integriteti i kontrolleve të paketave mbështetet në origjinalitetin e cookies. Pasi t'i keni ato, mund të rivendosni tastin automatik dhe më pas të mashtroni MAC. Sidoqoftë, serveri NTP përdor një seed kur i gjeneron ato. Këtu qëndron kapja.
Cookie=MSB_32(H(Client IP||Server IP||0||Server Seed))Funksioni MSB_32 ndërpret 5 bitet më të rëndësishme nga rezultati i llogaritjes së hash md32. Kuki i klientit nuk ndryshon për sa kohë që parametrat e serverit mbeten të pandryshuara. Atëherë sulmuesi mund të rivendosë vetëm numrin fillestar dhe të jetë në gjendje të gjenerojë në mënyrë të pavarur cookie.
Së pari, duhet të lidheni me serverin NTP si klient dhe të merrni cookie. Pas kësaj, duke përdorur një metodë brute force, sulmuesi rikthen numrin fillestar duke ndjekur një algoritëm të thjeshtë.
Algoritmi për sulmimin e llogaritjes së numrit fillestar duke përdorur 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 janë të njohura, kështu që mbetet vetëm krijimi i hasheve 2^32 derisa cookie-ja e krijuar të përputhet me atë të marrë nga serveri NTP. Në një stacion të rregullt shtëpiak me Intel Core i5, kjo do të zgjasë 25 minuta.
NTS - Autokey i ri
Ishte e pamundur të përballosh vrima të tilla sigurie në Autokey, dhe në vitin 2012 u shfaq protokoll. Për të kompromentuar emrin, ata vendosën të riemëroheshin, 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 modalitetin unicast. Ai siguron mbrojtje të fortë kriptografike kundër manipulimit të paketave, parandalon zbulimin, shkallëzohet mirë, është elastike ndaj humbjes së paketave të rrjetit dhe rezulton në sasinë më të vogël të humbjes së saktësisë të shkaktuar gjatë sigurisë së lidhjes.
Një lidhje NTS përbëhet nga dy faza që përdorin protokolle të shtresave më të ulëta. Aktiv i pari Në këtë fazë, 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 e të dhënave shoqëruese. Aktiv i dytë Në këtë fazë, sesioni aktual i mbrojtur NTS zhvillohet midis klientit dhe serverit NTP.

NTS përbëhet nga dy protokolle të nivelit më të ulët: Rrjeti Time Security Key Exchange (NTS-KE), i cili fillon një lidhje të sigurt mbi TLS dhe NTPv4, mishërimi më i fundit i protokollit NTP. Pak më shumë për këtë më poshtë.
Faza e parë - NTS KE
Në këtë fazë, klienti NTP fillon një seancë TLS 1.2/1.3 mbi një lidhje të veçantë TCP me serverin NTS KE. Gjatë këtij sesioni ndodh si më poshtë.
- Palët përcaktojnë parametrat algoritmi për fazën e dytë.
- Palët përcaktojnë një protokoll të dytë të shtresës së ulët, por për momentin mbështetet vetëm NTPv4.
- Palët përcaktojnë adresën IP dhe portin e serverit NTP.
- Serveri NTS KE lëshon kuki nën NTPv4.
- Palët nxjerrin një palë çelësash simetrikë (C2S dhe S2C) nga materiali i biskotave.
Kjo qasje ka avantazhin e madh që e gjithë barra e transmetimit të informacionit sekret në lidhje me parametrat e lidhjes bie mbi protokollin e provuar dhe të besueshëm TLS. Kjo eliminon nevojën për të rishpikur rrotën tuaj për një shtrëngim duarsh të sigurt NTP.
Faza e dytë - NTP nën mbrojtjen NTS
Në hapin e dytë, klienti sinkronizon në mënyrë të sigurt kohën me serverin NTP. Për këtë qëllim, ai transmeton katër shtesa speciale (fusha shtesë) në strukturën e paketave NTPv4.
- Zgjerimi i identifikuesit unik përmban një nonce të rastësishme për të parandaluar sulmet përsëritëse.
- NTS Cookie Extension përmban një nga kukit NTP të disponueshëm për klientin. Meqenëse vetëm klienti ka çelësat simetrik AAED C2S dhe S2C, serveri NTP duhet t'i nxjerrë ato nga materiali i kukive.
- NTS Cookie Placeholder Extension është një mënyrë që klienti të kërkojë skedarë shtesë nga serveri. Kjo shtesë është e nevojshme për të siguruar që përgjigja 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 AAED me çelësin C2S, kokën NTP, stampat kohore dhe EF-në e mësipërme si të dhëna shoqëruese. Pa këtë zgjatje është e mundur të mashtrohen vulat kohore.

Pas marrjes së një kërkese nga një klient, serveri verifikon vërtetësinë e paketës NTP. Për ta bërë këtë, ai duhet të deshifrojë cookies, të nxjerrë algoritmin AAED dhe çelësat. Pas kontrollimit të suksesshëm të paketës NTP për vlefshmërinë, serveri i përgjigjet klientit në formatin e mëposhtëm.
- Zgjerimi Unique Identifier është një kopje pasqyre e kërkesës së klientit, një masë kundër sulmeve të përsëritura.
- NTS Cookie Extension Më shumë cookie për të vazhduar seancën.
- NTS Authenticator dhe Zgjerimi i fushave të Zgjerimit të Enkriptuar përmban shifrën AEAD me një çelës S2C.
Shtrëngimi i dytë i duarve mund të përsëritet shumë herë, duke anashkaluar hapin e parë, pasi çdo kërkesë dhe përgjigje i jep klientit cookie shtesë. Kjo ka avantazhin që operacionet TLS relativisht intensive të burimeve të llogaritjes dhe transmetimit të të dhënave PKI ndahen me numrin e kërkesave të përsëritura. Kjo është veçanërisht e përshtatshme për kohëmatësit e specializuar FPGA, kur i gjithë funksionaliteti kryesor mund të paketohet në disa funksione nga fusha e kriptografisë simetrike, duke transferuar të gjithë grupin TLS në një pajisje tjetër.
NTPSec
Çfarë është e veçantë për NTP? Pavarësisht se autori i projektit, Dave Mills, u përpoq të dokumentonte sa më mirë kodin e tij, është një programues i rrallë që do të jetë në gjendje të kuptojë ndërlikimet e algoritmeve të sinkronizimit të kohës që janë 35 vjeç. Një pjesë e kodit ishte shkruar përpara epokës POSIX, dhe API Unix atëherë ishte shumë i ndryshëm nga ai që përdoret sot. Përveç kësaj, njohuria e statistikave është e nevojshme për të pastruar sinjalin nga ndërhyrja në linjat e zhurmshme.
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ë përforcuar sulmet DDoS, u bë e qartë se nevojiteshin ndryshime rrënjësore. Dhe ndërsa draftet e NTS ishin duke u përgatitur dhe finalizuar, Fondacioni Kombëtar i Shkencës i SHBA-së në fund të vitit 2014 caktoi urgjentisht një grant për modernizimin e NTP.
Grupi i punës nuk drejtohej nga kushdo, por - një nga themeluesit dhe shtyllat e komunitetit Open Source dhe autor i librit . Gjëja e parë që Eric dhe miqtë e tij u përpoqën të bënin ishte zhvendosja e kodit NTP nga platforma BitKeeper në git, por nuk funksionoi në atë mënyrë. Udhëheqësi i projektit Harlan Stenn ishte kundër këtij vendimi dhe negociatat ngecën. Pastaj u vendos që të formohej kodi i projektit dhe lindi NTPSec.
Përvoja e fortë, duke përfshirë punën në GPSD, një sfond matematikor dhe aftësinë magjike të leximit të kodit të lashtë - Eric Raymond ishte pikërisht hakeri që mund të realizonte një projekt të tillë. Ekipi gjeti një specialist të migrimit të kodit dhe në vetëm 10 javë NTP në GitLab. Puna ishte në ecje të plotë.
Ekipi i Eric Raymond mori detyrën në të njëjtën mënyrë si Auguste Rodin me një bllok guri. Duke hequr 175 KLOC të kodit të vjetër, ata ishin në gjendje të reduktonin ndjeshëm sipërfaqen e sulmit duke mbyllur shumë vrima sigurie.
Këtu është një listë jo e plotë e atyre që përfshihen në shpërndarje:
- Reflektim i padokumentuar, i vjetëruar, i vjetëruar ose i prishur.
- Biblioteka e papërdorur ICS.
- libopts/autogjen.
- Kodi i vjetër për Windows.
- ntpdc.
- Tasti automatik.
- Kodi ntpq C është rishkruar në Python.
- Kodi sntp/ntpdig C është rishkruar në Python.
Përveç pastrimit të kodit, projekti kishte edhe detyra të tjera. Këtu është një listë e pjesshme e arritjeve:
- Mbrojtja e kodit kundër tejmbushjes së tamponit është përmirësuar ndjeshëm. Për të parandaluar tejmbushjet e buferit, të gjitha funksionet e vargut të pasigurt (strcpy/strcat/strtok/sprintf/vsprintf/gets) janë zëvendësuar me versione të sigurta që zbatojnë kufijtë e madhësisë së tamponit.
- Mbështetja e shtuar NTS.
- Përmirësoi saktësinë e hapit kohor dhjetëfish duke lidhur harduerin fizik. Kjo për faktin se orët moderne kompjuterike janë bërë shumë më të sakta se ato kur lindi NTP. Përfituesit më të mëdhenj të kësaj ishin GPSDO dhe radiot me kohë të dedikuar.
- Numri i gjuhëve të programimit është reduktuar në dy. Në vend të skripteve Perl, awk dhe madje edhe S, tani është e gjitha Python. Për shkak të kësaj, ka më shumë mundësi për ripërdorimin e kodit.
- Në vend të noodles të skripteve të veglave automatike, projekti filloi të përdorte një sistem të ndërtimit të softuerit .
- Dokumentacioni i projektit i përditësuar dhe riorganizuar. Nga një koleksion dokumentesh kontradiktore dhe ndonjëherë arkaike, ata krijuan dokumentacion mjaft të kalueshëm. Çdo ndërprerës i linjës së komandës dhe çdo entitet konfigurimi tani ka një version të vetëm të së vërtetës. Për më tepër, faqet e njeriut dhe dokumentacioni në internet tani krijohen nga të njëjtat skedarë thelbësorë.
NTPSec është i disponueshëm për një numër shpërndarjesh Linux. Për momentin, versioni i fundit stabil është 1.1.8, 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]
Kronike
Kishte një përpjekje tjetër për të zëvendësuar NTP-në e vjetër me një alternativë më të sigurt. Chrony, ndryshe nga NTPSec, është shkruar nga themeli dhe është projektuar për të funksionuar në mënyrë të besueshme në një gamë të gjerë kushtesh, duke përfshirë lidhjet e paqëndrueshme të rrjetit, disponueshmërinë e pjesshme të rrjetit ose mbingarkesën dhe ndryshimet e temperaturës. Përveç kësaj, chrony ka avantazhe të tjera:
- chrony mund të sinkronizojë orën e sistemit më shpejt me saktësi më të madhe;
- chrony është më i vogël, konsumon më pak memorie dhe hyn në CPU vetëm kur nevojitet. Ky është një plus i madh për kursimin e burimeve dhe energjisë;
- chrony mbështet stampat kohore të harduerit në Linux, duke lejuar sinkronizim jashtëzakonisht të saktë në rrjetet lokale.
Megjithatë, chrony-t i mungojnë disa nga veçoritë e NTP-së së vjetër, si klienti/serveri i transmetimit dhe multicast. Përveç kësaj, NTP klasike mbështet një numër më të madh të sistemeve operative dhe platformave.
Për të çaktivizuar funksionalitetin e serverit dhe kërkesat NTP në procesin chronyd, thjesht shkruani portin 0 në skedarin chrony.conf. Kjo bëhet në rastet kur nuk ka nevojë për të mbajtur kohë për klientët ose kolegët NTP. Që nga versioni 2.0, porti i serverit NTP është i hapur vetëm kur qasja lejohet nga një direktivë leje ose komanda e përshtatshme, ose kur është konfiguruar një koleg NTP, ose përdoret një direktivë transmetimi.
Programi përbëhet nga dy module.
- chronyd është një shërbim që funksionon në sfond. Ai merr informacion në lidhje me ndryshimin midis orës së sistemit dhe serverit të orës së jashtme dhe rregullon orën lokale. Ai gjithashtu zbaton protokollin NTP dhe mund të veprojë si klient ose server.
- chronyc është një mjet i linjës komanduese për monitorimin dhe kontrollin e programit. Përdoret për të rregulluar parametrat e ndryshëm të shërbimit, për shembull duke ju lejuar të shtoni ose hiqni serverë NTP ndërsa chronyd vazhdon të funksionojë.
Që nga versioni 7 i RedHat Linux chrony si një shërbim për sinkronizimin e kohës. Paketa është gjithashtu e disponueshme për shpërndarje të tjera Linux. Versioni i fundit i qëndrueshëm është 3.5, duke u përgatitur për lëshimin e 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]
Si të konfiguroni serverin tuaj kronik në distancë në internet për të sinkronizuar kohën në një rrjet zyre. Më poshtë është një shembull i konfigurimit të një VPS.
Shembull i konfigurimit të Chrony në RHEL / CentOS në VPS
Tani le të praktikojmë pak dhe të vendosim serverin tonë NTP në një VPS. Është shumë e thjeshtë, thjesht zgjidhni tarifën e duhur në faqen e internetit të RuVDS, merrni një server të gatshëm dhe shkruani një duzinë komandash të thjeshta. Për qëllimet tona, ky opsion është mjaft i përshtatshëm.

Le të kalojmë te konfigurimi i shërbimit dhe së pari të instalojmë paketën chrony.
[root@server ~]$ yum install chronyRHEL 8 / CentOS 8 përdor një menaxher të ndryshëm 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ë reduktuar 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
Tjetra, ne vendosëm sinkronizimin e serverit NTP me nyjet nga grupi i specifikuar.
[root@server ~]$ timedatectl set-ntp true
[root@server ~]$ systemctl restart chronyd.service
Është gjithashtu e nevojshme të hapni portin NTP nga jashtë, përndryshe muri i zjarrit do të bllokojë lidhjet hyrëse nga nyjet e klientit.
[root@server ~]$ firewall-cmd --add-service=ntp --permanent
[root@server ~]$ firewall-cmd --reload
Në anën e klientit, mjafton të vendosni saktë zonën kohore.
[root@client ~]$ timedatectl set-timezone Europe/MoscowSkedari /etc/chrony.conf specifikon IP-në ose emrin e hostit të serverit tonë VPS që funksionon kronik i serverit NTP.
server my.vps.serverDhe së fundi, fillimi i sinkronizimit të kohës tek klienti.
[root@client ~]$ systemctl enable --now chronyd
[root@client ~]$ timedatectl set-ntp true
Herën tjetër do t'ju tregoj se cilat opsione ka për sinkronizimin e kohës pa internet.
Burimi: www.habr.com
