Kā laika sinhronizācija kļuva droša

Kā laika sinhronizācija kļuva droša
Kā pārliecināties, ka laiks pats par sevi nemelo, ja jums ir miljons lielu un mazu ierīču, kas sazinās, izmantojot TCP/IP? Galu galā katram no tiem ir pulkstenis, un laikam jābūt pareizam visiem. Šo problēmu nevar apiet bez ntp.

Uz brīdi iedomāsimies, ka vienā industriālās IT infrastruktūras segmentā ir grūtības ar pakalpojumu sinhronizāciju laika gaitā. Tūlīt uzņēmuma programmatūras klasteru steks sāk sabojāt, domēni sadalās, galvenie un gaidstāves mezgli neveiksmīgi cenšas atjaunot status quo.

Iespējams arī, ka uzbrucējs apzināti mēģina traucēt laiku, izmantojot MiTM vai DDOS uzbrukumu. Šādā situācijā var notikt jebkas:

  • Lietotāja kontu paroles beigsies;
  • X.509 sertifikātu derīguma termiņš beigsies;
  • TOTP divu faktoru autentifikācija pārtrauks darboties;
  • dublējumkopijas kļūs novecojušas, un sistēma tās izdzēsīs;
  • DNSSec pārtrūks.

Skaidrs, ka ikviena IT nodaļa ir ieinteresēta uzticamā laika sinhronizācijas pakalpojumu darbībā, un būtu jauki, ja tie būtu uzticami un droši rūpnieciskajā darbībā.

Pārtrauciet NTP 25 minūtēs

Tīkla protokoli - tūkstošgadniekiem ir viena īpatnība, tie ir bijuši novecojis un vairs nekam neder, bet tos nomainīt nav tik vienkārši pat tad, kad ir uzkrāta kritiskā entuziastu masa un finansējums.

Galvenā sūdzība par klasisko NTP ir uzticamu mehānismu trūkums aizsardzībai pret iebrucēju uzbrukumiem. Ir veikti dažādi mēģinājumi šo problēmu atrisināt. Lai to panāktu, mēs vispirms ieviesām iepriekš koplietoto atslēgu (PSK) mehānismu simetrisko atslēgu apmaiņai.

Diemžēl šī metode neatmaksājās vienkārša iemesla dēļ – tā nav labi mērogojama. Atkarībā no servera klienta pusē ir nepieciešama manuāla konfigurācija. Tas nozīmē, ka jūs vienkārši nevarat pievienot citu klientu tāpat vien. Ja kaut kas mainās NTP serverī, visi klienti ir jāpārkonfigurē.

Tad viņi nāca klajā ar AutoKey, taču viņi uzreiz atklāja vairākas nopietnas ievainojamības paša algoritma izstrādē, un viņiem nācās no tā atteikties. Lieta tāda, ka sēklā ir tikai 32 biti, tas ir pārāk mazs un nesatur pietiekamu skaitļošanas sarežģītību frontālam uzbrukumam.

  • Key ID - simetriska 32 bitu atslēga;
  • MAC (ziņojuma autentifikācijas kods) - NTP pakešu kontrolsumma;

Autokey tiek aprēķināts šādi.

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

Kur H() ir kriptogrāfiska jaucējfunkcija.

Tāda pati funkcija tiek izmantota, lai aprēķinātu pakešu kontrolsummu.

MAC=H(Autokey||NTP packet)

Izrādās, ka visa paku pārbaužu integritāte ir atkarīga no sīkfailu autentiskuma. Kad tie ir iegūti, varat atjaunot automātisko atslēgu un pēc tam viltot MAC. Tomēr NTP serveris tos ģenerējot izmanto sēklu. Šeit slēpjas loms.

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

Funkcija MSB_32 nogriež 5 nozīmīgākos bitus no md32 hash aprēķina rezultāta. Klienta sīkfails nemainās, kamēr servera parametri paliek nemainīgi. Tad uzbrucējs var atjaunot tikai sākotnējo numuru un patstāvīgi ģenerēt sīkfailus.

Pirmkārt, jums ir jāpievienojas NTP serverim kā klientam un jāsaņem sīkfaili. Pēc tam, izmantojot brutālā spēka metodi, uzbrucējs pēc vienkārša algoritma atjauno sākotnējo numuru.

Algoritms uzbrukumam sākotnējā skaitļa aprēķināšanai, izmantojot brutālā spēka metodi.

   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 adreses ir zināmas, tāpēc atliek tikai izveidot 2^32 jaucējus, līdz izveidotais sīkfails sakrīt ar to, kas saņemts no NTP servera. Parastā mājas stacijā ar Intel Core i5 tas prasīs 25 minūtes.

NTS - jauns Autokey

Ar šādiem drošības caurumiem Autokey nebija iespējams samierināties, un 2012. gadā tas parādījās jauna versija protokols. Lai apdraudētu nosaukumu, viņi nolēma mainīt zīmolu, tāpēc Autokey v.2 tika nosaukts par Network Time Security.

NTS protokols ir NTP drošības paplašinājums un pašlaik atbalsta tikai unicast režīmu. Tas nodrošina spēcīgu kriptogrāfisku aizsardzību pret pakešu manipulācijām, novērš snooping, labi mērogojas, ir izturīgs pret tīkla pakešu zudumu un rada vismazāko precizitātes zudumu, kas rodas savienojuma drošības laikā.

NTS savienojums sastāv no diviem posmiem, kuros tiek izmantoti zemāka slāņa protokoli. Ieslēgts pirmais Šajā posmā klients un serveris vienojas par dažādiem savienojuma parametriem un apmainās ar sīkdatnēm, kas satur atslēgas ar visu pievienoto datu kopu. Ieslēgts otrais Šajā posmā faktiskā aizsargātā NTS sesija notiek starp klientu un NTP serveri.

Kā laika sinhronizācija kļuva droša

NTS sastāv no diviem zemāka slāņa protokoliem: Network Time Security Key Exchange (NTS-KE), kas iniciē drošu savienojumu, izmantojot TLS, un NTPv4, jaunāko NTP protokola iemiesojumu. Nedaudz vairāk par to zemāk.

Pirmais posms - NTS KE

Šajā posmā NTP klients sāk TLS 1.2/1.3 sesiju, izmantojot atsevišķu TCP savienojumu ar NTS KE serveri. Šīs sesijas laikā notiek sekojošais.

  • Puses nosaka parametrus AEAD algoritms otrajam posmam.
  • Puses definē otru zemākā slāņa protokolu, taču šobrīd tiek atbalstīts tikai NTPv4.
  • Puses nosaka NTP servera IP adresi un portu.
  • NTS KE serveris izdod sīkfailus saskaņā ar NTPv4.
  • Puses no sīkfaila materiāla iegūst simetrisku atslēgu pāri (C2S un S2C).

Šai pieejai ir liela priekšrocība, ka viss slepenās informācijas pārsūtīšanas slogs attiecībā uz savienojuma parametriem gulstas uz pārbaudīto un uzticamo TLS protokolu. Tas novērš nepieciešamību no jauna izgudrot savu riteni, lai nodrošinātu drošu NTP rokasspiedienu.

Otrais posms - NTP ar NTS aizsardzību

Otrajā darbībā klients droši sinhronizē laiku ar NTP serveri. Šim nolūkam tas pārraida četrus īpašus paplašinājumus (paplašinājuma laukus) NTPv4 pakešu struktūrā.

  • Unikālā identifikatora paplašinājumā ir ietverts nejaušs notikums, lai novērstu atkārtošanas uzbrukumus.
  • NTS sīkfailu paplašinājums satur vienu no klientam pieejamajiem NTP sīkfailiem. Tā kā tikai klientam ir simetriskas AAED C2S un S2C atslēgas, NTP serverim tās ir jāizņem no sīkfaila materiāla.
  • NTS sīkfailu viettura paplašinājums ir veids, kā klients var pieprasīt papildu sīkfailus no servera. Šis paplašinājums ir nepieciešams, lai nodrošinātu, ka NTP servera atbilde nav daudz garāka par pieprasījumu. Tas palīdz novērst pastiprināšanas uzbrukumus.
  • NTS autentifikators un šifrēto paplašinājumu lauku paplašinājums satur AAED šifru ar C2S atslēgu, NTP galveni, laikspiedoliem un iepriekš minēto EF kā pavaddatus. Bez šī paplašinājuma ir iespējams viltot laikspiedolus.

Kā laika sinhronizācija kļuva droša

Saņemot pieprasījumu no klienta, serveris pārbauda NTP paketes autentiskumu. Lai to izdarītu, viņam ir jāatšifrē sīkfaili, jāizņem AAED algoritms un atslēgas. Pēc veiksmīgas NTP paketes derīguma pārbaudes serveris atbild klientam šādā formātā.

  • Unikālā identifikatora paplašinājums ir klienta pieprasījuma spoguļkopija, pasākums pret atkārtošanas uzbrukumiem.
  • NTS Cookie Extension vairāk sīkfailu, lai turpinātu sesiju.
  • NTS autentifikatora un šifrēto paplašinājumu lauku paplašinājums satur AEAD šifru ar S2C atslēgu.

Otro rokasspiedienu var atkārtot daudzas reizes, apejot pirmo soli, jo katrs pieprasījums un atbilde klientam piešķir papildu sīkfailus. Tam ir priekšrocība, ka salīdzinoši resursietilpīgās PKI datu aprēķināšanas un pārsūtīšanas TLS darbības tiek dalītas ar atkārtoto pieprasījumu skaitu. Tas ir īpaši ērti specializētiem FPGA hronometriem, kad visu galveno funkcionalitāti var iepakot vairākās funkcijās no simetriskās kriptogrāfijas jomas, pārnesot visu TLS steku uz citu ierīci.

NTPSec

Kas ir īpašs NTP? Neskatoties uz to, ka projekta autors Deivs Mills centās pēc iespējas labāk dokumentēt savu kodu, tas ir retais programmētājs, kurš spēs izprast 35 gadus veco laika sinhronizācijas algoritmu smalkumus. Daļa koda tika uzrakstīta pirms POSIX laikmeta, un toreiz Unix API ļoti atšķīrās no mūsdienās izmantotā. Turklāt ir nepieciešamas zināšanas par statistiku, lai attīrītu signālu no traucējumiem trokšņainās līnijās.

NTS nebija pirmais mēģinājums labot NTP. Kad uzbrucēji iemācījās izmantot NTP ievainojamības, lai pastiprinātu DDoS uzbrukumus, kļuva skaidrs, ka ir nepieciešamas radikālas izmaiņas. Un, kamēr tika gatavoti un pabeigti NTS projekti, ASV Nacionālais zinātnes fonds 2014. gada beigās steidzami piešķīra grantu NTP modernizācijai.

Darba grupu vadīja ne viens vien, bet gan Ēriks Stīvens Raimonds - viens no Open Source kopienas dibinātājiem un pīlāriem un grāmatas autore Katedrāle un tirgus. Pirmā lieta, ko Ēriks un viņa draugi mēģināja darīt, bija pārvietot NTP kodu no BitKeeper platformas uz git, taču tas neizdevās. Projekta vadītājs Harlans Stenns bija pret šo lēmumu, un sarunas apstājās. Tad tika nolemts izveidot projekta kodu, un radās NTPSec.

Liela pieredze, tostarp darbs pie GPSD, matemātiskais pamats un maģiska prasme lasīt seno kodu — Ēriks Raimonds bija tieši tas hakeris, kurš varēja īstenot šādu projektu. Komanda atrada kodu migrācijas speciālistu un tikai 10 nedēļu laikā NTP apmetāsvietnē GitLab. Darbs ritēja pilnā sparā.

Ērika Raimonda komanda uzņēmās uzdevumu tāpat kā Ogists Rodins ar akmens bluķi. Noņemot 175 KLOC vecā koda, viņi spēja ievērojami samazināt uzbrukuma virsmu, aizverot daudzas drošības caurumus.

Šeit ir nepilnīgs izplatīšanā iekļauto saraksts:

  • Nedokumentēts, novecojis, novecojis vai bojāts refclock.
  • Neizmantota ICS bibliotēka.
  • libopts/autogēns.
  • Vecs Windows kods.
  • ntpdc.
  • Autokey.
  • Ntpq C kods ir pārrakstīts Python.
  • Sntp/ntpdig C kods ir pārrakstīts programmā Python.

Papildus koda tīrīšanai projektam bija arī citi uzdevumi. Šeit ir daļējs sasniegumu saraksts:

  • Koda aizsardzība pret bufera pārpildīšanu ir ievērojami uzlabota. Lai novērstu bufera pārpildes, visas nedrošās virknes funkcijas (strcpy/strcat/strtok/sprintf/vsprintf/gets) ir aizstātas ar drošām versijām, kas ievieš bufera lieluma ierobežojumus.
  • Pievienots NTS atbalsts.
  • Uzlabota laika soļu precizitāte desmitkārtīgi, savienojot fizisko aparatūru. Tas ir saistīts ar faktu, ka mūsdienu datoru pulksteņi ir kļuvuši daudz precīzāki nekā tie, kad piedzima NTP. Lielākie ieguvēji no tā bija GPSDO un īpaša laika radio.
  • Programmēšanas valodu skaits ir samazināts līdz divām. Perl, awk un pat S skriptu vietā tagad viss ir Python. Sakarā ar to ir vairāk iespēju koda atkārtotai izmantošanai.
  • Autotools skriptu nūdeles vietā projektā sāka izmantot programmatūras veidošanas sistēmu WAF.
  • Atjaunota un reorganizēta projekta dokumentācija. No pretrunīga un dažkārt arhaiska dokumentu krājuma viņi izveidoja diezgan caurlaidīgu dokumentāciju. Katram komandrindas slēdzim un katrai konfigurācijas entītijai tagad ir viena patiesības versija. Turklāt man lapas un tīmekļa dokumentācija tagad tiek izveidotas no tiem pašiem pamatdatnēm.

NTPSec ir pieejams vairākiem Linux izplatījumiem. Šobrīd jaunākā stabilā versija ir 1.1.8, Gentoo Linux tā ir priekšpēdējā.

(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

Bija vēl viens mēģinājums aizstāt veco NTP ar drošāku alternatīvu. Chrony, atšķirībā no NTPSec, ir rakstīts no paša sākuma un ir paredzēts uzticamai darbībai dažādos apstākļos, tostarp nestabilos tīkla savienojumos, daļēja tīkla pieejamības vai pārslodzes gadījumā un temperatūras izmaiņām. Turklāt hronijai ir arī citas priekšrocības:

  • chrony var ātrāk sinhronizēt sistēmas pulksteni ar lielāku precizitāti;
  • chrony ir mazāks, patērē mazāk atmiņas un piekļūst centrālajam procesoram tikai tad, kad tas ir nepieciešams. Tas ir liels pluss resursu un enerģijas taupīšanai;
  • chrony atbalsta aparatūras laikspiedolus operētājsistēmā Linux, nodrošinot ārkārtīgi precīzu sinhronizāciju lokālajos tīklos.

Tomēr chrony trūkst dažu vecā NTP funkciju, piemēram, apraides un multiraides klienta/servera. Turklāt klasiskais NTP atbalsta lielāku skaitu operētājsistēmu un platformu.

Lai atspējotu servera funkcionalitāti un NTP pieprasījumus chronyd procesam, failā chrony.conf ierakstiet portu 0. Tas tiek darīts gadījumos, kad nav nepieciešams uzturēt laiku NTP klientiem vai vienaudžiem. Kopš versijas 2.0 NTP servera ports ir atvērts tikai tad, ja piekļuvi atļauj atļauja direktīva vai atbilstoša komanda vai ir konfigurēts NTP vienādrangs vai tiek izmantota apraides direktīva.

Programma sastāv no diviem moduļiem.

  • chronyd ir pakalpojums, kas darbojas fonā. Tā saņem informāciju par atšķirību starp sistēmas pulksteni un ārējo laika serveri un pielāgo vietējo laiku. Tas arī ievieš NTP protokolu un var darboties kā klients vai serveris.
  • chronyc ir komandrindas utilīta programmu uzraudzībai un kontrolei. Izmanto dažādu pakalpojumu parametru precizēšanai, piemēram, ļaujot pievienot vai noņemt NTP serverus, kamēr chronyd turpina darboties.

Kopš RedHat Linux 7. versijas izmanto chrony kā laika sinhronizācijas pakalpojums. Pakete ir pieejama arī citiem Linux izplatījumiem. Jaunākā stabilā versija ir 3.5, kas gatavojas v4.0 izlaišanai.

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

Kā iestatīt savu attālo Chrony serveri internetā, lai sinhronizētu laiku biroja tīklā. Tālāk ir sniegts VPS iestatīšanas piemērs.

Piemērs Chrony iestatīšanai RHEL / CentOS VPS

Tagad nedaudz trenēsimies un iestatīsim savu NTP serveri VPS. Tas ir ļoti vienkārši, vienkārši izvēlieties atbilstošo tarifu RuVDS vietnē, iegūstiet gatavu serveri un ierakstiet duci vienkāršu komandu. Mūsu vajadzībām šī opcija ir diezgan piemērota.

Kā laika sinhronizācija kļuva droša

Pāriesim pie pakalpojuma iestatīšanas un vispirms instalēsim chrony pakotni.

[root@server ~]$ yum install chrony

RHEL 8 / CentOS 8 izmanto citu pakotņu pārvaldnieku.

[root@server ~]$ dnf install chrony

Pēc chrony instalēšanas jums jāsāk un jāaktivizē pakalpojums.

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

Ja vēlaties, varat veikt izmaiņas failā /etc/chrony.conf, aizstājot NPT serverus ar tuvākajiem lokālajiem serveriem, lai samazinātu reakcijas laiku.

# 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

Tālāk mēs iestatām NTP servera sinhronizāciju ar mezgliem no norādītā pūla.

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

Tāpat ir nepieciešams atvērt NTP portu uz ārpusi, pretējā gadījumā ugunsmūris bloķēs ienākošos savienojumus no klienta mezgliem.

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

Klienta pusē pietiek pareizi iestatīt laika joslu.

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

Fails /etc/chrony.conf norāda mūsu VPS servera, kurā darbojas NTP servera chrony, IP vai resursdatora nosaukumu.

server my.vps.server

Un visbeidzot, klienta laika sinhronizācijas sākšana.

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

Nākamajā reizē es jums pastāstīšu, kādas ir iespējas sinhronizēt laiku bez interneta.

Kā laika sinhronizācija kļuva droša

Kā laika sinhronizācija kļuva droša

Avots: www.habr.com

Pievieno komentāru