Installation serveur NTP

De BigD's wiki
Aller à : navigation, rechercher

Retour vers Le coin des admins

Préambule

Un serveur de temps NTP est essentiel dans un réseau, pour de nombreuses raisons, surtout en termes de sécurité.

D'une part, un serveur de temps permet d'avoir une heure unique sur toutes les machines d'un réseau. Hormis le coté pratique de disposer tout le temps, sur sa machine, d'une horloge à l'heure, cela permet aussi de synchroniser toutes les machines entre elles sur une même source.

L'intérêt en termes de sécurité est immense : en cas de compromission, il sera beaucoup plus facile lors de l'investigation, de retrouver la chronologie des faits si tous les logs sont à la même heure ! En plus d'un gain de temps énorme, cela permettra de mieux comprendre l'attaque voire de mieux définir le périmètre de compromission.

Enfin, la mise en place d'un serveur de temps "logique" ou logiciel doit être une obligation surtout en cas d'utilisation de solution commerciale d'antenne (GPS ou hertzienne). En effet, ces boîtiers sont une vraie porte d'entrée dans le réseau, porte souvent oubliée par les RSSI. C'est pourquoi, il n'est pas farfelu de monter un tel serveur de temps logique qui se synchronise, pourquoi pas, sur un premier équipement communiquant par ondes, et sur lequel les machines du réseau se synchronisent (un relais NTP en sorte).

Mis en place de la synchronisation via NTP

Dans ce tutoriel, deux machines sont utilisées :

  • un serveur de temps dont le FQDN est ntp.bigd.fr (ici à l'adresse 172.20.0.2)
  • une machine cliente dans le réseau 172.20.0.0/24

Installation des paquets

L'installation d'un serveur ou d'un client NTP est relativement simple. Il suffit d'installer les paquets suivants :

  • Debian :
# aptitude install ntp
  • Gentoo :
# emerge -av --quiet net-misc/ntp

Configuration du serveur

Une fois installé, il faut éditer le fichier de configuration afin de régler plus finement le serveur NTP. Le fichier de configuration est situé dans /etc/ntp.conf

Fichier: /etc/ntp.conf
statsdir /var/log/ntpstats/
driftfile /var/lib/ntp/ntp.drift
logfile /var/log/ntp.log

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

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

server 127.127.1.0
fudge 127.127.1.0 stratum 2

interface ignore wildcard
interface listen 172.20.0.2/24
interface listen eth0

restrict -4 default kod notrap nomodify nopeer noquery
restrict default ignore
restrict -6 default ignore
restrict 127.0.0.1
restrict 172.20.0.0 mask 255.255.255.0


NB: Les commandes interface permettent de limiter les surfaces d'exposition du service NTP au strict nécessaire à des fins de durcissement. De même, comme non utilisé, l'IPv6 est désactivé.

Configuration des clients

Fichier: /etc/ntp.conf
statsdir /var/log/ntpstats/
logfile /var/log/ntp.log
driftfile /var/lib/ntp/ntp.drift

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

server ntp.bigd.fr 

restrict -4 default kod notrap nomodify nopeer noquery

restrict default ignore
restrict -6 default ignore

restrict ntp.bigd.fr
restrict 127.0.0.1 
restrict ::1

interface ignore wildcard
interface listen eth0


NB: Les deux dernières lignes permettent de restreinte les adresses d'écoute strictement nécessaire. De même, à des fin de sécurité, il n'est pas nécessaire d'activer l'écoute sur IPv6 si on ne l'utilise pas.

Vérification de la synchronisation

Pour vérifier que le serveur NTP du client et du serveur se synchronisent bien, il est possible d'utiliser la commande ntpq. Cette commande ouvre un environnement qui fournit plusieurs sous-commandes, dont la commande pe qui permet de voir le statut de synchronisation :

ntpq> pe
     remote           refid        st t when poll reach   delay   offset  jitter
================================================================================
*172.20.0.2      213.251.153.36     4 u   18  128  377    0.358    3.856   1.077
  • La colonne reach à 377 indique que la "connexion" avec le serveur de temps est parfaite.
  • L'étoile devant la ligne indique que ce serveur de temps est le serveur préféré du client (bon ici il n'en a qu'un).
  • Le refid indique le serveur primaire, celui sur lequel tous les serveurs intermédiaires se synchronisent.
  • la colonne st (stratum) indique le niveau hiérarchique du client dans la pyramide des serveurs de temps.
  • les colonnes delay, offset et jitter donnent des informations sur la synchronisation

Pour afficher ce même tableau, on peut directement exécuter la commande suivante :

# ntpq -np

Ajout de l'authentification

Afin de sécuriser l'authentification, notamment s'assurer que le serveur NTP avec lequel les machines se synchronisent est légitime, il faut mettre en place de l'authentification.

Plusieurs méthodes existent :

  • Authentification par clés symétriques ;
  • Authentification par certificat ;

Utilisation de clés symétriques

Configuration du serveur

La configuration du serveur se fait en deux étapes. Premièrement il faut générer les clés qui seront utilisées.

Cette génération s'effectue avec la commande ntp-keygen :

# ntp-keygen -c RSA-MD5 -M

Cette commande va générer plusieurs fichiers dont un nommé ntpkey_MD5key_hostname.timestamp. Ce fichier contient une liste de clés qui peuvent être utilisées pour l'authentification.

Ensuite, *on peut* copier le fichier dans /etc/ et on change les droits au passage :

# cp ntpkey_MD5key_hostname.timestamp /etc/ntp.keys
# chmod 400 /etc/ntp.keys

Enfin, on édite le fichier de configuration du serveur:

  • On ajoute les lignes suivantes :
Fichier: /etc/ntp.conf
...
enable auth
keys /etc/ntp.keys
trustedkey 1
NB: Ici la clé n°1 a été choisie, il est possible d'en choisir une autre, voire plusieurs autres
  • On modifie la ligne suivante en y ajoutant notrust :
Fichier: /etc/ntp.conf
restrict 172.20.0.0 mask 255.255.255.0 notrust

Cette ligne permet d'indiquer au serveur de n'accepter de synchroniser que les machines du réseau 172.20.0.0/24 qui se sont au préalable authentifiées.

On limite les droits du fichier de configuration :

# chmod 600 /etc/ntp.conf

On redémarre le serveur NTP:

# /etc/init.d/ntp restart

Configuration des clients

La configuration des clients elle aussi se fait en deux étapes. Premièrement, il faut créer un fichier contenant une des clés générées par le serveur lors de la configuration de celui-ci (cf. partie précédente).

# touch /etc/ntp.keys

Editer le fichier et y ajouter une des lignes du même fichier sur le serveur :

Fichier: /etc/ntp.keys
1 MD5 oBR4e&.I,8'q0?bspK3_  # MD5 key


Ensuite, on change les droits sur ce fichier. Nul besoin que tout le monde puisse lire la clé.

# chmodd 400 /etc/ntp.keys

A ce moment, il est possible de tester si l'authentification fonctionne. Pour cela, il faut exécuter la commande suivante :

# ntpdate -d -a 1 -k /etc.ntp.keys ntp.bigd.fr

La commande devrait au moins retourner le message suivant :

transmit(ntp.bigd.fr)
receive(ntp.bigd.fr)
receive: authentication passed
NB: Pour faire ce test, il faut au préalable stopper le démon NTP, car le port 123, utilisé par ntpdate, est déjà utilisé par le démon.

L'authentification fonctionne. Reste maintenant à la configurer au niveau du serveur en ajoutant les lignes suivantes ...

Fichier: /etc/ntp.conf
enable auth
keys /etc/ntp.keys
trustedkey 1

... et à modifier la ligne suivant en y ajoutant notrust :

Fichier: /etc/ntp.conf
restrict ntp.bigd.fr notrust


Maintenant, on peut redémarrer le serveur (ou le démarrer si on l'avait stoppé pour le test)

# /etc/init.d/ntp (re)start

Utilisation de certificat

La deuxième solution pour permettre l'authentification des machines pour la synchronisation est l'utilisation de certificats. Cette solution est *forcément* à privilégier car plus sécurisée.

Configuration du serveur

Pour installer une telle authentification, il faut d'abord créer le dossier dans lequel seront les certificats et clés.

# mkdir /etc/ntp
# cd /etc/ntp

Maintenant on peut générer la clé privé et le certificat publique du serveur de temps :

# ntp-keygen -TH -m 2048
NB: Il est possible de protéger la clé privée générée par une passephrase. Même si l'intérêt est limité (vu qu'il faudra la renseigner dans le fichier de conf) cela peut en rassurer certains. Pour ce faire, il suffit d'exécuter la commande suivante :
# ntp-keygen -TH -m 2048 -p passphrase

Cette commande va créer 4 fichiers :

  • deux liens symboliques avec des noms neutres (ntpkey_host_hostname et ntpkey_cert_hostname);
  • un fichier ntpkey_RSAhost_hostname.timestamp : la clé privée chiffrée ;
  • un fichier ntpkey_RSA-MD5cert_hostname.timestamp : le certificat lié à la clé valable 1 an ;
Attention: Il faut impérativement que le hostname soit le FQDN du serveur !! Si non, il est possible de spécifier le bon FQDN en ajoutant l'option -s hostname à la ligne de commande


Au passage, on restreint les accès aux clé et certificat :

# chmod 400 /etc/ntp/*

Enfin, on édite le fichier de configuration /etc/ntp.conf :

  • pour y ajouter les quelques lignes suivantes :
Fichier: /etc/ntp.conf
...
enable auth
crypto
keysdir /etc/ntp
NB: Si une passephrase a été utilisée lors de la précédente étape, il faut rajouter la ligne suivante dans le fichier de configuration /etc/ntp.conf :
Fichier: /etc/ntp.conf
crypto pw ''passphrase''
  • Ajouter à la fin de la ligne suivante le mot notrust :
Fichier: /etc/ntp.conf
restrict 172.20.0.0 mask 255.255.255.0 notrust


Et on redémarre le service :

# /etc/init.d/ntp restart

Configuration des clients

Sur les clients, il faut éditer la configuration pour qu'elle prenne en compte l'authentification par clé.

Tout d'abord, comme sur le serveur, on crée le dossier etc/ntp.conf :

# mkdir /etc/ntp
# cd /etc/ntp

On y copie le certificat du serveur (ici via scp pour les besoins du tuto):

# scp root@ntp.bigd.fr:/etc/ntp/ntpkey_RSA-MD5cert_ntp.bigd.fr.3583811803 .
NB: le plus simple, surtout pour une installation via PXE par exemple, ou pour le renouvellement annuel du certificat, est d'offrir la possibilité de pouvoir télécharger le certificat par un serveur web.

Ensuite, comme sur le serveur, on génère une clé privée et un certificat :

# ntp-keygen -H -m 2048
NB: Il est également possible de protéger la clé privée générée par une passephrase en exécutant la commande suivante :
# ntp-keygen -H -m 2048 -p passphrase

De même, la commande va générer 4 fichiers comme pour le serveur.

De même que pour le serveur, on restreint les accès aux clé et certificat :

# chmod 400 /etc/ntp/*

Enfin, on édite le fichier de configuration /etc/ntp.conf :

  • On y ajoute les lignes suivantes :
Fichier: /etc/ntp.conf
enable auth
crypto
keysdir /usr/local/etc/
NB: Si une passephrase a été utilisée lors de la précédente étape, il faut rajouter la ligne suivante dans le fichier de configuration /etc/ntp.conf :
Fichier: /etc/ntp.conf
crypto pw ''passphrase''
  • On modifie la ligne suivant pour y ajouter le mot clé autokey :
Fichier: /etc/ntp.conf
server ntp.bigd.fr autokey
NB: Pour que cela fonctionne, il faut s'assurer que le FQDN ntp.bigd.fr se résolve

Maintenant, on peut redémarrer le service :

# /etc/init.d/ntp restart

Vérifier que la synchronisation authentifiée fonctionne

Pour vérifier que les machines clientes sont bien synchronisées et si mis en place, authentifié, il faut utiliser la commande ntpq.

Ainsi, dans l'environnement ntpq, on peut vérifier que l'association entre le client et le serveur de temps est authentifiée :

ntpq> as

ind assid status  conf reach auth condition  last_event cnt
===========================================================
  1 54750  f63a   yes   yes   ok   sys.peer    sys_peer  3

Ici, on voit bien que la colonne auth est ok.

Gestion des logs

Comme renseigné dans le fichier de configuration, les logs sont redirigés vers /var/log/ntp.og. Cependant quelques sorties sont aussi attrapées par 'syslog !

Configuration de syslog

Pour que tout ce qui concerne le démon NTP soit loggé dans le même fichier de logs, à savoir Modèle:/var/log/ntp.conf, il faut ajouter, dans la configuration de syslog (/etc/syslog-ng/syslog-ng.conf), les lignes suivantes :

Fichier: /etc/syslog-ng/syslog-ng.conf
destination d_ntp { file("/var/log/ntp.log"); };
filter f_ntp { program(ntpd); };
log { source(s_src); filter(f_ntp); destination(d_ntp); };


Configuration de logrotate

Il faut également penser, comme pour tout fichier de logs, à les faire tourner pour éviter qu'il ne sature le disque, et si le système est mal partitioné, fasse cracher le système.

En ce qui concerne notre fichier de logs, /var/log/ntp.log, il faut ajouter le fichier suivant dans le dossier /etc/logrotate.d/ :

Fichier: /etc/logrotate.d/ntp.log
/var/log/ntp.log {
  missingok
  compress
  compressoptions -9
  weekly
  rotate 52
  notifempty
  sharedscripts
  postrotate
	  /etc/init.d/syslog-ng reload > /dev/null 2>&1 || true
  endscript
}


Règles de pare-feux

Toujours pour mieux sécuriser le service, il est impératif de bien ajouter les règles de pare-feux qui ne laissent passer que le strict nécessaire.

Sur le client

Les règles de pare-feu sur le client sont relativement simple. En s'assurant bien que la politique par défaut est de tout refuser (cf. Installer les règles de pare-feu), voici les quelques lignes de règles de filtrage : Pour iptables :

# iptables -A OUTPUT -o eth0 -p udp --sport 123 --dport 123 -d ntp.bigd.fr -m state --state NEW -j ACCEPT


Sur le serveur

De même, il faut autoriser uniquement les accès du réseau des clients dans le pare-feu * Pour iptables :

# iptables -A INPUT -i eth0 -p udp --sport 123 --dport 123 -s 172.20.0.0/24 -d ntp.bigd.fr -m state --state NEW -j ACCEPT