Hogyan vált biztonságossá az időszinkronizálás

Hogyan vált biztonságossá az időszinkronizálás
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 elavult é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 for

Az 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 egy új verzió 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.

Hogyan vált biztonságossá az időszinkronizálás

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

Hogyan vált biztonságossá az időszinkronizálás

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 Eric Steven Raymond - az Open Source közösség egyik alapítója és pillére, a könyv szerzője Katedrális és Bazár. 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 letelepedetta 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 WAF.
  • 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 felhasznál 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ő.

Hogyan vált biztonságossá az időszinkronizálás

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 chrony

Az RHEL 8 / CentOS 8 másik csomagkezelőt használ.

[root@server ~]$ dnf install chrony

A chrony telepítése után el kell indítania és aktiválnia kell a szolgáltatást.

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

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

Az /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.

Hogyan vált biztonságossá az időszinkronizálás

Hogyan vált biztonságossá az időszinkronizálás

Forrás: will.com

Hozzászólás