Kuidas aegade sünkroniseerimine muutus turvaliseks

Kuidas aegade sünkroniseerimine muutus turvaliseks
Kuidas tagada, et aeg iseenesest ei petaks, kui teil on miljon suurt ja väikest seadet, mis suhtlevad TCP/IP kaudu? Igal neist on kell, ja aeg peab olema kõikjal õige. Seda probleemi ei saa lahendada ilma ntp-ta.

Kujutame endale nüüd minutiks ette, et ühes tööstusliku IT-infrastruktuuri segmendis tekivad ajasünkroniseerimisega probleemid. Koheselt hakkab tõrkuma klastritehnoloogia, lagunevad domeenid, meistrid ja reservkäigud püüavad meeleheitlikult taastada varasemat seisundit.

On võimalik ka olukord, kus kurjategija püüab tahtlikult aega rikkuda MiTM-i või DDOS-rünnaku kaudu. Sellises olukorras võib juhtuda kõike:

  • kasutajakontode paroolide kehtivus aegub;
  • X.509 sertifikaatide kehtivus aegub;
  • kahefaktoriline autentimine TOTP lakkab töötamast;
  • varukoopiad muutuvad 'aegunuks' ja süsteem kustutab need;
  • DNSSec võib tõrke tõttu süveneda.

On selge, et iga IT osakond on huvitatud ajasünkroniseerimise teenuste usaldusväärsest toimimisest ning oleks hea, kui need oleksid usaldusväärsed ja turvalised tööstuslikus kasutuses.

Lõhusta NTP 25 minutiga

Võrguprotokollide puhul on - millenniumi põlvkonnal on üks eripära, nad on ammu aegunud ja ei sobi enam kuhugi, kuid nende asendamine ei ole sugugi lihtne, isegi kui saavutatakse kriitiline hulk entusiastide ja rahastamist.

Peamine kaebus klassikalise NTP üle on usaldusväärsete kaitsemehhanismide puudumine küberrünnakute vastu. Selle probleemi lahendamiseks on tehtud mitmeid katseid. Selleks viidi esmalt sisse eelnevalt määratud võtmete (PSK) mehhanism, et vahetada sümmeetrilisi võtmeid.

Kahjuks ei õigustanud see meetod end lihtsa põhjuse tõttu - see ei skaala hästi. See nõuab kliendi poolel käsitsi seadistamist vastavalt serverile. See tähendab, et ei saa lihtsalt lisada uut klienti. Kui NTP serveris midagi muutub, tuleb kõik kliendid uuesti seadistada.

Siis tuli AutoKey, kuid kohe avastati selle algoritmi disainis mitmeid tõsiseid haavatavusi ja sellest tuli loobuda. Probleem on selles, et algne number (seed) sisaldab vaid 32 bitti, mis on liiga vähe ja ei sisalda piisavalt arvutuslikku keerukust rünnaku teostamiseks.

  • Key ID — sümmeetriline 32-bitine võti;
  • MAC (sõnumi autentimise kood) — NTP paketi kontrollsumma;

Autokey arvutatakse järgmiselt.

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

Kus H() — krüptograafiline hüüdmise funktsioon.

Kontrollsumma arvutamiseks kasutatakse samasugust funktsiooni.

MAC=H(Autokey||NTP pakett)

Seega peab kogu pakettide terviklikkuse kontroll sõltuma küpsiste autentimisest. Nendega varastades saab taastada autokey ja seejärel vale MAC-i teha. Kuid NTP server kasutab nende genereerimisel algarvu (seed). Just siin peitub petu.

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

Funktsioon MSB_32 lõikab MD5 äärise 32 kõige kõrgemat bitti. Klientide küpsis ei muutu seni, kuni serveri parameetrid jäävad muutumatuks. Edasi peab ründaja lihtsalt taastama algarvu ja saab võimaluse ise küpsiseid genereerida.

Esmalt tuleb ühenduda NTP serveriga kliendi vormis ja saada küpsised. Seejärel taastab ründaja algarvu läbi proovimise, järgides lihtsat algoritmi.

Algoritm algarvu arvutamiseks proovimise meetodil.

   i=0:2^32 − 1 puhul
        Ci=H(Server-IP||Client-IP||0||i)
        kui Ci=Cookie siis
            tagasta i
        lõpeta
    lõpeta

IP-aadressid on teada, nii et jääb üle luua 2^32 räsit, kuni loodud küpsis vastab sellele, mis on saadud NTP-serverilt. Tüüpilisel koduarvutil Intel Core i5 võtab see aega 25 minutit.

NTS — uus Autokey

Selliste Autokey turvaaukkudega leppida ei olnud võimalik ja 2012. aastal ilmus uus versioon protokollist. Kompromiteeritud nime tõttu otsustati läbi viia bränding, nii nimetati Autokey v.2 Network Time Security.

NTS protokoll on NTP turvafunktsioonide laienemine ja toetab praegu ainult unicast režiimi. See pakub usaldusväärset krüptograafilist kaitset pakettide manipuleerimise eest, takistab jälgimist, on hästi skaleeritav, talub võrgu pakettide kaotust ja toob kaasa minimaalsed täpsuse kadumised, mis tekivad ühenduse kaitsmise käigus.

NTS-ühendus koosneb kahest etapist, kus kasutatakse madalama taseme protokolle. Esimeses etapis lepivad klient ja server kokku erinevates ühenduse parameetrites ja vahetavad küpsiseid, mis sisaldavad võtmeid koos kogu kaasneva andmekogumiga. Siis etapis kliendi ja serveri vahel lepitud mitmesuguste ühenduse parameetrite osas ning vahetatakse küpsiseid, mis sisaldavad võtmeid koos kogu seotud andmete kogumiga. teisel etapil toimub kaitstud NTS sessioon kliendi ja NTP serveri vahel.

Kuidas aegade sünkroniseerimine muutus turvaliseks

NTS koosneb kahest alumise taseme protokollist: Network Time Security Key Exchange (NTS-KE), turvalise ühenduse initsialiseerimine TLS-i kaudu, ja NTPv4 — protokolli NTP viimane versioon. Rocud, loe allpool lähemalt.

Esimene etapp — NTS KE

Sellel etapil algatab NTP klient TLS 1.2/1.3 sessiooni eraldi TCP ühenduse kaudu NTS KE serveriga. Selle seansi käigus toimub järgmine.

  • Osalised määravad parameetrid AEAD teise etapi algoritmi jaoks.
  • Osalised määravad teise alumise taseme protokolli, kuid hetkel toetatakse ainult NTPv4.
  • Osalised määravad NTP serveri IP-aadressi ja pordi.
  • NTS KE server väljastab küpsiseid NTPv4 jaoks.
  • Osalised ekstraktivad küpsistest paar sümmeetrilisi võtmeid (C2S ja S2C).

See lähenemine omab suurt eelist, kuna kogu koormus salajaste ühenduse parameetrite edastamiseks lasub usaldusväärsel protokollil TLS. Sellega väheneb vajadus välja mõelda oma lahendus turvaliseks NTP käepigistuseks.

Teine etapp — NTP kaitstud NTS-i all

Teises etapis klient turvaliselt sünkroniseerib aega NTP serveriga. Selle eesmärgi saavutamiseks edastab ta neli spetsiaalset laiendust (extension field) NTPv4 paketi struktuuris.

  • Unique Identifier Extension sisaldab juhuslikku nonce'i, et vältida kordusrünnakute tegemist.
  • NTS Cookie Extension sisaldab ühte kliendi NTP küpsist. Kuna ainult kliendil on sümmeetrilised AAED võtmed C2S ja S2C, peab NTP server neid küpsise materjalist välja tõmbama.
  • NTS Cookie Placeholder Extension on viis, kuidas klient saab serverilt taotleda täiendavaid küpsiseid. See laiendus on vajalik, et NTP serveri vastus ei oleks küsimusest oluliselt pikem. See aitab ära hoida tugevdusrünnakuid.
  • NTS Authenticator and Encrypted Extension Fields Extension sisaldab AAED algoritmi krüptimist C2S võtme, NTP päise, ajatempli märkide ning eespool mainitud EF koosseisus andmetena. Ilma selle laienduseta on võimalik ajatempli märke võltsida.

Kuidas aegade sünkroniseerimine muutus turvaliseks

Saadud päringu korral kontrollib server NTP paketi autentsust. Selleks peab ta küpsiseid dekrüpteerima, välja tõmbama AAED algoritmi ja võtmed. Pärast NTP paketi kehtivuse eduka kontrollimise järel vastab server kliendile järgmises formaadis.

  • Ainulaadne identifikaatori laiendus, mis on kliendi päringu peegelpilt ja kaitsemeetod rünnakute eest, mis põhinevad kordamisel.
  • NTS küpsise laiendus, mis suurendab sessiooni jätkamise võimalusi.
  • NTS autentija ja salastatud laiendatud väljad sisaldavad AEAD krüptimist S2C võtmega.

Teist kätlemist saab palju kordi korrata, jättes esimesed etapid vahele, kuna iga päring ja vastus annab kliendile lisaküpsiseid. See loob eelise, kuna aeglaselt toimivad TLS operatsioonid, näiteks PKI andmete edastamine ja arvutamine, jagunevad korduvate päringute arvu vahel. See on eriti mugav spetsialiseeritud FPGA kronomeetrite jaoks, kus kogu peamine funktsionaalsus saab pakkuda mitmesuguseid sümmeetrilise krüptograafia funktsioone, edastades kogu TLS teki teise seadmesse.

NTPSec

Mis on NTP eripära? Kuigi projekti autor Dave Mills püüdis oma koodi võimalikult hästi dokumenteerida, suudab harva mõni programmeerija mõista 35-aastaste aja sünkroniseerimise algoritmide keerukusi. Osad koodist on kirjutatud enne POSIXi ajastut ja Unix API erineb sel ajal väga tänasest kasutatavast. Lisaks on vajalikud statistilised teadmised, et eemaldada signaalidest müra häirivatest segmentidest.

NTS ei olnud esimene katse NTP-d parandada. Pärast seda, kui kurjategijad õppisid NTP haavatavusi DDoS rünnakute tugevdamiseks kasutama, sai selgeks, et on vaja radikaalseid muutusi. Ja kuni NTS-i mustandid valmis said, eraldas Ameerika Ühendriikide National Science Foundation 2014. aasta lõpus erakorralise toetuse NTP moderniseerimiseks.

Töörühma juhtis mitte keegi muu kui Eric Steven Raymond — üks Open Source kogukonna asutajatest ja raamatu autori Katedraal ja Basaar. Esiteks proovisin Eric koos kaastöötajatega NTP koodi BitKeeper platvormilt git-i üle kanda, kuid see ei õnnestunud. Projekti juht Harlan Stenn oli selle otsuse vastu ja läbirääkimised takerdusid. Seetõttu otsustati projekti kood forkitada, nii sündis NTPSec.

Tuginedes korralikule kogemusele, sealhulgas tööle GPSD-s, matemaatilisele taustale ja müstilisele oskusele lugeda vanade koodide, oli Eric Raymond just see häkker, kes suudaks sellist projekti ellu viia. Meeskonnas leidus ka koodi migreerimise spetsialist ning ainult 10 nädalaga asus NTP GitLab-i.Töö sai hoogu sisse.

Erik Raymondi meeskond võttis asja ette nagu Auguste Rodin kivi suurteoste kallal. Eemaldades 175 KLOC vana koodi, suutsid nad oluliselt vähendada ründeala, sulgedes mitmeid turvaauke.

Siin on mittetäielik nimekiri puudutatud elementidest:

  • Dokumenteerimata, vananenud või vigane refclock.
  • Kasutamata ICS teek.
  • libopts/autogen.
  • Vana kood Windowsile.
  • ntpdc.
  • Autokey.
  • C kood ntpq on ümber kirjutatud Pythonisse.
  • C kood sntp/ntpdig on ümber kirjutatud Pythonisse.

Lisaks koodi puhastamisele olid projektil ka teised ülesanded. Siin on mittetäielik nimekiri saavutustest:

  • Koodi kaitset on oluliselt tugevdatud ülevooluharide vastu. Ülevoolu ennetamiseks on kõik ebaturvalised stringifunktsioonid (strcpy / strcat / strtok / sprintf / vsprintf / gets) asendatud ohutute versioonidega, mis rakendavad pikkuse piiranguid.
  • On lisatud NTS toe.
  • Ajastepi täpsust on kümme korda tõhustatud füüsilise seadme sidumisega. See on tingitud sellest, et kaasaegsed arvutite kellaajad on muutunud palju täpsemaks kui need, mis olid NTP algusperioodil. Kõige rohkem sellest kasu saanud on GPSDO ja eraldiseisvad aja vaatlusjaamad.
  • Programmeerimiskeelte arv on vähenenud kahte. Perl'i, awk'i ja isegi S skriptide asemel on nüüd ainult Python. See avab rohkem võimalusi koodi taaskasutamiseks.
  • Autotoolse skriptide asemel hakkas projekt kasutama tarkvarakomplekti koostamise süsteemi. waf.
  • Oleme värskendanud ja ümber korraldanud projekti dokumentatsiooni. Segadusest ja kohati vananenud dokumentide kogumist on loonud arvestatava kvaliteediga dokumentatsiooni. Iga käsurea argument ja iga konfiguratsiooni element omavad nüüd ühtset tõde. Lisaks luuakse juhendilehed ja veebidokumentatsioon nüüd samadest põhiFailidest.

NTPSec on saadaval mitmete Linuxi distributsioonide jaoks. Hetkel on viimane stabiilne versioon 1.1.8, Gentoo Linuxi jaoks on eelviimane versioon.

(1:696)$ sudo emerge -av ntpsec
Need on paketid, mis oleksid installitud järjekorras:
Sõltuvuste arvutamine... valmis!
[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
Kokku: 1 pakett (1 uuesti installatsioon), allalaadimise suurus: 0 KiB
Kas soovite neid pakette installida? [Jah/Ei]

Chrony

Katsesime veel üht katset asendada vana NTP turvalisema analoogiga. Chrony, erinevalt NTPSec-ist, on kirjutatud nullist ja on mõeldud tööks usaldusväärselt laias valikus tingimustes, sealhulgas ebastabiilsete võrguühenduste, osalise kättesaadavuse või võrgukoormuse ning temperatuurimuutuste korral. Lisaks omab chrony ka teisi eeliseid:

  • chrony võib süsteemi kellade sünkroonimist teha kiiremini ja suurema täpsusega;
  • chrony on väiksem, tarbib vähem mälu ja pöördub protsessori poole ainult siis, kui see on vajalik. Ressursside ja energia kokkuhoid on suur pluss;
  • chrony toetab Linuxis riistvaralist ajatemplit, mis tagab äärmiselt täpse sünkroonimise kohalikes võrkudes.

Siiski puuduvad chronys mõned vanema NTP funktsioonid, nagu näiteks Multicast ja Üksikühenduse klient/server. Lisaks toetab klassikaline NTP rohkem operatsioonisüsteeme ja platvorme.

Serveri ja NTP päringute funktsionaalsuse keelamiseks piisab, kui kirjutada failis chrony.conf port 0. Seda tehakse siis, kui ei ole vaja teenindada aega NTP klientide või peer-‘ide jaoks. Alates versioonist 2.0 on NTP serveri port avatud ainult siis, kui juurdepääs on lubatud direktiiviga allow või vastava käsuga, või on seadistatud NTP peer-‘i, või kasutatakse direktiivi broadcast.

Programm koosneb kahest moodulist.

  • chronyd on taustal töötav teenus. See saab teavet süsteemi kellade erinevuse kohta väliselt ajaserverilt ja korrigeerib kohalikku aega. Samuti rakendab ta NTP protokolli ja võib toimida kas kliendi või serverina.
  • chronyc on käsurea utiliit programmi jälgimiseks ja kontrollimiseks. Seda kasutatakse teenuse erinevate parameetrite täpseks seadistamiseks, näiteks võimaldab see lisada või eemaldada NTP servereid samal ajal, kui chronyd jätkab töötamist.

Alates 7. versioonist RedHat Linux kasutab chrony ajasünkroonimise teenusena. Pakett on saadaval ka teistele Linuxi jaotustele. Viimane stabiilne versioon on 3.5, versiooni 4.0 väljalaskmine on käimas.

(1:712)$ sudo emerge -av chrony
Need to merge the following packages:
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]

Kuidas seadistada oma kaugserverit chrony internetis, et sünkroniseerida aega kontorivõrgus. Allpool on näidis seadistusest VPS-il.

Chrony seadistamise näide RHEL / CentOS VPS-il

Nüüd harjutame veidi ja loome oma NTP serveri VPS-il. See on väga lihtne, piisab, kui valida sobiv plaan RuVDS veebisaidilt, saada valmis server ja sisestada paar lihtsat käsku. Selleks sobib suurepäraselt järgmine variant.

Kuidas aegade sünkroniseerimine muutus turvaliseks

Liigume teenuse seadistamise juurde ja esmalt installime chrony paketi.

[root@server ~]$ yum install chrony

RHEL 8 / CentOS 8 kasutavad teistsugust pakihaldurit.

[root@server ~]$ dnf install chrony

Pärast chrony installimist tuleb teenus käivitada ja aktiveerida.

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

Soovi korral saab faile /etc/chrony.conf muuta, asendades NTP serverid lähimatega, et vähendada vastamisaega.

# 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

Seejärel seadistame NTP serveri sünkroniseerimise määratud puu sõlmedega.

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

Tuleb ka avada NTP port, vastasel juhul blokeerib tulemüür sisenevad ühendused kliendiseadmest.

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

Kliendi poolel piisab õige ajavööndi seadmisest.

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

Failis /etc/chrony.conf peab olema meie VPS serveri IP või hostinimi, millel NTP server chrony töötab.

server my.vps.server

Ja lõpuks, aegade sünkroonimise käivitamine kliendil.

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

Järgmisel korral räägin, millised on ajasünkrikuvahed ilma internetita.

Kuidas aegade sünkroniseerimine muutus turvaliseks

Kuidas aegade sünkroniseerimine muutus turvaliseks

Allikas: habr.com

Osta usaldusväärne veebihosting DDoS kaitsega, VPS VDS serverid 🔥 Osta usaldusväärne veebihosting DDoS kaitsega, VPS VDS serverid | ProHoster