Chrony
Chrony est, comme sont homologue éponyme, une implémentation libre du protocole NTP (Network Time Protocol). Il peut synchroniser l'horloge système avec d'autres serveurs NTP, des horloges de référence matériel comme des récepteurs GPS ainsi que manuellement. L'outil embarque un client permettant la synchronisation avec des sources externes ainsi qu'un serveur pouvant accepter les requêtes de temps de clients autorisés.
Chrony supporte, depuis la version 4.0, le protocole NTS (Network Time Security) permettant d'authentifier les serveurs via une couche de sécurité TLS (Transport Layer Security).
INFORMATION
La présente documentation est réalisée sous GNU/Linux Debian 12 et chrony 4.3-2.Serveur
Installation
Installation du service
apt install --no-install-recommends chrony
Configuration de base
L'outil se base sur un unique fichier /etc/chrony/chrony.conf
(changeable via un -f
) pouvant être atomisé dans /etc/chrony/conf.d/
. Les directives des serveurs peuvent quand à elle (et elles seules) être atomisées dans /etc/chrony/sources.d/
. Il n'est cependant généralement intéressant d'utiliser cette atomicité que dans des configurations complexes.
Voici le contenu de ce fichier pour une configuration simple en mode serveur pour deux réseaux clients
# Bienvenue dans le fichier de configuration de chrony. Veuillez voir la page de
# manuel chrony.conf(5) pour plus d'informations sur les directives utilisables.
# Inclure les fichiers de configurations trouvés dans /etc/chrony/conf.d.
confdir /etc/chrony/conf.d
# Utiliser les serveurs de temps de Debian.
# Toutes les IP retournées par le DNS seront utilisées dans la plage (pool).
pool 2.debian.pool.ntp.org iburst
# Utiliser les serveurs de temps fournis par les baux DHCP.
# sourcedir /run/chrony-dhcp
# Utiliser les serveurs NTP trouvés dans /etc/chrony/sources.d.
sourcedir /etc/chrony/sources.d
# Cette directive spécifie la localisation du fichier contenant le couple ID/clé
# pour l'authentification NTP.
keyfile /etc/chrony/chrony.keys
# Cette directive spécifie le fichier dans lequel chrony va stocker les
# informations de ratios.
driftfile /var/lib/chrony/chrony.drift
# Sauvegarder les les clés et cookies du protocole NTS dans /var/lib/chrony.
ntsdumpdir /var/lib/chrony
# Dé-commenter la ligne suivant pour activer la journalisation.
# Chaque mot définit un type de données à journaliser. Se référer au manuel.
#log tracking measurements statistics
# Localisation des fichiers de journaux
logdir /var/log/chrony
# Arrêter de considérer la source RTC matériel comme fiable au bout du seuil définit.
maxupdateskew 100.0
# Cette directive active la synchronisation RTC du noyau (toute les 11 minutes).
# Notez l'incompatibilité de cette option avec la directive 'rtcfile'.
rtcsync
# Ajuster d'une traite l'horloge au lieu de modifier la vitesse du temps pour
# ajuster le décalage lorsque celui-ci est supérieur à 1 seconde mais
# seulement pour les 3 premières synchronisations.
makestep 1 3
# Obtenir le décalage TAI-UTC et les secondes intercalaires à partir de la
# base de données tz du système. Cette directive doit être commentée lors de
# l'utilisation de sources de temps qui utilisent des secondes intercalaires.
leapsectz right/UTC
# Désactiver l'usage de chronyc via IP (port par défaut : UDP/323)
cmdport 0
# Autoriser les clients NTP des réseaux suivants à se synchroniser au serveur
allow 192.168.1.0/24
allow 10.0.2.0/23
Les directives allow
sont responsables du comportement en mode serveur de Chrony. En l'absence de paramètre, tous les clients sont autorisés à requêter le serveur (NTP publique).
Redémarrer le service
systemctl restart chrony.service
Afficher le statut du service pour voir d’éventuelle erreur
systemctl status chrony.service
Authentification
Deux modes d'authentification sont pris en charge :
Dans la mesure où le temps n'est pas une donnée confidentielle (les raisons sont assez évidentes...), aucun mécanismes ne permet le chiffrement de son échange. Les méthodes existantes ne permettent que l'authenticité et l'intégrité des paquets transmis.
Authentification NTP
L'authentification NTP est le mécanisme historique assurant l'intégrité des réponses du serveur. Il se base sur une clé hachée via différents algorithmes (SHA256 dans notre exemple mais couramment MD5) et partagée entre les paires. Chaque clé comporte un identifiant unique et est contenue dans une base (texte plein pour Chrony) des deux côtés de la communication. Le clients et le serveur doivent donc disposer du même couple identifiant/clé pour que les paquets soient jugés valides.
ATTENTION
Cela ne fonctionne pas. Il doit y avoir quelque chose d'autre à faire car après altération de la clé, ça se synchronise quand même... Cette méthode n'ayant jamais eu aucun intérêt de toute façon je ne vais pas perdre de temps à la faire fonctionner. Utilisez NTS si vous voulez de la sécurité. C'est mieux en tout point et bien moins compliqué à mettre en œuvre.Génération de la clé côté serveur
chronyc keygen 1 SHA256 256 >> /etc/chrony/chrony.keys systemctl restart chrony.service
Il faut copier la ligne générée dans le même fichier sur le client et préciser la clé à utiliser dans la ligne du serveur du fichier de configuration
server nts1.exemple.fr iburst key 1
systemctl restart chrony.service
NTS
NTS est un mécanisme normalisé en septembre 2020 permettant d’utiliser TLS pour assurer l'authentification cryptographique du mode client-serveur du NTP.
Génération des clés du serveur
mkdir /etc/chrony/nts openssl req -x509 -nodes -days 36500 -newkey rsa:4096 -out /etc/chrony/nts/chrony.crt -keyout /etc/chrony/nts/chrony.key -subj "/CN=nts1.exemple.fr/"
Le service s'exécutant avec des privilèges restreints, il est important que l'utilisateur l'exécutant est la propriété sur les éléments générés
chown _chrony:_chrony /etc/chrony/nts/chrony.*
Il convient enfin d'ajouter les directive demandant au serveur de les utiliser dans la configuration du service
cat >> /etc/chrony/chrony.conf << _EOF_
# Configuration du NTS
ntsservercert /etc/chrony/nts/chrony.crt
ntsserverkey /etc/chrony/nts/chrony.key
_EOF_
systemctl restart chrony.service systemctl status chrony.service
Client
La configuration du client est très similaire à celle du serveur.
# Bienvenue dans le fichier de configuration de chrony. Veuillez voir la page de
# manuel chrony.conf(5) pour plus d'informations sur les directives utilisables.
# Inclure les fichiers de configurations trouvés dans /etc/chrony/conf.d.
confdir /etc/chrony/conf.d
# Utiliser le serveur de temps NTS définit dans la section "serveur".
# Pour un NTP normal, il faut enlever le paramètre "NTS".
# Pour un NTP authentifié, faut utiliser le paramètre "key <id_clé>"
server nts1.exemple.fr iburst nts
# Utiliser les serveurs de temps fournis par les baux DHCP.
# sourcedir /run/chrony-dhcp
# Utiliser les serveurs NTP trouvés dans /etc/chrony/sources.d.
sourcedir /etc/chrony/sources.d
# Cette directive spécifie la localisation du fichier contenant le couple ID/clé
# pour l'authentification NTP.
keyfile /etc/chrony/chrony.keys
# Cette directive spécifie le fichier dans lequel chrony va stocker les
# informations de ratios.
driftfile /var/lib/chrony/chrony.drift
# Sauvegarder les les clés et cookies du protocole NTS dans /var/lib/chrony.
ntsdumpdir /var/lib/chrony
# Dé-commenter la ligne suivant pour activer la journalisation.
#log tracking measurements statistics
# Localisation des fichiers de journaux
logdir /var/log/chrony
# Arrêter de considérer la source RTC matériel comme fiable au bout du seuil définit.
maxupdateskew 100.0
# Cette directive active la synchronisation RTC du noyau (toute les 11 minutes).
# Notez l'incompatibilité de cette option avec la directive 'rtcfile'.
rtcsync
# Ajuster d'une traite l'horloge au lieu de modifier la vitesse du temps pour
# ajuster le décalage lorsque celui-ci est supérieur à 1 seconde mais
# seulement pour les 3 premières synchronisations.
makestep 1 3
# Obtenir le décalage TAI-UTC et les secondes intercalaires à partir de la
# base de données tz du système. Cette directive doit être commentée lors de
# l'utilisation de sources de temps qui utilisent des secondes intercalaires.
leapsectz right/UTC
# Désactiver l'usage de chronyc via IP (port par défaut : UDP/323)
cmdport 0
Pour le NTS, dans le cas où votre certificat est auto-généré, il faudra l'ajouter dans la base interne des clients. La méthode sous Debian est désormais la suivante (sur le client) :
cp chrony.crt /usr/local/share/ca-certificates/ update-ca-certificates -v
Redémarrer le service
systemctl restart chrony.service
Afficher le statut du service pour voir d’éventuelle erreur
systemctl status chrony.service
Afficher les sources NTP
chronyc sourcestats
Afficher l'état de la session NTS
chronyc authdata
Sources
- Pages de manuelles https://chrony-project.org/documentation.html :
- https://ubuntu.com/server/docs/how-to-serve-the-network-time-protocol-with-chrony
- https://mpolinowski.github.io/docs/DevOps/Linux/2022-09-29--build-an-chrony-nts-client-from-source/2022-09-29/
- https://access.redhat.com/documentation/fr-fr/red_hat_enterprise_linux/9/html/configuring_basic_system_settings/using-chrony-to-configure-ntp_configuring-basic-system-settings
- https://www.it-connect.fr/ntp-la-synchronisation-temporelle-avec-chrony/#V_Securisation_de_chrony