Hoe tiid syngronisaasje waard feilich

Hoe tiid syngronisaasje waard feilich
Hoe kinne jo derfoar soargje dat de tiid per se net leit as jo in miljoen grutte en lytse apparaten hawwe dy't kommunisearje fia TCP / IP? Ommers, elk fan harren hat in klok, en de tiid moat wêze korrekt foar harren allegearre. Dit probleem kin net omseame sûnder ntp.

Litte wy ús foar in minút foarstelle dat yn ien segmint fan 'e yndustriële IT-ynfrastruktuer d'r swierrichheden binne mei syngronisearjen fan tsjinsten oer de tiid. Daliks begjint de klusterstapel fan Enterprise-software te mislearjen, domeinen ferdwine, masters en Standby-knooppunten stribje sûnder súkses om de status quo te herstellen.

It is ek mooglik dat in oanfaller mei opsetsin besiket de tiid te fersteuren troch in MiTM- of DDOS-oanfal. Yn sa'n situaasje kin alles barre:

  • Wachtwurden fan brûkersaccount sille ferrinne;
  • X.509 sertifikaten sille ferrinne;
  • TOTP twa-faktor autentikaasje sil ophâlde te wurkjen;
  • backups sille ferâldere wurde en it systeem sil se wiskje;
  • DNSSec sil brekke.

It is dúdlik dat elke IT ôfdieling is ynteressearre yn de betroubere wurking fan tiid syngronisaasje tsjinsten, en it soe moai wêze as se wiene betrouber en feilich yn yndustriële operaasje.

Brek NTP yn 25 minuten

Netwurkprotokollen - millennials hawwe ien eigenaardichheid, se hawwe west ferâldere en binne net mear goed foar neat, mar ferfange se is net sa maklik sels as in krityske massa fan entûsjasters en finansiering wurdt opboud.

De wichtichste klacht oer klassike NTP is it gebrek oan betroubere meganismen foar beskerming tsjin oanfallen troch ynbrekkers. Ferskate besykjen binne dien om dit probleem op te lossen. Om dit te berikken hawwe wy earst in pre-dielde kaai (PSK) meganisme ymplementearre foar it útwikseljen fan symmetryske kaaien.

Spitigernôch hat dizze metoade net betelle foar in ienfâldige reden - it is net goed skaal. Hânlieding konfiguraasje is nedich oan de kliïnt kant ôfhinklik fan de tsjinner. Dit betsjut dat jo gewoan in oare klant net kinne tafoegje. As der wat feroaret op 'e NTP-tsjinner, moatte alle kliïnten opnij konfigureare wurde.

Doe kamen se mei AutoKey, mar se ûntdutsen fuortendaliks in oantal serieuze kwetsberens yn it ûntwerp fan it algoritme sels en se moasten it ferlitte. It ding is dat it sied allinich 32-bits befettet, it is te lyts en befettet net genôch berekkeningskompleksiteit foar in frontale oanfal.

  • Key ID - symmetryske 32-bit kaai;
  • MAC (berjocht autentikaasjekoade) - NTP-pakketkontrôlesom;

Autokey wurdt berekkene as folget.

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

Wêr't H() in kryptografyske hashfunksje is.

Deselde funksje wurdt brûkt om de kontrôlesum fan pakketten te berekkenjen.

MAC=H(Autokey||NTP packet)

It docht bliken dat de folsleine yntegriteit fan pakketkontrôles hinget op 'e echtheid fan' e koekjes. As jo ​​​​se ienris hawwe, kinne jo de autokaai weromsette en dan de MAC spoofje. De NTP-tsjinner brûkt lykwols in sied by it generearjen fan har. Dit is wêr't de fangst leit.

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

De MSB_32-funksje snijt de 5 meast wichtige bits ôf fan it resultaat fan 'e md32-hash-berekkening. It kliïntkoekje feroaret net salang't de tsjinnerparameters net feroare bliuwe. Dan kin de oanfaller allinich it earste nûmer weromsette en sels koekjes kinne generearje.

Earst moatte jo ferbine mei de NTP-tsjinner as kliïnt en koekjes ûntfange. Hjirnei, mei in brute force metoade, herstelt de oanfaller it begjinnûmer nei in ienfâldich algoritme.

Algoritme foar it oanfallen fan 'e berekkening fan it begjinnûmer mei de brute-force-metoade.

   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

De IP-adressen binne bekend, dus alles wat oerbliuwt is om 2^32-hashes te meitsjen oant it oanmakke koekje oerienkomt mei dy fan 'e NTP-tsjinner ûntfongen. Op in gewoane thússtasjon mei Intel Core i5 sil dit 25 minuten nimme.

NTS - nije Autokey

It wie ûnmooglik om te setten mei sokke feiligens gatten yn Autokey, en yn 2012 ferskynde in nije ferzje protokol. Om de namme te kompromittearjen, besleaten se te rebranden, sadat Autokey v.2 waard neamd Network Time Security.

It NTS-protokol is in útwreiding fan NTP-befeiliging en stipet op it stuit allinich unicast-modus. It soarget foar sterke kryptografyske beskerming tsjin pakketmanipulaasje, foarkomt snoopjen, skaalber goed, is resistint foar netwurkpakketferlies, en resultearret yn it minste bedrach fan presysferlies dy't ûntstien is tidens ferbiningsfeiligens.

In NTS-ferbining bestiet út twa stadia dy't protokollen foar legere lagen brûke. Op de earste Op dit poadium binne de kliïnt en tsjinner it iens oer ferskate ferbiningsparameters en wikselje koekjes út mei kaaien mei alle byhearrende gegevensset. Op twadde Op dit stadium fynt de eigentlike beskerme NTS-sesje plak tusken de kliïnt en de NTP-tsjinner.

Hoe tiid syngronisaasje waard feilich

NTS bestiet út twa protokollen fan legere laach: Network Time Security Key Exchange (NTS-KE), dy't in feilige ferbining inisjearret oer TLS, en NTPv4, de lêste ynkarnaasje fan it NTP-protokol. In bytsje mear oer dit hjirûnder.

Earste etappe - NTS KE

Op dit stadium inisjearret de NTP-kliïnt in TLS 1.2/1.3-sesje oer in aparte TCP-ferbining mei de NTS KE-tsjinner. Tidens dizze sesje bart it folgjende.

  • De partijen bepale de parameters AEAD algoritme foar de twadde etappe.
  • De partijen definiearje in twadde protokol fan legere laach, mar op it stuit wurdt allinnich NTPv4 stipe.
  • De partijen bepale it IP-adres en de haven fan de NTP-tsjinner.
  • NTS KE-tsjinner jout cookies út ûnder NTPv4.
  • De partijen ekstrahearje in pear symmetryske kaaien (C2S en S2C) út it koekje materiaal.

Dizze oanpak hat it grutte foardiel dat de hiele lêst fan it ferstjoeren fan geheime ynformaasje oangeande ferbiningsparameters falt op it bewezen en betroubere TLS-protokol. Dit elimineert de needsaak om opnij útfine dyn eigen tsjil foar in feilige NTP handshake.

Twadde etappe - NTP ûnder NTS beskerming

Yn 'e twadde stap syngronisearret de kliïnt de tiid feilich mei de NTP-tsjinner. Foar dit doel stjoert it fjouwer spesjale útwreidingen (útwreidingsfjilden) yn 'e NTPv4-pakketstruktuer.

  • De Unique Identifier Extension befettet in willekeurige nonce om opnij oanfallen te foarkommen.
  • NTS Cookie Extension befettet ien fan 'e NTP-koekjes beskikber foar de kliïnt. Om't allinich de kliïnt de symmetryske AAED C2S- en S2C-kaaien hat, moat de NTP-tsjinner se út it koekje materiaal ekstrahearje.
  • NTS Cookie Placeholder Extension is in manier foar in kliïnt om ekstra koekjes fan 'e tsjinner oan te freegjen. Dizze tafoeging is nedich om te soargjen dat it antwurd fan de NTP-tsjinner net folle langer is as it fersyk. Dit helpt foar te kommen amplification oanfallen.
  • NTS Authenticator and Encrypted Extension Fields Extension befettet de AAED-sifer mei de C2S-kaai, NTP-koptekst, tiidstempels, en de boppesteande EF as byhearrende gegevens. Sûnder dizze tafoeging is it mooglik tiidstempels te spoofjen.

Hoe tiid syngronisaasje waard feilich

By it ûntfangen fan in fersyk fan in kliïnt, ferifieart de tsjinner de echtheid fan it NTP-pakket. Om dit te dwaan, moat hy de cookies ûntsiferje, it AAED-algoritme en kaaien útpakke. Nei it suksesfolle kontrolearjen fan it NTP-pakket foar jildigens, reagearret de tsjinner op 'e kliïnt yn it folgjende formaat.

  • Unique Identifier Extension is in spegelkopy fan it klantfersyk, in maatregel tsjin opnij oanfallen.
  • NTS Cookie Extension mear cookies om de sesje troch te gean.
  • NTS Authenticator and Encrypted Extension Fields Extension befettet de AEAD-sifer mei in S2C-kaai.

De twadde handshake kin in protte kearen wurde werhelle, troch de earste stap te omgean, om't elk fersyk en antwurd de klant ekstra koekjes jout. Dit hat it foardiel dat de relatyf boarne-yntinsive TLS-operaasjes fan it berekkenjen en ferstjoeren fan PKI-gegevens wurde dield troch it oantal werhelle oanfragen. Dit is benammen handich foar spesjalisearre FPGA timekeepers, doe't alle wichtichste funksjonaliteit kin wurde ferpakt yn ferskate funksjes út it mêd fan symmetryske kryptografy, oerdracht fan de hiele TLS stack nei in oar apparaat.

NTPSec

Wat is spesjaal oan NTP? Nettsjinsteande it feit dat de skriuwer fan it projekt, Dave Mills, besocht syn koade sa goed mooglik te dokumintearjen, is it in seldsume programmeur dy't de kompleksjes fan tiidsyngronisaasjealgoritmen dy't 35 jier âld binne kinne begripe. Guon fan 'e koade waard skreaun foar it POSIX-tiidrek, en de Unix API wie doe hiel oars as wat hjoeddedei brûkt wurdt. Derneist is kennis fan statistiken nedich om it sinjaal te wiskjen fan ynterferinsje op lawaaierige rigels.

NTS wie net de earste poging om NTP te reparearjen. Sadree't oanfallers learden NTP-kwetsberheden te eksploitearjen om DDoS-oanfallen te fersterkjen, waard it dúdlik dat radikale feroaringen nedich wiene. En wylst de NTS-ûntwerpen wurde taret en finalisearre, hat de US National Science Foundation oan 'e ein fan 2014 driuwend in subsydzje tawiisd foar de modernisearring fan NTP.

De wurkgroep waard laat troch net ien, mar Eric Steven Raymond - ien fan 'e oprjochters en pylders fan' e Open Source-mienskip en skriuwer fan it boek Katedraal en Bazaar. It earste ding dat Eric en syn freonen besochten te dwaan wie de NTP-koade te ferpleatsen fan it BitKeeper-platfoarm nei git, mar it slagge net sa. Projektlieder Harlan Stenn wie tsjin dit beslút en de ûnderhannelings stiene fêst. Doe waard besletten om de projektkoade te gabeljen, en NTPSec waard berne.

Solide ûnderfining, ynklusyf wurk oan GPSD, in wiskundige eftergrûn en de magyske feardigens fan it lêzen fan âlde koade - Eric Raymond wie krekt de hacker dy't sa'n projekt koe útfiere. It team fûn in spesjalist foar koademigraasje en yn just 10 wiken NTP fêstigeop GitLab. It wurk wie yn folle gong.

It team fan Eric Raymond naam de taak op deselde wize as Auguste Rodin mei in blok stien. Troch 175 KLOC fan âlde koade te ferwiderjen, koene se it oanfalsflak signifikant ferminderje troch in protte befeiligingsgaten te sluten.

Hjir is in ûnfolsleine list fan dyjingen opnommen yn 'e distribúsje:

  • Net dokumintearre, ferâldere, ferâldere of brutsen refklok.
  • Net brûkte ICS bibleteek.
  • libopts/autogen.
  • Alde koade foar Windows.
  • ntpdc.
  • Autokey.
  • De ntpq C-koade is opnij skreaun yn Python.
  • De sntp/ntpdig C-koade is opnij skreaun yn Python.

Neist it opromjen fan de koade hie it projekt oare taken. Hjir is in diellist fan prestaasjes:

  • Koade beskerming tsjin buffer oerstreaming is gâns ferbettere. Om bufferoerlêst te foarkommen, binne alle ûnfeilige stringfunksjes (strcpy/strcat/strtok/sprintf/vsprintf/gets) ferfongen troch feilige ferzjes dy't grinzen fan buffergrutte ymplementearje.
  • NTS-stipe tafoege.
  • Ferbettere krektens fan tiidstappen tsienfâldich troch fysike hardware te keppeljen. Dit komt troch it feit dat moderne kompjûterklokken folle krekter wurden binne as dy doe't NTP berne waard. De grutste begunstigden hjirfan wiene GPSDO en tawijde tiidradio's.
  • It oantal programmeartalen is werombrocht nei twa. Ynstee fan Perl, awk en sels S-skripts, is it no allegear Python. Hjirtroch binne d'r mear mooglikheden foar hergebrûk fan koade.
  • Ynstee fan noodles fan autotools-skripts, begon it projekt in softwarebousysteem te brûken waf.
  • Bywurke en reorganisearre projektdokumintaasje. Ut in tsjinstridige en soms archayske kolleksje fan dokuminten makken se frij passabele dokumintaasje. Elke kommandorigelskeakel en elke konfiguraasje-entiteit hat no ien ferzje fan wierheid. Derneist wurde man-siden en webdokumintaasje no makke fan deselde kearnbestannen.

NTPSec is beskikber foar in oantal Linux-distribúsjes. Op it stuit is de lêste stabile ferzje 1.1.8, foar Gentoo Linux is it de foarlêste.

(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

Der wie noch in poging om de âlde NTP te ferfangen troch in feiliger alternatyf. Chrony, yn tsjinstelling ta NTPSec, is fan 'e grûn ôf skreaun en is ûntworpen om betrouber te operearjen ûnder in breed skala oan omstannichheden, ynklusyf ynstabile netwurkferbiningen, partielbeskikberens as oerlêst, en temperatuerferoarings. Derneist hat chrony oare foardielen:

  • chrony kin de systeemklok flugger syngronisearje mei gruttere krektens;
  • chrony is lytser, verbruikt minder ûnthâld, en tagong ta de CPU allinne as it nedich is. Dit is in grut plus foar it besparjen fan boarnen en enerzjy;
  • chrony stipet hardware-tiidstempels op Linux, wêrtroch ekstreem krekte syngronisaasje op lokale netwurken mooglik is.

Chrony ûntbrekt lykwols guon fan 'e funksjes fan' e âlde NTP, lykas útstjoering en multicast client / tsjinner. Derneist stipet klassike NTP in grutter oantal bestjoeringssystemen en platfoarms.

Om de funksjonaliteit fan 'e tsjinner en NTP-oanfragen út te skeakeljen nei it chronyd-proses, skriuw gewoan poarte 0 yn it chrony.conf-bestân. Dit wurdt dien yn gefallen dêr't it net nedich is om tiid te behâlden foar NTP-kliïnten of peers. Sûnt ferzje 2.0 is de NTP-tsjinnerpoarte allinich iepen as tagong wurdt tastien troch in tastean-rjochtline of passend kommando, of in NTP-peer is konfigureare, of in útstjoerrjochtline wurdt brûkt.

It programma bestiet út twa modules.

  • chronyd is in tsjinst dy't op 'e eftergrûn rint. It ûntfangt ynformaasje oer it ferskil tusken de systeemklok en de eksterne tiidtsjinner en past de lokale tiid oan. It ymplementearret ek it NTP-protokol en kin fungearje as client of server.
  • chronyc is in kommandorigelprogramma foar programmamonitoring en kontrôle. Wurdt brûkt om ferskate tsjinstparameters te fine, sadat jo bygelyks NTP-tsjinners kinne tafoegje of fuortsmite wylst chronyd trochgiet.

Sûnt ferzje 7 fan RedHat Linux brûkt chrony as tiidsyngronisaasjetsjinst. It pakket is ek beskikber foar oare Linux-distribúsjes. De lêste stabile ferzje is 3.5, tariede op de frijlitting fan 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 kinne jo jo eigen chrony-tsjinner op ôfstân ynstelle op it ynternet om tiid te syngronisearjen op in kantoarnetwurk. Hjirûnder is in foarbyld fan it ynstellen fan in VPS.

Foarbyld fan it ynstellen fan Chrony op RHEL / CentOS op VPS

Litte wy no in bytsje oefenje en ús eigen NTP-tsjinner op in VPS ynstelle. It is heul ienfâldich, kies gewoan it passende taryf op 'e RuVDS-webside, krije in klearmakke server en typ in tsiental ienfâldige kommando's. Foar ús doelen is dizze opsje hiel geskikt.

Hoe tiid syngronisaasje waard feilich

Litte wy trochgean mei it ynstellen fan de tsjinst en earst it chrony-pakket ynstallearje.

[root@server ~]$ yum install chrony

RHEL 8 / CentOS 8 brûke in oare pakketbehearder.

[root@server ~]$ dnf install chrony

Nei it ynstallearjen fan chrony moatte jo de tsjinst begjinne en aktivearje.

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

As jo ​​​​wolle, kinne jo wizigingen oanmeitsje oan /etc/chrony.conf, troch NPT-tsjinners te ferfangen troch de tichtstby lizzende lokale om de reaksjetiid te ferminderjen.

# 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

Dêrnei sette wy syngronisaasje op fan 'e NTP-tsjinner mei knooppunten fan it oantsjutte swimbad.

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

It is ek nedich om de NTP-poarte nei bûten te iepenjen, oars sil de brânmuorre ynkommende ferbiningen fan kliïntknooppunten blokkearje.

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

Oan 'e kliïntkant is it genôch om de tiidsône korrekt yn te stellen.

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

De triem /etc/chrony.conf spesifisearret de IP of hostnamme fan ús VPS-tsjinner dy't NTP-tsjinner chrony draait.

server my.vps.server

En as lêste, begjinnende tiid syngronisaasje op de klant.

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

Folgjende kear sil ik jo fertelle hokker opsjes d'r binne foar syngronisaasje fan tiid sûnder ynternet.

Hoe tiid syngronisaasje waard feilich

Hoe tiid syngronisaasje waard feilich

Boarne: www.habr.com

Add a comment