Wie kann man sicherstellen, dass die Zeit per se nicht lĂŒgt, wenn man Millionen von groĂen und kleinen GerĂ€ten hat, die ĂŒber TCP/IP interagieren? SchlieĂlich hat jedes von ihnen eine Uhr, und die Zeit muss auf allen korrekt sein. Dieses Problem lĂ€sst sich ohne NTP nicht umgehen.
Stellen wir uns einen Moment vor, dass in einem Segment der industriellen IT-Infrastruktur Probleme mit der Zeitsynchronisierung auftreten. Sofort beginnt der Clusterstack der Unternehmenssoftware zu straucheln, Domains zerfallen, Master- und Standby-Knoten versuchen vergeblich, den Status quo wiederherzustellen.
Es ist auch möglich, dass ein Angreifer absichtlich versucht, die Zeit durch MiTM- oder DDOS-Angriffe zu manipulieren. In einer solchen Situation kann alles Mögliche passieren:
- Benutzerpasswörter laufen ab;
- X.509-Zertifikate laufen ab;
- Die Zwei-Faktor-Authentifizierung TOTP funktioniert nicht mehr;
- Backups werden "veraltet" und das System löscht sie;
- DNSSec bricht zusammen.
Es ist klar, dass jeder erste IT-Abteilung an einer zuverlÀssigen Funktionsweise von Zeit-Synchronisierungsdiensten interessiert ist, und es wÀre gut, wenn sie in der industriellen Nutzung sowohl zuverlÀssig als auch sicher wÀren.
NTP in 25 Minuten hacken
Netzwerkprotokolle â Millennials haben eine Besonderheit, sie sind schon lange und sind nirgendwo mehr brauchbar, aber sie zu ersetzen ist nicht so einfach, selbst wenn sich eine kritische Masse von Enthusiasten und Finanzierung zusammenfindet.
Die Hauptbeschwerde gegen klassisches NTP ist das Fehlen zuverlĂ€ssiger Schutzmechanismen gegen Angriffe von Angreifern. Es wurden verschiedene Versuche unternommen, dieses Problem zu lösen. ZunĂ€chst wurde ein Mechanismus fĂŒr zuvor festgelegte SchlĂŒssel (PSK) zum Austausch von symmetrischen SchlĂŒsseln implementiert.
Leider hat sich diese Methode aus einem einfachen Grund nicht bewĂ€hrt â sie skaliert schlecht. Es ist eine manuelle Konfiguration auf der Client-Seite erforderlich, je nach Server. Das bedeutet, dass man nicht einfach einen weiteren Client hinzufĂŒgen kann. Wenn sich auf dem NTP-Server etwas Ă€ndert, mĂŒssen alle Clients neu konfiguriert werden.
Dann wurde AutoKey entwickelt, aber sofort wurden mehrere schwerwiegende Schwachstellen im Design des Algorithmus entdeckt, und man musste es aufgeben. Das Problem ist, dass die Ausgangszahl (Seed) nur 32-Bit enthĂ€lt, was zu wenig ist und nicht genĂŒgend rechnerische KomplexitĂ€t fĂŒr einen Brute-Force-Angriff aufweist.
- Key ID â ein 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 steht H() fĂŒr eine kryptografische Hash-Funktion.
FĂŒr die Berechnung der PrĂŒfziffer wird dieselbe Funktion verwendet.
MAC=H(Autokey||NTP-Paket)Es zeigt sich, dass die gesamte IntegritĂ€t der PaketprĂŒfungen auf der AuthentizitĂ€t der Cookies beruht. Wenn man sie erlangt, kann man das Autokey wiederherstellen und den MAC fĂ€lschen. Der NTP-Server verwendet jedoch eine Zufallszahl (Seed) bei deren Generierung. Hier liegt der Haken.
Cookie=MSB_32(H(Client IP||Server IP||0||Server Seed))Die Funktion MSB_32 schneidet die 32 höchstwertigen Bits des Ergebnisses der Berechnung des md5-Hashes ab. Das Client-Cookie bleibt unverÀndert, solange die Serverparameter gleich bleiben. Danach bleibt dem Angreifer nur noch, die Zufallszahl wiederherzustellen und die Möglichkeit zu erhalten, selbst Cookies zu generieren.
ZunÀchst muss man sich als Client mit dem NTP-Server verbinden und Cookies erhalten. Danach stellt der Angreifer die Zufallszahl durch Ausprobieren mithilfe eines einfachen Algorithmus wieder her.
Angriffsalgorithmus zur Berechnung der Zufallszahl durch Ausprobieren.
for i=0:2^32 â 1 do
Ci=H(Server-IP||Client-IP||0||i)
if Ci=Cookie then
return i
end if
end forDie IP-Adressen sind bekannt, sodass man nur noch 2^32 Hashes erzeugen muss, bis das erzeugte Cookie mit dem vom NTP-Server erhaltenen ĂŒbereinstimmt. Auf einer typischen Heimstation mit Intel Core i5 dauert dies 25 Minuten.
NTS â neues Autokey
Es war unmöglich, mit solchen SicherheitslĂŒcken im Autokey zu leben, und 2012 erschien das Protokoll. Um dem kompromittierten Namen entgegenzuwirken, entschied man sich fĂŒr ein Rebranding, sodass Autokey v.2 als Network Time Security bezeichnet wurde.
Das NTS-Protokoll ist eine Sicherheitserweiterung des NTP und unterstĂŒtzt derzeit nur den Unicast-Modus. Es bietet einen zuverlĂ€ssigen kryptografischen Schutz vor Manipulationen von Paketen, verhindert das Tracking, ist gut skalierbar, robust gegen den Verlust von Netzpaketen und fĂŒhrt zu den geringsten Verlusten an Genauigkeit, die wĂ€hrend des Schutzes der Verbindung entstehen.
Eine NTS-Verbindung besteht aus zwei Phasen, in denen Protokolle der unteren Ebene verwendet werden. In der ersten Phase einigen sich Client und Server auf verschiedene Verbindungsparameter und tauschen Cookies aus, die SchlĂŒssel mit allen begleitenden DatensĂ€tzen enthalten. In der zweiten Phase findet dann tatsĂ€chlich die geschĂŒtzte NTS-Sitzung zwischen Client und NTP-Server statt.

NTS besteht aus zwei unteren Protokollen: Network Time Security Key Exchange (NTS-KE), um eine sichere Verbindung ĂŒber TLS zu initialisieren, und NTPv4 â der neuesten Inkarnation des NTP-Protokolls. Etwas ausfĂŒhrlicher dazu unten.
Der erste Schritt â NTS KE
In diesem Schritt initiiert der NTP-Client eine TLS 1.2/1.3-Sitzung ĂŒber eine separate TCP-Verbindung mit dem NTS KE-Server. WĂ€hrend dieser Sitzung geschieht Folgendes.
- Die Parteien legen die Parameter des Algorithmus fĂŒr den zweiten Schritt fest.
- Die Parteien bestimmen das zweite untere Protokoll, aber momentan wird nur NTPv4 unterstĂŒtzt.
- 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 groĂen Vorteil, dass die gesamte Last der Ăbertragung vertraulicher Informationen ĂŒber die Verbindung auf ein bewĂ€hrtes und sicheres Protokoll wie TLS verlagert wird. Damit entfĂ€llt die Notwendigkeit, ein eigenes Rad fĂŒr ein sicheres NTP-Handschlag zu erfinden.
Der zweite Schritt â NTP geschĂŒtzt durch NTS
Im zweiten Schritt synchronisiert der Client die Zeit sicher mit dem NTP-Server. Zu diesem Zweck ĂŒbertrĂ€gt er vier spezielle Erweiterungen (extension field) in der Struktur des NTPv4-Pakets.
- Die Unique Identifier Extension enthÀlt eine zufÀllige Nonce, um Wiederholungsangriffe zu verhindern.
- Die NTS Cookie Extension enthĂ€lt eines der verfĂŒgbaren NTP-Cookies des Clients. Da nur der Client ĂŒber die symmetrischen AAED-SchlĂŒssel C2S und S2C verfĂŒgt, muss der NTP-Server diese aus den Cookies extrahieren.
- Die NTS Cookie Placeholder Extension ist ein Mittel fĂŒr den Client, um zusĂ€tzliche Cookies vom Server anzufordern. Diese Erweiterung ist notwendig, damit die Antwort des NTP-Servers nicht viel lĂ€nger ist als die Anfrage. So wird verhindert, dass VerstĂ€rkungsangriffe erfolgen.
- Die NTS Authenticator and Encrypted Extension Fields Extension enthĂ€lt die VerschlĂŒsselung des AAED-Algorithmus mit dem C2S-SchlĂŒssel, NTP-Header, Zeitstempeln und den oben erwĂ€hnten EFs als Begleitdaten. Ohne diese Erweiterung könnten Zeitstempel gefĂ€lscht werden.

Nachdem der Server die Anfrage vom Client erhalten hat, ĂŒberprĂŒft er die AuthentizitĂ€t des NTP-Pakets. Dazu muss er die Cookies entschlĂŒsseln, den AAED-Algorithmus und die SchlĂŒssel extrahieren. Nach erfolgreicher Validierung des NTP-Pakets antwortet der Server dem Client im folgenden Format.
- Die Unique Identifier Extension ist eine Spiegelung der Client-Anfrage, um Wiederholungsangriffe zu vermeiden.
- Die NTS Cookie Extension stellt mehr Cookies fĂŒr die Fortsetzung der Sitzung bereit.
- Der NTS Authenticator und die verschlĂŒsselten Erweiterungsfelder enthalten eine AEAD-VerschlĂŒsselung mit einem S2C-SchlĂŒssel.
Das zweite Handshake kann viele Male wiederholt werden, wobei die erste Phase umgangen wird, da jede Anfrage und Antwort dem Client zusĂ€tzliche Cookies gibt. Dies hat den Vorteil, dass ressourcenintensive TLS-Operationen zur Berechnung und Ăbertragung von PKI-Daten auf die Anzahl der Wiederholungsanfragen verteilt werden. Dies ist besonders praktisch fĂŒr spezialisierte FPGA-Taktgeber, wenn die gesamte HauptfunktionalitĂ€t in mehrere Funktionen der symmetrischen Kryptografie verpackt werden kann, wobei der gesamte TLS-Stack auf ein anderes GerĂ€t ĂŒbertragen wird.
NTPSec
Was ist das Besondere am NTP? Trotz der BemĂŒhungen des Projektleiters Dave Mills, seinen Code so gut wie möglich zu dokumentieren, wird es fĂŒr einen seltenen Programmierer einfach sein, die komplexen Algorithmen fĂŒr die Zeitsynchronisation, die 35 Jahre alt sind, zu durchdringen. Teile des Codes wurden vor der POSIX-Ăra geschrieben, und die Unix-API unterschied sich damals erheblich von dem, was heute verwendet wird. Zudem sind Kenntnisse in Statistik erforderlich, um das Signal von Störungen auf verrauschten 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 vorbereitet und verfeinert wurden, stellte die National Science Foundation der USA Ende 2014 dringend einen Zuschuss fĂŒr die Modernisierung von NTP bereit.
Die Arbeitsgruppe wurde von niemand Geringerem als â einem der GrĂŒnder und SĂ€ulen der Open-Source-Community und Autor des Buches . ZunĂ€chst versuchte Eric mit seinen Kollegen, den NTP-Code von der BitKeeper-Plattform auf git zu portieren, doch das war nicht so einfach. Der Projektleiter Harlan Stenn war gegen diese Lösung und die Verhandlungen kamen ins Stocken. Daher wurde beschlossen, den Code des Projekts zu forken, was zur Entstehung von NTPSec fĂŒhrte.
Er bringt nicht nur umfangreiche Erfahrung mit, einschlieĂlich seiner Arbeit an GPSD, sondern auch einen mathematischen Hintergrund und das magische Talent, alten Code zu lesen â Eric Raymond war genau der Hacker, der ein solches Projekt umsetzen konnte. Im Team fand sich ein Spezialist fĂŒr die Migration des Codes und in nur 10 Wochen wurde NTP Die Arbeit nahm Fahrt auf.
Das Team um Eric Raymond packte die Aufgabe ebenso an wie Auguste Rodin beim Arbeiten mit einem groĂen Steinblock. Durch die Entfernung von 175 KLOC altem Code gelang es ihnen, die AngriffsflĂ€che erheblich zu reduzieren und zahlreiche SicherheitslĂŒcken zu schlieĂen.
Hier ist eine unvollstÀndige Liste der betroffenen Punkte:
- Undokumentierte, veraltete oder defekte Refclock.
- Nicht verwendete ICS-Bibliothek.
- libopts/autogen.
- Alte Windows-Software.
- ntpdc.
- Autokey.
- C-Code von ntpq wurde in Python umgeschrieben.
- C-Code von sntp/ntpdig wurde in Python umgeschrieben.
Neben der Bereinigung des Codes gab es auch andere Aufgaben im Projekt. Hier ist eine unvollstÀndige Liste der Errungenschaften:
- Der Schutz des Codes vor PufferĂŒberlĂ€ufen 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 Begrenzung der PuffergröĂe implementieren.
- UnterstĂŒtzung fĂŒr NTS hinzugefĂŒgt.
- Die Genauigkeit des Zeitstempels wurde durch die Anbindung an physikalische Hardware verzehnfacht. Dies liegt daran, dass moderne Computeruhren viel genauer geworden sind als die, die zur Zeit der Entstehung von NTP existierten. Am meisten davon profitierten GPSDO und dedizierte Zeitstationen.
- Die Anzahl der Programmiersprachen wurde auf zwei reduziert. Statt Perl, awk und sogar S-Skripten wird nun ausschlieĂlich Python verwendet. Dadurch gibt es mehr Möglichkeiten zur Wiederverwendung von Code.
- Statt eines wirren Skript-Chaos' verwendet das Projekt nun ein Software-Bausystem. .
- Die Dokumentation des Projekts wurde aktualisiert und neu strukturiert. Aus einer widersprĂŒchlichen und teils veralteten Sammlung von Dokumenten wurde eine annehmbare Dokumentation erstellt. Jede SchlĂŒsselzeile und jede Konfigurationseinheit hat jetzt eine einheitliche 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 zusammengefĂŒhrt werden, in folgender Reihenfolge:
AbhÀngigkeitsberechnung⊠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 erneute Installation), GröĂe der Downloads: 0 KiB
Möchten Sie diese Pakete zusammenfĂŒhren? [Ja/Nein]
Chrony
Es gab einen weiteren Versuch, das alte NTP durch ein sichereres Ăquivalent zu ersetzen. Chrony wurde im Gegensatz zu NTPSec von Grund auf neu geschrieben und ist fĂŒr einen zuverlĂ€ssigen Betrieb unter einer Vielzahl von Bedingungen, einschlieĂlich instabiler Netzwerkverbindungen, teilweise VerfĂŒgbarkeit oder NetzwerkĂŒberlastungen und Temperaturschwankungen, konzipiert. DarĂŒber hinaus bietet chrony weitere Vorteile:
- chrony kann die Systemuhren schneller mit höherer Genauigkeit synchronisieren;
- chrony ist kleiner, verbraucht weniger Speicher und verwendet den Prozessor nur dann, wenn dies erforderlich ist. Dies ist ein groĂer Vorteil fĂŒr die Ressourcenschonung und Energieeinsparung;
- chrony unterstĂŒtzt hardwaregestĂŒtzte Zeitstempel in Linux, was extrem prĂ€zise Synchronisation in lokalen Netzwerken gewĂ€hrleistet.
Allerdings fehlen dem chrony einige Funktionen des alten NTP, wie z.B. der Broadcast- und der Multicast-Client/Server. DarĂŒber hinaus unterstĂŒtzt der klassische NTP eine gröĂere Anzahl von Betriebssystemen und Plattformen.
Um die ServerfunktionalitĂ€t und NTP-Anfragen des Prozesses chronyd zu deaktivieren, reicht es aus, port 0 in die Datei chrony.conf einzutragen. Dies geschieht in den FĂ€llen, in denen keine Zeit fĂŒr NTP-Clients oder Peer-Knoten bereitgestellt werden muss. Ab Version 2.0 ist der NTP-Serverport nur geöffnet, wenn der Zugriff durch die Direktive allow oder den entsprechenden Befehl erlaubt ist, oder wenn ein NTP-Peer-Knoten konfiguriert ist, oder die Direktive broadcast verwendet wird.
Das Programm besteht aus zwei Modulen.
- chronyd ist ein Dienst, der im Hintergrund lĂ€uft. Er erhĂ€lt Informationen ĂŒber die Differenz der Systemuhr mit einem externen Zeitserver und korrigiert die lokale Zeit. Er implementiert auch das NTP-Protokoll und kann als Client oder Server fungieren.
- chronyc ist ein Kommandozeilenwerkzeug zur Ăberwachung und Steuerung 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 lĂ€uft.
Seit der 7. Version von RedHat Linux wird chrony als Zeit-Synchronisierungsdienst angeboten. 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 zusammengefĂŒhrt werden:
Berechnung der AbhÀngigkeiten... abgeschlossen!
[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), GröĂe der Downloads: 246 KiB
Möchten Sie diese Pakete zusammenfĂŒhren? [Ja/Nein]
So richten Sie Ihren eigenen chrony-Server im Internet fĂŒr die Zeitsynchronisierung in einem BĂŒroumgebung ein. Hier ist ein Beispiel fĂŒr die Konfiguration auf einem VPS.
Beispielkonfiguration von Chrony auf RHEL / CentOS auf einem VPS
Lassen Sie uns nun ein wenig ĂŒben und unseren eigenen NTP-Server auf einem VPS einrichten. Das ist ganz einfach, Sie mĂŒssen nur einen passenden Tarif auf der Website RuVDS auswĂ€hlen, den fertigen Server erhalten und ein Dutzend einfacher Befehle eingeben. FĂŒr unsere Zwecke ist diese Variante durchaus geeignet.

Beginnen wir mit der Konfiguration des Dienstes und installieren wir 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 --nowFalls gewĂŒnscht, können Ănderungen in /etc/chrony.conf vorgenommen werden, indem die NPT-Server durch die nĂ€chstgelegenen lokalen ersetzt werden, um die Reaktionszeit 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
Dann konfigurieren wir die Synchronisation des NTP-Servers mit den 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 den Clientknoten 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 oder den Hostnamen unseres VPS-Servers an, auf dem der NTP-Server chrony lÀuft.
server my.vps.serverUnd schlieĂlich wird die Zeitsynchronisation auf dem Client gestartet.
[root@client ~]$ systemctl enable --now chronyd
[root@client ~]$ timedatectl set-ntp true
NÀchstes Mal erzÀhle ich, welche Möglichkeiten es zur Zeitsynchronisation ohne Internet gibt.
Quelle: habr.com
