1. Dlaczego Synchronizacja Czasu Ma Znaczenie
W systemach rozproszonych wspólna skala czasu jest potrzebna do porządkowania zdarzeń i weryfikacji operacji. Każdy komputer i urządzenie sieciowe ma własny zegar, zwykle oparty na oscylatorze kwarcowym. Zegary te dryfują, dlatego bez korekcji czas na dwóch komputerach może różnić się o sekundy, minuty, a nawet więcej.
Brak spójnego czasu utrudnia działanie wielu systemów:
- Analiza Logów i Informatyka Śledcza: Podczas incydentu obejmującego wiele serwerów śledczy muszą odtworzyć sekwencję zdarzeń. Niesynchronizowane znaczniki czasu utrudniają ustalenie kolejności działań i prześledzenie kroków atakującego.
- Systemy Rozproszone i Bazy Danych: Rozproszone bazy danych i systemy plików mogą używać znaczników czasu do porządkowania transakcji i kontroli spójności. Rozbieżność zegarów może utrudniać te operacje i prowadzić do niespójnych wyników.
- Protokoły Uwierzytelniania: Protokoły takie jak Kerberos używają znaczników czasu do ograniczania ataków typu replay. Bilet uwierzytelniający wydany przez serwer jest ważny tylko przez krótki okres, dlatego zbyt duża różnica zegarów może uniemożliwić uwierzytelnienie.
- Transakcje Finansowe: W handlu wysokiej częstotliwości i wybranych systemach bankowych znaczniki czasu mogą mieć dokładność milisekund, a nawet mikrosekund, aby wspierać porządkowanie zdarzeń i zgodność z regulacjami.
Protokół służy do synchronizacji zegarów klientów z jednym lub większą liczbą serwerów nadrzędnych, których źródła mogą być powiązane z UTC. Osiągalna precyzja zależy od implementacji, źródła i trasy. W publicznym internecie może wynosić kilka lub kilkadziesiąt milisekund, a w szybkich sieciach lokalnych może być znacznie lepsza.
Typowo NTP korzysta z UDP na porcie 123. Częstotliwość odpytywania oraz wybór źródeł wpływają na ruch sieciowy i jakość estymaty, dlatego konfiguracja powinna uwzględniać opóźnienia, stabilność zegarów i wymagania aplikacji. Sam znacznik czasu nie potwierdza tożsamości źródła. Do tego potrzebne są mechanizmy uwierzytelniania. Implementacje mogą raportować opóźnienie i rozproszenie względem źródła nadrzędnego, co pomaga ocenić niepewność pomiaru. Te wielkości opisują właściwości ścieżki i źródła, lecz niski numer stratum nie jest gwarancją dokładności.
2. Hierarchiczna Struktura NTP: Poziomy Stratum
NTP organizuje dystrybucję czasu w systemie hierarchicznym lub warstwowym. Pozycja serwera czasu w tej hierarchii jest określana przez jego poziom . Poziom stratum opisuje odległość od źródła czasu i nie jest samodzielną miarą jakości ani niezawodności serwera.
- Stratum 0
Są to wysokiej precyzji zegary referencyjne, które służą jako źródło czasu dla całej sieci NTP. Nie są to serwery podłączone do sieci, ale same urządzenia czasowe. Przykłady obejmują:
- Zegary Atomowe: Urządzenia (np. cezowe, rubidowe), które wykorzystują częstotliwość rezonansową atomów jako podstawę czasu i zapewniają wysoką dokładność.
- Odbiorniki GPS: Satelity Globalnego Systemu Pozycjonowania (GPS) mają na pokładzie wiele zegarów atomowych. Odbiornik GPS na ziemi może wykorzystywać sygnały z tych satelitów do uzyskania bardzo dokładnego sygnału czasu.
- Odbiorniki Sygnałów Radiowych Czasu: Te urządzenia odbierają sygnały czasowe nadawane przez krajowe organizacje standardów czasu, takie jak WWVB w Stanach Zjednoczonych czy DCF77 w Niemczech.
- Stratum 1
Serwer Stratum 1 to komputer bezpośrednio podłączony do zegara referencyjnego Stratum 0. Synchronizuje swój wewnętrzny zegar z tym źródłem i udostępnia czas innym komputerom w sieci. Serwery Stratum 1 należą zwykle do najdokładniejszych serwerów dostępnych w sieci, lecz wynik zależy także od źródła i implementacji.
- Stratum 2
Serwer Stratum 2 to komputer, który pobiera swój czas poprzez synchronizację z jednym lub wieloma serwerami Stratum 1 za pośrednictwem połączenia sieciowego. Następnie udostępnia ten czas innym komputerom.
- Stratum 3 i Wyższe
Hierarchia jest kontynuowana w ten sam sposób. Serwer Stratum 3 synchronizuje się z serwerem Stratum 2, Stratum 4 z Stratum 3 itd. Dokładność zależy na każdym poziomie od opóźnień, stabilności zegara i obciążenia ścieżki. Wyższy poziom często oznacza dłuższą ścieżkę synchronizacji. NTP może obsługiwać do 15 warstw stratum. Stratum 16 jest używane do wskazania, że urządzenie jest niezsynchronizowane.
Hierarchia ułatwia skalowanie i obsługę awarii. Klient może być skonfigurowany tak, aby pobierać czas z kilku różnych serwerów (np. trzech lub czterech serwerów Stratum 2). Oprogramowanie NTP porównuje pomiary, odrzuca źródła uznane za niepoprawne i wyznacza estymatę czasu na podstawie pozostałych źródeł.
3. Algorytm Synchronizacji NTP
NTP synchronizuje zegary mimo zmiennych opóźnień sieciowych, takich jak opóźnienia występujące w internecie. Wykorzystuje do tego wymianę pakietów zawierających znaczniki czasu między klientem a serwerem.
Cztery Kluczowe Znaczniki Czasu
Aby obliczyć różnicę czasu i opóźnienie sieciowe, wymiana NTP wykorzystuje cztery znaczniki czasu:
- (Znacznik Czasu Nadania - Originate Timestamp): Czas na zegarze klienta w momencie wysłania pakietu żądania do serwera.
- (Znacznik Czasu Odbioru - Receive Timestamp): Czas na zegarze serwera w momencie odebrania pakietu żądania od klienta.
- (Znacznik Czasu Transmisji - Transmit Timestamp): Czas na zegarze serwera w momencie wysłania pakietu odpowiedzi z powrotem do klienta.
- (Znacznik Czasu Docelowego - Destination Timestamp): Czas na zegarze klienta w momencie odebrania pakietu odpowiedzi od serwera.
Posiadając te cztery informacje, klient może obliczyć dwie kluczowe metryki.
Obliczanie Opóźnienia w Obie Strony
(, delta) to całkowity czas, jaki pakiety spędziły na podróży przez sieć. Oblicza się go, biorąc całkowity czas, jaki upłynął na zegarze klienta () i odejmując od niego czas, jaki serwer spędził na przetwarzaniu żądania ().
Obliczanie Przesunięcia Zegara
(, theta) jest estymatą różnicy między zegarem serwera a zegarem klienta. NTP zakłada, że opóźnienie na ścieżce sieciowej jest w przybliżeniu symetryczne, czyli czas dotarcia żądania do serwera jest zbliżony do czasu powrotu odpowiedzi. Przy tym założeniu przesunięcie oblicza się jako połowę różnicy między dwoma czasami podróży w jedną stronę.
Dyscyplina Zegara: Dostrajanie Zegara
Prymitywne podejście do korekcji zegara klienta polegałoby po prostu na jego przestawieniu do przodu lub do tyłu o obliczone przesunięcie . Może to jednak powodować poważne problemy dla aplikacji wrażliwych na czas. Jeśli zegar cofnie się, logi mogą stracić chronologię, zaplanowane zadania mogą uruchomić się dwukrotnie, a obliczenia oparte na upływie czasu mogą być błędne. Jeśli przeskoczy do przodu, zadania mogą zostać pominięte.
Pełna implementacja klienta NTP używa . Utrzymuje on oszacowanie błędu zegara i jego dryfu częstotliwości. Dla małych korekt dostosowuje prędkość lokalnego zegara, co nazywa się dostrajaniem (slewing). Zegar biegnie wtedy nieco szybciej lub wolniej, aż zbliży się do poprawnego czasu. Przy dużym błędzie implementacja może wykonać bezpośrednią korektę, dlatego monotoniczność zależy od systemu operacyjnego i jego konfiguracji.
4. Tryby Pracy NTP
NTP może działać w kilku różnych trybach, w zależności od środowiska sieciowego i ról uczestniczących urządzeń.
- Tryb Klient/Serwer: Jest to najczęstszy tryb. Klient wysyła żądanie o czas do serwera i oczekuje na odpowiedź. Klient nie dostarcza żadnych informacji o czasie serwerowi.
- Tryb Symetryczny: Ten tryb jest używany między peerami, często na tym samym lub podobnym poziomie stratum. Dwa serwery w trybie symetrycznym wymieniają pakiety czasowe i mogą wzajemnie dostarczać synchronizację oraz dane do kontroli poprawności. Jeśli konfiguracja na to pozwala, serwer po utracie własnych źródeł może zsynchronizować się z peerem.
- Tryb Broadcast/Multicast: W sieci lokalnej (LAN) z wieloma klientami każdy klient może odbierać okresowe pakiety wysyłane na adres rozgłoszeniowy lub grupowy multicast. Klienci mogą synchronizować zegary bez stałego wysyłania indywidualnych żądań. Bez dodatkowej wymiany unicast tryb ten nie zapewnia pełnego pomiaru opóźnienia w obie strony, dlatego estymata może być mniej dokładna. Klient może wcześniej wymienić kilka pakietów unicast z serwerem, aby oszacować opóźnienie propagacji.
5. Prosty Protokół Czasu Sieciowego (SNTP)
SNTP to uproszczony sposób dostępu do protokołu NTP. Używa tego samego formatu pakietów i obliczeń znaczników czasu, lecz nie wymaga pełnego zestawu mechanizmów selekcji i stabilizacji typowych dla implementacji NTP. Klient SNTP nie musi utrzymywać rozbudowanego stanu ani porównywać czasu z wielu serwerów.
Zazwyczaj klient SNTP wysyła żądanie do jednego serwera i akceptuje otrzymany czas. W wielu prostych implementacjach wykonuje bezpośrednią korektę zegara zamiast stopniowego dostrajania stosowanego przez część pełnych klientów NTP.
Ze względu na prostotę i mniejsze zapotrzebowanie na zasoby, SNTP nadaje się do systemów wbudowanych, urządzeń IoT i innych zastosowań, gdzie wysoka precyzja jest mniej krytyczna niż rozsądnie dokładny czas. Systemy operacyjne, w tym Windows i macOS, zawierają klientów czasu, lecz ich tryb pracy i poziom filtracji zależą od implementacji oraz konfiguracji. Niektóre systemy udostępniają w podstawowej konfiguracji klienta pracującego w trybie zbliżonym do SNTP, a szczegóły zależą od konkretnej wersji oprogramowania.
6. Aspekty Bezpieczeństwa w NTP
Oryginalny NTP nie zapewniał uwierzytelniania jako domyślnej ochrony. Nieuwierzytelniona sesja NTP jest podatna na różne ataki, w szczególności na . Atakujący może przechwycić pakiety NTP i odesłać sfałszowane odpowiedzi, ustawiając zegar klienta na błędny czas. Może to zakłócić usługi, wpłynąć na walidację certyfikatów bezpieczeństwa lub zaburzyć dane zależne od czasu.
NTPv4 opisuje mechanizm uwierzytelniania oparty na kryptografii klucza symetrycznego. Wcześniej uzgodniony tajny klucz konfiguruje się na kliencie i serwerze. Klient dołącza do pakietu kod uwierzytelniania wiadomości oparty na kluczu, a serwer weryfikuje go i uwierzytelnia odpowiedź. Przy niezgodności kodu pakiet powinien zostać odrzucony. W starszych konfiguracjach spotyka się algorytmy takie jak MD5 lub SHA1, dlatego wybór mechanizmu i ochrona kluczy mają znaczenie. Network Time Security (NTS) wykorzystuje PKI z kluczem publicznym do uwierzytelnienia serwera, a następnie chroni pola rozszerzeń NTP za pomocą uwierzytelniania i szyfrowania.