Kuidas ajasünkroonimine sai turvaliseks

Kuidas ajasünkroonimine sai turvaliseks
Kuidas teha nii, et aeg per se 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õigil õige. Seda probleemi ei saa NTP-ta lahendada.

Kujutame ette hetkeks, et ühe sektori tööstuslikus IT-infrastruktuuris tekivad ajasünkroniseerimisega seotud probleemid. Koheselt hakkab ebaõnnestuma ettevõtte tarkvara klastritekk, domeenid lagunevad, ja meistrid ning varuvõrgud püüavad tulutult taastada status quo'd.

Võimalik on ka olukord, kus kurjategija püüab tahtlikult aega segamini ajada MiTM või DDoS rünnaku kaudu. Sellises olukorras võib juhtuda kõike:

  • kasutajakontode paroolide aegumine;
  • X.509 sertifikaatide aegumine;
  • TOTP kahefaktoriline autentimine lõpetab töötamise;
  • varukoopiad "kannavad" ja süsteem eemaldab need;
  • DNSSec puruneb.

Selge on, et iga IT-osakond on huvitatud usaldusväärsatest ajasünkroniseerimise teenustest ja oleks hea, kui need oleksid usaldusväärsed ja turvalised tööstuslikus kasutuses.

Purusta NTP 25 minutiga

Võrguprotokollidel — millenniaalidel on üks eripära, nad on juba ammu on aegunud ja ei sobi enam kuhugi, kuid nende asendamine ei ole nii lihtne isegi siis, kui entusiaste ja rahastamist on piisavalt.

Peamine kaebus traditsioonilise NTP suhtes on usaldusväärsete kaitsemehhanismide puudumine kurjategijate rünnakute eest. Erinevaid katseid selle probleemi lahendamiseks on tehtud. Esiteks rakendati üksteisega salajaste võtmete (PSK) vahetamiseks ettemääratud võtmete mehhanism.

Kahjuks ei õigustanud see meetod ennast lihtsal põhjusel — see ei skaaleeru hästi. Klientide käsitsi seadistamine sõltub serverist. See tähendab, et ei saa lihtsalt veel ühte klienti lisada. Kui NTP-serveris midagi muutub, tuleb kõik kliendid uuesti seadistada.

Siis leiutati AutoKey, kuid kohe avastati selles mitmeid tõsiseid haavatavusi algoritmi enda disainis ja selle kasutamisest 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 jaoks.

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

Autokood arvutatakse järgmiselt.

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

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

Pakettide kontrollsummade arvutamiseks kasutatakse sama funktsiooni.

MAC=H(Autokood||NTP paket)

Seega sõltub kõigi pakettide terviklikkuse kontroll autentsustest küpsistest. Neid omades on võimalik autokood taastada ja seejärel MAC-i võltsida. Siiski kasutab NTP server nende genereerimisel algarvu (seed). Just siin peitub nõrkus.

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

Funktsioon MSB_32 lõikab md5 räsi 32 kõige olulisemat bitti. Klientide küpsis ei muutu seni, kuni serveri parameetrid on muutumatud. Jätkuks jääb ründajale vaid algarv taastada ja saada võimalus küpsiseid ise genereerida.

Esmalt tuleb NTP serveriga kliendina ühendada ja küpsised saada. Seejärel taastab ründaja algarvu, järgides lihtsat algoritmi.

Algoritm algarvu taastamiseks brute-force meetodiga.

   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 vaid luua 2^32 räsi, kuni loodud küpsis ei kattu NTP serverilt saadud küpsisega. Tavalise koduklientiga, millel on Intel Core i5, kulub sellele 25 minutit.

NTS — uus Autokood

Selliste turvanõrkustega Autokoodiga leppimine ei olnud võimalik ja 2012. aastal ilmus uus versioon protokoll. Kompromiteeritud nime tõttu otsustati läbi viia brändiuuendus, seega nimetati Autokood v.2 Network Time Security.

NTS protokoll on NTP turbekihi laiendus ja praegu toetab see ainult unikaalsuse režiimi (unicast). See pakub usaldusväärset krüptograafiat pakettide manipuleerimise kaitsmiseks, ennetab jälgimist, skaleerub hästi, on vastupidav võrgu pakettide kadumise korral ja toob kaasa minimaalsed täpsuse kadumised, mis tekivad ühenduse kaitsmise protsessis.

NTS-ühendus koosneb kahest etapist, kus kasutatakse madalama taseme protokolle. Esimeses etapis lepivad klient ja server kokku erinevates ühenduse parameetrites ning vahetavad küpsiseid, mis sisaldavad võtmeid koos kõigi seotud andmete komplektiga. Teises etapis toimub kaitstud NTS sessioon kliendi ja NTP serveri vahel. teises etapil toimub kaitstud NTS seanss kliendi ja NTP serveri vahel.

Kuidas ajasünkroonimine sai turvaliseks

NTS koosneb kahest madalama taseme protokollist: Network Time Security Key Exchange (NTS-KE), mis initsialiseerib turvalise ühenduse TLSi kaudu, ja NTPv4 — NTP protokolli viimasest versioonist. Veidi rohkem sellest allpool.

Esimene etapp — NTS KE

Selles etapis käivitab NTP klient TLS 1.2/1.3 seansi eraldi TCP-ühenduse kaudu NTS KE serveriga. Selle seansi jooksul toimub järgmist.

  • Osalised määravad AEAD teise etapi algoritmi.
  • Osalised määravad teise madalama taseme protokolli, kuid hetkel toetab ainult NTPv4.
  • Osalised määravad NTP serveri IP-aadressi ja pordi.
  • NTS KE server väljastab küpsiseid NTPv4 jaoks.
  • Osalised saavad küpsiste materjalist välja paar sümmeetrilisi võtmeid (C2S ja S2C).

Selline lähenemine omab suurt eelist, et kogu koormus salajaste ühenduse parameetrite edastamiseks langeb usaldusväärse ja tõestatud TLS protokolli kanda. Seeläbi kaob vajadus leiutada omaenda turvaline NTP käepigistus.

Teine etapp — NTP NTS kaitse all

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

  • Unique Identifier Extension sisaldab juhuslikku nonce'i ründe ennetamiseks korduskatsete kaudu.
  • NTS Cookie Extension sisaldab ühte klientide olemasolevatest NTP küpsistest. Kuna ainult klient omab sümmeetrilisi AAED võtmeid C2S ja S2C, peab NTP server need küpsiste materjalist välja võtma.
  • NTS Cookie Placeholder Extension võimaldab kliendil serverilt küsida täiendavaid küpsiseid. See laiendus on vajalik, et NTP serveri vastus ei oleks märkimisväärselt pikem kui päring. See aitab vältida tugevdamisrünnakuid.
  • NTS Authenticator and Encrypted Extension Fields Extension sisaldab AAED algoritmi šifrit C2S võtmega, NTP pealkirja, ajatempe ja eespool mainitud EF kui täiendavaid andmeid. Ilma selle laienduseta on võimalik ajatempe vale esitada.

Kuidas ajasünkroonimine sai turvaliseks

Pärast kliendi päringu saamist kontrollib server NTP paketi autentsust. Selleks peab ta küpsiseid dekrüpteerima, välja võtma AAED algoritmi ja võtmed. Pärast NTP paketi edukat kehtivuse kontrollimist vastab server kliendile järgmises formaadis.

  • Unique Identifier Extension on kliendi päringu peegelduse koopia, meede kordusrünnakute vastu.
  • NTS Cookie Extension veel küpsiseid seansi jätkamiseks.
  • NTS Authenticator ja krüpteeritud laiendite väljad sisaldavad AEAD krüpto S2C võtmega.

Teist käepigistust saab korrata mitu korda, jättes vahele esimese etapi, kuna iga päring ja vastus annavad kliendile täiendavaid küpsiseid. See annab eelise, et suhteliselt ressursimahukad TLS operatsioonid ja PKI andmete edastamine jagatakse korduvate päringute arvuga. See on eriti mugav spetsialiseeritud FPGA ajastite jaoks, kus kogu peamine funktsionaalsus saab pakkida mitmesse sümmeetrilise krüptograafia funktsiooni, edastades kogu TLS kihi teisele seadmele.

NTPSec

Mis on NTP eripära? Kuigi projekti autor Dave Mills püüdis oma koodi võimalikult hästi dokumenteerida, on harva, kui mõni programmeerija suudab aru saada 35 aastat tagasi välja töötatud ajasünkroniseerimise algoritmide keerukusest. Osa koodist on kirjutatud veel enne POSIX-i ajastut ja Unix API erineb sel ajal kasutatavast oluliselt. Lisaks on statistikaalased teadmised vajalikud, et filtreerida signaali müra üles öeldest.

NTS ei olnud esimene katse NTP parandada. Pärast seda, kui ründajad õppisid ära kasutama NTP haavatavusi DDoS rünnakute suurendamiseks, sai selgeks, et on vajalikud radikaalsed muutused. Samal ajal, kui NTS-i mustandid valmistati ja viidi toimivaks, eraldas USA Rahvuslik Teadusfond 2014. aasta lõpus kiiresti toetuse NTP moderniseerimiseks.

Töörühma juht oli mitte keegi muu kui Eric Stephen Raymond — üks Open Source'i kogukonna rajajatest ja raamatu autori Katedraal ja Bazar. Esiteks üritasid Eric ja tema meeskond NTP koodi BitKeeperist git-i üle kanda, kuid see ei õnnestunud. Projektijuht Harlan Stenn oli vastu sellele lahendusele ja läbirääkimised jõudsid ummikusse. Seetõttu otsustati projekti koodifotograafia moodustada ja nii sündis NTPSec.

Väärikas kogemus, sealhulgas töö GPSD-ga, matemaatiline taust ja maagiline oskus vana koodi lugeda — Eric Raymond oli just see häkker, kes suutis sellist projekti ellu viia. Meeskonnas oli koodimigratsiooni spetsialist ja vaid 10 nädala jooksul asus NTP GitLab-i.Töö läks hoogsalt edasi.

Eric Raymondi meeskond lähenes asjale nii, nagu Auguste Rodin töötas kivitükiga. Eemaldades 175 KLOC vana koodi, suudeti oluliselt vähendada rünnaku pinda, sulgedes mitmeid turvaauke.

Siin on mittetäielik nimekiri, mis jäi alla:

  • Dokumendita, aegunud, vananenud või katkenud refclock.
  • Kasutamata ICS raamatukogu.
  • 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 märkimisväärselt tugevdatud puhveri ülevoolu vältimiseks. Puufferi ülevoolu ennetamiseks on kõik ohtlikud stringifunktsioonid (strcpy / strcat / strtok / sprintf / vsprintf / gets) asendatud turvaliste versioonidega, mis rakendavad puhveri suuruse piirangu.
  • Lisatud NTS-i tugi.
  • Ajabloki täpsus on künnise füüsilise seadme sidumise abil kümme korda suurenenud. See on tingitud sellest, et tänapäeva arvutih kellad on palju täpsemad kui need, mis olid NTP sündimise ajal. Kõige rohkem kasu on saanud GPSDO ja spetsialiseeritud ajakomplektid.
  • Programmeermiskeelte arv on vähenenud kahte. Perl, awk ja isegi S skeemide asemel on nüüd täiesti Pythoni skeem. See võimaldab rohkem koodi taaskasutusvõimalusi.
  • Autotools'i skriptihäire asendamine tarkvarakuve süsteemiga. waf.
  • Projekti dokumentatsioon on uuendatud ja ümber korraldatud. Vastandlikust ja kohati arhaistlikust dokumendikollektsioonist on loodud täiesti vastuvõetav dokumentatsioon. Iga käsurea võtme ja iga konfigureerimise üksuse kohta on nüüd üksainus tõde. Lisaks luuakse käsiraamatud ja veebidokumentatsioon nüüd samadest põhifailidest.

NTPSec on saadaval mitmesugustes Linuxi distributsioonides. Praegu on viimane stabiilne versioon 1.1.8, Gentoo Linuxi jaoks — eelviimane.

(1:696)$ sudo emerge -av ntpsec
Need on paketid, mis ostetakse, järjekorras:
Sõltuvuste arvutamine... tehtud!
[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 uuestiinstallimine), allalaadimise suurus: 0 KiB
Kas soovite need paketid ühendusse viia? [Jah/Ei]

Chrony

Katses prooviti asendada vana NTP turvalisema alternatiiviga. Chrony on erinevalt NTPSec-st kirjutatud nullist ja on kavandatud usaldusväärseks toimimiseks laias valikus tingimustes, sealhulgas ebastabiilsete võrguühenduste, osalise kättesaadavuse, võrgu ülekoormuse ja temperatuuri kõikumiste korral. Lisaks on chronyl ka teisi eeliseid:

  • chrony suudab kiiremini sünkroniseerida süsteemi kellasid suure täpsusega;
  • chrony on väiksem, tarbib vähem mälu ja pöördub protsessori poole ainult siis, kui see on vajalik. See on suur pluss ressursside ja energia säästmiseks;
  • chrony toetab riistvarataseme ajatempleid Linuxis, mis tagab äärmiselt täpse sünkroniseerimise kohalikes võrgustikes.

Kuid chronyst puuduvad mõned vana NTP funktsioonid, nagu levitamise ja mitme aadressi (multicast) klient / server. Lisaks toetab klassikaline NTP rohkem operatsioonisüsteeme ja platvorme.

Serveri ja NTP päringute funktsionaalsuse keelamiseks chronyd protsessis piisab, kui seadistada port 0 failis chrony.conf. Seda tehakse siis, kui pole vaja aega NTP klientidele või võrdsuspunktidele teenindada. 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 võrdsuspunkt, või on kasutatud direktiivi broadcast.

Programm koosneb kahest moodulist.

  • chronyd on teenus, mis töötab taustal. See saadab teavet süsteemi kellade erinevuse kohta välisest aja serverist ja korrigeerib kohalikku aega. See rakendab ka NTP protokolli ja võib toimida nii kliendi kui ka serverina.
  • chronyc on käsurea tööriist programmi jälgimiseks ja juhtimiseks. Seda kasutatakse teenuse erinevate parameetrite täpseks seadistamiseks, näiteks võimaldab lisada või eemaldada NTP-servereid samal ajal, kui chronyd jätkab töötamist.

Alates 7. versioonist RedHat Linuxist kasutab chrony ajasüncroniseerimise teenusena. Pakett on saadaval ka teistele Linuxi jaotustele. Viimane stabiilne versioon on 3.5, versioon 4.0 on valmimas.

(1:712)$ sudo emerge -av chrony
Need on pakettide, mida soovitakse ühendada, järjekord:
Sõltuvuste arvutamine... tehtud!
[binaarne 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
Kokku: 1 pakett (1 uus, 1 binaarne), allalaadimise suurus: 246 KiB
Kas soovite need paketid ühendada? [Jah/ei]

Kuidas seadistada oma kaugserverit chrony internetis, et sünkroniseerida aega kontori võrgus. Siin on näide seadistamisest VPS-i peal.

Chrony seadistamise näide RHEL / CentOS süsteemidel VPS-is

Vaatame nüüd veidi harjutusi ja tõstame omaenda NTP serveri VPS-is. See on väga lihtne, piisab sobiva paketi valimisest RuVDS veebilehelt, saada valmis server ja sisestada paar lihtsat käsku. Meie vajaduste jaoks sobib hästi järgmine valik.

Kuidas ajasünkroonimine sai turvaliseks

Jõuame teenuse seadistamise juurde ja kõigepealt installime chrony paketi.

[root@server ~]$ yum install chrony

RHEL 8 / CentOS 8 kasutavad teistsugust paketihaldurit.

[root@server ~]$ dnf install chrony

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

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

Soovi korral saab teha muudatusi failis /etc/chrony.conf, asendades NPT serverid lähimate kohalikega, et vähendada reageerimise aega.

# 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 näidatud basseini sõlmedega.

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

Samuti tuleb NTP port avada, vastasel juhul blokeerib tulemüür sissetulevaid ühendusi kliendi sõlmedelt.

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

Kliendi poolel on piisavalt õigesti seadistada ajavöönd.

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

Failis /etc/chrony.conf näidake meie VPS serveri IP-d või hostinime, millel töötab NTP server chrony.

server my.vps.server

Ja lõpuks käivitame aja sünkroniseerimise kliendil.

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

Järgmine kord räägin, millised on aja sünkroniseerimise variantide kasutamine ilma internetita.

Kuidas ajasünkroonimine sai turvaliseks

Kuidas ajasünkroonimine sai turvaliseks

Allikas: habr.com

Osta usaldusväärne hostimine veebilehtede jaoks DDoS-i kaitsega, VPS VDS serverid 🔥 Osta usaldusväärne hostimine veebilehtede jaoks DDoS-i kaitsega, VPS VDS serverid | ProHoster