Hur ser man till att tiden i sig inte ljuger nÀr man har en miljon stora och smÄ enheter som kommunicerar via TCP/IP? Trots allt har var och en av dem en klocka, och tiden mÄste vara korrekt pÄ dem alla. Detta problem kan inte kringgÄs utan ntp.
LÄt oss förestÀlla oss en minut att ett segment av industriell IT-infrastruktur har svÄrt att synkronisera tjÀnster över tid. Klusterstacken för företagsprogramvara börjar omedelbart fallera, domÀner faller isÀr, master- och standby-noder försöker utan framgÄng ÄterstÀlla status quo.
Det Àr ocksÄ möjligt att en angripare avsiktligt försöker ÄterstÀlla tiden genom en MiTM- eller DDOS-attack. I en sÄdan situation kan vad som helst hÀnda:
- lösenord för anvÀndarkonton kommer att upphöra att gÀlla;
- X.509-certifikat kommer att upphöra att gÀlla;
- TOTP tvÄfaktorsautentisering kommer att sluta fungera;
- sÀkerhetskopior blir "förÄldrade" och systemet tar bort dem;
- DNSSec kommer att gÄ sönder.
Det Àr tydligt att varje IT-avdelning Àr intresserad av tillförlitlig drift av tidssynkroniseringstjÀnster, och det vore bra om de var tillförlitliga och sÀkra i industriell drift.
Bryt NTP pÄ 25 minuter
NĂ€tverksprotokoll â millennials har en sak gemensamt: de har lĂ€nge varit och Ă€r inte lĂ€ngre bra för nĂ„gonting, men att ersĂ€tta dem Ă€r inte sĂ„ lĂ€tt Ă€ven nĂ€r en kritisk massa av entusiaster och finansiering har vunnits.
Det huvudsakliga klagomÄlet mot klassisk NTP Àr bristen pÄ tillförlitliga mekanismer för skydd mot skadliga attacker. Olika försök har gjorts för att lösa detta problem. För att uppnÄ detta introducerades först en mekanism för fördelad nyckel (PSK) för att utbyta symmetriska nycklar.
TyvÀrr rÀttfÀrdigade sig inte denna metod av en enkel anledning - den skalar inte bra. Manuell konfiguration krÀvs pÄ klientsidan beroende pÄ servern. Det betyder att du inte bara kan lÀgga till en annan klient pÄ det sÀttet. Om nÄgot Àndras pÄ NTP-servern mÄste alla klienter konfigureras om.
Sedan kom de pÄ AutoKey, men omedelbart upptÀcktes ett antal allvarliga sÄrbarheter i sjÀlva algoritmdesignen och den fick överges. Problemet Àr att fröet bara Àr 32 bitar, vilket Àr för litet och inte innehÄller tillrÀckligt med berÀkningskomplexitet för en brute force-attack.
- Nyckel-ID Àr en symmetrisk 32-bitarsnyckel;
- MAC (meddelandeautentiseringskod) â kontrollsumma för NTP-paket;
Autokey berÀknas enligt följande.
Autokey=H(Sender-IP||Receiver-IP||KeyID||Cookie)DÀr H() Àr en kryptografisk hashfunktion.
Samma funktion anvÀnds för att berÀkna paketets kontrollsumma.
MAC=H(Autokey||NTP packet)Det visar sig att hela integriteten hos paketkontroller vilar pÄ cookies Àkthet. NÀr du vÀl har dem kan du ÄterstÀlla autonyckeln och sedan förfalska MAC-koden. NTP-servern anvÀnder dock ett frö (seed) nÀr den genererar dem. Det Àr hÀr haken ligger.
Cookie=MSB_32(H(Client IP||Server IP||0||Server Seed))Funktionen MSB_32 tar bort 5 av de mest signifikanta bitarna frÄn resultatet av berÀkningen av md32-hashen. Klientkakan Àndras inte sÄ lÀnge serverinstÀllningarna förblir oförÀndrade. Allt som ÄterstÄr för angriparen att göra Àr att ÄterstÀlla det ursprungliga numret och fÄ möjligheten att generera cookies sjÀlvstÀndigt.
Först mÄste du ansluta till NTP-servern som klient och hÀmta cookien. Efter detta anvÀnder angriparen brute force för att ÄterstÀlla det ursprungliga numret enligt en enkel algoritm.
En algoritm för att attackera det initiala talet med hjÀlp av brute force-metoden.
for i=0:2^32 â 1 do
Ci=H(Server-IP||Client-IP||0||i)
if Ci=Cookie then
return i
end if
end forIP-adresserna Àr kÀnda, sÄ allt som ÄterstÄr Àr att skapa 2^32 hashvÀrden tills den genererade cookien matchar den som tas emot frÄn NTP-servern. PÄ en typisk hemmaarbetsstation med en Intel Core i5 tar detta 25 minuter.
NTS â ny Autokey
Det var omöjligt att ÄtgÀrda sÄdana sÀkerhetshÄl i Autokey, och Är 2012, protokoll. För att kompromissa med namnet bestÀmde de sig för att byta namn, sÄ Autokey v.2 fick namnet Network Time Security.
NTS-protokollet Àr en sÀkerhetsutökning av NTP och stöder för nÀrvarande endast unicast-lÀge. Den ger starkt kryptografiskt skydd mot paketmanipulation, förhindrar snokning, skalar bra, Àr motstÄndskraftig mot nÀtverkspaketförlust och resulterar i den lÀgsta noggrannhetsförlusten i processen att sÀkra en anslutning.
NTS-anslutningen bestÄr av tvÄ steg, dÀr protokoll pÄ lÀgre nivÄ anvÀnds. PÄ den första I detta skede kommer klienten och servern överens om olika anslutningsparametrar och utbyter cookies som innehÄller nycklar med all tillhörande datamÀngd. PÄ andra I detta skede sker den faktiska sÀkra NTS-sessionen mellan klienten och NTP-servern.

NTS bestÄr av tvÄ protokoll pÄ lÀgre nivÄer: Network Time Security Key Exchange (NTS-KE), som initierar en sÀker anslutning via TLS, och NTPv4, den senaste versionen av NTP-protokollet. Mer om detta nedan.
Första etappen - NTS KE
I detta skede initierar NTP-klienten en TLS 1.2/1.3-session över en separat TCP-anslutning till NTS KE-servern. Under denna session hÀnder följande.
- Parterna bestÀmmer parametrarna algoritm för det andra steget.
- Parterna definierar ett andra protokoll pÄ lÀgre nivÄ, men för nÀrvarande stöds endast NTPv4.
- Parterna bestÀmmer IP-adressen och porten för NTP-servern.
- NTS KE-servern utfÀrdar cookies under NTPv4.
- Parterna extraherar ett par symmetriska nycklar (C2S och S2C) frÄn cookiematerialet.
Denna metod har en stor fördel i det att hela bördan av att överföra information om hemliga anslutningsparametrar faller pÄ det beprövade och pÄlitliga TLS-protokollet. Detta eliminerar behovet av att uppfinna hjulet pÄ nytt för en sÀker NTP-handskakning.
Steg 2 - NTP under NTS-skydd
I det andra steget synkroniserar klienten tiden sÀkert med NTP-servern. För detta ÀndamÄl bÀr den fyra speciella tillÀggsfÀlt i NTPv4-paketstrukturen.
- Unique Identifier Extension innehÄller en slumpmÀssig nonce för att förhindra replay-attacker.
- NTS Cookie Extension innehÄller en av de cookies som Àr tillgÀngliga för NTP-klienten. Eftersom endast klienten har de symmetriska AAED-nycklarna C2S och S2C, mÄste NTP-servern extrahera dem frÄn cookiematerialet.
- NTS Cookie Placeholder Extension Àr ett sÀtt för en klient att begÀra ytterligare cookies frÄn servern. Denna tillÀgg Àr nödvÀndig för att sÀkerstÀlla att NTP-serverns svar inte Àr mycket lÀngre Àn begÀran. Detta hjÀlper till att förhindra förstÀrkningsattacker.
- NTS Authenticator och Encrypted Extension Fields Extension innehÄller AAED-algoritmchiffern med C2S-nyckel, NTP-rubrik, tidsstÀmplar och ovan nÀmnda EF som medföljande data. Utan detta tillÀgg Àr det möjligt att förfalska tidsstÀmplar.

Efter att ha mottagit en begÀran frÄn klienten kontrollerar servern Àktheten hos NTP-paketet. För att göra detta mÄste han dekryptera cookies, extrahera AAED-algoritmen och nycklarna. Efter att NTP-paketet har kontrollerats för giltighet svarar servern klienten i följande format.
- Unique Identifier Extension Àr en spegelkopia av klientbegÀran, en ÄtgÀrd mot replay-attacker.
- NTS Cookie Extension fler cookies för att fortsÀtta sessionen.
- NTS Authenticator och Encrypted Extension Fields Extension innehÄller en AEAD-chiffer med en S2C-nyckel.
Det andra handskakningssteget kan upprepas mÄnga gÄnger, och kringgÄ det första steget, eftersom varje begÀran och svar ger klienten ytterligare cookies. Detta har fördelen att de relativt resurskrÀvande TLS-berÀkningarna och PKI-dataöverföringsoperationerna Àr uppdelade i ett antal upprepade förfrÄgningar. Detta Àr sÀrskilt bekvÀmt för specialiserade FPGA-tidshÄllare, nÀr all huvudfunktionalitet kan packas i flera funktioner frÄn omrÄdet symmetrisk kryptografi, vilket överför hela TLS-stacken till en annan enhet.
NTPSec
Vad Àr speciellt med NTP? Trots att projektets författare Dave Mills försökte dokumentera sin kod sÄ bra som möjligt, kommer en sÀllsynt programmerare att kunna förstÄ invecklingen i tidssynkroniseringsalgoritmerna för 35 Är sedan. En del av koden skrevs före POSIX-eran, och Unix API var vÀldigt annorlunda Àn vad som anvÀnds idag. Dessutom krÀvs kunskap om statistik för att rensa signalen frÄn störningar pÄ brusiga linjer.
NTS var inte det första försöket att fixa NTP. Efter att angripare lÀrt sig att utnyttja NTP-sÄrbarheter för att förstÀrka DDoS-attacker, blev det tydligt att radikala förÀndringar behövdes. Och medan utkasten till NTS förbereddes och slutfördes, beviljade den amerikanska National Science Foundation snarast ett bidrag för modernisering av NTP i slutet av 2014.
Arbetsgruppen leddes av ingen mindre Ă€n â en av grundarna och stöttepelarna i öppen kĂ€llkodsgemenskapen och författaren till boken . Det första Eric och hans kamrater gjorde var att försöka flytta NTP-koden frĂ„n BitKeeper-plattformen till git, men det fungerade inte sĂ„. Projektledaren Harlan Stenn var emot detta beslut och förhandlingarna hamnade i en Ă„tervĂ€ndsgrĂ€nd. Man beslutade sedan att forka projektkoden, och det var sĂ„ NTPSec uppstod.
Med en gedigen bakgrund inom bland annat GPSD, matematik och en magisk förmÄga att lÀsa urÄldrig kod var Eric Raymond precis rÀtt hackare för att genomföra ett sÄdant projekt. Teamet hittade en specialist pÄ kodmigrering och pÄ bara 10 veckor NTP pÄ GitLab. Arbetet började koka.
Eric Raymonds team nÀrmade sig uppgiften pÄ samma sÀtt som Auguste Rodin skulle ha nÀrmat sig ett stenblock. Genom att ta bort 175 KLOC gammal kod kunde de avsevÀrt minska attackytan och stÀnga mÄnga sÀkerhetshÄl.
HÀr Àr en ofullstÀndig lista över de drabbade:
- Odokumenterad, förÄldrad, utdaterad eller trasig refclock.
- OanvÀnt ICS-bibliotek.
- libopts/autogen.
- Gammal kod för Windows.
- ntpdc.
- Autonyckel.
- C-kod ntpq omskriven i Python.
- C-kod sntp/ntpdig omskriven i Python.
Förutom kodrensning hade projektet andra uppgifter. HÀr Àr en ofullstÀndig lista över prestationer:
- AvsevÀrt förstÀrkt kodskydd mot buffertöverflöde. För att förhindra buffertöversvÀmningar har alla osÀkra strÀngfunktioner (strcpy/strcat/strtok/sprintf/vsprintf/gets) ersatts med sÀkra versioner som implementerar begrÀnsning av buffertstorlek.
- Lade till NTS-stöd.
- Ăkad tidsstegsnoggrannhet tiofaldigt genom att anvĂ€nda fysisk hĂ„rdvarubindning. Detta beror pĂ„ att moderna datorklockor har blivit mycket mer exakta Ă€n de som fanns pĂ„ plats nĂ€r NTP först uppfanns. De som gynnades mest av detta var GPSDO och dedikerade radiotidsstationer.
- Antalet programmeringssprÄk har minskats till tvÄ. IstÀllet för Perl, awk och till och med S-skript Àr det nu allt Python. Detta möjliggör större möjligheter för ÄteranvÀndning av kod.
- IstÀllet för allt frÄn Autotools-skript började projektet anvÀnda ett system för mjukvarubyggande. .
- Uppdaterade och omorganiserade projektdokumentationen. FrÄn en motsÀgelsefull och bitvis arkaisk samling av dokument skapade de ganska godkÀnd dokumentation. Varje kommandoradsvÀxel och varje konfigurationsenhet har nu en enda version av sanningen. Dessutom genereras nu manualsidor och webbdokumentation frÄn samma kÀrnfiler.
NTPSec Àr tillgÀngligt för ett antal Linuxdistributioner. För nÀrvarande Àr den senaste stabila versionen 1.1.8, för Gentoo Linux Àr det den nÀst sista.
(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
Det gjordes ytterligare ett försök att ersÀtta den gamla NTP:n med en sÀkrare analog. Till skillnad frÄn NTPSec Àr Chrony skrivet frÄn grunden och utformat för att fungera tillförlitligt under en mÀngd olika förhÄllanden, inklusive instabila nÀtverksanslutningar, partiell eller överbelastad nÀtverkstillgÀnglighet och temperaturförÀndringar. Dessutom har chrony andra fördelar:
- chrony kan synkronisera systemklockan snabbare och med större noggrannhet;
- chrony Àr mindre, anvÀnder mindre minne och anvÀnder bara processorn nÀr det behövs. Detta Àr ett stort plus för att spara resurser och energi;
- chrony stöder hÄrdvarutidsstÀmplar i Linux, vilket möjliggör extremt noggrann synkronisering över lokala nÀtverk.
Chrony saknar dock nÄgra av de gamla NTP-funktionerna som broadcast och multicast-klient/server. Dessutom stöder klassisk NTP ett bredare utbud av operativsystem och plattformar.
För att inaktivera serverfunktionen och NTP-förfrÄgningar till chronyd-processen, ange helt enkelt port 0 i chrony.conf-filen. Detta görs i fall dÀr det inte finns nÄgot behov av att hÄlla tid för NTP-klienter eller kollegor. Sedan version 2.0 Àr NTP-serverporten endast öppen nÀr Ätkomst tillÄts av allow-direktivet eller motsvarande kommando, eller nÀr en NTP-peer Àr konfigurerad, eller nÀr broadcast-direktivet anvÀnds.
Programmet bestÄr av tvÄ moduler.
- chronyd Àr en tjÀnst som körs i bakgrunden. Den tar emot information om skillnaden mellan systemklockan och en extern tidsserver och justerar den lokala tiden. Den implementerar ocksÄ NTP-protokollet och kan fungera som en klient eller server.
- chronyc Àr ett kommandoradsverktyg för att övervaka och styra ett program. AnvÀnds för att finjustera olika tjÀnsteparametrar, till exempel att lÄta dig lÀgga till eller ta bort NTP-servrar medan chronyd fortsÀtter att köras.
Sedan RedHat Linux version 7 chrony som en tidssynkroniseringstjÀnst. Paketet Àr Àven tillgÀngligt för andra Linuxdistributioner. Den senaste stabila versionen Àr 3.5, v4.0 förbereds för release.
(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]
Hur man konfigurerar sin egen fjÀrranslutna Chrony-server pÄ internet för att synkronisera tid i ett kontorsnÀtverk. Nedan följer ett exempel pÄ installation pÄ en VPS.
Exempel pÄ att konfigurera Chrony pÄ RHEL / CentOS pÄ VPS
LÄt oss nu öva lite och sÀtta upp vÄr egen NTP-server pÄ en VPS. Det Àr vÀldigt enkelt, vÀlj bara en lÀmplig tariff pÄ RuVDS webbplats, skaffa en fÀrdig server och ange ett dussin enkla kommandon. Det hÀr alternativet Àr ganska lÀmpligt för vÄra ÀndamÄl.

LÄt oss gÄ vidare till att konfigurera tjÀnsten och först och frÀmst installera chrony-paketet.
[root@server ~]$ yum install chronyRHEL 8 / CentOS 8 anvÀnder en annan pakethanterare.
[root@server ~]$ dnf install chronyEfter att du har installerat chrony mÄste du starta och aktivera tjÀnsten.
[root@server ~]$ systemctl enable chrony --nowOm sÄ önskas kan du redigera /etc/chrony.conf för att ersÀtta NPT-servrar med de nÀrmaste lokala servrarna för att minska svarstiden.
# 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Àrefter konfigurerar vi synkronisering av NTP-servern med noder frÄn den angivna poolen.
[root@server ~]$ timedatectl set-ntp true
[root@server ~]$ systemctl restart chronyd.service
Det Àr ocksÄ nödvÀndigt att öppna NTP-porten utÄt, annars blockerar brandvÀggen inkommande anslutningar frÄn klientnoder.
[root@server ~]$ firewall-cmd --add-service=ntp --permanent
[root@server ~]$ firewall-cmd --reload
PÄ klientsidan rÀcker det att stÀlla in tidszonen korrekt.
[root@client ~]$ timedatectl set-timezone Europe/MoscowI filen /etc/chrony.conf anger du IP-adressen eller vÀrdnamnet för vÄr VPS-server dÀr NTP-servern chrony körs.
server my.vps.serverOch slutligen, starta tidssynkronisering pÄ klienten.
[root@client ~]$ systemctl enable --now chronyd
[root@client ~]$ timedatectl set-ntp true
NÀsta gÄng ska jag berÀtta vilka alternativ det finns för att synkronisera tid utan internet.
KĂ€lla: will.com
