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.
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
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
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).
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
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
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
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