Le temps est une donnée importante dans la synchronisation des équipements informatiques, notamment pour l'aspect sécurité, afin que les protocoles d'authentification fonctionnent (comme Kerberos notamment). Dans un environnement Microsoft soumis à un Active Directory, un des 5 rôles FSMO est en charge de la gestion du temps : le PDC emulator. Dans une forêt il n'y a qu'un seul serveur qui se synchronise avec un serveur de temps externe, les autres équipements (PC, serveurs) se synchronisent avec le PDC emulator.
La synchronisation temporelle repose sur une latence minimale entre les sources de temps et les demandeurs de synchronisation. Pour réduire cette latence, il est requis de se synchroniser avec le serveur de temps le plus proche, donc pour nous, en France, il nous faut nous synchroniser avec un serveur de temps en France. Il existe un projet permettant cette synchronisation : https://www.ntppool.org/fr/. Le projet NTP Pool consiste en un ensemble de serveurs mis gracieusement à disposition des équipements du monde entier. Il existe actuellement 3701 serveurs de temps en Europe et globalement 200 serveurs pour la France.
Avec un serveur Windows, ouvrez une commande Powershell pour déterminer quel est l'émulateur PDC de votre domaine
Get-ADDomain | Select-Object PDCEmulator. En vous connectant sur le
serveur renvoyé par la commande Powershell, exécutez cette nouvelle commande pour déterminer quelle est votre source de temps.
w32tm /query /source. Vous pouvez obtenir des réponses du genre
Free-running System Clock ou Local CMOS Clock. Ce n'est pas forcément la bonne configuration (sauf si le serveur
ne peut pas être connecté à Internet) et d'ailleurs vous pouvez retrouver des avertissements dans le journal d'événements
de Windows (Time Service) qui indiquent des problèmes potentiels de synchronisation.
.
On commence par observer l'état de notre service de temps par
w32tm /query /status
On peut apercevoir la source de temps, le décalage temporel, l'intervalle d'interrogation ainsi que le moment de la
dernière bonne synchronisation.
Le service NTP repose sur le port 123. Vérifiez que la communication est effective en faisant
w32tm /stripchart /computer:0.fr.pool.ntp.org
Cela donne deux informations :
w32tm /config /manualpeerlist:"0.fr.pool.ntp.org,0x8 1.fr.pool.ntp.org,0x8 2.fr.pool.ntp.org,0x8" /syncfromflags:manual /update
On utilise une liste de serveurs de synchronisation qui appartiennent au pool français. La valeur 0x8 indique d'utiliser le protocole
ntp standard pour réaliser cette synchronisation.
Maintenant que la synchronisation est faite, nous allons nous annoncer au reste des équipements comme une source de temps fiable
w32tm /config /reliable:yes
Maintenant nous pouvons interroger de nouveau l'état du service
w32tm /query /status
et voir que le serveur de temps externe est apparu et qu'il n'y a pas de dérive temporelle. Pour plus d'informations, utilisez
w32tm /query /configuration. Vous pourrez voir une ligne NtpServer
qui liste l'ensemble des serveurs de temps possibles.
Depuis un poste de travail intégré au domaine, vous pouvez connaître la configuration de temps utilisée en faisant
w32tm /query /configuration et remarquer que le type est
NT5DS signifiant que le poste est bien sur un domaine.
Avec
w32tm /query /status vous pouvez voir que la machine se synchronise sur
votre émulateur PDC.
Si vous avez besoin de faire du troubleshooting sur le service de temps d'une machine qui ne se synchronise pas sur le domaine
net stop w32time
w32tm /unregister
w32tm /register
net start w32time
w32tm /config /syncfromflags:DOMHIER /update
net stop w32time
net start w32time. La mention DOMHIER signifie DOMain HIERarchy et force la machine à se synchroniser sur un
contrôleur de domaine.
Sous Linux le système de gestion du temps a changé au fil du temps. Historiquement c'était le service ntpd qui était en charge de ce mécanisme de synchronisation. Une évolution a eu lieu avec un nouveau service nommé systemd-timesyncd mais celui qui se détache aujourd'hui du lot par ses performances est le service chrony. Point important, lorsque vous mettez en place un système de synchronisation temporelle, pensez à désinstaller celui qui est potentiellement déjà en place.
Sous Linux, le temps est géré par le service ntp qui est normalement installé par défaut. pour le savoir consultez simplement le fichier sudo cat /etc/ntp.conf. S'il n'existe pas c'est que le service ntp n'est pas présent sur votre système.
#debian/ubuntu
$ sudo apt install ntp
# redhat
$ sudo yum install ntp
Editez le fichier de configuration pour spécifier les serveurs de temps à utiliser
sudo nano /etc/ntp.conf
Nous pouvons par exemple utiliser les serveurs du projet pool.ntp.org
server 0.fr.pool.ntp.org
server 1.fr.pool.ntp.org
server 2.fr.pool.ntp.org
server 3.fr.pool.ntp.org
Il faut ensuite démarrer le service et lancer au démarrage du système
#Pour CentOS/Red Hat/Fedora
chkconfig ntpd on
service ntpd start
#Pour Debian/Ubuntu
update-rc.d ntp defaults
service ntp start
Pour forcer la mise à jour de l’heure, nous utiliserons la commande ntpdate il faudra d’abord arrêter le service puis
le relancer après la mise à jour
#Pour CentOS/Red Hat/Fedora/Debian/Ubuntu
service ntpd stop
ntpdate 0.fr.pool.ntp.org
service ntpd start
Pour vérifier que le système est bien à l’heure, il suffira d’exécuter la commande
date
Désinstallez le client NTP déjà existant
$ sudo systemctl status systemd-timesyncd.service
$ sudo systemctl disable --now systemd-timesyncd.service
# installer le service chrony
$ sudo apt install chrony
# vérifiez si le service fonctionne
$ sudo systemctl status chrony
Vous pouvez maintenant installer chrony
# installation de chrony
$ sudo apt install chrony
# démarrez le service
$ sudo systemctl enable --now chronyd
Le fichier de configuration est /etc/chrony.conf. Il va falloir l'éditer pour ajouter les lignes des différents serveurs NTP que vous allez vouloir contacter.
# Avec un pool de serveurs
pool fr.pool.ntp.org iburst
# Avec une liste de serveurs
server 0.fr.pool.ntp.org iburst
server 1.fr.pool.ntp.org iburst
server 2.fr.pool.ntp.org iburst
server 3.fr.pool.ntp.org iburst
# Pour plus de sécurité, on limite l'écoute de la socket à sa seule machine
allow 127.0.0.0/8
Lorsque les paramètres sont modifiés, on peut relancer le service
$ sudo systemctl restart chronyd
Pour vérifier les informations de configuration des serveurs :
$ chronyc sources
Chrony peut également fonctionner en mode serveur et écouter d'autres réseaux pour la synchronisation des horloges. Dans le fichier de configuration /etc/chrony.conf :
allow 127.0.0.0/8
allow 10.0.0.0/8
allow 172.16.0.0/12
allow 192.168.0.0/16
binddaddress 0.0.0.0
Redémarrer ensuite le service par
$ sudo systemctl restart chronyd
Enfin, si vous utilisez un firewall comme firewalld, n'oubliez pas d'ouvrir le port 123/udp (le service ntp)
$ firewall-cmd --add-service=ntp --permanent
$ firewall-cmd --reload
Pour diagnostiquer le fonctionnement de chrony
# Activer l'option tracking pour avoir des informations additionnelles sur le statut NTP
$ chronyc tracking
# Forcer une synchronisation manuelle
$ sudo chronyc makestep
Si le service n'est pas démarré, on utilise la commande chronyd
$ sudo chronyd -q 'pool fr.pool.ntp.org iburst'