Wie kann man sicherstellen, dass die Zeit per se nicht lĂŒgt, wenn Sie Millionen von groĂen und kleinen GerĂ€ten haben, die ĂŒber TCP/IP interagieren? SchlieĂlich hat jedes dieser GerĂ€te eine Uhr, und die Zeit muss ĂŒberall korrekt sein. Dieses Problem lĂ€sst sich ohne NTP nicht lösen.
Stellen wir uns fĂŒr einen Moment vor, dass in einem Segment der industriellen IT-Infrastruktur Probleme mit der Zeitsynchronisierung der Dienste auftreten. Sofort beginnt das Cluster-Stack von Enterprise-Software zu schwanken, DomĂ€nen fallen auseinander, und Master- sowie Standby-Knoten versuchen vergeblich, den Status quo wiederherzustellen.
Es kann auch eine Situation eintreten, in der ein Angreifer absichtlich versucht, die Zeit ĂŒber Man-in-the-Middle-Attacken oder DDoS-Attacken zu stören. In einem solchen Fall kann alles Mögliche geschehen:
- die GĂŒltigkeit von Benutzerpasswörtern lĂ€uft ab;
- die GĂŒltigkeit von X.509-Zertifikaten lĂ€uft ab;
- die Zwei-Faktor-Authentifizierung TOTP funktioniert nicht mehr;
- Backups werden âobsoletâ und das System löscht sie;
- DNSSec bricht zusammen.
Es ist klar, dass jeder IT-Department an einer zuverlĂ€ssigen Funktion der Zeitsynchronisierungsdienste interessiert ist und es wĂŒnschenswert wĂ€re, dass diese in der industriellen Nutzung zuverlĂ€ssig und sicher sind.
NTP in 25 Minuten knacken
Netzwerkprotokolle â Millennials haben eine Eigenheit, die sich seit langem zeigt, und sie sind kaum noch zeitgemĂ€Ă, doch ihre Ersetzung ist selbst dann nicht einfach, wenn sich genĂŒgend Enthusiasten und finanzielle Mittel finden.
Die Hauptkritik am klassischen NTP liegt in der fehlenden zuverlĂ€ssigen Mechanismen zum Schutz vor Angriffen durch böswillige Akteure. Es wurden verschiedene Versuche unternommen, dieses Problem zu lösen. Zuerst wurde ein Mechanismus fĂŒr vordefinierte SchlĂŒssel (PSK) eingefĂŒhrt, um symmetrische SchlĂŒssel auszutauschen.
Leider hat sich dieser Ansatz aus einem einfachen Grund als ineffizient erwiesen â er skaliert schlecht. Eine manuelle Konfiguration auf der Client-Seite ist notwendig und abhĂ€ngig vom jeweiligen Server. Das bedeutet, dass es nicht einfach ist, einen weiteren Client hinzuzufĂŒgen. Bei Ănderungen am NTP-Server mĂŒssen alle Clients neu konfiguriert werden.
Daraufhin wurde AutoKey entwickelt, doch sofort stellte man eine Reihe gravierender Schwachstellen im Design des Algorithmus fest, was zu seiner Aufgabe fĂŒhrte. Der Grund dafĂŒr ist, dass die Ausgangszahl (Seed) lediglich 32 Bit umfasst, was viel zu gering ist und nicht ausreichend RechenkomplexitĂ€t fĂŒr einen direkten Angriff enthĂ€lt.
- Key ID â symmetrischer 32-Bit-SchlĂŒssel;
- MAC (Message Authentication Code) â PrĂŒfziffer des NTP-Pakets;
Autokey wird wie folgt berechnet.
Autokey=H(Sender-IP||Receiver-IP||KeyID||Cookie)Dabei ist H() eine kryptografische Hashfunktion.
FĂŒr die Berechnung der PrĂŒfziffer der Pakete wird dieselbe Funktion verwendet.
MAC=H(Autokey||NTP-Paket)Somit hĂ€ngt die gesamte IntegritĂ€t der PaketprĂŒfungen von der AuthentizitĂ€t der Cookies ab. Hat man diese erlangt, kann man Autokey wiederherstellen und dann das MAC fĂ€lschen. Der NTP-Server verwendet jedoch bei deren Generierung eine Zufallszahl (Seed). Genau hier liegt der Haken.
Cookie=MSB_32(H(Client IP||Server IP||0||Server Seed))Die MSB_32-Funktion schneidet die 32 obersten Bits des Ergebnisses der MD5-Hashberechnung ab. Das Client-Cookie bleibt unverÀndert, solange die Serverparameter gleich bleiben. Danach muss der Angreifer nur noch die Zufallszahl wiederherstellen, um die Möglichkeit zu erhalten, selbst Cookies zu generieren.
ZunÀchst sollte man sich als Client mit dem NTP-Server verbinden und Cookies erhalten. Danach kann der Angreifer durch Brute-Force die Zufallszahl gemÀà einem einfachen Algorithmus wiederherstellen.
Angriffsalgorithmus zur Berechnung der Zufallszahl mittels Brute-Force.
fĂŒr i=0:2^32 â 1 do
Ci=H(Server-IP||Client-IP||0||i)
if Ci=Cookie then
return i
end if
end forIP-Adressen sind bekannt, daher bleibt nur, bis zu 2^32 Hashes zu erstellen, bis das generierte Cookie mit dem vom NTP-Server erhaltenen ĂŒbereinstimmt. Auf einem gewöhnlichen Heimcomputer mit Intel Core i5 dauert dies etwa 25 Minuten.
NTS â neue Autokey
Solche SicherheitslĂŒcken in Autokey waren im Jahr 2012 nicht mehr tragbar. Um dem kompromittierten Namen gerecht zu werden, wurde ein Rebranding durchgefĂŒhrt, sodass Autokey v.2 als Network Time Security bezeichnet wurde.
Das NTS-Protokoll ist eine Erweiterung der Sicherheit von NTP und unterstĂŒtzt derzeit nur den Unicast-Modus. Es bietet einen zuverlĂ€ssigen kryptografischen Schutz gegen Paketmanipulation, verhindert Tracking, ist gut skalierbar, widerstandsfĂ€hig gegen den Verlust von Netzwerkpaketen und fĂŒhrt zu minimalen Genauigkeitsverlusten, die wĂ€hrend des Schutzes der Verbindung auftreten.
Die NTS-Verbindung besteht aus zwei Phasen, in denen Protokolle der unteren Ebene verwendet werden. In der ersten Phase vereinbaren der Client und der Server verschiedene Verbindungsparameter und tauschen Cookies aus, die SchlĂŒssel sowie den entsprechenden Datensatz enthalten. In der zweiten In dieser Phase erfolgt die tatsĂ€chliche geschĂŒtzte NTS-Sitzung zwischen dem Client und dem NTP-Server.

NTS besteht aus zwei unterliegenden Protokollen: Network Time Security Key Exchange (NTS-KE), das die sichere Verbindung ĂŒber TLS initialisiert, und NTPv4 â der neuesten Version des NTP-Protokolls. Etwas ausfĂŒhrlicher dazu weiter unten.
Erster Schritt â NTS KE
In dieser Phase initiiert der NTP-Client eine TLS 1.2/1.3-Sitzung ĂŒber eine separate TCP-Verbindung zum NTS KE-Server. WĂ€hrend dieser Sitzung erfolgt Folgendes.
- Die Parteien legen die Parameter des Algorithmus fĂŒr die zweite Phase fest.
- Die Parteien bestimmen das zweite unterliegende Protokoll, wobei derzeit nur NTPv4 unterstĂŒtzt wird.
- Die Parteien legen die IP-Adresse und den Port des NTP-Servers fest.
- Der NTS KE-Server gibt Cookies fĂŒr NTPv4 aus.
- Die Parteien extrahieren aus den Cookies ein Paar symmetrischer SchlĂŒssel (C2S und S2C).
Dieser Ansatz hat den Vorteil, dass die gesamte Last beim Ăbertragen geheimer Verbindungsparameter auf das bewĂ€hrte und zuverlĂ€ssige Protokoll TLS gelegt wird. Damit entfĂ€llt die Notwendigkeit, fĂŒr ein sicheres NTP-Handschlagverfahren das Rad neu zu erfinden.
Zweiter Schritt â NTP geschĂŒtzt durch NTS
Im zweiten Schritt synchronisiert der Kunde sicher die Zeit mit dem NTP-Server. Zu diesem Zweck ĂŒbertrĂ€gt er vier spezielle Erweiterungen (extension field) im NTPv4-Paket.
- Die Unique Identifier Extension enthÀlt eine zufÀllige Nonce zur Verhinderung von Wiederholungsangriffen.
- Die NTS Cookie Extension enthĂ€lt eines der beim Kunden vorhandenen NTP-Cookies. Da nur der Kunde die symmetrischen AAED-SchlĂŒssel C2S und S2C besitzt, muss der NTP-Server diese aus dem Cookie-Material extrahieren.
- Die NTS Cookie Placeholder Extension ermöglicht es dem Kunden, zusÀtzliche Cookies vom Server anzufordern. Diese Erweiterung ist notwendig, um sicherzustellen, dass die Antwort des NTP-Servers nicht wesentlich lÀnger ist als die Anfrage. Dies hilft, VerstÀrkungangriffe zu verhindern.
- Die NTS Authenticator and Encrypted Extension Fields Extension enthĂ€lt den VerschlĂŒsselungsalgorithmus AAED mit dem C2S-SchlĂŒssel, dem NTP-Header, Zeitstempeln und den oben genannten EF als Begleitdaten. Ohne diese Erweiterung könnten Zeitstempel gefĂ€lscht werden.

Nach Erhalt der Anfrage vom Kunden prĂŒft der Server die AuthentizitĂ€t des NTP-Pakets. Hierzu muss er die Cookies entschlĂŒsseln und den AAED-Algorithmus sowie die SchlĂŒssel extrahieren. Nach erfolgreicher Validierung des NTP-Pakets antwortet der Server dem Kunden im folgenden Format.
- Eindeutige Identifikatorerweiterung fĂŒr die Spiegelkopie der Clientanfrage, MaĂnahme gegen Angriffe durch Wiederholung.
- NTS-Cookie-Erweiterung, mehr Cookies zur Fortsetzung der Sitzung.
- NTS-Authenticator und verschlĂŒsselte Erweiterungsfelder enthalten einen AEAD-SchlĂŒssel mit S2C.
Das zweite Handshake kann mehrfach wiederholt werden, wobei die erste Phase umgangen wird, da jede Anfrage und Antwort dem Client zusĂ€tzliche Cookies bereitstellt. Dies bietet den Vorteil, dass die relativ ressourcenintensiven TLS-Berechnungen und die Ăbertragung von PKI-Daten auf die Anzahl der Wiederholungsanfragen verteilt werden. Dies ist besonders nĂŒtzlich fĂŒr spezialisierte FPGA-Taktgeber, bei denen die gesamte FunktionalitĂ€t in mehreren Funktionen aus dem Bereich der symmetrischen Kryptographie verpackt werden kann, wobei der gesamte TLS-Stack auf ein anderes GerĂ€t ĂŒbertragen wird.
NTPSec
Was macht NTP besonders? Obwohl der Projektleiter Dave Mills bemĂŒht war, seinen Code so gut wie möglich zu dokumentieren, wird es kaum einem Programmierer gelingen, die KomplexitĂ€t der 35 Jahre alten Zeit-Synchronisationsalgorithmen vollstĂ€ndig zu verstehen. Ein Teil des Codes wurde vor der Ăra von POSIX geschrieben und die Unix-API unterschied sich erheblich von dem, was heute verwendet wird. Zudem sind Kenntnisse in Statistik erforderlich, um das Signal von Störungen auf störanfĂ€lligen Leitungen zu reinigen.
NTS war nicht der erste Versuch, NTP zu reparieren. Nachdem Angreifer gelernt hatten, NTP-Schwachstellen fĂŒr verstĂ€rkte DDoS-Angriffe auszunutzen, wurde klar, dass radikale VerĂ€nderungen notwendig waren. WĂ€hrend die EntwĂŒrfe fĂŒr NTS ausgearbeitet wurden, gewĂ€hrte die National Science Foundation der USA Ende 2014 dringend einen Zuschuss zur Modernisierung von NTP.
Die Arbeitsgruppe wurde von niemand anderem als â einem der GrĂŒnder und SĂ€ulen der Open-Source-Community sowie dem Autor des Buches . Zuerst versuchten Eric und seine Kollegen, den NTP-Code von der BitKeeper-Plattform auf Git zu ĂŒbertragen, doch das klappt nicht. Der Projektleiter Harlan Stenn war gegen diese Entscheidung, und die Verhandlungen kamen zum Stillstand. Daher wurde beschlossen, den Code des Projekts zu forken, wodurch NTPSec entstand.
Mit umfangreicher Erfahrung, einschlieĂlich der Arbeit an GPSD, mathematischem Hintergrund und dem magischen Talent, alten Code zu lesen â Eric Raymond war genau der Hacker, der ein solches Projekt vorantreiben konnte. In der Gruppe fand sich ein Spezialist fĂŒr die Migration von Code, und innerhalb von nur 10 Wochen wurde NTP gebracht. Die Arbeit nahm Fahrt auf.
Das Team von Eric Raymond ging mit der gleichen Entschlossenheit an die Sache heran wie Auguste Rodin bei der Arbeit an einem Block Stein. Durch die Entfernung von 175 KLOC altem Code konnten sie die AngriffsflĂ€che erheblich verringern und viele SicherheitslĂŒcken schlieĂen.
Hier ist eine unvollstÀndige Liste der Betroffenen:
- Undokumentierte, veraltete oder fehlerhafte Refclock.
- Unbenutzte ICS-Bibliothek.
- libopts/autogen.
- Alter Code fĂŒr Windows.
- ntpdc.
- Autokey.
- C-Code von ntpq wurde auf Python umgeschrieben.
- C-Code von sntp/ntpdig wurde auf Python umgeschrieben.
Neben der Codebereinigung hatte das Projekt auch andere Aufgaben. Hier ist eine unvollstÀndige Liste der Errungenschaften:
- Der Schutz des Codes gegen PufferĂŒberlĂ€ufe wurde erheblich verstĂ€rkt. Um PufferĂŒberlĂ€ufe zu verhindern, wurden alle unsicheren String-Funktionen (strcpy / strcat / strtok / sprintf / vsprintf / gets) durch sichere Versionen ersetzt, die eine GröĂenbegrenzung des Puffers implementieren.
- UnterstĂŒtzung fĂŒr NTS hinzugefĂŒgt.
- Die Genauigkeit des Zeitintervalls wurde durch die Bindung physischer Hardware um den Faktor zehn erhöht. Dies liegt daran, dass moderne Computeruhren wesentlich genauer geworden sind als die zu Beginn der Entwicklung von NTP. Besonders profitierten GPSDO und dedizierte Zeitstationen davon.
- Die Anzahl der Programmiersprachen hat sich auf zwei reduziert. Anstelle von Perl, awk und sogar S dominieren jetzt durchgÀngig Python. Dadurch gibt es mehr Möglichkeiten zur Wiederverwendung von Code.
- Statt der autotools-Skripte wird im Projekt nun ein Software-Bausystem verwendet. .
- Wir haben die Projektdokumentation aktualisiert und neu strukturiert. Aus einer inkonsistenten und teilweise veralteten Sammlung von Dokumenten ist nun eine ansehnliche Dokumentation entstanden. Jede wichtige Kommandozeilenoption und jede Konfigurationseinheit hat jetzt eine eindeutige Version der Wahrheit. DarĂŒber hinaus werden die Handbuchseiten und die Webdokumentation jetzt aus denselben Grunddateien erstellt.
NTPSec ist fĂŒr eine Reihe von Linux-Distributionen verfĂŒgbar. Derzeit ist die letzte stabile Version 1.1.8, fĂŒr Gentoo Linux ist es die vorletzte.
(1:696)$ sudo emerge -av ntpsec
Diese Pakete wĂŒrden in der folgenden Reihenfolge installiert:
AbhÀngigkeiten werden berechnet... erledigt!
[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
Insgesamt: 1 Paket (1 Neuinstallation), GröĂe der Downloads: 0 KiB
Möchten Sie diese Pakete installieren? [Ja/Nein]
Chrony
Es gab einen weiteren Versuch, den alten NTP durch einen sichereren Nachfolger zu ersetzen. Chrony wurde im Gegensatz zu NTPSec von Grund auf neu entwickelt und bietet eine zuverlĂ€ssige FunktionalitĂ€t unter einer Vielzahl von Bedingungen, einschlieĂlich instabiler Netzwerkverbindungen, partieller VerfĂŒgbarkeit oder NetzĂŒberlastungen sowie Temperaturschwankungen. DarĂŒber hinaus hat chrony auch andere Vorteile:
- Chrony kann die Systemuhr schneller und mit gröĂerer Genauigkeit synchronisieren;
- Chrony ist kleiner, verbraucht weniger Speicher und greift auf die CPU nur dann zu, wenn es erforderlich ist. Dies ist ein groĂer Vorteil fĂŒr den Ressourcen- und Energieverbrauch;
- Chrony unterstĂŒtzt hardwarebasierte Zeitstempel in Linux, was eine Ă€uĂerst prĂ€zise Synchronisation in lokalen Netzwerken gewĂ€hrleistet.
Allerdings fehlen chrony einige Funktionen des alten NTP, wie Broadcast- und Multicast-Client/Server. AuĂerdem unterstĂŒtzt das klassische NTP eine gröĂere Anzahl von Betriebssystemen und Plattformen.
Um die FunktionalitĂ€t des Servers und der NTP-Anfragen an den Prozess chronyd zu deaktivieren, genĂŒgt es, den Port 0 in die Datei chrony.conf einzutragen. Dies geschieht in FĂ€llen, in denen es nicht notwendig ist, die Zeit fĂŒr NTP-Clients oder Peernodes bereitzustellen. Ab Version 2.0 ist der NTP-Serverport nur dann geöffnet, wenn der Zugriff durch die Direktive allow oder den entsprechenden Befehl erlaubt ist, oder wenn ein Peernode fĂŒr NTP konfiguriert oder die Direktive broadcast verwendet wird.
Das Programm besteht aus zwei Modulen.
- chronyd ist ein im Hintergrund laufender Dienst. Er erhĂ€lt Informationen ĂŒber die Systemzeitabweichung von einem externen Zeitserver und korrigiert die lokale Zeit. AuĂerdem implementiert er das NTP-Protokoll und kann sowohl als Client als auch als Server fungieren.
- chronyc ist ein Kommandozeilenwerkzeug zur Ăberwachung und Kontrolle des Programms. Es wird verwendet, um verschiedene Parameter des Dienstes fein abzustimmen, zum Beispiel um NTP-Server hinzuzufĂŒgen oder zu entfernen, wĂ€hrend chronyd weiterhin arbeitet.
Beginnend mit der 7. Version von RedHat Linux Chrony als Zeitabgleichdienst. Das Paket ist auch fĂŒr andere Linux-Distributionen verfĂŒgbar. Die letzte stabile Version 3.5 bereitet sich auf die Veröffentlichung von v4.0 vor.
(1:712)$ sudo emerge -av chrony
Dies sind die Pakete, die in folgender Reihenfolge installiert werden:
AbhÀngigkeiten werden berechnet... fertig!
[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
Insgesamt: 1 Paket (1 neu, 1 binĂ€r), DownloadgröĂe: 246 KiB
Möchten Sie diese Pakete installieren? [Ja/Nein]
Wie man einen eigenen Remote-Server mit Chrony im Internet einrichtet, um die Zeit im BĂŒonetzwerk zu synchronisieren. Im Folgenden ein Beispiel zur Einrichtung auf einem VPS.
Beispiel fĂŒr die Konfiguration von Chrony auf RHEL / CentOS auf einem VPS
Lassen Sie uns nun ein wenig ĂŒben und unseren eigenen NTP-Server auf einem VPS aufsetzen. Es ist ganz einfach, man muss lediglich einen passenden Tarif auf der Website RuVDS wĂ€hlen, einen Server anfordern und ein Dutzend einfacher Befehle eingeben. FĂŒr unsere Zwecke ist diese Option völlig ausreichend.

Jetzt gehen wir zur Konfiguration des Dienstes ĂŒber und installieren zunĂ€chst das Paket chrony.
[root@server ~]$ yum install chronyRHEL 8 / CentOS 8 verwenden einen anderen Paketmanager.
[root@server ~]$ dnf install chronyNach der Installation von chrony muss der Dienst gestartet und aktiviert werden.
[root@server ~]$ systemctl enable chrony --nowWenn gewĂŒnscht, können Sie Ănderungen in /etc/chrony.conf vornehmen, indem Sie die NTP-Server durch die nĂ€chstgelegenen lokalen Server ersetzen, um die Antwortzeiten zu verkĂŒrzen.
# 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
Als NĂ€chstes konfigurieren wir die Synchronisation des NTP-Servers mit Knoten aus dem angegebenen Pool.
[root@server ~]$ timedatectl set-ntp true
[root@server ~]$ systemctl restart chronyd.service
Es ist auch notwendig, den NTP-Port nach auĂen zu öffnen, da sonst die Firewall eingehende Verbindungen von Client-Knoten blockiert.
[root@server ~]$ firewall-cmd --add-service=ntp --permanent
[root@server ~]$ firewall-cmd --reload
Auf der Client-Seite reicht es aus, die Zeitzone korrekt einzustellen.
[root@client ~]$ timedatectl set-timezone Europe/MoscowIn der Datei /etc/chrony.conf geben Sie die IP-Adresse oder den Hostnamen unseres VPS-Servers an, auf dem der NTP-Server chrony lÀuft.
server my.vps.serverUnd schlieĂlich die Zeit-Synchronisation auf dem Client starten.
[root@client ~]$ systemctl enable --now chronyd
[root@client ~]$ timedatectl set-ntp true
Beim nÀchsten Mal werde ich erlÀutern, welche Möglichkeiten zur Zeit-Synchronisation ohne Internet bestehen.
Quelle: habr.com
