Localisation géographique et synchronisation temporelle

La localisation géographique et la synchronisation des horloges est indispensable au bon fonctionnement des systèmes informatiques (logs, authentifications, chiffrement, forensic, …). Les logiciels Linux utiles sont date, timedatectl, ntpdate, chronyc. Le démon chronyd permet d’assurer la synchronisation temporelle auprès de serveurs de temps (NTP).

1. Localisation

Sous Debian/Ubuntu :

sudo dpkg-reconfigure tzdata

Sous RHEL/Centos, le fichier /etc/localtime est un lien symbolique vers un des fichiers situés dans /usr/share/zoneinfo/ :

ls -l /etc/localtime

2. Date courante : commande date

La commande date permet d’afficher, initialiser et de convertir la date et l’heure du système alors que la commande hwclock affiche la date et l’heure “matérielle”.

La commande date prend des options et accepte un format d’affichage avec différents masques selon cette syntaxe :

date [OPTION]... [+FORMAT]

3. Options de la commande date

date
dim jun  6 11:25:06 CEST 2021

Afficher la date et l’heure au format ISO 8601 :

date -I
2021-06-06

Afficher la date et l’heure au format RFC 2822 :

date -R
Sun, 06 Jun 2021 11:25:15 +0200

Afficher la date en système de temps universel (UTC) :

date -u
dim jun  6 09:25:17 UTC 2021

4. Contrôler le format d’affichage de la commande date

On peut contrôler le format d’affichage de la date. Par exemple :

date ; date -u +%Y-%m-%d-%H%M%S
dim jun  6 11:47:48 CEST 2021
2021-06-06-094748
date ; date -u +%s
dim jun  6 11:48:12 CEST 2021
1622972892

+FORMAT contrôle l’affichage où “FORMAT” les séquences suivantes :

SéquencesAffichage
%%un caractère %
%anom abrégé localisé du jour de la semaine (par exemple dim.)
%Anom complet localisé du jour de la semaine (par exemple dimanche)
%bnom abrégé localisé du mois (par exemple janv.)
%Bnom complet localisé du mois (par exemple janvier)
%cdate et heure localisées (par exemple jeu. 03 mars 2005 23:05:25 CET)
%Csiècle, comme %Y, sans les deux derniers chiffres (par exemple 20)
%djour du mois (par exemple 01)
%Ddate, identique à %m/%d/%y
%ejour du mois, éventuellement complété par une espace, identique à %_d
%Fdate complète, identique à %Y-%m-%d
%gdeux derniers chiffres de l’année du numéro de semaine ISO (voir %G)
%Gannée correspondant au numéro de semaine ISO (voir %V) ; normalement seulement utile avec %V
%hidentique à %b
%Hheure (00..23)
%Iheure (01..12)
%jjour de l’année (001..366)
%kheure avec espace ( 0..23), identique à %_H
%lheure avec espace ( 1..12), identique à %_I
%mmois (01..12)
%Mminute (00..59)
%nun changement de ligne
%Nnanosecondes (000000000..999999999)
%pindicateur localisé AM ou PM en majuscules (blanc si inconnu)
%Pidentique à %p mais en minuscules
%rheure locale au format 12 heures (par exemple 11:11:01 PM)
%Rheure en format 24 heures identique à %H:%M
%ssecondes depuis 1970-01-01 00:00:00 UTC
%Ssecondes (00..60)
%tune tabulation
%Tl’heure, identique à %H:%M:%S
%ujour de la semaine (1..7) ; 1 représente le lundi
%Unuméro de la semaine de l’année, avec dimanche en premier jour de la semaine (00..53)
%Vnuméro de la semaine ISO, avec lundi en premier jour de la semaine
%wjour de la semaine (0..6), 0 représente le dimanche
%Wnuméro de la semaine, avec lundi en premier jour de la semaine (00..53)
%xreprésentation localisée de la date (par exemple 12/31/99)
%Xreprésentation localisée de l’heure (par exemple 23:13:48)
%ydeux derniers chiffres de l’année (00..99)
%Yannée
%zfuseau horaire numérique +hhmm (par exemple -0400)
%:zfuseau horaire numérique +hh:mm (par exemple -04:00)
%::zfuseau horaire numérique +hh:mm:ss (par exemple -04:00:00)
%:::zfuseau horaire numérique utilisant « : » pour la précision (par exemple -04, +05:30)
%Zabréviation alphabétique des fuseaux horaires (par exemple EDT)

5. Network Time Protocol

Network Time Protocol ou NTP est un protocole qui permet de synchroniser l’horloge locale d’ordinateurs sur une référence d’heure via le réseau. Un service NTP utilise le port UDP (ou TCP) 123.

La version 3 de NTP est la plus répandue à ce jour. Elle est formalisée par la RFC 1305 qui spécifie plusieurs aspects :

  • la description du protocole réseau (Architecture)
  • les modes de fonctionnement (Messages)
  • les algorithmes à mettre en place dans les machines.

La version 4 de NTP est une révision importante publiée dans la RFC 5905 en juin 2010.

Aussitôt après la parution de la version 3 de NTP, une version simplifiée est apparue, appelée « Simple Network Time Protocol » (SNTP) qui a également fait l’objet de plusieurs RFC. Par rapport à NTP, cette version est simplifiée dans le sens qu’elle ne spécifie pas les algorithmes à mettre en place dans les machines.

On ne manquera pas de visiter le site du projet NTP pool : http://www.pool.ntp.org/fr/.

6. Timedatectl

La commande timedatectl permet d’interroger et de modifier les paramètres de temps et de date.

timedatectl --help
timedatectl [OPTIONS...] COMMAND ...

Query or change system time and date settings.

  -h --help                Show this help message
     --version             Show package version
     --no-pager            Do not pipe output into a pager
     --no-ask-password     Do not prompt for password
  -H --host=[USER@]HOST    Operate on remote host
  -M --machine=CONTAINER   Operate on local container
     --adjust-system-clock Adjust system clock when changing local RTC mode

Commands:
  status                   Show current time settings
  set-time TIME            Set system time
  set-timezone ZONE        Set system time zone
  list-timezones           Show known time zones
  set-local-rtc BOOL       Control whether RTC is in local time
  set-ntp BOOL             Control whether NTP is enabled

Par exemple :

timedatectl status
      Local time: dim 2021-06-06 11:53:44 CEST
  Universal time: dim 2021-06-06 09:53:44 UTC
        RTC time: dim 2021-06-06 09:53:44
       Time zone: Europe/Paris (CEST, +0200)
     NTP enabled: yes
NTP synchronized: yes
 RTC in local TZ: no
      DST active: yes
 Last DST change: DST began at
                  dim 2021-03-28 01:59:59 CET
                  dim 2021-03-28 03:00:00 CEST
 Next DST change: DST ends (the clock jumps one hour backwards) at
                  dim 2021-10-31 02:59:59 CEST
                  dim 2021-10-31 02:00:00 CET

Pour fixer la zone horaire :

timedatectl set-timezone Europe/Paris

7. client ntpdate

Pour se synchroniser dans le temps, on peut utiliser aussi le client ntpdate :

sudo ntpdate fr.pool.ntp.org
6 Jun 11:55:10 ntpdate[400]: adjust time server 5.196.160.139 offset -0.000269 sec

8. Chrony

Chrony vise à remplacer le logiciel NTPd à des fins de performance. Il est l’outil de synchronisation temporelle par défaut à partir de Centos 7. Il offre un logiciel serveur chronyd et dispose d’un logiciel client chronyc.

S’il fallait installer et activer le service chronyd.

sudo yum -y install chrony
sudo systemctl enable chronyd
sudo systemctl start chronyd

On peut aussi vérifier la bonne activation du service chronyd.

sudo systemctl status chronyd
● chronyd.service - NTP client/server
   Loaded: loaded (/usr/lib/systemd/system/chronyd.service; enabled; vendor preset: enabled)
   Active: active (running) since sam 2021-06-05 12:32:43 CEST; 23h ago
     Docs: man:chronyd(8)
           man:chrony.conf(5)
  Process: 686 ExecStartPost=/usr/libexec/chrony-helper update-daemon (code=exited, status=0/SUCCESS)
  Process: 653 ExecStart=/usr/sbin/chronyd $OPTIONS (code=exited, status=0/SUCCESS)
 Main PID: 675 (chronyd)
    Tasks: 1
   CGroup: /system.slice/chronyd.service
           └─675 /usr/sbin/chronyd

jun 05 12:32:42 monlinux systemd[1]: Starting NTP client/server...
jun 05 12:32:43 monlinux chronyd[675]: chronyd version 3.4 starting (+CMDMON +NTP +REFCLOCK +RTC +PRIVDROP +SCFILTER +S...DEBUG)
jun 05 12:32:43 monlinux chronyd[675]: Frequency -8.398 +/- 0.111 ppm read from /var/lib/chrony/drift
jun 05 12:32:43 monlinux systemd[1]: Started NTP client/server.
jun 05 12:32:49 monlinux chronyd[675]: Selected source 144.76.100.49
Hint: Some lines were ellipsized, use -l to show in full.

On trouvera les serveurs de synchronisation et d’autres paramètres utilisés par Chrony dans le fichier de configuration /etc/chrony.conf.

cat /etc/chrony.conf

9. Client chronyc

Le client chronyc tracking offre un diagnostic précis : le numéro de strate et les différentiels de synchronisation.

chronyc tracking
Reference ID    : 904C6431 (wtfstfu.org)
Stratum         : 3
Ref time (UTC)  : Sun Jun 06 10:08:25 2021
System time     : 0.000782300 seconds slow of NTP time
Last offset     : -0.000317792 seconds
RMS offset      : 0.000188593 seconds
Frequency       : 7.999 ppm slow
Residual freq   : -0.063 ppm
Skew            : 0.105 ppm
Root delay      : 0.018359069 seconds
Root dispersion : 0.006287391 seconds
Update interval : 515.1 seconds
Leap status     : Normal

10. Afficher les sources de synchronisation avec chronyc

Le client chronyc sources -v affiche les sources de synchronisation.

chronyc sources -v
210 Number of sources = 4

  .-- Source mode  '^' = server, '=' = peer, '#' = local clock.
 / .- Source state '*' = current synced, '+' = combined , '-' = not combined,
| /   '?' = unreachable, 'x' = time may be in error, '~' = time too variable.
||                                                 .- xxxx [ yyyy ] +/- zzzz
||      Reachability register (octal) -.           |  xxxx = adjusted offset,
||      Log2(Polling interval) --.      |          |  yyyy = measured offset,
||                                \     |          |  zzzz = estimated error.
||                                 |    |           \
MS Name/IP address         Stratum Poll Reach LastRx Last sample
===============================================================================
^+ mtw.ig-haase.de               2  10   377   533   +938us[ +624us] +/-   35ms
^+ ntp2.hosteurope.de            2  10   377   626   +599us[ +287us] +/-   28ms
^* wtfstfu.org                   2   9   377   369  -1952us[-2270us] +/-   15ms
^+ littlericket.me               2  10   377    33  +1590us[+1590us] +/-   26ms