#!/coding/blatt
Sammelsurium mit Schwerpunkten Linux & IT-Sicherheit

OpenWrt: NTP verschlüsseln via NTS und chrony

Das NTP (Network Time Protocol) dient der Synchronisation der Uhrzeit von Endgeräten über ein Netzwerk, wie z.B. das Internet. Die Kommunikation erfolgt dabei standardmäßig ungesichert (keine Verschlüsselung, keine Authentifizierung etc.) über Port UDP/123. Mit NTS (Network Time Security) gibt es seit 2020 aber eine auf Basis von TLS verschlüsselte und somit abgesicherte Alternative (Details siehe RFC 8915 sowie NTS: Absicherung von NTP gegen MITM-Angriffe).

Meinen OpenWrt-Router habe ich mittlerweile von NTP auf NTS umgestellt. Wie ich das mittels chrony umgesetzt habe, erfahrt ihr in folgendem Beitrag.

Folgende Hardware bzw. Software wurde verwendet:
  • Spitz 4G LTE Smart Router - GL-X750C6
  • OpenWrt v22.03.5
  • chrony v4.2
  • Notebook mit Arch Linux

Standard-NTP-Dienst von OpenWrt deaktivieren

Da wir zukünftig chrony für die Zeitsynchronisation verwenden, benötigen wir den Standard-NTP-Dienst von OpenWrt nicht mehr. Aus diesem Grund kann dieser deaktiviert werden. Das könnt ihr bspw. direkt über die Weboberfläche per LuCI vornehmen. Dazu wählt im Menü System - System - Time Synchronization und entfernt das Häkchen bei Enable NTP client. Anschließend klickt noch auf Save & Apply, um die Änderungen zu übernehmen.

chrony mit NTS einrichten

chrony installieren

Als erstes installiert chrony mit NTS-Unterstützung unter OpenWrt mit folgenden Befehlen:

opkg update
opkg install chrony-nts
Terminal / Konsole

chrony konfigurieren

Da ich nie mit UCI zum Konfigurieren von OpenWrt-Diensten warm geworden bin und die UCI-Konfigurationsdatei von chrony auch nicht alle Konfigurationen von chrony zulässt, habe ich als erstes den kompletten Inhalt der /etc/config/chrony-Datei entfernt. Die Datei bleibt weiter vorhanden, aber ist leer und wird nicht weiter verwendet.

Die eigentliche Konfiguration erfolgt in /etc/chrony/chrony.conf. Bei mir sieht die Konfigurationsdatei derzeit wie folgt aus:

server time.cloudflare.com iburst nts
server ntppool1.time.nl iburst nts
server nts.netnod.se iburst nts
server ptbtime1.ptb.de iburst nts
server ptbtime2.ptb.de iburst nts

minsources 2
authselectmode require

driftfile /var/run/chrony/drift
ntsdumpdir /var/run/chrony

cmdport 0

makestep 1.0 3

noclientlog

leapsectz right/UTC
rtconutc
rtcsync

allow 192.168.1.1/24
bindaddress 192.168.1.1
Datei: /etc/chrony/chrony.conf

Im Großen und Ganzen habe ich die Konfigurationsdatei, die das GrapheneOS-Projekt für seine Infrastruktur verwendet, als Vorlage verwendet. Was die einzelnen Konfigurationswerte bedeuten, könnt ihr der chrony-Dokumentation entnehmen.

Die letzten zwei Zeilen benötigt ihr nur, wenn chrony auch als NTP-Server agieren soll (siehe auch OpenWrt: Router als NTP-Server einrichten).

Tipp Liste mit frei verfügbaren NTS-Servern

Eine Liste verfügbarer Server, die NTS unterstützen, finden sich z.B. hier:

chrony-Dienst aktivieren & starten

Nachdem ihr die Konfiguration entsprechend vorgenommen habt, könnt ihr nun den chrony-Dienst starten:

/etc/init.d/chrony enable
/etc/init.d/chrony restart
Terminal / Konsole

chrony - Status überprüfen

Um sicherzugehen, dass alles korrekt funktioniert, bietet chrony einige Befehle. Als erstes überprüft, ob eure NTS-Server verwendet werden und erreichbar sind. In der Reach-Spalte sollte im Bestfall eine 377 stehen. (Details siehe chrony-Dokumentation)

chronyc -N sources
MS Name/IP address         Stratum Poll Reach LastRx Last sample
===============================================================================
^+ time.cloudflare.com           3  10   377   386    -12ms[  -13ms] +/-   32ms
^+ ntppool1.time.nl              1  10   234   88m  -4857us[-7719us] +/-   26ms
^+ nts.netnod.se                 1  10   377   815  -5587us[-6622us] +/-   46ms
^- ptbtime1.ptb.de               1   9   377   370  -4875us[-5924us] +/-   22ms
^* ptbtime2.ptb.de               1   8   377   256  -5213us[-6266us] +/-   22ms
Terminal / Konsole

Des Weiteren könnt ihr sicherstellen, dass die Authentifizierung mit den NTS-Servern erfolgreich war:

chronyc -N authdata
Name/IP address             Mode KeyID Type KLen Last Atmp  NAK Cook CLen
=========================================================================
time.cloudflare.com          NTS     1   15  256 405m    0    0    8  100
ntppool1.time.nl             NTS     1   15  256 405m    0    0    5  100
nts.netnod.se                NTS     1   15  256 405m    0    0    8  100
ptbtime1.ptb.de              NTS     1   15  256 379m    0    0    8  100
ptbtime2.ptb.de              NTS     1   15  256 405m    0    0    8  100
Terminal / Konsole

Die Spalten KeyID, Type und KeyLen sollte keine 0-Werte enthalten.

Allgemeine Statistiken bietet der Befehl chronyc -N serverstats.

Falls ihr, wie ich, eure Clients so konfiguriert habt, dass euer OpenWrt-Router als NTP-Server hinterlegt ist, kann der Befehl chronyc -N clients genutzt werden, um zu prüfen, ob und wann die Clients das letzte mal eine Anfrage gestellt haben.

Fazit

Die Umstellung von NTP auf das sichere NTS zur Zeitsynchronisation funktioniert unter OpenWrt dank chrony problemlos.