Nola denbora-sinkronizazioa seguru bihurtu zen

Nola denbora-sinkronizazioa seguru bihurtu zen
Nola ziurtatu denbora hori ez dela gezurrik esaten TCP/IP bidez komunikatzen diren milioi bat gailu handi eta txiki badituzu? Azken finean, horietako bakoitzak erloju bat dauka, eta orduak zuzena izan behar du guztientzat. Arazo hau ezin da saihestu ntp gabe.

Imajina dezagun minutu batez industria informatikoaren azpiegituraren segmentu batean zerbitzuak denboran zehar sinkronizatzeko zailtasunak daudela. Berehala Enterprise softwarearen kluster pila huts egiten hasten da, domeinuak desegiten dira, maisuak eta Egonerako nodoak arrakastarik gabe ahalegintzen dira egoera berrezartzen.

Baliteke erasotzaile bat nahita denbora oztopatzen saiatzea MiTM edo DDOS eraso baten bidez. Egoera horretan, edozer gerta daiteke:

  • Erabiltzaile-kontuaren pasahitzak iraungi egingo dira;
  • X.509 ziurtagiriak iraungiko dira;
  • TOTP bi faktoreko autentifikazioak funtzionatzeari utziko dio;
  • babeskopiak zaharkituta geratuko dira eta sistemak ezabatu egingo ditu;
  • DNSSec hautsi egingo da.

Argi dago IT sail bakoitzari interesatzen zaiola denbora sinkronizatzeko zerbitzuen funtzionamendu fidagarrian, eta polita litzateke funtzionamendu industrialean fidagarriak eta seguruak balira.

Apurtu NTP 25 minututan

Sareko protokoloak - millennials-ek berezitasun bat dute, izan dira zaharkitua eta jada ez dute ezertarako balio, baina horiek ordezkatzea ez da hain erraza zale eta finantzaketa masa kritikoa pilatzen denean ere.

NTP klasikoaren kexa nagusia intrusoen erasoetatik babesteko mekanismo fidagarririk eza da. Arazo hau konpontzeko hainbat saiakera egin dira. Hori lortzeko, lehenik eta behin gako simetrikoak trukatzeko aurrez partekatutako gako (PSK) mekanismo bat ezarri genuen.

Zoritxarrez, metodo honek ez zuen arrazoi sinple batengatik ordaindu - ez da ondo eskalatzen. Eskuzko konfigurazioa behar da bezeroaren aldetik zerbitzariaren arabera. Horrek esan nahi du ezin duzula beste bezerorik gehitu horrela. NTP zerbitzarian zerbait aldatzen bada, bezero guztiak berriro konfiguratu behar dira.

Gero, AutoKey-rekin asmatu zuten, baina berehala ahultasun larri batzuk aurkitu zituzten algoritmoaren beraren diseinuan eta bertan behera utzi behar izan zuten. Gauza da haziak 32 bit baino ez dituela, txikiegia dela eta ez duela nahikoa konplexutasun konputazionala eraso frontal baterako.

  • Gako IDa - 32 biteko gako simetrikoa;
  • MAC (mezuen autentifikazio-kodea) - NTP paketeen checksum;

Autotekla honela kalkulatzen da.

Autokey=H(Sender-IP||Receiver-IP||KeyID||Cookie)

Non H() hash funtzio kriptografikoa den.

Funtzio bera erabiltzen da paketeen checksuma kalkulatzeko.

MAC=H(Autokey||NTP packet)

Bihurtzen da paketeen egiaztapenen osotasun osoa cookieen benetakotasunean oinarritzen dela. Behin horiek dituzunean, tekla automatikoa leheneratu dezakezu eta, ondoren, MAC-a faltsutu. Hala ere, NTP zerbitzariak hazia bat erabiltzen du sortzerakoan. Hor dago harrapaketa.

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

MSB_32 funtzioak md5 hash kalkuluaren emaitzatik 32 bit esanguratsuenak mozten ditu. Bezeroaren cookiea ez da aldatzen zerbitzariaren parametroak aldatzen ez diren bitartean. Orduan, erasotzaileak hasierako zenbakia soilik berreskuratu eta cookieak modu independentean sortzeko gai izan daitezke.

Lehenik eta behin, NTP zerbitzaria bezero gisa konektatu eta cookieak jaso behar dituzu. Honen ostean, indar gordineko metodo bat erabiliz, erasotzaileak hasierako zenbakia berreskuratzen du algoritmo sinple bati jarraituz.

Hasierako zenbakiaren kalkulua indar gordinaren metodoa erabiliz erasotzeko algoritmoa.

   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 helbideak ezagunak dira, beraz, geratzen dena 2^32 hash sortzea da, sortutako cookiea NTP zerbitzaritik jasotakoarekin bat etorri arte. Intel Core i5 duen ohiko geltoki batean, 25 minutu beharko dira.

NTS - Autokey berria

Ezinezkoa zen Autokey-n halako segurtasun zuloak jartzea, eta 2012an agertu zen bertsio berri bat protokoloa. Izena arriskuan jartzeko, marka berritzea erabaki zuten, beraz, Autokey v.2 Network Time Security izena jarri zioten.

NTS protokoloa NTP segurtasunaren luzapena da eta gaur egun unicast modua soilik onartzen du. Paketeen manipulazioaren aurkako babes kriptografiko sendoa eskaintzen du, miaketa saihesten du, ondo eskalatzen du, sareko paketeen galerari erresistentea da eta konexioaren segurtasunean sortzen den zehaztasun-galera gutxien eragiten du.

NTS konexio batek beheko geruza protokoloak erabiltzen dituzten bi etapa ditu. On lehenengoa Fase honetan, bezeroak eta zerbitzariak hainbat konexio-parametro adosten dituzte eta gakoak dituzten cookieak trukatzen dituzte harekin batera doan datu-multzo guztiekin. On bigarren Fase honetan, benetako babestutako NTS saioa bezeroaren eta NTP zerbitzariaren artean egiten da.

Nola denbora-sinkronizazioa seguru bihurtu zen

NTS beheko geruzako bi protokolok osatzen dute: Network Time Security Key Exchange (NTS-KE), TLS bidezko konexio segurua abiarazten duena, eta NTPv4, NTP protokoloaren azken enkarnazioa. Honi buruz apur bat gehiago behean.

Lehen etapa - NTS KE

Fase honetan, NTP bezeroak TLS 1.2/1.3 saio bat hasten du NTS KE zerbitzariarekin TCP konexio bereizi baten bidez. Saio honetan honako hau gertatzen da.

  • Alderdiek zehazten dituzte parametroak AEAD bigarren faserako algoritmoa.
  • Alderdiek behe-geruzako bigarren protokoloa definitzen dute, baina momentuz NTPv4 bakarrik onartzen da.
  • Alderdiek NTP zerbitzariaren IP helbidea eta ataka zehazten dituzte.
  • NTS KE zerbitzariak cookieak igortzen ditu NTPv4 pean.
  • Alderdiek gako simetriko pare bat ateratzen dute (C2S eta S2C) cookie-materialetik.

Ikuspegi honek abantaila handia du, konexio-parametroei buruzko informazio sekretua transmititzearen zama osoa TLS protokolo frogatu eta fidagarrian baitago. Horrek zure gurpila berrasmatu beharra ezabatzen du NTP esku-emate seguru baterako.

Bigarren etapa - NTP NTS babespean

Bigarren urratsean, bezeroak modu seguruan sinkronizatzen du ordua NTP zerbitzariarekin. Horretarako, lau luzapen berezi (luzapen eremuak) transmititzen ditu NTPv4 pakete-egituran.

  • Identifikatzaile bakarraren luzapenak ausazko nonce bat dauka errepikatu erasoak saihesteko.
  • NTS Cookie Extension bezeroak eskuragarri dituen NTP cookieetako bat dauka. Bezeroak soilik AAED C2S eta S2C gako simetrikoak dituenez, NTP zerbitzariak cookie-materialetik atera behar ditu.
  • NTS Cookie Placeholder Extension bezero batek zerbitzariari cookie gehigarriak eskatzeko modu bat da. Luzapen hau beharrezkoa da NTP zerbitzariaren erantzuna eskaera baino askoz luzeagoa ez dela ziurtatzeko. Horrek anplifikazio-erasoak saihesten laguntzen du.
  • NTS Authenticator eta Encrypted Extension Fields Extension-ek C2S gakoa, NTP goiburua, denbora-zigiluak eta goiko EF-a biltzen dituen AAED zifratua dauka. Luzapen hori gabe, denbora-zigiluak faltifikatzea posible da.

Nola denbora-sinkronizazioa seguru bihurtu zen

Bezero baten eskaera jasotzean, zerbitzariak NTP paketearen benetakotasuna egiaztatzen du. Horretarako, cookieak deszifratu, AAED algoritmoa eta gakoak atera behar ditu. NTP paketea baliozkotasuna egiaztatu ondoren, zerbitzariak hurrengo formatuan erantzuten dio bezeroari.

  • Unique Identifier Extension bezeroaren eskaeraren ispilu kopia bat da, errepikapenen erasoen aurkako neurri bat.
  • NTS Cookie Extension cookie gehiago saioarekin jarraitzeko.
  • NTS Authenticator eta Encrypted Extension Fields Extensionek AEAD zifratua dauka S2C gako batekin.

Bigarren esku-ematea askotan errepika daiteke, lehen urratsa saihestuz, eskaera eta erantzun bakoitzak bezeroari cookie gehigarriak ematen dizkiolako. Honek abantaila du PKI datuak konputatzeko eta transmititzeko TLS eragiketa nahiko baliabide intentsiboak errepikatzen diren eskaera kopuruarekin zatitzen direla. Hau bereziki erosoa da FPGA kronometratzaile espezializatuentzat, funtzio nagusi guztiak kriptografia simetrikoaren eremutik hainbat funtziotan bildu daitezkeenean, TLS pila osoa beste gailu batera transferituz.

NTPSec

Zer da berezia NTP? Proiektuaren egilea, Dave Mills, bere kodea ahalik eta ondoen dokumentatzen saiatu zen arren, programatzaile arraroa da 35 urte dituzten denbora sinkronizatzeko algoritmoen korapilatsuak ulertzeko gai izango dena. Kode batzuk POSIX aroaren aurretik idatzi ziren, eta Unix APIa gaur egun erabiltzen denaren oso desberdina zen orduan. Horrez gain, estatistiken ezagutza behar da seinalea linea zaratatsuetan interferentziatik garbitzeko.

NTS ez zen NTP konpontzeko lehen saiakera izan. Erasotzaileek DDoS erasoak areagotzeko NTP ahultasunak ustiatzen ikasi zutenean, argi geratu zen errotiko aldaketak behar zirela. Eta NTSren zirriborroak prestatzen eta amaitzen ari ziren bitartean, AEBetako Zientzia Fundazio Nazionalak 2014 amaieran premiazko diru-laguntza bat esleitu zuen NTP modernizatzeko.

Lantaldearen buru ez zen edonork, baina Eric Steven Raymond - Open Source komunitatearen sortzaile eta zutabeetako bat eta liburuaren egilea Katedrala eta Bazar. Eric eta bere lagunak egiten saiatu ziren lehen gauza NTP kodea BitKeeper plataformatik git-era eramatea izan zen, baina ez zuen horrela atera. Harlan Stenn proiektuaren burua erabaki honen aurka zegoen eta negoziazioak geldiarazi egin ziren. Orduan proiektuaren kodea bifurkatzea erabaki zen, eta NTPSec jaio zen.

Esperientzia sendoa, GPSD-ri buruzko lana, aurrekari matematikoak eta antzinako kodea irakurtzeko trebetasun magikoa barne - Eric Raymond izan zen hain zuzen ere proiektu bat atera zezakeen hackerra. Taldeak kodearen migrazio espezialista bat aurkitu zuen eta 10 astetan NTP finkatuGitLab-en. Lanak pil-pilean zeuden.

Eric Raymonden taldeak Auguste Rodinek harri bloke batekin egin zuen modu berean hartu zuen zeregina. Kode zaharraren 175 KLOC kenduta, eraso-azalera nabarmen murrizteko gai izan ziren segurtasun-zulo asko itxiz.

Hona hemen banaketan sartutakoen zerrenda osatu gabea:

  • Dokumentatu gabea, zaharkitua, zaharkitua edo hautsitako refclock.
  • Erabili gabeko ICS liburutegia.
  • libopts/autogen.
  • Kode zaharra Windows-erako.
  • ntpdc.
  • Tekla automatikoa.
  • ntpq C kodea Python-en berridatzi da.
  • sntp/ntpdig C kodea Python-en berridatzi da.

Kodea garbitzeaz gain, proiektuak beste zeregin batzuk zituen. Hona hemen lorpenen zerrenda partziala:

  • Buffer gainezkatzearen aurkako kodearen babesa nabarmen hobetu da. Buffer gainezkatzea saihesteko, kate-funtzio seguru guztiak (strcpy/strcat/strtok/sprintf/vsprintf/gets) buffer tamaina mugak ezartzen dituzten bertsio seguruekin ordezkatu dira.
  • NTS euskarria gehitu da.
  • Denbora-pausoaren zehaztasuna hamar aldiz hobetu da hardware fisikoa lotuz. Ordenagailu modernoen erlojuak NTP jaio zenean baino askoz zehatzagoak bihurtu direlako da hori. Honen onuradun handienak GPSDO eta denbora dedikatu irratiak izan ziren.
  • Programazio lengoaia kopurua bitara murriztu da. Perl, awk eta baita S scripten ordez, Python da dena. Hori dela eta, aukera gehiago dago kodea berrerabiltzeko.
  • Autotools scripten fideoen ordez, proiektua softwarea eraikitzeko sistema erabiltzen hasi zen waf.
  • Proiektuaren dokumentazioa eguneratu eta berrantolatu. Dokumentu-bilduma kontraesankor eta batzuetan arkaiko batetik abiatuta, nahiko dokumentazio pasagarria sortu zuten. Komando-lerroko etengailu bakoitzak eta konfigurazio-entitate bakoitzak egiaren bertsio bakarra du orain. Gainera, man orriak eta web dokumentazioa oinarrizko fitxategi berberetatik sortzen dira orain.

NTPSec Linux banaketa batzuetarako eskuragarri dago. Momentuz, azken bertsio egonkorra 1.1.8 da, Gentoo Linuxentzat azkenaurrekoa da.

(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]

Kronika

NTP zaharra alternatiba seguruago batekin ordezkatzeko beste saiakera bat egon zen. Chrony, NTPSec ez bezala, oinarritik idatzita dago eta baldintza ugaritan modu fidagarrian funtzionatzeko diseinatuta dago, besteak beste, sare konexio ezegonkorrak, sarearen erabilgarritasun partziala edo pilaketak eta tenperatura aldaketak. Gainera, kronikak beste abantaila batzuk ditu:

  • chrony-k sistemaren erlojua azkarrago sinkroniza dezake zehaztasun handiagoz;
  • chrony txikiagoa da, memoria gutxiago kontsumitzen du eta CPUra behar denean bakarrik sartzen da. Baliabideak eta energia aurrezteko abantaila handia da hau;
  • chrony-k hardwarearen denbora-zigiluak onartzen ditu Linux-en, sare lokaletan sinkronizazio oso zehatza ahalbidetuz.

Hala ere, Chrony-k NTP zaharraren ezaugarri batzuk falta ditu, hala nola difusioa eta multicast bezero/zerbitzaria. Gainera, NTP klasikoak sistema eragile eta plataforma kopuru handiagoa onartzen du.

Chronyd prozesuan zerbitzariaren eta NTP eskaeraren funtzionaltasuna desgaitzeko, idatzi 0 ataka chrony.conf fitxategian. Hau NTP bezeroentzako edo kideentzako denbora mantendu beharrik ez dagoen kasuetan egiten da. 2.0 bertsioaz geroztik, NTP zerbitzariaren ataka baimendu zuzentarau batek edo komando egokiak sarbidea baimentzen duenean bakarrik dago irekita, edo NTP pareko bat konfiguratuta dagoenean edo difusio zuzentarau bat erabiltzen denean.

Programak bi modulu ditu.

  • chronyd atzeko planoan exekutatzen den zerbitzu bat da. Sistemako erlojuaren eta kanpoko ordu-zerbitzariaren arteko diferentziari buruzko informazioa jasotzen du eta tokiko ordua doitzen du. NTP protokoloa ere ezartzen du eta bezero edo zerbitzari gisa jardun dezake.
  • chronyc komando-lerroko erabilgarritasun bat da, programak kontrolatzeko eta kontrolatzeko. Hainbat zerbitzu-parametro doitzeko erabiltzen da, adibidez, chronyd-ek exekutatzen jarraitzen duen bitartean NTP zerbitzariak gehitzeko edo kentzeko aukera ematen dizu.

RedHat Linux-en 7. bertsiotik erabilerak chrony ordua sinkronizatzeko zerbitzu gisa. Paketea beste Linux banaketa batzuetarako ere eskuragarri dago. Azken bertsio egonkorra 3.5 da, v4.0 oharra prestatzen.

(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]

Nola konfiguratu zure urruneko chrony zerbitzaria Interneten ordua bulegoko sare batean sinkronizatzeko. Jarraian, VPS bat konfiguratzeko adibide bat dago.

Chrony konfiguratzeko adibidea RHEL / CentOS VPS-en

Praktika dezagun orain pixka bat eta konfigura dezagun gure NTP zerbitzaria VPS batean. Oso erraza da, aukeratu RuVDS webgunean tarifa egokia, lortu prest egindako zerbitzari bat eta idatzi dozena bat komando sinple. Gure helburuetarako, aukera hau nahiko egokia da.

Nola denbora-sinkronizazioa seguru bihurtu zen

Goazen zerbitzua konfiguratzera eta lehenik chrony paketea instalatu.

[root@server ~]$ yum install chrony

RHEL 8 / CentOS 8-k beste pakete-kudeatzaile bat erabiltzen du.

[root@server ~]$ dnf install chrony

Chrony instalatu ondoren, zerbitzua hasi eta aktibatu behar duzu.

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

Nahi izanez gero, /etc/chrony.conf-en aldaketak egin ditzakezu, NPT zerbitzariak tokiko hurbilenekin ordezkatuz erantzun denbora murrizteko.

# 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

Ondoren, NTP zerbitzariaren sinkronizazioa ezarri dugu zehaztutako igerilekuko nodoekin.

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

NTP ataka kanpoaldera ere ireki behar da, bestela suebakiak bezero nodoetatik sarrerako konexioak blokeatuko ditu.

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

Bezeroaren aldetik, nahikoa da ordu-eremua behar bezala ezartzea.

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

/etc/chrony.conf fitxategiak NTP zerbitzariaren chrony exekutatzen duen gure VPS zerbitzariaren IP edo ostalari-izena zehazten du.

server my.vps.server

Eta azkenik, bezeroaren ordu-sinkronizazioa hastea.

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

Hurrengoan esango dizut zein aukera dauden ordua Internet gabe sinkronizatzeko.

Nola denbora-sinkronizazioa seguru bihurtu zen

Nola denbora-sinkronizazioa seguru bihurtu zen

Iturria: www.habr.com

Gehitu iruzkin berria