Jak se synchronizace času stala bezpečnou

Jak se synchronizace času stala bezpečnou
Jak zajistit, aby čas sám o sobě nebyl klamný, pokud máte milion velkých a malých zařízení komunikujících po TCP/IP? Vždyť na každém z nich jsou hodiny a čas by měl být správný na všech. Tento problém bez NTP nelze vyřešit.

Představme si na jednu minutu, že v jednom segmentu průmyslové IT infrastruktury vznikly problémy se synchronizací služeb podle času. Okamžitě začne selhávat klastrový stack podnikového softwaru, rozpadnou se domény, primární a záložní uzly se bez úspěchu snaží obnovit status quo.

Je také možné, že útočník se úmyslně pokouší narušit čas prostřednictvím MiTM nebo DDoS útoku. V takové situaci se může stát cokoliv:

  • vyprší platnost uživatelských účtů;
  • vyprší platnost X.509 certifikátů;
  • dvoufaktorová autentizace TOTP přestane fungovat;
  • zálohy se 'ostarají' a systém je odstraní;
  • zkolabuje DNSSec.

Je jasné, že každý první IT oddělení má zájem na spolehlivém chodu časových synchronizačních služeb a bylo by dobré, kdyby byly spolehlivé a bezpečné v průmyslovém provozu.

Rozbití NTP za 25 minut

Síťové protokoly – mileniálové mají jednu zvláštnost, existují už dlouho jsou zastaralé a nikam už nepasují, ale jejich výměna není snadná ani tehdy, když se shromáždí kritická masa nadšenců a financí.

Hlavní výtka klasickému NTP je nedostatek spolehlivých mechanismů ochrany proti útokům útočníků. Byly podniknuty různé pokusy tento problém vyřešit. Nejprve byl zaveden mechanismus předem stanovených klíčů (PSK) pro výměnu symetrických klíčů.

Bohužel, tento způsob se neosvědčil z prostého důvodu – špatně se škáluje. Je nutné manuálně nastavit na straně klienta v závislosti na serveru. To znamená, že takto jednoduše nelze přidat dalšího klienta. Pokud se na serveru NTP něco změní, je nutné přeprogramovat všechny klienty.

Pak vymysleli AutoKey, ale ihned byly objeveny řady vážných zranitelností v samotném designu algoritmu a bylo nutné se od něj vzdát. Celý problém je, že počáteční číslo (seed) obsahuje pouze 32 bitů, což je příliš málo a neobsahuje dostatečnou výpočetní složitost pro hrubou sílu.

  • Key ID – symetrický 32bitový klíč;
  • MAC (kód pro autentizaci zpráv) — kontrolní součet NTP paketu;

Autokey se vypočítává následujícím způsobem.

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

Kde H() — kryptografická hašovací funkce.

Pro výpočet kontrolního součtu se používá stejná funkce pro pakety.

MAC=H(Autokey||NTP packet)

Tak se ukazuje, že celá integrita kontroly paketů závisí na autentičnosti cookie. Získáním jich lze obnovit autokey a následně padělat MAC. Nicméně server NTP při jejich generování používá počáteční číslo (seed). Právě zde se skrývá úskalí.

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

Funkce MSB_32 ořízne 32 nejvyšších bitů z výsledku výpočtu md5 hašování. Klientská cookie se nemění, dokud jsou parametry serveru neměnné. Dále zbývá útočníkovi pouze obnovit počáteční číslo a získat možnost generovat cookies sám.

Nejprve se musí připojit k serveru NTP jako klient a získat cookies. Poté útočník pomocí metody pokusu a omylu obnoví počáteční číslo následováním jednoduchého algoritmu.

Algoritmus útoku na výpočet počátečního čísla metodou pokusu.

   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 adresy jsou známé, takže zbývá pouze vytvořit 2^32 hašů, dokud vytvořená cookie nesouhlasí s tou, kterou získal z NTP serveru. Na běžné domácí stanici s Intel Core i5 to potrvá 25 minut.

NTS — nový Autokey

S takovými bezpečnostními nedostatky Autokey se nedalo smířit, a tak v roce 2012 vznikl nová verze protokol. Aby se předešlo zkompromitování, rozhodli se provést rebranding, takže Autokey v.2 byl nazván Network Time Security.

Protokol NTS je rozšířením bezpečnosti NTP a v současné době podporuje pouze unicast režim. Poskytuje spolehlivou kryptografickou ochranu proti manipulaci s pakety, brání sledování, dobře se škáluje, je odolný vůči ztrátě síťových paketů a nabízí minimální ztrátu přesnosti, která vzniká během ochrany spojení.

NTS spojení se skládá ze dvou fází, v nichž se používají protokoly nižší úrovně. Na první fázi se klient a server dohodnou na různých parametrech spojení a vyměňují si cookies, které obsahují klíče se všemi souvisejícími daty. Na druhé fázi dochází k samotnému chráněnému NTS sezení mezi klientem a serverem NTP.

Jak se synchronizace času stala bezpečnou

NTS se skládá ze dvou protokolů na nižší úrovni: výměna klíčů zabezpečení časové sítě (NTS-KE), která inicializuje bezpečné spojení přes TLS, a NTPv4 — poslední inkarnace protokolu NTP. O tom níže více.

První etapa — NTS KE

V této fázi NTP klient iniciuje sezení TLS 1.2/1.3 přes samostatné TCP spojení se serverem NTS KE. Během této relace se děje následující.

  • Strany určují parametry AEAD algoritmu pro druhou etapu.
  • Strany určují druhý protokol na nižší úrovni, ale v současné době je podporován pouze NTPv4.
  • Strany určují IP adresu a port NTP serveru.
  • Server NTS KE vydává cookies pro NTPv4.
  • Strany extrahují z materiálu cookies pár symetrických klíčů (C2S a S2C).

Tento přístup má velkou výhodu v tom, že veškeré zatížení přenosu tajných informací o parametrech spojení leží na prověřeném a spolehlivém protokolu TLS. Tím odpadá potřeba vynalézat vlastní řešení pro bezpečné NTP handshake.

Druhá etapa — NTP chráněný NTS

Ve druhé fázi klient bezpečně synchronizuje čas s NTP serverem. K tomu předává čtyři speciální rozšíření (extension field) ve struktuře NTPv4 paketu.

  • Unique Identifier Extension obsahuje náhodný nonce pro prevenci opakovaných útoků.
  • NTS Cookie Extension obsahuje jedno z dostupných NTP cookies klienta. Protože pouze klient má symetrické AAED klíče C2S a S2C, NTP server je musí extrahovat z materiálu cookies.
  • NTS Cookie Placeholder Extension je způsob, jak může klient požádat o další cookies ze serveru. Toto rozšíření je nezbytné, aby odpověď NTP serveru nebyla výrazně delší než žádost. To zabraňuje útokům zesílení.
  • NTS Authenticator and Encrypted Extension Fields Extension obsahuje šifrovací algoritmus AAED s klíčem C2S, hlavičkou NTP, časovými razítky a výše uvedenými EF jako dodatečnými daty. Bez tohoto rozšíření je možné podvrhnout časová razítka.

Jak se synchronizace času stala bezpečnou

Po obdržení žádosti od klienta server ověřuje platnost NTP paketu. K tomu musí dešifrovat cookies, extrahovat algoritmus AAED a klíče. Po úspěšném ověření platnosti NTP paketu server odpovídá klientovi v následujícím formátu.

  • Unique Identifier Extension je zrcadlovým odrazem klientské žádosti, opatřením proti opakovaným útokům.
  • NTS Cookie Extension je více cookies pro pokračování sezení.
  • NTS Authenticator a rozšíření Encrypted Extension Fields využívá šifru AEAD s klíčem S2C.

Druhé handshake může být opakováno mnohokrát, přičemž první fázi lze vynechat, protože každá žádost a odpověď poskytuje klientovi další cookies. To přináší výhodu, že relativně náročné operace TLS pro výpočty a přenos PKI dat jsou rozděleny na počet opakovaných požadavků. To je obzvláště pohodlné pro specializované FPGA chronometry, kde lze celou hlavní funkcionalitu zabalit do několika funkcí z oblasti symetrické kryptografie a přesunout celý TLS stack na jiné zařízení.

NTPSec

Jaké jsou zvláštnosti NTP? I když se autor projektu Dave Mills snažil co nejlépe zdokumentovat svůj kód, řídce který programátor zvládne složitosti algoritmů synchronizace času starých 35 let. Část kódu byla napsána před dobou POSIX a Unix API se tehdy výrazně lišil od toho, co se používá dnes. Kromě toho jsou potřeba znalosti v oblasti statistiky, aby se signál vyčistil od šumu na hlučných linkách.

NTS nebyla první pokus o opravu NTP. Poté, co se útočníci naučili využívat zranitelnosti NTP k zesílení DDoS útoků, bylo jasné, že jsou zapotřebí radikální změny. A zatímco se připravovaly a dolaďovaly návrhy NTS, National Science Foundation USA naléhavě v závěru roku 2014 přidělila grant na modernizaci NTP.

Pracovní skupinu vedl nikdo jiný než Eric Steven Raymond — jeden ze zakladatelů a pilířů komunity Open Source a autor knihy Katedrála a trh. Eric a jeho kolegové se nejprve pokusili přenést kód NTP z platformy BitKeeper na git, ale nedařilo se. Vedoucí projektu Harlan Stenn byl proti tomuto rozhodnutí a jednání uvízla v slepé uličce. Poté bylo rozhodnuto kód projektu forknout a tak vznikl NTPSec.

Solidní zkušenosti, včetně práce na GPSD, matematický background a kouzelná dovednost číst starý kód — Eric Raymond byl právě tím hackerem, který mohl takový projekt vytáhnout. V týmu byl odborník na migraci kódu a během pouhých 10 týdnů se NTP usadilna GitLabu. Práce začala.

Tým Erica Raymonda se do práce pustil stejně jako Auguste Rodin při práci s blokem kamene. Odstraněním 175 KLOC starého kódu se jim podařilo výrazně snížit plochu útoku a uzavřít řadu bezpečnostních děr.

Zde je neúplný seznam těch, kteří se dostali pod palbu:

  • Nedokumentované, zastaralé, obsolete nebo nefunkční refclock.
  • Nepoužívaná knihovna ICS.
  • libopts/autogen.
  • Starý kód pro Windows.
  • ntpdc.
  • Autokey.
  • C kód ntpq byl převeden na Python.
  • C kód sntp/ntpdig byl převeden na Python.

Kromě úklidu kódu měl projekt i další úkoly. Zde je neúplný seznam úspěchů:

  • Ochrana kódu před přetečením byla výrazně posílena. Aby se předešlo přetečení bufferu, všechny nebezpečné řetězcové funkce (strcpy / strcat / strtok / sprintf / vsprintf / gets) byly nahrazeny bezpečnými verzemi, které implementují omezení velikosti bufferu.
  • Byla přidána podpora NTS.
  • Desetinásobně jsme zvýšili přesnost časového kroku pomocí vazby na fyzické vybavení. To souvisí s tím, že moderní počítačové hodiny jsou mnohem přesnější než ty, které existovaly při vzniku NTP. Nejvíce z toho profitovaly GPSDO a specializované časové stanice.
  • Počet programovacích jazyků byl zredukován na dva. Místo skriptů Perl, awk a dokonce S, nyní používáme pouze Python. Díky tomu se zvýšily možnosti opětovného použití kódu.
  • Místo pletence skriptů autotools projekt začal používat systém pro sestavování softwaru. waf.
  • Aktualizovali a reorganizovali jsme dokumentaci projektu. Z rozporuplné a místy archaické sbírky dokumentů jsme vytvořili dostatečně solidní dokumentaci. Každá klíčová položka příkazového řádku a každá konfigurační entita nyní mají jedinou verzi pravdy. Kromě toho jsou stránky nápovědy a webová dokumentace nyní vytvářeny ze stejných základních souborů.

NTPSec je dostupný pro řadu distribucí Linuxu. V současnosti je poslední stabilní verze 1.1.8, pro Gentoo Linux — předposlední.

(1:696)$ sudo emerge -av ntpsec
Tyto balíčky by byly sloučeny, v tomto pořadí:
Výpočet závislostí... hotovo!
[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
Celkem: 1 balíček (1 přeinstalace), Velikost stažených dat: 0 KiB
Chcete tyto balíčky sloučit? [Ano/Ne]

Chrony

Byl další pokus nahradit starý NTP bezpečnějším analogem. Chrony, na rozdíl od NTPSec, byl napsán od nuly a je určen pro spolehlivou práci v širokém spektru podmínek, včetně nestabilních síťových připojení, částečné dostupnosti nebo přetížení sítě a změn teploty. Kromě toho má chrony i další výhody:

  • chrony dokáže rychleji synchronizovat systémové hodiny s větší přesností;
  • chrony je menší, spotřebovává méně paměti a obrací se na procesor pouze tehdy, když je to nutné. To je velká výhoda pro úsporu zdrojů a energie;
  • chrony podporuje časová razítka na hardwarové úrovni v Linuxu, což zajišťuje mimořádně přesnou synchronizaci v lokálních sítích.

Nicméně, v chrony chybí některé funkce starého NTP, jako například širokopásmový a vícerozměrný (multicast) klient/server. Kromě toho klasický NTP podporuje větší počet operačních systémů a platforem.

Pro deaktivaci funkčnosti serveru a NTP dotazů na proces chronyd stačí napsat port 0 do souboru chrony.conf. To se provádí v případech, kdy není potřeba obsluhovat čas pro NTP klienty nebo peer uzly. Od verze 2.0 je port NTP serveru otevřen pouze tehdy, když je přístup povolen direktivou allow nebo odpovídajícím příkazem, nebo je nastaven peer uzel NTP, nebo je použita direktiva broadcast.

Program se skládá ze dvou modulů.

  • chronyd — služba běžící na pozadí. Získává informace o rozdílu systémových hodin s externím časovým serverem a koriguje místní čas. Implementuje také protokol NTP a může fungovat jako klient nebo server.
  • chronyc — příkazový řádek pro monitorování a řízení programu. Používá se pro jemné ladění různých parametrů služby, například umožňuje přidávat nebo odebírat NTP servery, zatímco chronyd pokračuje v běhu.

Od 7. verze RedHat Linux používá chrony jako služba synchronizace času. Balíček je také dostupný pro ostatní distribuce Linuxu. Poslední stabilní verze je 3.5, připravuje se verze v4.0.

(1:712)$ sudo emerge -av chrony
Jsou to balíčky, které by byly sloučeny, v tomto pořadí:
Vypočítávání závislostí... hotovo!
[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
Celkem: 1 balíček (1 nový, 1 binární), velikost stahování: 246 KiB
Chcete tyto balíčky sloučit? [Ano/Ne]

Jak nastavit vlastní vzdálený server chrony na internetu pro synchronizaci času v kancelářské síti. Následuje příklad nastavení na VPS.

Příklad nastavení Chrony na RHEL / CentOS na VPS

Teď si trochu potrénujeme a zprovozníme si vlastní NTP server na VPS. Je to velmi jednoduché, stačí si vybrat vhodný tarif na stránkách RuVDS, získat hotový server a zadat desítku jednoduchých příkazů. Pro naše účely je tento variant naprosto vyhovující.

Jak se synchronizace času stala bezpečnou

Přejdeme k nastavení služby a jako první nainstalujeme balíček chrony.

[root@server ~]$ yum install chrony

RHEL 8 / CentOS 8 používají jiného správce balíčků.

[root@server ~]$ dnf install chrony

Po instalaci chrony je potřeba službu spustit a aktivovat.

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

Pokud chcete, můžete provést úpravy v /etc/chrony.conf, kde nahradíte NTP servery nejbližšími lokálními pro zkrácení doby odezvy.

# 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ále nastavíme synchronizaci NTP serveru s uzly z určeného poolu.

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

Je také nutné otevřít port NTP směrem ven, jinak bude firewall blokovat příchozí spojení od klientských uzlů.

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

Na straně klienta stačí správně nastavit časové pásmo.

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

V souboru /etc/chrony.conf uveďte IP nebo název hostitele našeho VPS serveru, na kterém je spuštěn NTP server chrony.

server my.vps.server

A nakonec spustíme synchronizaci času na klientovi.

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

Příště vám povím, jaké existují možnosti synchronizace času bez internetu.

Jak se synchronizace času stala bezpečnou

Jak se synchronizace času stala bezpečnou

Zdroj: habr.com

Koupit spolehlivý hosting pro webové stránky s ochranou proti DDoS, VPS VDS servery 🔥 Koupit spolehlivý hosting pro webové stránky s ochranou proti DDoS, VPS VDS servery | ProHoster