Cum să vă asigurați că timpul în sine nu minte dacă aveți un milion de dispozitive mari și mici care comunică prin TCP/IP? La urma urmei, fiecare dintre ei are un ceas, iar ora trebuie să fie corectă pentru toate. Această problemă nu poate fi ocolită fără ntp.
Să ne imaginăm pentru un minut că într-un segment al infrastructurii IT industriale există dificultăți în sincronizarea serviciilor în timp. Imediat, stiva de clustere de software Enterprise începe să eșueze, domeniile se dezintegrează, nodurile master și Standby se străduiesc fără succes să restabilească status quo-ul.
De asemenea, este posibil ca un atacator să încerce în mod deliberat să perturbe timpul printr-un atac MiTM sau DDOS. Într-o astfel de situație se poate întâmpla orice:
- Parolele contului de utilizator vor expira;
- certificatele X.509 vor expira;
- Autentificarea TOTP cu doi factori nu va mai funcționa;
- backup-urile vor deveni depășite și sistemul le va șterge;
- DNSSec se va rupe.
Este clar că fiecare departament IT este interesat de funcționarea fiabilă a serviciilor de sincronizare a timpului și ar fi bine dacă acestea ar fi fiabile și sigure în operarea industrială.
Rupe NTP în 25 de minute
Protocoale de rețea - millenialii au o particularitate, au fost și nu mai sunt bune la nimic, dar înlocuirea lor nu este atât de ușoară chiar și atunci când se acumulează o masă critică de entuziaști și finanțare.
Principala plângere despre NTP clasic este lipsa mecanismelor fiabile de protecție împotriva atacurilor intrușilor. Au fost făcute diferite încercări pentru a rezolva această problemă. Pentru a realiza acest lucru, am implementat mai întâi un mecanism de cheie pre-partajată (PSK) pentru schimbul de chei simetrice.
Din păcate, această metodă nu a dat roade dintr-un motiv simplu - nu se scalează bine. Configurarea manuală este necesară pe partea clientului, în funcție de server. Aceasta înseamnă că pur și simplu nu puteți adăuga un alt client așa. Dacă ceva se schimbă pe serverul NTP, toți clienții trebuie reconfigurați.
Apoi au venit cu AutoKey, dar au descoperit imediat o serie de vulnerabilități grave în designul algoritmului în sine și au fost nevoiți să-l abandoneze. Chestia este că sămânța conține doar 32 de biți, este prea mică și nu conține suficientă complexitate de calcul pentru un atac frontal.
- Key ID - cheie simetrică pe 32 de biți;
- MAC (cod de autentificare a mesajelor) - suma de verificare a pachetelor NTP;
Autokey se calculează după cum urmează.
Autokey=H(Sender-IP||Receiver-IP||KeyID||Cookie)Unde H() este o funcție hash criptografică.
Aceeași funcție este utilizată pentru a calcula suma de control a pachetelor.
MAC=H(Autokey||NTP packet)Se pare că întreaga integritate a verificărilor pachetelor se bazează pe autenticitatea cookie-urilor. Odată ce le aveți, puteți restabili cheia automată și apoi puteți falsifica MAC-ul. Cu toate acestea, serverul NTP folosește o sămânță atunci când le generează. Aici se află captura.
Cookie=MSB_32(H(Client IP||Server IP||0||Server Seed))Funcția MSB_32 decupează cei 5 de biți cei mai semnificativi din rezultatul calculului hash md32. Cookie-ul client nu se modifică atâta timp cât parametrii serverului rămân neschimbați. Apoi atacatorul poate doar să restabilească numărul inițial și să poată genera în mod independent cookie-uri.
În primul rând, trebuie să vă conectați la serverul NTP ca client și să primiți cookie-uri. După aceasta, folosind o metodă de forță brută, atacatorul restabilește numărul inițial urmând un algoritm simplu.
Algoritm pentru atacarea calculului numărului inițial folosind metoda forței brute.
for i=0:2^32 − 1 do
Ci=H(Server-IP||Client-IP||0||i)
if Ci=Cookie then
return i
end if
end forAdresele IP sunt cunoscute, așa că nu mai rămâne decât să creați 2^32 hashuri până când cookie-ul creat se potrivește cu cel primit de la serverul NTP. Pe o stație de acasă obișnuită cu Intel Core i5, acest lucru va dura 25 de minute.
NTS - noua cheie automată
Era imposibil să suporti astfel de găuri de securitate în Autokey, iar în 2012 a apărut protocol. Pentru a compromite numele, au decis să-și rebrandă, așa că Autokey v.2 a fost numit Network Time Security.
Protocolul NTS este o extensie a securității NTP și în prezent acceptă doar modul unicast. Oferă o protecție criptografică puternică împotriva manipulării pachetelor, previne snoopingul, se scalează bine, este rezistent la pierderea pachetelor de rețea și are ca rezultat cea mai mică pierdere de precizie în timpul securității conexiunii.
O conexiune NTS constă din două etape care utilizează protocoale de nivel inferior. Pe primul În această etapă, clientul și serverul convin asupra diferiților parametri de conexiune și schimbă cookie-uri care conțin chei cu tot setul de date însoțitor. Pe în al doilea rând În această etapă, sesiunea NTS protejată reală are loc între client și serverul NTP.

NTS constă din două protocoale de nivel inferior: Network Time Security Key Exchange (NTS-KE), care inițiază o conexiune sigură prin TLS și NTPv4, cea mai recentă încarnare a protocolului NTP. Mai jos ceva mai multe despre asta.
Prima etapă - NTS KE
În această etapă, clientul NTP inițiază o sesiune TLS 1.2/1.3 printr-o conexiune TCP separată cu serverul NTS KE. În timpul acestei sesiuni se întâmplă următoarele.
- Părțile determină parametrii algoritm pentru a doua etapă.
- Părțile definesc un al doilea protocol de nivel inferior, dar în prezent este acceptat doar NTPv4.
- Părțile determină adresa IP și portul serverului NTP.
- Serverul NTS KE emite cookie-uri sub NTPv4.
- Părțile extrag o pereche de chei simetrice (C2S și S2C) din materialul cookie.
Această abordare are marele avantaj că întreaga sarcină a transmiterii informațiilor secrete privind parametrii de conexiune revine protocolului TLS dovedit și de încredere. Acest lucru elimină nevoia de a vă reinventa propria roată pentru o strângere de mână NTP sigură.
A doua etapă - NTP sub protecție NTS
În al doilea pas, clientul sincronizează în siguranță ora cu serverul NTP. În acest scop, transmite patru extensii speciale (câmpuri de extensie) în structura de pachete NTPv4.
- Extensia de identificare unică conține un nonce aleatoriu pentru a preveni atacurile de reluare.
- Extensia cookie NTS conține unul dintre modulele cookie NTP disponibile clientului. Deoarece doar clientul are cheile AAED simetrice C2S și S2C, serverul NTP trebuie să le extragă din materialul cookie.
- Extensia NTS Cookie Placeholder este o modalitate prin care un client poate solicita cookie-uri suplimentare de la server. Această extensie este necesară pentru a vă asigura că răspunsul serverului NTP nu este cu mult mai lung decât solicitarea. Acest lucru ajută la prevenirea atacurilor de amplificare.
- NTS Authenticator și Extensia de câmpuri de extensie criptate conține cifrul AAED cu cheia C2S, antetul NTP, marcajele de timp și EF de mai sus ca date însoțitoare. Fără această extensie este posibilă falsificarea marcajelor de timp.

La primirea unei cereri de la un client, serverul verifică autenticitatea pachetului NTP. Pentru a face acest lucru, el trebuie să decripteze cookie-urile, să extragă algoritmul și cheile AAED. După verificarea cu succes a pachetului NTP pentru validitate, serverul răspunde clientului în următorul format.
- Unique Identifier Extension este o copie în oglindă a cererii clientului, o măsură împotriva atacurilor de reluare.
- NTS Cookie Extension mai multe module cookie pentru a continua sesiunea.
- NTS Authenticator și Extensia Câmpuri de extensie criptate conține cifrul AEAD cu o cheie S2C.
A doua strângere de mână poate fi repetată de mai multe ori, ocolind primul pas, deoarece fiecare cerere și răspuns oferă clientului cookie-uri suplimentare. Acest lucru are avantajul că operațiunile TLS relativ intensive în resurse de calcul și transmitere a datelor PKI sunt împărțite la numărul de solicitări repetate. Acest lucru este deosebit de convenabil pentru cronometrarii FPGA specializați, când toate funcționalitățile principale pot fi împachetate în mai multe funcții din domeniul criptografiei simetrice, transferând întregul stivă TLS pe un alt dispozitiv.
NTPSec
Ce este special la NTP? În ciuda faptului că autorul proiectului, Dave Mills, a încercat să-și documenteze codul cât mai bine posibil, este un programator rar care va fi capabil să înțeleagă complexitățile algoritmilor de sincronizare a timpului care au 35 de ani. O parte din cod a fost scris înainte de era POSIX, iar API-ul Unix atunci era foarte diferit de ceea ce este folosit astăzi. În plus, sunt necesare cunoștințe de statistică pentru a elimina semnalul de interferențe pe liniile zgomotoase.
NTS nu a fost prima încercare de a repara NTP. Odată ce atacatorii au învățat să exploateze vulnerabilitățile NTP pentru a amplifica atacurile DDoS, a devenit clar că erau necesare schimbări radicale. Și în timp ce proiectele NTS erau pregătite și finalizate, Fundația Națională pentru Știință din SUA a alocat de urgență, la sfârșitul anului 2014, un grant pentru modernizarea NTP.
Grupul de lucru era condus nu de oricine, ci - unul dintre fondatorii și pilonii comunității Open Source și autorul cărții . Primul lucru pe care l-au încercat Eric și prietenii săi a fost să mute codul NTP de pe platforma BitKeeper în git, dar nu a funcționat așa. Liderul de proiect Harlan Stenn a fost împotriva acestei decizii, iar negocierile au stagnat. Apoi s-a hotărât să fork codul proiectului și s-a născut NTPSec.
Experiență solidă, inclusiv lucru pe GPSD, un fundal matematic și abilitatea magică de a citi codul antic - Eric Raymond a fost exact hackerul care a putut realiza un astfel de proiect. Echipa a găsit un specialist în migrarea codului și în doar 10 săptămâni NTP pe GitLab. Munca era în plină desfășurare.
Echipa lui Eric Raymond și-a asumat sarcina la fel cum a făcut-o Auguste Rodin cu un bloc de piatră. Prin eliminarea a 175 KLOC de cod vechi, au reușit să reducă semnificativ suprafața de atac, închizând multe găuri de securitate.
Iată o listă incompletă a celor incluse în distribuție:
- Refclock nedocumentat, învechit, învechit sau rupt.
- Bibliotecă ICS nefolosită.
- libopts/autogen.
- Cod vechi pentru Windows.
- ntpdc.
- Tasta automată.
- Codul ntpq C a fost rescris în Python.
- Codul sntp/ntpdig C a fost rescris în Python.
Pe lângă curățarea codului, proiectul avea și alte sarcini. Iată o listă parțială a realizărilor:
- Protecția codului împotriva depășirii bufferului a fost îmbunătățită semnificativ. Pentru a preveni depășirea buffer-ului, toate funcțiile șir nesigure (strcpy/strcat/strtok/sprintf/vsprintf/gets) au fost înlocuite cu versiuni sigure care implementează limite de dimensiunea tamponului.
- S-a adăugat suport NTS.
- Precizia pasului de timp îmbunătățită de zece ori prin conectarea hardware-ului fizic. Acest lucru se datorează faptului că ceasurile computerelor moderne au devenit mult mai precise decât cele de când s-a născut NTP. Cei mai mari beneficiari au fost GPSDO și radiourile dedicate.
- Numărul de limbaje de programare a fost redus la două. În loc de scripturi Perl, awk și chiar S, acum totul este Python. Din acest motiv, există mai multe oportunități de reutilizare a codului.
- În loc de scripturi autotools, proiectul a început să folosească un sistem de construire software .
- Documentația proiectului actualizată și reorganizată. Dintr-o colecție de documente contradictorie și uneori arhaică, au creat o documentație destul de acceptabilă. Fiecare comutator de linie de comandă și fiecare entitate de configurare are acum o singură versiune a adevărului. În plus, paginile de manual și documentația web sunt acum create din aceleași fișiere de bază.
NTPSec este disponibil pentru o serie de distribuții Linux. Momentan, cea mai recentă versiune stabilă este 1.1.8, pentru Gentoo Linux este penultima.
(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]
Cronia
A existat o altă încercare de a înlocui vechiul NTP cu o alternativă mai sigură. Chrony, spre deosebire de NTPSec, este scris de la zero și este proiectat să funcționeze în mod fiabil într-o gamă largă de condiții, inclusiv conexiuni instabile la rețea, disponibilitate parțială sau congestionare a rețelei și schimbări de temperatură. În plus, cronica are și alte avantaje:
- chrony poate sincroniza ceasul sistemului mai rapid cu o precizie mai mare;
- chrony este mai mic, consumă mai puțină memorie și accesează CPU numai atunci când este necesar. Acesta este un mare plus pentru economisirea resurselor și a energiei;
- chrony acceptă marcaje de timp hardware pe Linux, permițând sincronizarea extrem de precisă pe rețelele locale.
Cu toate acestea, chrony îi lipsește unele dintre caracteristicile vechiului NTP, cum ar fi client/server de difuzare și multicast. În plus, NTP clasic acceptă un număr mai mare de sisteme de operare și platforme.
Pentru a dezactiva funcționalitatea serverului și solicitările NTP către procesul chronyd, trebuie doar să scrieți portul 0 în fișierul chrony.conf. Acest lucru se face în cazurile în care nu este nevoie să păstrați timp pentru clienții NTP sau colegii. Începând cu versiunea 2.0, portul serverului NTP este deschis numai atunci când accesul este permis de o directivă allow sau de o comandă adecvată, sau este configurat un peer NTP sau este utilizată o directivă de difuzare.
Programul este format din două module.
- chronyd este un serviciu care rulează în fundal. Primește informații despre diferența dintre ceasul sistemului și serverul de timp extern și ajustează ora locală. De asemenea, implementează protocolul NTP și poate acționa ca client sau server.
- chronyc este un utilitar de linie de comandă pentru monitorizarea și controlul programelor. Folosit pentru reglarea fină a diferiților parametri de serviciu, de exemplu, permițându-vă să adăugați sau să eliminați servere NTP în timp ce chronyd continuă să ruleze.
De la versiunea 7 a RedHat Linux chrony ca serviciu de sincronizare a timpului. Pachetul este disponibil și pentru alte distribuții Linux. Cea mai recentă versiune stabilă este 3.5, pregătindu-se pentru lansarea 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]
Cum să vă configurați propriul server Chrony la distanță pe Internet pentru a sincroniza ora într-o rețea de birou. Mai jos este un exemplu de configurare a unui VPS.
Exemplu de configurare Chrony pe RHEL / CentOS pe VPS
Acum să exersăm puțin și să ne instalăm propriul server NTP pe un VPS. Este foarte simplu, alegeți doar tariful potrivit pe site-ul web RuVDS, obțineți un server gata făcut și tastați o duzină de comenzi simple. Pentru scopurile noastre, această opțiune este destul de potrivită.

Să trecem la configurarea serviciului și să instalăm mai întâi pachetul chrony.
[root@server ~]$ yum install chronyRHEL 8 / CentOS 8 utilizează un manager de pachete diferit.
[root@server ~]$ dnf install chronyDupă instalarea chrony, trebuie să porniți și să activați serviciul.
[root@server ~]$ systemctl enable chrony --nowDacă doriți, puteți face modificări în /etc/chrony.conf, înlocuind serverele NPT cu cele mai apropiate servere locale pentru a reduce timpul de răspuns.
# 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
Apoi, am configurat sincronizarea serverului NTP cu noduri din pool-ul specificat.
[root@server ~]$ timedatectl set-ntp true
[root@server ~]$ systemctl restart chronyd.service
De asemenea, este necesar să deschideți portul NTP în exterior, altfel firewall-ul va bloca conexiunile de intrare de la nodurile client.
[root@server ~]$ firewall-cmd --add-service=ntp --permanent
[root@server ~]$ firewall-cmd --reload
În partea clientului, este suficient să setați corect fusul orar.
[root@client ~]$ timedatectl set-timezone Europe/MoscowFișierul /etc/chrony.conf specifică IP-ul sau numele gazdei serverului nostru VPS care rulează serverul NTP chrony.
server my.vps.serverȘi în sfârșit, începerea sincronizării orei pe client.
[root@client ~]$ systemctl enable --now chronyd
[root@client ~]$ timedatectl set-ntp true
Data viitoare vă voi spune ce opțiuni există pentru sincronizarea orei fără internet.
Sursa: www.habr.com
