Hur tidssynkronisering blev sÀker

Hur tidssynkronisering blev sÀker
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 förĂ„ldrad 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 for

IP-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, en ny version 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.

Hur tidssynkronisering blev sÀker

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 BORT 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.

Hur tidssynkronisering blev sÀker

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 Eric Steven Raymond — en av grundarna och stöttepelarna i öppen kĂ€llkodsgemenskapen och författaren till boken Katedral och basar. 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 fastpÄ 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. WAF.
  • 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 anvÀndningsomrÄden 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.

Hur tidssynkronisering blev sÀker

LÄt oss gÄ vidare till att konfigurera tjÀnsten och först och frÀmst installera chrony-paketet.

[root@server ~]$ yum install chrony

RHEL 8 / CentOS 8 anvÀnder en annan pakethanterare.

[root@server ~]$ dnf install chrony

Efter att du har installerat chrony mÄste du starta och aktivera tjÀnsten.

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

Om 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/Moscow

I 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.server

Och 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.

Hur tidssynkronisering blev sÀker

Hur tidssynkronisering blev sÀker

KĂ€lla: will.com

LĂ€gg en kommentar