Hoe tydsinchronisasie veilig geword het

Hoe tydsinchronisasie veilig geword het
Hoe om seker te maak dat tyd per se nie lê as jy 'n miljoen groot en klein toestelle het wat via TCP/IP kommunikeer nie? Elkeen van hulle het immers 'n horlosie, en die tyd moet vir almal korrek wees. Hierdie probleem kan nie sonder ntp omseil word nie.

Kom ons verbeel ons vir 'n oomblik dat daar in een segment van die industriële IT-infrastruktuur probleme is met die sinchronisering van dienste oor tyd. Onmiddellik begin die clusterstapel Enterprise-sagteware misluk, domeine disintegreer, meesters en Standby-nodusse streef onsuksesvol daarna om die status quo te herstel.

Dit is ook moontlik dat 'n aanvaller doelbewus probeer om die tyd te ontwrig deur 'n MiTM- of DDOS-aanval. In so 'n situasie kan enigiets gebeur:

  • Gebruikersrekeningwagwoorde sal verval;
  • X.509-sertifikate sal verval;
  • TOTP-tweefaktor-verifikasie sal ophou werk;
  • rugsteune sal verouderd raak en die stelsel sal dit uitvee;
  • DNSSec sal breek.

Dit is duidelik dat elke IT-afdeling belangstel in die betroubare werking van tydsinchronisasiedienste, en dit sal lekker wees as dit betroubaar en veilig is in industriële bedryf.

Breek NTP in 25 minute

Netwerkprotokolle - millennials het een eienaardigheid, hulle was verouderd en is vir niks meer goed nie, maar om hulle te vervang is nie so maklik nie, selfs wanneer 'n kritieke massa entoesiaste en befondsing opgehoop word.

Die belangrikste klagte oor klassieke NTP is die gebrek aan betroubare meganismes om teen aanvalle deur indringers te beskerm. Verskeie pogings is aangewend om hierdie probleem op te los. Om dit te bereik, het ons eers 'n voorafgedeelde sleutel (PSK) meganisme geïmplementeer vir die uitruil van simmetriese sleutels.

Ongelukkig het hierdie metode om 'n eenvoudige rede nie vrugte afgewerp nie - dit skaal nie goed nie. Handmatige konfigurasie word vereis aan die kliëntkant, afhangende van die bediener. Dit beteken dat jy eenvoudig nie 'n ander kliënt net so kan byvoeg nie. As iets op die NTP-bediener verander, moet alle kliënte herkonfigureer word.

Toe het hulle met AutoKey vorendag gekom, maar hulle het dadelik 'n aantal ernstige kwesbaarhede in die ontwerp van die algoritme self ontdek en hulle moes dit laat vaar. Die ding is dat die saad slegs 32-bis bevat, dit is te klein en bevat nie genoeg berekeningskompleksiteit vir 'n frontale aanval nie.

  • Sleutel ID - simmetriese 32-bis sleutel;
  • MAC (boodskap verifikasie kode) - NTP pakkie kontrolesom;

Outosleutel word soos volg bereken.

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

Waar H() 'n kriptografiese hash-funksie is.

Dieselfde funksie word gebruik om die kontrolesom van pakkies te bereken.

MAC=H(Autokey||NTP packet)

Dit blyk dat die hele integriteit van pakkettjeks op die egtheid van die koekies berus. Sodra jy dit het, kan jy die outosleutel herstel en dan die MAC bedrieg. Die NTP-bediener gebruik egter 'n saad wanneer dit gegenereer word. Dit is waar die vangs lê.

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

Die MSB_32-funksie sny die 5 mees betekenisvolle bisse van die md32-hash-berekeningsresultaat af. Die kliëntkoekie verander nie solank die bedienerparameters onveranderd bly nie. Dan kan die aanvaller net die aanvanklike nommer herstel en in staat wees om onafhanklik koekies te genereer.

Eerstens moet u as 'n kliënt aan die NTP-bediener koppel en koekies ontvang. Hierna herstel die aanvaller die aanvanklike getal met behulp van 'n brute force metode volgens 'n eenvoudige algoritme.

Algoritme vir die aanval van die berekening van die aanvanklike getal met behulp van die brute-force metode.

   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

Die IP-adresse is bekend, so al wat oorbly is om 2^32 hashes te skep totdat die geskepde koekie ooreenstem met die een wat van die NTP-bediener ontvang is. Op 'n gewone tuisstasie met Intel Core i5 sal dit 25 minute neem.

NTS - nuwe outosleutel

Dit was onmoontlik om sulke sekuriteitsgate in Autokey te verduur, en in 2012 het dit verskyn 'n nuwe weergawe protokol. Om die naam in die gedrang te bring, het hulle besluit om die handelsmerk te verander, so Autokey v.2 is Network Time Security genoem.

Die NTS-protokol is 'n uitbreiding van NTP-sekuriteit en ondersteun tans slegs unicast-modus. Dit bied sterk kriptografiese beskerming teen pakkiemanipulasie, voorkom snuffel, skaal goed, is veerkragtig teen netwerkpakketverlies, en lei tot die minste hoeveelheid presisieverlies wat tydens verbindingsekuriteit aangegaan word.

'n NTS-verbinding bestaan ​​uit twee fases wat laerlaagprotokolle gebruik. Aan die eerste Op hierdie stadium stem die kliënt en bediener ooreen oor verskeie verbindingsparameters en ruil koekies uit wat sleutels bevat met al die gepaardgaande datastel. Aan tweede Op hierdie stadium vind die werklike beskermde NTS-sessie tussen die kliënt en die NTP-bediener plaas.

Hoe tydsinchronisasie veilig geword het

NTS bestaan ​​uit twee laer-laag protokolle: Network Time Security Key Exchange (NTS-KE), wat 'n veilige verbinding oor TLS inisieer, en NTPv4, die nuutste inkarnasie van die NTP-protokol. 'n Bietjie meer hieroor hieronder.

Eerste fase - NTS KE

Op hierdie stadium begin die NTP-kliënt 'n TLS 1.2/1.3-sessie oor 'n aparte TCP-verbinding met die NTS KE-bediener. Tydens hierdie sessie gebeur die volgende.

  • Die partye bepaal die parameters VOORAF algoritme vir die tweede fase.
  • Die partye definieer 'n tweede laer-laag protokol, maar op die oomblik word slegs NTPv4 ondersteun.
  • Die partye bepaal die IP-adres en poort van die NTP-bediener.
  • NTS KE-bediener reik koekies uit onder NTPv4.
  • Die partye onttrek 'n paar simmetriese sleutels (C2S en S2C) uit die koekiemateriaal.

Hierdie benadering het die groot voordeel dat die hele las van die oordrag van geheime inligting rakende verbindingsparameters op die bewese en betroubare TLS-protokol val. Dit skakel die behoefte uit om jou eie wiel te herontdek vir 'n veilige NTP-handdruk.

Tweede fase - NTP onder NTS-beskerming

In die tweede stap sinchroniseer die kliënt die tyd veilig met die NTP-bediener. Vir hierdie doel stuur dit vier spesiale uitbreidings (uitbreidingsvelde) in die NTPv4-pakkiestruktuur.

  • Die Unique Identifier Extension bevat 'n ewekansige nonce om herhalingsaanvalle te voorkom.
  • NTS-koekie-uitbreiding bevat een van die NTP-koekies wat aan die kliënt beskikbaar is. Aangesien slegs die kliënt die simmetriese AAED C2S- en S2C-sleutels het, moet die NTP-bediener dit uit die koekiemateriaal onttrek.
  • NTS Cookie Placeholder Extension is 'n manier vir 'n kliënt om bykomende koekies vanaf die bediener aan te vra. Hierdie uitbreiding is nodig om te verseker dat die NTP-bediener se reaksie nie veel langer as die versoek is nie. Dit help om versterkingsaanvalle te voorkom.
  • NTS Authenticator en Encrypted Extension Fields-uitbreiding bevat die AAED-syfer met die C2S-sleutel, NTP-kopskrif, tydstempels en die bogenoemde EF as gepaardgaande data. Sonder hierdie uitbreiding is dit moontlik om tydstempels te bedrieg.

Hoe tydsinchronisasie veilig geword het

By ontvangs van 'n versoek van 'n kliënt, verifieer die bediener die egtheid van die NTP-pakkie. Om dit te doen, moet hy die koekies dekripteer, die AAED-algoritme en sleutels onttrek. Nadat die NTP-pakkie suksesvol gekontroleer is vir geldigheid, reageer die bediener op die kliënt in die volgende formaat.

  • Unique Identifier Extension is 'n spieëlkopie van die kliëntversoek, 'n maatreël teen herhalingsaanvalle.
  • NTS-koekie-uitbreiding meer koekies om die sessie voort te sit.
  • NTS Authenticator en Encrypted Extension Fields-uitbreiding bevat die AEAD-syfer met 'n S2C-sleutel.

Die tweede handdruk kan baie keer herhaal word en die eerste stap omseil, aangesien elke versoek en antwoord die kliënt bykomende koekies gee. Dit het die voordeel dat die relatief hulpbron-intensiewe TLS-bewerkings van die berekening en oordrag van PKI-data gedeel word deur die aantal herhaalde versoeke. Dit is veral gerieflik vir gespesialiseerde FPGA-tydhouers, wanneer al die hooffunksies in verskeie funksies verpak kan word vanaf die veld van simmetriese kriptografie, wat die hele TLS-stapel na 'n ander toestel oordra.

NTPSec

Wat is spesiaal aan NTP? Ten spyte van die feit dat die skrywer van die projek, Dave Mills, probeer het om sy kode so goed moontlik te dokumenteer, is dit 'n seldsame programmeerder wat die verwikkeldheid van tydsinchronisasiealgoritmes wat 35 jaar oud is, sal kan verstaan. Sommige van die kode is voor die POSIX-era geskryf, en die Unix API was destyds baie anders as wat vandag gebruik word. Daarbenewens is kennis van statistiek nodig om die sein van steuring op raserige lyne skoon te maak.

NTS was nie die eerste poging om NTP reg te stel nie. Sodra aanvallers geleer het om NTP-kwesbaarhede te ontgin om DDoS-aanvalle te versterk, het dit duidelik geword dat radikale veranderinge nodig was. En terwyl die NTS-konsepte voorberei en afgehandel is, het die Amerikaanse Nasionale Wetenskapstigting aan die einde van 2014 dringend 'n toekenning vir die modernisering van NTP toegeken.

Die werkgroep is nie deur net enigiemand gelei nie, maar Eric Steven Raymond - een van die stigters en pilare van die Open Source gemeenskap en skrywer van die boek Katedraal en Basaar. Die eerste ding wat Eric en sy vriende probeer doen het, was om die NTP-kode van die BitKeeper-platform na git te skuif, maar dit het nie so uitgewerk nie. Projekleier Harlan Stenn was teen hierdie besluit en onderhandelinge het vasgeval. Toe is daar besluit om die projekkode te vurk, en NTPSec is gebore.

Soliede ervaring, insluitend werk op GPSD, 'n wiskundige agtergrond en die magiese vaardigheid om antieke kode te lees - Eric Raymond was presies die hacker wat so 'n projek kon regkry. Die span het 'n kode-migrasiespesialis gevind en binne net 10 weke NTP afgehandelop GitLab. Werk was in volle swang.

Eric Raymond se span het die taak op dieselfde manier aangepak as wat Auguste Rodin met 'n blok klip gedoen het. Deur 175 KLOC van ou kode te verwyder, kon hulle die aanvaloppervlak aansienlik verminder deur baie sekuriteitsgate toe te maak.

Hier is 'n onvolledige lys van diegene wat in die verspreiding ingesluit is:

  • Ongedokumenteerde, verouderde, verouderde of stukkende herklok.
  • Ongebruikte ICS-biblioteek.
  • libopts/outogen.
  • Ou kode vir Windows.
  • ntpdc.
  • Outosleutel.
  • Die ntpq C-kode is in Python herskryf.
  • Die sntp/ntpdig C-kode is in Python herskryf.

Benewens die skoonmaak van die kode, het die projek ander take gehad. Hier is 'n gedeeltelike lys van prestasies:

  • Kodebeskerming teen bufferoorloop is aansienlik verbeter. Om bufferoorvloei te voorkom, is alle onveilige stringfunksies (strcpy/strcat/strtok/sprintf/vsprintf/gets) vervang met veilige weergawes wat buffergroottelimiete implementeer.
  • Bygevoeg NTS ondersteuning.
  • Verbeterde tydstapakkuraatheid tienvoudig deur fisiese hardeware te koppel. Dit is te wyte aan die feit dat moderne rekenaarhorlosies baie meer akkuraat geword het as dié toe NTP gebore is. Die grootste bevoordeeldes hiervan was GPSDO en toegewyde tydradio's.
  • Die aantal programmeertale is tot twee verminder. In plaas van Perl-, awk- en selfs S-skrifte, is dit nou alles Python. As gevolg hiervan is daar meer geleenthede vir kode hergebruik.
  • In plaas van noodles van outo-tools-skrifte, het die projek begin om 'n sagteware-boustelsel te gebruik waf.
  • Opgedateerde en herorganiseerde projekdokumentasie. Uit 'n teenstrydige en soms argaïese versameling dokumente het hulle redelik begaanbare dokumentasie geskep. Elke opdragreëlskakelaar en elke konfigurasie-entiteit het nou 'n enkele weergawe van waarheid. Boonop word manbladsye en webdokumentasie nou uit dieselfde kernlêers geskep.

NTPSec is beskikbaar vir 'n aantal Linux-verspreidings. Op die oomblik is die nuutste stabiele weergawe 1.1.8, vir Gentoo Linux is dit die voorlaaste een.

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

Chronie

Daar was nog 'n poging om die ou NTP met 'n veiliger alternatief te vervang. Chrony, anders as NTPSec, word van die grond af geskryf en is ontwerp om betroubaar te werk onder 'n wye reeks toestande, insluitend onstabiele netwerkverbindings, gedeeltelike netwerkbeskikbaarheid of opeenhoping, en temperatuurveranderinge. Boonop het chronie ander voordele:

  • chrony kan die stelselklok vinniger met groter akkuraatheid sinchroniseer;
  • chrony is kleiner, verbruik minder geheue en kry slegs toegang tot die SVE wanneer dit nodig is. Dit is 'n groot pluspunt vir die besparing van hulpbronne en energie;
  • chrony ondersteun hardeware tydstempels op Linux, wat uiters akkurate sinchronisasie op plaaslike netwerke moontlik maak.

Chrony het egter nie sommige van die kenmerke van die ou NTP nie, soos uitsaai- en multicast-kliënt/bediener. Daarbenewens ondersteun klassieke NTP 'n groter aantal bedryfstelsels en platforms.

Om die funksionaliteit van die bediener en NTP-versoeke na die chronyd-proses te deaktiveer, skryf net poort 0 in die chrony.conf-lêer. Dit word gedoen in gevalle waar dit nie nodig is om tyd vir NTP-kliënte of eweknieë in stand te hou nie. Sedert weergawe 2.0 is die NTP-bedienerpoort slegs oop wanneer toegang toegelaat word deur 'n toelaat-aanwysing of toepaslike opdrag, of 'n NTP-eweknie gekonfigureer is, of 'n uitsaai-aanwysing gebruik word.

Die program bestaan ​​uit twee modules.

  • chronyd is 'n diens wat in die agtergrond loop. Dit ontvang inligting oor die verskil tussen die stelselklok en die eksterne tydbediener en pas die plaaslike tyd aan. Dit implementeer ook die NTP-protokol en kan as 'n kliënt of bediener optree.
  • chronyc is 'n opdragreëlhulpmiddel vir programmonitering en beheer. Word gebruik om verskeie diensparameters te verfyn, byvoorbeeld sodat jy NTP-bedieners kan byvoeg of verwyder terwyl chronyd aanhou loop.

Sedert weergawe 7 van RedHat Linux gebruike chrony as 'n tydsinchronisasiediens. Die pakket is ook beskikbaar vir ander Linux-verspreidings. Die nuutste stabiele weergawe is 3.5, wat voorberei vir die vrystelling van v4.0.

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

Hoe om jou eie afgeleë chrony-bediener op die internet op te stel om tyd op 'n kantoornetwerk te sinchroniseer. Hieronder is 'n voorbeeld van die opstel van 'n VPS.

Voorbeeld van die opstel van Chrony op RHEL / CentOS op VPS

Kom ons oefen nou 'n bietjie en stel ons eie NTP-bediener op 'n VPS op. Dit is baie eenvoudig, kies net die toepaslike tarief op die RuVDS-webwerf, kry 'n klaargemaakte bediener en tik 'n dosyn eenvoudige opdragte. Vir ons doeleindes is hierdie opsie baie geskik.

Hoe tydsinchronisasie veilig geword het

Kom ons gaan voort met die opstel van die diens en installeer eers die chrony-pakket.

[root@server ~]$ yum install chrony

RHEL 8 / CentOS 8 gebruik 'n ander pakketbestuurder.

[root@server ~]$ dnf install chrony

Nadat u chrony geïnstalleer het, moet u die diens begin en aktiveer.

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

As jy wil, kan jy veranderinge aan /etc/chrony.conf maak, en NPT-bedieners vervang met die naaste plaaslike om reaksietyd te verminder.

# 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

Vervolgens stel ons sinchronisasie van die NTP-bediener op met nodusse van die gespesifiseerde swembad.

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

Dit is ook nodig om die NTP-poort na buite oop te maak, anders sal die firewall inkomende verbindings vanaf kliëntnodusse blokkeer.

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

Aan die kliëntkant is dit genoeg om die tydsone korrek in te stel.

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

Die /etc/chrony.conf-lêer spesifiseer die IP of gasheernaam van ons VPS-bediener wat NTP-bediener chrony gebruik.

server my.vps.server

En uiteindelik, begin tydsinchronisasie op die kliënt.

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

Volgende keer sal ek jou vertel watter opsies daar is om tyd sonder die internet te sinchroniseer.

Hoe tydsinchronisasie veilig geword het

Hoe tydsinchronisasie veilig geword het

Bron: will.com

Voeg 'n opmerking