Kuidas aja sünkroonimine turvaliseks sai

Kuidas aja sünkroonimine turvaliseks sai
Kuidas teha kindlaks, et aeg iseenesest ei valeta, kui teil on miljon suurt ja väikest seadet, mis suhtlevad TCP/IP kaudu? Igaühel neist on ju kell ja kellaaeg peab olema kõigi jaoks õige. Sellest probleemist ei saa mööda ilma ntp-ta.

Kujutagem korraks ette, et ühes tööstusliku IT-infrastruktuuri segmendis on raskusi teenuste aja jooksul sünkroonimisega. Kohe hakkab Enterprise'i tarkvara klastripinn üles ütlema, domeenid lagunevad, ülem- ja ooterežiimi sõlmed püüavad edutult taastada status quo.

Samuti on võimalik, et ründaja üritab MiTM-i või DDOS-i rünnakuga tahtlikult aega häirida. Sellises olukorras võib juhtuda kõike:

  • Kasutajakonto paroolid aeguvad;
  • X.509 sertifikaadid aeguvad;
  • TOTP kahefaktoriline autentimine lakkab töötamast;
  • varukoopiad aeguvad ja süsteem kustutab need;
  • DNSSec katkeb.

On selge, et iga IT-osakond on huvitatud aja sünkroniseerimisteenuste usaldusväärsest toimimisest ning oleks tore, kui need oleksid töökindlad ja ohutud.

Katkesta NTP 25 minutiga

Võrguprotokollid – millenniaalidel on üks eripära, nad on olnud aegunud ja ei kõlba enam millekski, kuid nende asendamine pole nii lihtne ka siis, kui koguneb kriitiline mass entusiaste ja rahastust.

Peamine etteheide klassikalise NTP kohta on usaldusväärsete mehhanismide puudumine sissetungijate rünnakute eest kaitsmiseks. Selle probleemi lahendamiseks on tehtud erinevaid katseid. Selle saavutamiseks rakendasime esmalt sümmeetriliste võtmete vahetamiseks eeljagatud võtme (PSK) mehhanismi.

Kahjuks ei tasunud see meetod end ära lihtsal põhjusel – see ei skaleeru hästi. Sõltuvalt serverist on kliendi poolel nõutav käsitsi seadistamine. See tähendab, et teist klienti lihtsalt niisama lisada ei saa. Kui NTP-serveris midagi muutub, tuleb kõik kliendid uuesti konfigureerida.

Seejärel tulid nad välja AutoKeyga, kuid avastasid algoritmi enda disainis kohe mitmeid tõsiseid haavatavusi ja pidid sellest loobuma. Asi on selles, et seeme sisaldab ainult 32 bitti, see on liiga väike ja ei sisalda piisavalt arvutuslikku keerukust frontaalrünnaku jaoks.

  • Võtme ID – sümmeetriline 32-bitine võti;
  • MAC (sõnumi autentimiskood) - NTP-paketi kontrollsumma;

Autokey arvutatakse järgmiselt.

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

Kus H() on krüptograafiline räsifunktsioon.

Sama funktsiooni kasutatakse pakettide kontrollsumma arvutamiseks.

MAC=H(Autokey||NTP packet)

Selgub, et kogu pakendikontrolli terviklikkus sõltub küpsiste autentsusest. Kui teil on need olemas, saate automaatvõtme taastada ja seejärel MAC-i võltsida. NTP-server kasutab aga nende genereerimisel seemet. Siin peitub saak.

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

Funktsioon MSB_32 lõikab md5 räsiarvutuse tulemusest ära 32 kõige olulisemat bitti. Kliendiküpsis ei muutu seni, kuni serveri parameetrid jäävad muutumatuks. Siis saab ründaja taastada ainult esialgse numbri ja iseseisvalt küpsiseid genereerida.

Esiteks peate looma ühenduse NTP-serveriga kliendina ja saama küpsiseid. Pärast seda taastab ründaja toore jõu meetodil lihtsa algoritmi järgi algnumbri.

Algoritm algarvu arvutamise ründamiseks brute-force meetodil.

   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-aadressid on teada, seega jääb üle vaid luua 2^32 räsi, kuni loodud küpsis ühtib NTP-serverist saadud küpsisega. Tavalises Intel Core i5-ga kodujaamas võtab see aega 25 minutit.

NTS – uus Autokey

Selliseid turvaauke Autokeys ei olnud võimalik leppida ja 2012. aastal tekkis see uus versioon protokolli. Nime ohustamiseks otsustasid nad kaubamärgi muuta, nii et Autokey v.2 nimetati Network Time Securityks.

NTS-protokoll on NTP-turvalisuse laiendus ja toetab praegu ainult unicast-režiimi. See pakub tugevat krüptograafilist kaitset pakettidega manipuleerimise eest, takistab nuhkimist, mastaabib hästi, on võrgupakettide kadumise suhtes vastupidav ja põhjustab ühenduse turvalisuse ajal vähimat täpsuskadu.

NTS-ühendus koosneb kahest etapist, mis kasutavad madalama kihi protokolle. Peal esimene Selles etapis lepivad klient ja server kokku erinevates ühenduse parameetrites ning vahetavad võtmeid sisaldavaid küpsiseid koos kogu kaasneva andmestikuga. Peal teine Selles etapis toimub tegelik kaitstud NTS-i seanss kliendi ja NTP-serveri vahel.

Kuidas aja sünkroonimine turvaliseks sai

NTS koosneb kahest madalama kihi protokollist: Network Time Security Key Exchange (NTS-KE), mis algatab turvalise ühenduse TLS-i kaudu, ja NTPv4, NTP-protokolli uusim kehastus. Sellest veidi lähemalt allpool.

Esimene etapp - NTS KE

Selles etapis algatab NTP klient TLS 1.2/1.3 seansi eraldi TCP ühenduse kaudu NTS KE serveriga. Selle seansi ajal toimub järgmine.

  • Osapooled määravad parameetrid AEAD teise etapi algoritm.
  • Osapooled määratlevad teise madalama kihi protokolli, kuid hetkel toetatakse ainult NTPv4.
  • Osapooled määravad kindlaks NTP-serveri IP-aadressi ja pordi.
  • NTS KE server väljastab NTPv4 all küpsiseid.
  • Pooled eraldavad küpsisematerjalist sümmeetriliste võtmete paari (C2S ja S2C).

Sellel lähenemisviisil on suur eelis, et kogu ühenduse parameetritega seotud salajase teabe edastamise kohustus langeb tõestatud ja usaldusväärsele TLS-protokollile. See välistab vajaduse oma ratast uuesti leiutada turvalise NTP käepigistuse jaoks.

Teine etapp - NTP NTS-kaitse all

Teises etapis sünkroonib klient aja turvaliselt NTP-serveriga. Sel eesmärgil edastab see NTPv4 paketistruktuuris neli spetsiaalset laiendust (laiendusvälja).

  • Unikaalse identifikaatori laiend sisaldab kordusrünnete vältimiseks juhuslikku mittesõna.
  • NTS Cookie Extension sisaldab ühte kliendile saadaolevatest NTP küpsistest. Kuna sümmeetrilised AAED C2S ja S2C võtmed on ainult kliendil, peab NTP-server need küpsisematerjalist eraldama.
  • NTS Cookie Placeholder Extension on viis, kuidas klient saab serverilt täiendavaid küpsiseid taotleda. See laiendus on vajalik tagamaks, et NTP-serveri vastus ei oleks palju pikem kui päring. See aitab vältida võimendusrünnakuid.
  • NTS Authenticator ja Encrypted Extension Fields Extension sisaldab AAED-šifrit koos C2S-võtmega, NTP-päist, ajatempleid ja ülaltoodud EF-i kaasnevate andmetena. Ilma selle laiendita on võimalik ajatempleid võltsida.

Kuidas aja sünkroonimine turvaliseks sai

Kliendilt päringu saamisel kontrollib server NTP-paketi autentsust. Selleks peab ta küpsised dekrüpteerima, välja võtma AAED-algoritmi ja võtmed. Pärast edukat NTP-paketi kehtivuse kontrollimist vastab server kliendile järgmises vormingus.

  • Unikaalne identifikaatori laiend on kliendi päringu peegelkoopia, meede kordusrünnakute vastu.
  • NTS Cookie Extension rohkem küpsiseid seansi jätkamiseks.
  • NTS Authenticator ja Encrypted Extension Fields Extension sisaldab AEAD-šifrit koos S2C-võtmega.

Teist käepigistust saab korrata mitu korda, jättes esimesest sammust mööda, kuna iga päring ja vastus annab kliendile täiendavaid küpsiseid. Selle eeliseks on see, et suhteliselt ressursimahukad TLS-i toimingud PKI andmete arvutamisel ja edastamisel jagatakse korduvate päringute arvuga. See on eriti mugav spetsialiseerunud FPGA ajamõõtjatele, kui kogu põhifunktsionaalsuse saab sümmeetrilise krüptograafia valdkonnast mitmeks funktsiooniks pakkida, kandes kogu TLS-i pinu teise seadmesse.

NTPSec

Mis on NTP-s erilist? Hoolimata asjaolust, et projekti autor Dave Mills püüdis oma koodi võimalikult hästi dokumenteerida, on see haruldane programmeerija, kes suudab mõista 35 aastat vanade aja sünkroonimisalgoritmide keerukust. Osa koodist on kirjutatud enne POSIXi ajastut ja Unixi API erines siis tänapäeval kasutatavast. Lisaks on vaja teadmisi statistikast, et puhastada signaal häiretest mürarikastel liinidel.

NTS polnud esimene katse NTP-d parandada. Kui ründajad õppisid ära kasutama NTP haavatavusi DDoS-i rünnakute võimendamiseks, sai selgeks, et vaja on radikaalseid muudatusi. Ja samal ajal, kui NTS-i kavandeid valmistati ette ja viimistleti, eraldas USA riiklik teadusfond 2014. aasta lõpus kiiresti NTP moderniseerimiseks toetuse.

Töörühma ei juhtinud mitte keegi, vaid Eric Steven Raymond - üks avatud lähtekoodiga kogukonna asutajatest ja alustaladest ning raamatu autor Katedraal ja basaar. Esimese asjana üritasid Eric ja ta sõbrad NTP-koodi BitKeeperi platvormilt giti teisaldada, kuid see ei õnnestunud. Projektijuht Harlan Stenn oli selle otsuse vastu ja läbirääkimised takerdusid. Siis otsustati projekti kood hargida ja sündis NTPSec.

Kindel kogemus, sealhulgas töö GPSD kallal, matemaatiline taust ja maagiline iidse koodi lugemise oskus – Eric Raymond oli täpselt see häkker, kes sellise projektiga hakkama sai. Meeskond leidis koodi migratsiooni spetsialisti ja vaid 10 nädalaga NTP lahendatudGitLabis. Töö käis täies hoos.

Eric Raymondi meeskond võttis ülesande enda peale samamoodi nagu Auguste Rodin kiviplokiga. Eemaldades 175 KLOC vana koodi, suutsid nad rünnaku pinda oluliselt vähendada, sulgedes palju turvaauke.

Siin on mittetäielik nimekiri distributsioonis sisalduvatest:

  • Dokumentideta, aegunud, aegunud või katkine refclock.
  • Kasutamata ICS-teek.
  • libopts/autogen.
  • Vana kood Windowsi jaoks.
  • ntpdc.
  • Automaatne klahv.
  • Ntpq C kood on Pythonis ümber kirjutatud.
  • Sntp/ntpdig C kood on Pythonis ümber kirjutatud.

Lisaks koodi puhastamisele oli projektil muid ülesandeid. Siin on osaline saavutuste loend:

  • Koodikaitset puhvri ületäitumise eest on oluliselt täiustatud. Puhvri ületäitumise vältimiseks on kõik ebaturvalised stringifunktsioonid (strcpy/strcat/strtok/sprintf/vsprintf/gets) asendatud turvaliste versioonidega, mis rakendavad puhvri suuruse piiranguid.
  • Lisatud NTS tugi.
  • Füüsilise riistvara ühendamine parandas aja sammu täpsust kümnekordselt. See on tingitud asjaolust, et kaasaegsed arvutikellad on muutunud palju täpsemaks kui NTP sündimise ajal. Suurimad kasu sellest said GPSDO ja spetsiaalsed ajaraadiod.
  • Programmeerimiskeelte arv on vähendatud kahele. Perli, awki ja isegi S-skriptide asemel on nüüd kõik Python. Tänu sellele on rohkem võimalusi koodi taaskasutamiseks.
  • Autotoolsi skriptide nuudlite asemel hakati projektis kasutama tarkvara koostamise süsteemi WAF.
  • Uuendatud ja ümberkorraldatud projekti dokumentatsioon. Vastuolulisest ja kohati arhailisest dokumendikogust lõid nad üsna läbitava dokumentatsiooni. Igal käsurealülitil ja igal konfiguratsiooniüksusel on nüüd üks tõeversioon. Lisaks luuakse nüüd samadest põhifailidest man-lehed ja veebidokumentatsioon.

NTPSec on saadaval paljude Linuxi distributsioonide jaoks. Hetkel on uusim stabiilne versioon 1.1.8, Gentoo Linuxi jaoks eelviimane.

(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

Oli veel üks katse asendada vana NTP turvalisema alternatiiviga. Erinevalt NTPSecist on Chrony kirjutatud algusest peale ja see on loodud töötama usaldusväärselt paljudes tingimustes, sealhulgas ebastabiilsed võrguühendused, võrgu osaline kättesaadavus või ummikud ja temperatuurimuutused. Lisaks on kroonil ka muid eeliseid:

  • chrony suudab süsteemi kella kiiremini ja suurema täpsusega sünkroonida;
  • chrony on väiksem, tarbib vähem mälu ja pääseb CPU-le juurde ainult vajaduse korral. See on suur pluss ressursside ja energia säästmisel;
  • chrony toetab Linuxis riistvaralisi ajatempleid, võimaldades ülitäpset sünkroonimist kohalikes võrkudes.

Kuid chronyl puuduvad mõned vana NTP funktsioonid, näiteks leviedastus ja multisaadete klient/server. Lisaks toetab klassikaline NTP suuremat hulka operatsioonisüsteeme ja platvorme.

Serveri funktsionaalsuse ja chronyd-protsessi NTP-päringute keelamiseks kirjutage lihtsalt port 0 faili chrony.conf. Seda tehakse juhtudel, kui pole vaja NTP klientide või kaaslaste jaoks aega varuda. Alates versioonist 2.0 on NTP-serveri port avatud ainult siis, kui juurdepääs on lubatud käsu või sobiva käsuga või kui on konfigureeritud NTP partner või kasutatakse leviedastuse käsku.

Programm koosneb kahest moodulist.

  • chronyd on teenus, mis töötab taustal. See saab teavet süsteemi kella ja välise ajaserveri erinevuse kohta ning kohandab kohalikku aega. Samuti rakendab see NTP-protokolli ja võib toimida kliendi või serverina.
  • chronyc on käsurea utiliit programmide jälgimiseks ja juhtimiseks. Kasutatakse erinevate teenuseparameetrite peenhäälestamiseks, näiteks võimaldab teil lisada või eemaldada NTP-servereid, kui chronyd töötab.

Alates RedHat Linuxi versioonist 7 kasutab chrony aja sünkroonimisteenusena. Pakett on saadaval ka teistele Linuxi distributsioonidele. Uusim stabiilne versioon on 3.5, mis valmistub v4.0 väljalaskmiseks.

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

Kuidas seadistada Internetis oma Chrony-kaugserver, et sünkroonida aega kontorivõrgus. Allpool on näide VPS-i seadistamisest.

Näide Chrony seadistamisest RHEL-is / CentOS-is VPS-is

Harjutame nüüd veidi ja paneme VPS-is üles oma NTP-serveri. See on väga lihtne, lihtsalt valige RuVDS-i veebisaidil sobiv tariif, hankige valmis server ja tippige kümmekond lihtsat käsku. Meie eesmärkidel on see valik üsna sobiv.

Kuidas aja sünkroonimine turvaliseks sai

Liigume edasi teenuse seadistamise juurde ja installime esmalt Chrony paketi.

[root@server ~]$ yum install chrony

RHEL 8 / CentOS 8 kasutavad teist paketihaldurit.

[root@server ~]$ dnf install chrony

Pärast chrony installimist peate teenuse käivitama ja aktiveerima.

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

Soovi korral saate teha muudatusi failis /etc/chrony.conf, asendades NPT serverid lähimate kohalike serveritega, et vähendada reageerimisaega.

# 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

Järgmisena seadistame NTP-serveri sünkroonimise määratud kogumi sõlmedega.

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

Samuti on vaja avada NTP-port väljapoole, vastasel juhul blokeerib tulemüür kliendisõlmedest sissetulevad ühendused.

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

Kliendi poolel piisab ajavööndi õigest määramisest.

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

Fail /etc/chrony.conf määrab meie VPS-serveri IP- või hostinime, milles töötab NTP-server chrony.

server my.vps.server

Ja lõpuks käivitage kliendil aja sünkroonimine.

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

Järgmine kord räägin teile, millised võimalused on aja sünkroonimiseks ilma Internetita.

Kuidas aja sünkroonimine turvaliseks sai

Kuidas aja sünkroonimine turvaliseks sai

Allikas: www.habr.com

Lisa kommentaar