Hogyan lehet megbizonyosodni arról, hogy az idő önmagában nem hazudik, ha millió nagy és kicsi eszköze kommunikál TCP/IP-n keresztül? Hiszen mindegyiknek van órája, és mindegyiknél helyesnek kell lennie az időnek. Ezt a problémát nem lehet megkerülni ntp nélkül.
Képzeljük el egy percre, hogy az ipari IT infrastruktúra egy szegmensében nehézségekbe ütközik a szolgáltatások időbeli szinkronizálása. Azonnal a vállalati szoftverek fürtkötege tönkremegy, a tartományok szétesnek, a mesterek és a készenléti csomópontok sikertelenül igyekeznek visszaállítani a status quo-t.
Az is lehetséges, hogy egy támadó szándékosan megpróbálja megzavarni az időt egy MiTM vagy DDOS támadás révén. Ilyen helyzetben bármi megtörténhet:
- A felhasználói fiók jelszavai lejárnak;
- Az X.509 tanúsítványok lejárnak;
- A TOTP kéttényezős hitelesítés leáll;
- a biztonsági másolatok elavulnak, és a rendszer törli azokat;
- A DNSSec megszakad.
Nyilvánvaló, hogy minden informatikai részleg érdekelt az időszinkronizálási szolgáltatások megbízható működésében, és jó lenne, ha azok megbízhatóak és biztonságosak lennének az ipari üzemben.
Törje meg az NTP-t 25 perc alatt
Hálózati protokollok – az ezredfordulóknak van egy sajátosságuk, az volt és már semmire sem jók, de pótlásuk még akkor sem egyszerű, ha kritikus tömeget halmoznak fel a lelkesek és a finanszírozás.
A klasszikus NTP-vel kapcsolatos fő panasz az, hogy hiányoznak a megbízható mechanizmusok a behatolók támadásai ellen. Különféle kísérletek történtek a probléma megoldására. Ennek elérése érdekében először bevezettünk egy előre megosztott kulcs (PSK) mechanizmust a szimmetrikus kulcsok cseréjére.
Sajnos ez a módszer egy egyszerű okból nem kifizetődő – nem skálázható jól. A szervertől függően a kliens oldalon kézi konfiguráció szükséges. Ez azt jelenti, hogy egyszerűen nem tud hozzáadni egy másik ügyfelet. Ha valami megváltozik az NTP-kiszolgálón, minden klienst újra kell konfigurálni.
Aztán előálltak az AutoKey-vel, de azonnal számos komoly sebezhetőséget fedeztek fel magában az algoritmusban, és el kellett hagyniuk. A helyzet az, hogy a seed csak 32 bitet tartalmaz, túl kicsi és nem tartalmaz elég számítási bonyolultságot egy frontális támadáshoz.
- Kulcsazonosító - szimmetrikus 32 bites kulcs;
- MAC (üzenet hitelesítési kód) - NTP csomag ellenőrző összeg;
Az Autokey kiszámítása a következőképpen történik.
Autokey=H(Sender-IP||Receiver-IP||KeyID||Cookie)Ahol H() egy kriptográfiai hash függvény.
Ugyanezt a függvényt használják a csomagok ellenőrző összegének kiszámításához.
MAC=H(Autokey||NTP packet)Kiderült, hogy a csomagellenőrzés teljes integritása a cookie-k hitelességén múlik. Ha megvannak, visszaállíthatja az automatikus kulcsot, majd meghamisíthatja a MAC-ot. Az NTP-kiszolgáló azonban magot használ a generálásuk során. Itt rejlik a fogás.
Cookie=MSB_32(H(Client IP||Server IP||0||Server Seed))Az MSB_32 függvény levágja a 5 legjelentősebb bitet az md32 hash számítási eredményéből. Az ügyfél cookie nem változik, amíg a szerver paraméterei változatlanok maradnak. Ekkor a támadó csak a kezdeti számot tudja visszaállítani, és önállóan tud cookie-kat generálni.
Először is csatlakoznia kell az NTP-kiszolgálóhoz kliensként, és cookie-kat kell fogadnia. Ezt követően a támadó brute force módszerrel egy egyszerű algoritmus szerint visszaállítja a kezdeti számot.
Algoritmus a kezdeti szám kiszámításának támadására brute-force módszerrel.
for i=0:2^32 − 1 do
Ci=H(Server-IP||Client-IP||0||i)
if Ci=Cookie then
return i
end if
end forAz IP-címek ismertek, így már csak 2^32 hash-t kell létrehozni, amíg a létrehozott cookie meg nem egyezik az NTP-szervertől kapottal. Egy hagyományos otthoni állomáson Intel Core i5-tel ez 25 percet vesz igénybe.
NTS - új Autokey
Az Autokey-ben lehetetlen volt elviselni az ilyen biztonsági réseket, és 2012-ben megjelent jegyzőkönyv. A név veszélyeztetése érdekében a márkaváltás mellett döntöttek, így az Autokey v.2 nevet Network Time Security-nek nevezték el.
Az NTS protokoll az NTP biztonság kiterjesztése, és jelenleg csak az unicast módot támogatja. Erős kriptográfiai védelmet nyújt a csomagmanipuláció ellen, megakadályozza a leskelődést, jól skálázódik, ellenáll a hálózati csomagvesztésnek, és a kapcsolat biztonsága során a legkisebb precíziós veszteséget eredményezi.
Az NTS-kapcsolat két szakaszból áll, amelyek alacsonyabb rétegbeli protokollokat használnak. Tovább első Ebben a szakaszban a kliens és a szerver megállapodik a különböző kapcsolati paraméterekben, és kulcsokat tartalmazó sütiket cserél az összes kísérő adatkészlettel. Tovább második Ebben a szakaszban a tényleges védett NTS-munkamenet az ügyfél és az NTP-kiszolgáló között zajlik.

Az NTS két alsóbb szintű protokollból áll: a Network Time Security Key Exchange (NTS-KE) protokollból, amely biztonságos kapcsolatot kezdeményez TLS-en keresztül, és az NTPv4-ből, az NTP protokoll legújabb megtestesüléséből. Erről alább egy kicsit bővebben.
Első szakasz - NTS KE
Ebben a szakaszban az NTP-kliens egy TLS 1.2/1.3-as munkamenetet kezdeményez egy különálló TCP-kapcsolaton keresztül az NTS KE-kiszolgálóval. Ezen az ülésen a következő történik.
- A paramétereket a felek határozzák meg algoritmus a második szakaszhoz.
- A felek meghatároznak egy második alsóbb szintű protokollt, de jelenleg csak az NTPv4 támogatott.
- A felek meghatározzák az NTP-szerver IP-címét és portját.
- Az NTS KE szerver sütiket bocsát ki az NTPv4 alatt.
- A felek kivonnak egy pár szimmetrikus kulcsot (C2S és S2C) a süti anyagából.
Ennek a megközelítésnek az a nagy előnye, hogy a kapcsolati paraméterekkel kapcsolatos titkos információk továbbításának teljes terhe a bevált és megbízható TLS protokollra hárul. Így nem kell újra feltalálnia saját kerekét a biztonságos NTP-kézfogás érdekében.
Második szakasz - NTP NTS védelem alatt
A második szakaszban a kliens biztonságosan szinkronizálja az időt az NTP-kiszolgálóval. Ebből a célból négy speciális kiterjesztést (kiterjesztési mezőt) továbbít az NTPv4 csomagstruktúrában.
- Az Unique Identifier Extension egy véletlenszerű nonce-t tartalmaz a visszajátszási támadások megelőzésére.
- Az NTS Cookie Extension tartalmazza az egyik ügyfél számára elérhető NTP cookie-t. Mivel csak a kliens rendelkezik szimmetrikus AAED C2S és S2C kulcsokkal, az NTP-szervernek ki kell bontania azokat a cookie-anyagból.
- Az NTS Cookie Placeholder Extension segítségével az ügyfél további cookie-kat kérhet a szervertől. Ez a kiterjesztés szükséges annak biztosításához, hogy az NTP-kiszolgáló válasza ne legyen sokkal hosszabb, mint a kérés. Ez segít megelőzni az amplifikációs támadásokat.
- Az NTS Authenticator és Encrypted Extension Fields Extension tartalmazza az AAED-rejtjelet a C2S kulccsal, az NTP-fejlécet, az időbélyegeket és a fenti EF-t kísérő adatokként. E kiterjesztés nélkül lehetséges az időbélyegek hamisítása.

Az ügyféltől érkező kérés fogadásakor a szerver ellenőrzi az NTP-csomag hitelességét. Ehhez dekódolnia kell a cookie-kat, ki kell bontania az AAED algoritmust és a kulcsokat. Az NTP-csomag érvényességének sikeres ellenőrzése után a szerver a következő formátumban válaszol a kliensnek.
- Az Unique Identifier Extension a kliens kérésének tükörmásolata, a visszajátszási támadások elleni intézkedés.
- NTS Cookie Extension további cookie-kat a munkamenet folytatásához.
- Az NTS Authenticator és Encrypted Extension Fields kiterjesztés tartalmazza az AEAD titkosítást egy S2C kulccsal.
A második kézfogás sokszor megismételhető, az első lépés megkerülésével, mivel minden kérés és válasz további cookie-kat ad az ügyfélnek. Ennek megvan az az előnye, hogy a viszonylag erőforrás-igényes TLS-műveleteket a PKI-adatok számítása és továbbítása során elosztjuk az ismételt kérések számával. Ez különösen a speciális FPGA időmérők számára kényelmes, amikor az összes fő funkcionalitás több funkcióba csomagolható a szimmetrikus kriptográfia területéről, átvihető a teljes TLS verem egy másik eszközre.
NTPSec
Mi a különleges az NTP-ben? Annak ellenére, hogy a projekt szerzője, Dave Mills igyekezett a lehető legjobban dokumentálni a kódját, ritka programozó, aki képes lesz megérteni a 35 éves időszinkronizációs algoritmusok bonyolultságát. A kód egy része a POSIX-korszak előtt íródott, és a Unix API akkoriban nagyon különbözött a ma használttól. Ezenkívül a statisztika ismerete szükséges ahhoz, hogy a jelet a zajos vonalakon fellépő zavaroktól megtisztítsuk.
Nem az NTS volt az első kísérlet az NTP javítására. Miután a támadók megtanulták kihasználni az NTP sebezhetőségeit a DDoS támadások felerősítésére, világossá vált, hogy radikális változtatásokra van szükség. Miközben pedig az NTS-tervezetek előkészítése és véglegesítése zajlott, az Egyesült Államok Nemzeti Tudományos Alapítványa 2014 végén sürgősen támogatást különített el az NTP korszerűsítésére.
A munkacsoport élén nem akárki állt, hanem - az Open Source közösség egyik alapítója és pillére, a könyv szerzője . Az első dolog, amit Eric és barátai megpróbáltak megtenni, az NTP-kód áthelyezése volt a BitKeeper platformról a git-re, de ez nem sikerült. Harlan Stenn, a projekt vezetője ellenezte ezt a döntést, és a tárgyalások elakadtak. Aztán elhatározták, hogy a projekt kódját elágazik, és megszületett az NTPSec.
Szilárd tapasztalat, beleértve a GPSD-vel kapcsolatos munkát, a matematikai hátteret és az ősi kódolvasás mágikus készségét – Eric Raymond pontosan az a hacker volt, aki képes volt egy ilyen projektet megvalósítani. A csapat talált egy kódmigrációs szakembert és mindössze 10 hét alatt NTP-t a GitLabon. Javában folyt a munka.
Eric Raymond csapata ugyanúgy vállalta a feladatot, mint Auguste Rodin egy kőtömbnél. 175 KLOC régi kód eltávolításával számos biztonsági rést bezárva jelentősen csökkenteni tudták a támadási felületet.
Íme a disztribúcióban szereplők hiányos listája:
- Dokumentálatlan, elavult, elavult vagy törött refclock.
- Nem használt ICS könyvtár.
- libopts/autogen.
- Régi Windows kód.
- ntpdc.
- Autokey.
- Az ntpq C kódot átírták Pythonban.
- Az sntp/ntpdig C kódot átírták Pythonban.
A kódtisztításon kívül más feladatok is voltak a projektben. Íme egy részleges lista az eredményekről:
- A puffertúlcsordulás elleni kódvédelem jelentősen javult. A puffertúlcsordulás megelőzése érdekében az összes nem biztonságos karakterlánc-függvényt (strcpy/strcat/strtok/sprintf/vsprintf/gets) biztonságos verziókra cserélték, amelyek pufferméret-korlátozást alkalmaznak.
- NTS támogatás hozzáadva.
- A fizikai hardver összekapcsolásával megtízszereződött az időlépés pontossága. Ez annak köszönhető, hogy a modern számítógépes órák sokkal pontosabbak lettek, mint az NTP megszületésekor. Ennek a legnagyobb haszonélvezői a GPSDO és a dedikált időrádiók voltak.
- A programozási nyelvek száma kettőre csökkent. A Perl, az awk és még az S szkriptek helyett most már csak Python. Ennek köszönhetően több lehetőség nyílik a kód újrafelhasználására.
- Az autotools szkriptek tészta helyett a projekt szoftverkészítő rendszert kezdett használni .
- Frissített és átrendeződött projektdokumentáció. Az egymásnak ellentmondó, olykor archaikus iratgyűjteményből egészen áttekinthető dokumentációt készítettek. Mostantól minden parancssori kapcsolónak és minden konfigurációs entitásnak van egyetlen verziója az igazságról. Ezenkívül a kézikönyvoldalak és a webes dokumentáció most ugyanazokból az alapvető fájlokból készül.
Az NTPSec számos Linux disztribúcióhoz elérhető. Jelenleg a legújabb stabil verzió az 1.1.8, Gentoo Linuxra ez az utolsó előtti.
(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
Volt egy újabb kísérlet arra, hogy a régi NTP-t biztonságosabb alternatívával cseréljék le. A Chrony, az NTPSec-től eltérően, az alapoktól kezdve íródott, és úgy tervezték, hogy megbízhatóan működjön számos körülmény között, beleértve az instabil hálózati kapcsolatokat, a hálózat részleges rendelkezésre állását vagy torlódásait, valamint a hőmérséklet-változásokat. Ezenkívül a chronynak más előnyei is vannak:
- a chrony gyorsabban, nagyobb pontossággal tudja szinkronizálni a rendszerórát;
- A chrony kisebb, kevesebb memóriát fogyaszt, és csak szükség esetén fér hozzá a CPU-hoz. Ez nagy előny az erőforrások és az energia megtakarítása szempontjából;
- A chrony támogatja a hardveres időbélyegeket Linuxon, ami rendkívül pontos szinkronizálást tesz lehetővé a helyi hálózatokon.
A chrony azonban hiányzik a régi NTP néhány funkciójából, mint például a broadcast és a multicast kliens/szerver. Ezenkívül a klasszikus NTP több operációs rendszert és platformot támogat.
A kiszolgáló és a chronyd folyamathoz intézett NTP-kérések letiltásához csak írja be a 0-s portot a chrony.conf fájlba. Erre olyan esetekben kerül sor, amikor nincs szükség az NTP-kliensek vagy társaik számára fenntartott időre. A 2.0-s verzió óta az NTP-kiszolgáló portja csak akkor van nyitva, ha a hozzáférést engedélyezési direktíva vagy megfelelő parancs engedélyezi, vagy NTP-társ konfigurálva van, vagy broadcast direktívát használnak.
A program két modulból áll.
- A chronyd egy háttérben futó szolgáltatás. Információkat kap a rendszeróra és a külső időszerver közötti különbségről, és beállítja a helyi időt. Az NTP protokollt is megvalósítja, és kliensként vagy szerverként is működhet.
- A chronyc egy parancssori segédprogram a programok figyelésére és vezérlésére. Különféle szolgáltatási paraméterek finomhangolására szolgál, például lehetővé teszi NTP-kiszolgálók hozzáadását vagy eltávolítását, miközben a chronyd fut.
A RedHat Linux 7-es verziója óta chrony időszinkronizálási szolgáltatásként. A csomag más Linux-disztribúciókhoz is elérhető. A legújabb stabil verzió a 3.5, amely a 4.0 kiadásra készül.
(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]
Hogyan állíthat be saját távoli Chrony szervert az interneten az idő szinkronizálásához az irodai hálózaton. Az alábbiakban egy példa a VPS beállítására.
Példa a Chrony beállítására RHEL / CentOS rendszeren VPS-en
Gyakoroljunk egy kicsit, és állítsuk be saját NTP szerverünket VPS-en. Nagyon egyszerű, csak válassza ki a megfelelő tarifát a RuVDS webhelyen, szerezzen be egy kész szervert, és írjon be egy tucat egyszerű parancsot. Céljainkra ez a lehetőség meglehetősen megfelelő.

Térjünk át a szolgáltatás beállítására, és először telepítsük a chrony csomagot.
[root@server ~]$ yum install chronyAz RHEL 8 / CentOS 8 másik csomagkezelőt használ.
[root@server ~]$ dnf install chronyA chrony telepítése után el kell indítania és aktiválnia kell a szolgáltatást.
[root@server ~]$ systemctl enable chrony --nowHa szükséges, módosíthatja az /etc/chrony.conf fájlt, lecserélve az NPT-kiszolgálókat a legközelebbi helyi szerverekre a válaszidő csökkentése érdekében.
# 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
Ezután beállítjuk az NTP-kiszolgáló szinkronizálását a megadott készlet csomópontjaival.
[root@server ~]$ timedatectl set-ntp true
[root@server ~]$ systemctl restart chronyd.service
Az NTP portot is ki kell nyitni, különben a tűzfal blokkolja a bejövő kapcsolatokat a kliens csomópontokról.
[root@server ~]$ firewall-cmd --add-service=ntp --permanent
[root@server ~]$ firewall-cmd --reload
Kliens oldalon elég az időzóna helyes beállítása.
[root@client ~]$ timedatectl set-timezone Europe/MoscowAz /etc/chrony.conf fájl megadja a chrony NTP-kiszolgálót futtató VPS-szerverünk IP-címét vagy gazdagépnevét.
server my.vps.serverÉs végül a kliens időszinkronizálásának megkezdése.
[root@client ~]$ systemctl enable --now chronyd
[root@client ~]$ timedatectl set-ntp true
Legközelebb elmondom, milyen lehetőségek vannak az idő internet nélküli szinkronizálására.
Forrás: will.com
