Linux härten: ntp sicher konfigurieren auf MX Linux 23.2

Hallo zusammen,

(Tut mir leid wenn mein Deutsch ein wenig seltsam wirkt, Ich bin kein Deutscher.)

Vielleicht eine dumme Frage, aber wie kann Ich NTP so konfigurieren, damit sie nur auf dem localhost bzw. der IP-Adresse 127.0.0.1 lauscht? und für andere Rechner im gleichen Netzwerk somit nicht erreichbar sind. Linux Härten teil 2

Terminal wenn Ich $ ss -tulpn | grep :123 eingebe:

udp   UNCONN 0      0          127.0.0.1:123        0.0.0.0:*          
udp   UNCONN 0      0            0.0.0.0:123        0.0.0.0:*          
udp   UNCONN 0      0              [::1]:123           [::]:*          
udp   UNCONN 0      0               [::]:123           [::]:* 

ntp.conf:

# /etc/ntpsec/ntp.conf, configuration for ntpd; see ntp.conf(5) for help

driftfile /var/lib/ntpsec/ntp.drift
leapfile /usr/share/zoneinfo/leap-seconds.list

# To enable Network Time Security support as a server, obtain a certificate
# (e.g. with Let's Encrypt), configure the paths below, and uncomment:
# nts cert CERT_FILE
# nts key KEY_FILE
# nts enable

# You must create /var/log/ntpsec (owned by ntpsec:ntpsec) to enable logging.
#statsdir /var/log/ntpsec/
#statistics loopstats peerstats clockstats
#filegen loopstats file loopstats type day enable
#filegen peerstats file peerstats type day enable
#filegen clockstats file clockstats type day enable

# This should be maxclock 7, but the pool entries count towards maxclock.
tos maxclock 11

# Comment this out if you have a refclock and want it to be able to discipline
# the clock by itself (e.g. if the system is not connected to the network).
tos minclock 4 minsane 3

# Specify one or more NTP servers.

# Public NTP servers supporting Network Time Security:
# server time.cloudflare.com nts

# pool.ntp.org maps to about 1000 low-stratum NTP servers.  Your server will
# pick a different set every time it starts up.  Please consider joining the
# pool: <https://www.pool.ntp.org/join.html>
pool 0.debian.pool.ntp.org iburst
pool 1.debian.pool.ntp.org iburst
pool 2.debian.pool.ntp.org iburst
pool 3.debian.pool.ntp.org iburst

# Access control configuration; see /usr/share/doc/ntpsec-doc/html/accopt.html
# for details.
#
# Note that "restrict" applies to both servers and clients, so a configuration
# that might be intended to block requests from certain clients could also end
# up blocking replies from your own upstream servers.

# By default, exchange time with everybody, but don't allow configuration.
restrict default kod nomodify nopeer noquery limited

# Local users may interrogate the ntp server more closely.
restrict 127.0.0.1
restrict ::1

Danke!

Mithilfe der manpage konnte Ich nur die Option interface finden:

interface [listen | ignore | drop] [all | ipv4 | ipv6 | wildcard | name | address[/prefixlen]]
This command controls which network addresses ntpd opens, and whether the input is dropped without processing. The first parameter determines the
action on addresses which match the second parameter. That parameter specifies a class of addresses, or a specific interface name, or an address. In
the address case, prefixlen determines how many bits must match for this rule to apply. ignore prevents opening matching addresses, drop causes ntpd to
open the address and drop all received packets without examination. Multiple interface commands can be used. The last rule which matches a particular
address determines the action for it. interface commands are disabled if any of the -I, --interface,-L, or --novirtualips command-line options are
used. If none of those options are used, and no interface actions are specified in the >configuration file, all available network addresses are opened.
The nic command is an alias for interface.

Das klingt erstmal nach einer Lösung für dein Problem, aber:
trotz der folgenden Option öffnete ntp(sec) weiterhin den Port 123 auf localhost (127.0.0.1 & [::1]) und „allem“ (0.0.0.0 & [::]). Ich schätze, das ist fest eingebaut.

interface ignore all

Das ist aber kein Problem, da du am Log (nach dem journalctl Befehl im Beispiel gleich) erkennen solltest, wenn diese Option gesetzt ist, dass die Pakete unter der Wildcard (0.0.0.0 & [::]) dort sofort verworfen werden (Listen and drop).

Ohne Option:

$ ss -nlup | grep :123
udp   UNCONN 0      0         192.168.152.1:123        0.0.0.0:*    users:(("ntpd",pid=3707,fd=20))       
udp   UNCONN 0      0      192.168.178.15:123        0.0.0.0:*    users:(("ntpd",pid=3707,fd=19))       
udp   UNCONN 0      0           127.0.0.1:123        0.0.0.0:*    users:(("ntpd",pid=3707,fd=18))       
udp   UNCONN 0      0             0.0.0.0:123        0.0.0.0:*    users:(("ntpd",pid=3707,fd=17))       
udp   UNCONN 0      0               [::1]:123           [::]:*    users:(("ntpd",pid=3707,fd=21))       
udp   UNCONN 0      0                [::]:123           [::]:*    users:(("ntpd",pid=3707,fd=16))

$ journalctl -xe | grep -i ntp.*listen
Apr 03 00:25:21 host ntpd[3707]: IO: Listen and drop on 0 v6wildcard [::]:123
Apr 03 00:25:21 host ntpd[3707]: IO: Listen and drop on 1 v4wildcard 0.0.0.0:123
Apr 03 00:25:21 host ntpd[3707]: IO: Listen normally on 2 lo 127.0.0.1:123
Apr 03 00:25:21 host ntpd[3707]: IO: Listen normally on 3 enp2s0 192.168.178.15:123
Apr 03 00:25:21 host ntpd[3707]: IO: Listen normally on 4 wg0 192.168.152.1:123
Apr 03 00:25:21 host ntpd[3707]: IO: Listen normally on 5 lo [::1]:123
Apr 03 00:25:21 host ntpd[3707]: IO: Listening on routing socket on fd #22 for interface updates

Mit Option:

$ ss -nlup | grep :123
UNCONN 0      0           127.0.0.1:123        0.0.0.0:*    users:(("ntpd",pid=3800,fd=18))   
UNCONN 0      0             0.0.0.0:123        0.0.0.0:*    users:(("ntpd",pid=3800,fd=17))   
UNCONN 0      0               [::1]:123           [::]:*    users:(("ntpd",pid=3800,fd=19))   
UNCONN 0      0                [::]:123           [::]:*    users:(("ntpd",pid=3800,fd=16))

$ journalctl -xe | grep -i ntp.*listen
Apr 03 00:30:33 host ntpd[3800]: IO: Listen and drop on 0 v6wildcard [::]:123
Apr 03 00:30:33 host ntpd[3800]: IO: Listen and drop on 1 v4wildcard 0.0.0.0:123
Apr 03 00:30:33 host ntpd[3800]: IO: Listen normally on 2 lo 127.0.0.1:123
Apr 03 00:30:33 host ntpd[3800]: IO: Listen normally on 3 lo [::1]:123
Apr 03 00:30:33 host ntpd[3800]: IO: Listening on routing socket on fd #20 for interface updates

Danke. Wenn Ich

journalctl -xe | grep -i ntp.*listen

eingebe, bekomme Ich den Fehler: No journal files found. Ich muss erst weiter recherchieren wie Ich das lösen kann.

Um nochmal auf das Thema zurückzukommen:
Ich fürchte, mein Konfigurationsvorschlag macht die Zeitsynchronisation mit anderen NTP-Servern kaputt.

Wenn man interface ignore all verwendet, müsste man ebenfalls einstellen, dass auf der Netzschnittstelle/IP, über die eine Verbindung in das Internet hergestellt wird, gelauscht wird, um die NTP Pakete auf Port 123 von den Servern zurück zu bekommen.
Das ginge zum Beispiel dann über ein nachfolgendes interface listen 192.168.178.2/32, wo der Teil vor dem /32 die eigene IP-Adresse ist. Falls das aber die einzige Netzwerkschnittstelle des Gerätes ist, kann man beides gleich weglassen.
Eigentlich offensichtlich, da es UDP ist, ist mir zum Zeitpunkt des Beitrages aber entfallen.

Schlussfolgernd wird ntp(sec) bei dir immer lauschen, wenn Zeitserver im Internet verwendet werden sollen. Wenn das unerwünscht ist, wären deine Optionen andere Software zur Zeitsynchronisation (systemd-timesyncd, eventuell „chrony“) zu verwenden, oder diese über sntp (falls kein NTS (Wikipedia: EN - DE) erwünscht ist) innerhalb eines cron-Skriptes zu machen, und den NTP-Daemon ganz abzuschalten.

Ansich ist der NTP-Daemon aber bereits durch deine gepostete Konfiguration „abgesichert“: Durch die „Access control configuration“. Mehr geht mit der Software alleine nicht.


Eventuell verwendet MX Linux einen anderen Syslog-Daemon, dann wird journalctl nicht funktionieren.
Systemd’s journald könnte aber eventuell auch von dir oder MX so konfiguriert worden sein, dass es keine Logdateien anlegt?
Die Einstellungen dafür - falls der Prozess systemd-journald läuft - befinden sich in der Datei /etc/systemd/journald.conf oder in einer Datei mit der Endung .conf im Verzeichnis /etc/systemd/journald.conf.d, und lässt sich mit folgender Option einstellen:

[Journal]
#Storage=auto

Falls die Logs nur während der Laufzeit des Systems im Arbeitsspeicher gespeichert werden sollen, kannst du dort Storage=volatile eintragen, ohne führende #:

[Journal]
Storage=volatile

Am besten in einer Datei mit der Endung .conf im journald.conf.d Verzeichnis.

Danke. Bei MX Linux gibt es etc/systemd journald.conf und auch timesyncd.conf

Journald.conf ab jetzt, aber macht kein Unteschied, auch wenn Ich #Storage=auto auskommentiere:

#  This file is part of systemd.
#
#  systemd is free software; you can redistribute it and/or modify it
#  under the terms of the GNU Lesser General Public License as published by
#  the Free Software Foundation; either version 2.1 of the License, or
#  (at your option) any later version.
#
# Entries in this file show the compile time defaults.
# You can change settings by editing this file.
# Defaults can be restored by simply deleting this file.
#
# See journald.conf(5) for details.

[Journal]
#Storage=auto
Storage=volatile
#Compress=yes
#Seal=yes
#SplitMode=uid
#SyncIntervalSec=5m
#RateLimitIntervalSec=30s
#RateLimitBurst=10000
#SystemMaxUse=
#SystemKeepFree=
#SystemMaxFileSize=
#SystemMaxFiles=100
#RuntimeMaxUse=
#RuntimeKeepFree=
#RuntimeMaxFileSize=
#RuntimeMaxFiles=100
#MaxRetentionSec=
#MaxFileSec=1month
#ForwardToSyslog=yes
#ForwardToKMsg=no
#ForwardToConsole=no
#ForwardToWall=yes
#TTYPath=/dev/console
#MaxLevelStore=debug
#MaxLevelSyslog=debug
#MaxLevelKMsg=notice
#MaxLevelConsole=info
#MaxLevelWall=emerg
#LineMax=48K
#ReadKMsg=yes

Timesyncd:

#  This file is part of systemd.
#
#  systemd is free software; you can redistribute it and/or modify it
#  under the terms of the GNU Lesser General Public License as published by
#  the Free Software Foundation; either version 2.1 of the License, or
#  (at your option) any later version.
#
# Entries in this file show the compile time defaults.
# You can change settings by editing this file.
# Defaults can be restored by simply deleting this file.
#
# See timesyncd.conf(5) for details.

[Time]
#NTP=
#FallbackNTP=0.debian.pool.ntp.org 1.debian.pool.ntp.org 2.debian.pool.ntp.org 3.debian.pool.ntp.org
#RootDistanceMaxSec=5
#PollIntervalMinSec=32
#PollIntervalMaxSec=2048

Und /usr/share/doc/ntpsec-doc/html/accopt.html gibt es nicht.

Nach der Änderung sollte nach einen Neustart des systemd-journald Dienstes die Konfiguration neu geladen werden:
systemctl restart systemd-journald
Falls das Journal nun angelegt wird (journalctl -xe liefert eine Ausgabe), würden neue Log-Einträge von NTP darin landen.

Die relevanten Einträge sind aber die ab dessen start, entsprechend fehlt, sofern das Journal funktioniert, noch ein Neustart des NTP Dienstes: systemctl restart ntpsec
Aber anhand deiner bisherigen Konfigurationsdatei hätte bereits ein Journal angelegt werden müssen, da die Storage= Option bereits auskommentiert (#) ist, und der Default wert „auto“ eigentlich ein dauerhaftes Journal anlegt - es sei denn, es gibt Dateien im Ordner /etc/systemd/journald.conf.d

Leider habe Ich kein MX Installiert, sondern Debian. Deswegen kann Ich nicht selber nachschauen, wie das System standardmäßig Konfiguriert ist, und ob eventuell entgegen meiner Erwartungen ein anderer Syslog-Daemon verwendet wird, entschuldige.


Die Konfiguration von timesyncd ist Egal, sofern es nicht läuft oder installiert ist, es sei denn, du möchtest ntpsec durch systemds „timesyncd“ ersetzen.

Falls es nicht dein Ziel ist, einen NTP Server in deinen Netzwerk zu haben (mit dem du die Zeit anderer Computer synchronisieren kannst), und / oder die Zeitsynchronisation mithilfe von „NTS“ zu verschlüsseln, und so vor Manipulation zu schützen, wäre ein Wechsel darauf vermutlich eine Option für dich.

Das sollte in etwa so einfach sein wie: apt remove ntpsec und apt install systemd-timesyncd oder systemctl enable timesynd (beide zu verwenden wäre auch okay).
Eigene Server kannst du dort Eintragen indem du vor NTP= die # entfernst, und die eigenen danach einträgst - getrennt durch Leerzeichen. Ansonsten werden die unter FallbackNTP gelisteten standardmäßig verwendet.
Wenn Ich mich recht erinnere, lauscht diese Software nicht dauerhaft auf den UDP Port 123, wobei Ich das Risiko dadurch bei NTPSEC als nicht hoch einschätze.


Bei mir ebenfalls nicht, sie findet sich aber online:
https://docs.ntpsec.org/latest/accopt.html#restrict
Die Dokumentation dieser Option für die aktuellste Version sollte auch für die von MX verwendete Version stimmen.
Hier ist auch das Handbuch, welches darauf verlinkt https://docs.ntpsec.org/latest/access.html