Kaip laiko sinchronizavimas tapo saugus

Kaip laiko sinchronizavimas tapo saugus
Kaip įsitikinti, kad laikas pats savaime nemeluoja, jei turite milijoną didelių ir mažų įrenginių, bendraujančių per TCP/IP? Juk kiekvienas iš jų turi laikrodį, o laikas turi būti tinkamas visiems. Šios problemos negalima apeiti be ntp.

Įsivaizduokime, kad viename pramoninės IT infrastruktūros segmente laikui bėgant kyla sunkumų sinchronizuojant paslaugas. Nedelsiant pradeda veikti įmonės programinės įrangos klasterio dėklas, suyra domenai, pagrindiniai ir budėjimo mazgai nesėkmingai stengiasi atkurti status quo.

Taip pat gali būti, kad užpuolikas sąmoningai bando sutrikdyti laiką per MiTM arba DDOS ataką. Tokioje situacijoje gali nutikti bet kas:

  • Vartotojo paskyrų slaptažodžių galiojimo laikas baigsis;
  • X.509 sertifikatai nustos galioti;
  • TOTP dviejų veiksnių autentifikavimas nustos veikti;
  • atsarginės kopijos pasens ir sistema jas ištrins;
  • DNSSec nutrūks.

Akivaizdu, kad patikimu laiko sinchronizavimo paslaugų veikimu suinteresuotas kiekvienas IT skyrius ir būtų malonu, jei jos būtų patikimos ir saugios pramoninėje veikloje.

Sulaužykite NTP per 25 minutes

Tinklo protokolai – tūkstantmečiai turi vieną ypatumą, jie buvo pasenusi ir jau niekam netinka, bet juos pakeisti nėra taip paprasta net tada, kai susikaupia kritinė entuziastų masė ir finansavimas.

Pagrindinis skundas dėl klasikinio NTP yra patikimų apsaugos nuo įsibrovėlių atakų mechanizmų trūkumas. Šią problemą buvo bandoma išspręsti įvairiais būdais. Norėdami tai pasiekti, pirmiausia įdiegėme iš anksto bendrinamo rakto (PSK) mechanizmą, skirtą keistis simetriniais raktais.

Deja, šis būdas nepasiteisino dėl paprastos priežasties – jis prastai plečiasi. Priklausomai nuo serverio, kliento pusėje reikalinga rankinė konfigūracija. Tai reiškia, kad tiesiog negalite pridėti kito kliento. Jei kas nors pasikeičia NTP serveryje, visi klientai turi būti sukonfigūruoti iš naujo.

Tada jie sugalvojo „AutoKey“, bet iškart atrado nemažai rimtų pažeidžiamumų pačiame algoritme ir turėjo jo atsisakyti. Reikalas tas, kad sėkloje yra tik 32 bitai, ji yra per maža ir neturi pakankamai skaičiavimo sudėtingumo priekiniam atakai.

  • Key ID – simetriškas 32 bitų raktas;
  • MAC (pranešimo autentifikavimo kodas) - NTP paketo kontrolinė suma;

Autokey apskaičiuojamas taip.

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

Kur H() yra kriptografinė maišos funkcija.

Ta pati funkcija naudojama paketų kontrolinei sumai apskaičiuoti.

MAC=H(Autokey||NTP packet)

Pasirodo, visas paketų patikrų vientisumas priklauso nuo slapukų autentiškumo. Kai juos turėsite, galėsite atkurti automatinį raktą ir sugadinti MAC. Tačiau NTP serveris juos generuodamas naudoja sėklą. Čia ir slypi laimikis.

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

Funkcija MSB_32 atskiria 5 reikšmingiausius bitus iš md32 maišos skaičiavimo rezultato. Kliento slapukas nesikeičia tol, kol serverio parametrai išlieka nepakitę. Tada užpuolikas gali atkurti tik pradinį numerį ir savarankiškai generuoti slapukus.

Pirmiausia turite prisijungti prie NTP serverio kaip kliento ir gauti slapukus. Po to, naudodamas brutalios jėgos metodą, užpuolikas atkuria pradinį skaičių pagal paprastą algoritmą.

Algoritmas, skirtas atakuoti pradinio skaičiaus skaičiavimą naudojant brute-force metodą.

   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 adresai žinomi, todėl belieka sukurti 2^32 maišą, kol sukurtas slapukas sutaps su gautu iš NTP serverio. Įprastoje namų stotyje su Intel Core i5 tai užtruks 25 minutes.

NTS – naujas Autokey

„Autokey“ su tokiomis saugumo spragomis susitaikyti buvo neįmanoma, o 2012 m nauja versija protokolas. Siekdami sukompromituoti pavadinimą, jie nusprendė pakeisti prekės ženklą, todėl Autokey v.2 buvo pavadintas Network Time Security.

NTS protokolas yra NTP saugos plėtinys ir šiuo metu palaiko tik vieno perdavimo režimą. Jis užtikrina stiprią kriptografinę apsaugą nuo manipuliavimo paketais, apsaugo nuo šnipinėjimo, gerai keičia mastelį, yra atsparus tinklo paketų praradimui ir užtikrina mažiausią tikslumo praradimą, patiriamą ryšio saugumo metu.

NTS ryšys susideda iš dviejų etapų, kuriuose naudojami žemesnio sluoksnio protokolai. Įjungta pirmasis Šiame etape klientas ir serveris susitaria dėl įvairių ryšio parametrų ir keičiasi slapukais su raktais su visais pridedamais duomenų rinkiniais. Įjungta antra Šiame etape faktinė apsaugota NTS sesija vyksta tarp kliento ir NTP serverio.

Kaip laiko sinchronizavimas tapo saugus

NTS susideda iš dviejų žemesnio sluoksnio protokolų: tinklo laiko saugos raktų mainų (NTS-KE), kuris inicijuoja saugų ryšį per TLS, ir NTPv4, naujausio NTP protokolo įsikūnijimo. Šiek tiek daugiau apie tai žemiau.

Pirmas etapas – NTS KE

Šiame etape NTP klientas inicijuoja TLS 1.2/1.3 seansą per atskirą TCP ryšį su NTS KE serveriu. Šios sesijos metu vyksta šie dalykai.

  • Šalys nustato parametrus AEAD Antrojo etapo algoritmas.
  • Šalys apibrėžia antrąjį žemesnio sluoksnio protokolą, tačiau šiuo metu palaikomas tik NTPv4.
  • Šalys nustato NTP serverio IP adresą ir prievadą.
  • NTS KE serveris išleidžia slapukus pagal NTPv4.
  • Šalys iš slapuko medžiagos išskiria porą simetriškų raktų (C2S ir S2C).

Šis metodas turi didelį pranašumą, kad visa slaptos informacijos, susijusios su ryšio parametrais, perdavimo našta tenka patikrintam ir patikimam TLS protokolui. Tai pašalina būtinybę iš naujo išradinėti savo ratą, kad būtų užtikrintas saugus NTP rankos paspaudimas.

Antras etapas – NTP su NTS apsauga

Antrame etape klientas saugiai sinchronizuoja laiką su NTP serveriu. Šiuo tikslu jis perduoda keturis specialius plėtinius (plėtimo laukus) NTPv4 paketų struktūroje.

  • Unikalaus identifikatoriaus plėtinyje yra atsitiktinis neįvykis, kad būtų išvengta pakartojimo atakų.
  • NTS slapukų plėtinyje yra vienas iš klientui prieinamų NTP slapukų. Kadangi tik klientas turi simetrinius AAED C2S ir S2C raktus, NTP serveris turi juos išgauti iš slapukų medžiagos.
  • NTS slapukų rezervavimo plėtinys yra būdas klientui prašyti papildomų slapukų iš serverio. Šis plėtinys yra būtinas norint užtikrinti, kad NTP serverio atsakymas būtų ne ilgesnis nei užklausa. Tai padeda išvengti stiprinimo atakų.
  • NTS autentifikavimo priemonė ir šifruotų plėtinių laukų plėtinys apima AAED šifrą su C2S raktu, NTP antraštę, laiko žymes ir aukščiau pateiktą EF kaip pridedamus duomenis. Be šio plėtinio galima suklastoti laiko žymas.

Kaip laiko sinchronizavimas tapo saugus

Gavęs užklausą iš kliento, serveris patikrina NTP paketo autentiškumą. Norėdami tai padaryti, jis turi iššifruoti slapukus, išgauti AAED algoritmą ir raktus. Sėkmingai patikrinęs NTP paketo galiojimą, serveris atsako klientui tokiu formatu.

  • Unikalaus identifikatoriaus plėtinys yra kliento užklausos veidrodinė kopija, priemonė nuo pakartojimo atakų.
  • NTS Cookie Extension daugiau slapukų, kad tęstų sesiją.
  • NTS autentifikavimo priemonė ir šifruotų plėtinių laukų plėtinys turi AEAD šifrą su S2C raktu.

Antrasis rankos paspaudimas gali būti kartojamas daug kartų, apeinant pirmąjį veiksmą, nes kiekviena užklausa ir atsakymas suteikia klientui papildomų slapukų. Tai turi pranašumą, nes santykinai daug resursų reikalaujančios PKI duomenų skaičiavimo ir perdavimo TLS operacijos yra padalintos iš kartotinių užklausų skaičiaus. Tai ypač patogu specializuotiems FPGA laikmačiams, kai visas pagrindinis funkcionalumas gali būti supakuotas į kelias funkcijas iš simetrinės kriptografijos srities, perkeliant visą TLS steką į kitą įrenginį.

NTPSec

Kuo ypatingas NTP? Nepaisant to, kad projekto autorius Dave'as Millsas stengėsi kuo geriau dokumentuoti savo kodą, tai retas programuotojas, kuris sugebės perprasti 35 metų senumo laiko sinchronizavimo algoritmų subtilybes. Dalis kodo buvo parašyti prieš POSIX erą, o Unix API tada labai skyrėsi nuo to, kas naudojama šiandien. Be to, norint išvalyti signalą nuo trukdžių triukšmingose ​​linijose, reikalingos žinios apie statistiką.

NTS nebuvo pirmasis bandymas ištaisyti NTP. Kai užpuolikai išmoko išnaudoti NTP pažeidžiamumą, kad sustiprintų DDoS atakas, tapo aišku, kad reikia radikalių pokyčių. O kol buvo rengiami ir baigiami rengti NTS projektai, JAV Nacionalinis mokslo fondas 2014 metų pabaigoje skubiai skyrė dotaciją NTP modernizavimui.

Darbo grupei vadovavo ne bet kas, o Erikas Stevenas Raymondas – vienas iš Atvirojo kodo bendruomenės įkūrėjų ir ramsčių bei knygos autorius Katedra ir turgus. Pirmas dalykas, kurį Ericas ir jo draugai bandė padaryti, buvo perkelti NTP kodą iš BitKeeper platformos į git, bet taip nepavyko. Projekto vadovas Harlanas Stennas nepritarė šiam sprendimui ir derybos įstrigo. Tada buvo nuspręsta suprojektuoti projekto kodą ir gimė NTPSec.

Didelė patirtis, įskaitant darbą su GPSD, matematinį pagrindą ir magiškus senovinio kodo skaitymo įgūdžius – Ericas Raymondas buvo būtent tas įsilaužėlis, kuris galėjo įgyvendinti tokį projektą. Komanda rado kodo perkėlimo specialistą ir vos per 10 savaičių NTP apsigyveno„GitLab“. Darbai įsibėgėjo.

Erico Raymondo komanda ėmėsi užduoties taip pat, kaip Auguste'as Rodinas su akmens luitu. Pašalinus 175 KLOC senojo kodo, jie sugebėjo žymiai sumažinti atakos paviršių, uždarydami daugybę saugumo spragų.

Čia yra neišsamus į platinimą įtrauktų asmenų sąrašas:

  • Nedokumentuotas, pasenęs, pasenęs arba sugedęs refclock.
  • Nenaudojama ICS biblioteka.
  • libopts/autogen.
  • Senas kodas, skirtas windows.
  • ntpdc.
  • Autokey.
  • ntpq C kodas buvo perrašytas Python.
  • Sntp/ntpdig C kodas buvo perrašytas Python.

Be kodo valymo, projektas turėjo ir kitų užduočių. Čia yra dalinis pasiekimų sąrašas:

  • Kodo apsauga nuo buferio perpildymo buvo žymiai patobulinta. Siekiant išvengti buferio perpildymo, visos nesaugios eilutės funkcijos (strcpy/strcat/strtok/sprintf/vsprintf/gets) buvo pakeistos saugiomis versijomis, kurios įgyvendina buferio dydžio apribojimus.
  • Pridėtas NTS palaikymas.
  • Patobulintas laiko žingsnio tikslumas dešimt kartų, susiejant fizinę aparatinę įrangą. Taip yra dėl to, kad šiuolaikiniai kompiuterių laikrodžiai tapo daug tikslesni nei tie, kai gimė NTP. Didžiausią naudą iš to gavo GPSDO ir tam skirto laiko radijo imtuvai.
  • Programavimo kalbų skaičius sumažintas iki dviejų. Vietoj Perl, awk ir net S scenarijų dabar viskas yra Python. Dėl šios priežasties yra daugiau galimybių pakartotinai naudoti kodą.
  • Vietoj „autotools“ scenarijų makaronų projekte buvo pradėta naudoti programinės įrangos kūrimo sistema WAF.
  • Atnaujinta ir pertvarkyta projektinė dokumentacija. Iš prieštaringo ir kartais archajiško dokumentų rinkinio jie sukūrė gana priimtiną dokumentaciją. Kiekvienas komandinės eilutės jungiklis ir kiekvienas konfigūracijos objektas dabar turi vieną tiesos versiją. Be to, man puslapiai ir žiniatinklio dokumentacija dabar kuriami iš tų pačių pagrindinių failų.

NTPSec galima naudoti daugeliui Linux platinimų. Šiuo metu naujausia stabili versija yra 1.1.8, Gentoo Linux – priešpaskutinė.

(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

Buvo dar vienas bandymas pakeisti senąjį NTP saugesne alternatyva. Chrony, skirtingai nei NTPSec, yra parašytas nuo pat pradžių ir sukurtas patikimai veikti įvairiomis sąlygomis, įskaitant nestabilius tinklo ryšius, dalinį tinklo prieinamumą arba perkrovą ir temperatūros pokyčius. Be to, chronis turi ir kitų privalumų:

  • chrony gali greičiau ir tiksliau sinchronizuoti sistemos laikrodį;
  • chrony yra mažesnis, sunaudoja mažiau atminties ir pasiekia procesorių tik tada, kai reikia. Tai didelis pliusas taupant išteklius ir energiją;
  • „chrony“ palaiko „Linux“ aparatinės įrangos laiko žymes, leidžiančias itin tiksliai sinchronizuoti vietiniuose tinkluose.

Tačiau chrony neturi kai kurių senojo NTP funkcijų, pvz., transliavimo ir daugialypės siuntimo kliento / serverio. Be to, klasikinis NTP palaiko didesnį skaičių operacinių sistemų ir platformų.

Norėdami išjungti serverio ir NTP užklausų chronyd procesui funkcionalumą, tiesiog įrašykite 0 prievadą į chrony.conf failą. Tai daroma tais atvejais, kai nereikia skirti laiko NTP klientams ar kolegoms. Nuo 2.0 versijos NTP serverio prievadas atidaromas tik tada, kai prieiga yra leidžiama pagal leidimo direktyvą arba atitinkamą komandą, arba sukonfigūruotas NTP lygiavertis partneris arba naudojama transliavimo direktyva.

Programa susideda iš dviejų modulių.

  • chronyd yra paslauga, kuri veikia fone. Jis gauna informaciją apie skirtumą tarp sistemos laikrodžio ir išorinio laiko serverio ir koreguoja vietinį laiką. Jis taip pat įgyvendina NTP protokolą ir gali veikti kaip klientas arba serveris.
  • chronyc yra komandų eilutės įrankis, skirtas programų stebėjimui ir valdymui. Naudojamas įvairiems paslaugų parametrams patikslinti, pavyzdžiui, leidžiant pridėti arba pašalinti NTP serverius, kol chronyd ir toliau veikia.

Nuo 7 RedHat Linux versijos naudoja chrony kaip laiko sinchronizavimo paslauga. Paketas taip pat prieinamas kitiems Linux platinimams. Naujausia stabili versija yra 3.5, ruošiama v4.0 išleidimui.

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

Kaip nustatyti savo nuotolinį chrony serverį internete, kad būtų galima sinchronizuoti laiką biuro tinkle. Žemiau pateikiamas VPS nustatymo pavyzdys.

Chrony nustatymo RHEL / CentOS VPS pavyzdys

Dabar šiek tiek pasitreniruokime ir sukurkime savo NTP serverį VPS. Tai labai paprasta, tiesiog pasirinkite atitinkamą tarifą RuVDS svetainėje, gaukite paruoštą serverį ir įveskite keliolika paprastų komandų. Mūsų tikslams ši parinktis yra gana tinkama.

Kaip laiko sinchronizavimas tapo saugus

Pereikime prie paslaugos nustatymo ir pirmiausia įdiekite chrony paketą.

[root@server ~]$ yum install chrony

RHEL 8 / CentOS 8 naudoja kitą paketų tvarkyklę.

[root@server ~]$ dnf install chrony

Įdiegę chrony, turite paleisti ir suaktyvinti paslaugą.

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

Jei norite, galite pakeisti /etc/chrony.conf, pakeisdami NPT serverius artimiausiais vietiniais, kad sumažintumėte atsako laiką.

# 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

Tada nustatome NTP serverio sinchronizavimą su mazgais iš nurodyto telkinio.

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

Taip pat būtina atidaryti NTP prievadą į išorę, kitaip ugniasienė blokuos įeinančius ryšius iš kliento mazgų.

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

Kliento pusėje pakanka teisingai nustatyti laiko juostą.

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

Failas /etc/chrony.conf nurodo mūsų VPS serverio, kuriame veikia NTP serverio chrony, IP arba pagrindinio kompiuterio pavadinimą.

server my.vps.server

Ir galiausiai, kliento laiko sinchronizavimo pradžia.

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

Kitą kartą papasakosiu, kokios yra galimybės sinchronizuoti laiką be interneto.

Kaip laiko sinchronizavimas tapo saugus

Kaip laiko sinchronizavimas tapo saugus

Šaltinis: www.habr.com

Добавить комментарий