Syslog
Les entités
Les messages
Constitution des logs
Récupérer les messages
Première méthode
Seconde méthode
La plupart des routeurs xDSL d'aujourd'hui sont capables d'envoyer à un serveur les logs d'utilisation et de connexion par l'intermédiaire du démon syslog. Cependant, les informations concernant cette fonction sont souvent absentes. Voici une méthode complète. Dans mon expérience, j'ai utilisé le routeur NetGear FR114P et syslog sous FreeBSD 5.4. Mais cette méthode doit pouvoir s'exporter sur d'autres routeurs et d'autres systèmes d'exploitations.
Les routeurs les plus récent proposent toutefois de choisir l'entité à laquelle l'on veut affecter les log du routeur.
Syslog est un service (daemon) qui provient du monde UNIX, bien qu'il en existe une version sous Windows. C'est un outil qui récupère les messages envoyé par les programmes et les consigne dans des fichiers, les envoie à des utilisateurs...
Sous FreeBSD 5.4 il est lancé automatiquement au démarrage.
Les messages récupérés par Syslog sont découpés en entités. Ces entités sont :
Kernel (kern) : entité 0, correspondant au noyau système.
User : entité 1, correspondant au processus ne faisant pas partie de kernel.
Mail : entité 2, correspondant au mécanisme du courrier.
Daemon : entité 3, correspondant aux démons systèmes.
Auth : entité 4, correspondant à l'authentification.
Syslog : entité 5, correspondant à Syslog lui-même.
Lpr : entité 6, correspondant aux processus d'impression.
News : entité 7, correspondant aux serveurs de news.
Uucp : entité 8, correspondant aux programmes fondés sur UUCP.
Cron : entité 9, correspondant à Cron lui-même.
Authpriv : entité 10, correspondant à AUTH, mais n'étant pas destinés à être publics.
Ftp : entité 11, correspondant au FTP (serveur et client).
Ntp : entité 12, correspondant aux applications NTP.
Local[0-7] : entités 16 (Local0) à 23 (Local7) réservé pour des usages propres au site.
Il existe d'autres entités (13, 14), mais très peu utilisées.
Pour chaque entité, il existe un ensemble de messages, c'est à dire un ensemble de niveaux de sévérité de chaque message reçu par Syslog. Ces messages sont :
Emergency (emerg) : niveau 0, le plus élevé, le plus urgent
Alert : niveau 1, inférieur à 0
Critical (crit) : niveau 2, inférieur à 1
Error (err) : niveau 3, inférieur à 2
Warning : niveau 4, inférieur à 3
Notice : niveau 5, inférieur à 4
Info : niveau 6, inférieur à 5
debug : niveau 7, inférieur à 5
Les logs envoyés à Syslog appartiennent forcément à une entité définie avec une sévérité définie. Dans Syslog, ce niveau est noté entité.niveau.
Dans le cas de notre routeur, le plus difficile est de savoir à quel entité les messages sont envoyés. La plupart du temps, il s'agit de messages localn. Mais toute la difficulté provient de la façon de trouver n. Et il ne faut pas compter sur le vendeur du routeur pour nous l'indiquer.
Il existe donc deux méthodes possibles pour trouver le l'entité et ses niveaux. Une facile, mais incomplète (vous comprendrez bientôt pourquoi) et qui peut s'avérer totalement inutile, et une autre, plus complète, un peu plus technique mais plus efficace pour déterminer les disfonctionnements.
La méthode est simple : il suffit de mettre dans le fichier /etc/syslog.conf toutes les possibilités de messages, tous les couples possibles entité.niveau, en commençant par le plus probable, les localn.
Pour chaque localn, il faut définir les 8 niveaux et les envoyer chacun dans un fichier différent.
Syslog ne crée pas les fichiers s'ils n'existent pas. Il faut les créer pour lui. Une simple commande touch nom_de_fichier suffira à créer le fichier. Vu le nombre de fichiers à créer dans cette méthode, il vaut mieux créer un shell qui va se charger de créer les fichiers avec un minimum d'efforts.
Il ne vous reste plus qu'à relancer Syslog et constater quel fichier se remplit.
Dans le cas du routeur NetGear FR114P, il n'est pas nécessaire de lancer syslog avec un paramètre. Mais certaines configurations nécessiteront peut-être de le lancer avec l'option -a.
Pour relancer Syslog, tapez la commande :
kill -9 `more /var/run/syslog.pid`
syslogd
Tout le secret de cette technique repose sur l'utilisation de tcpdump, un utilitaire en standard sur les distributions libres. Pour Windows, il faudra se renseigner sur l'équivalent, s'il existe.
tcpdump est un utilitaire qui permet d'écouter un port et d'afficher ce qui y passe. Dans notre méthode, Syslog utilisant le port UDP 514, il ne nous reste plus qu'à écouter ce port.
Tout d'abord, il faut activer la carte réseau correctement, c'est à dire le mode promiscious, qui permet d'écouter le trafic. Dans mon exemple, ep0 est l'inteface réseau que j'utilise.
ifconfig ep0 promisc
ifconfig vous affiche simplement toutes vos interface réseau. Vous pourrez ainsi voir ce dont vous disposer et connaître le nom de votre interface.
Il suffit ensuite d'écouter :
tcpdump -X -i ep0 -s 1024 port 514 and proto UDP
l'option -i permet de déterminer sur quel appareil réseau vous désirez écouter le trafic. Il est utilise de le préciser si vous en avez plusieurs. Si vous n'en avez qu'un seul, vous pouvez omettre ce paramètre. Si tout se passe bien, vous devriez récupérer le trafic du réseau sur le port UDP 514. Et cela devrait ressembler à ceci :
etc.
Sur la première ligne vous trouvez votre machine, ici FR114P si vous l'avez défini dans le fichier /etc/hosts, sinon l'adresse IP de la machine émettrice. Passerelle est le nom du serveur Syslog, défini dans hosts également.
En dessous vous avez un ensemble de lignes ordonnées par colonnes. Intéressons nous à la dernière colonne. Plus particulièrement aux données incluses entre < et >. Ici 188. Il s'agit de notre entité.sévérité. Mais dans une version numérique.
La règle de calcul qui donne la valeur numérique récupérée est ainsi :
8 x entité + niveau.
Ce qui donne une série de valeur allant de 0 ( 8 x kernel + emerg ) à 191 ( 8 x local7 + debug ).
La règle pour passer de la valeur numérique à l'entité.niveau est :
Entité = Partie entière de (v/8)
niveau = reste de Entité x 8
Ou encore Entité est le quotient de la division euclidienne de v par 8, Niveau est le reste de la division euclidienne de v par 8
188 donne :
Entité = 188 / 8 = 23
Niveau = 188 % 8 = 4 (0,5 x 8)
Grâce au tableau que j'ai donné au début, nous pouvons voir qu'il s'agit de local7, pour le niveau warning, soit :
local7.warning
Il suffira donc de récupérer tout ce qui concerne local7 dans syslog.
Vous avez défini l'ensemble des entités nécessaires pour votre routeur. En général un seul suffit mais certains cas en utilisent plusieurs.
Vous avez modifié le /etc/syslog.conf de façon à prendre en charge les messages provenant du routeur. Une fois syslog redémarré, tout est OK. Enfin vos fichiers de log se remplissent ! Vous avez (presque) gagné!
Presque! Car lorsque vous relancez la machine complètement, à nouveau les fichiers ne se remplissent plus. Et vous avez beau dire et maudire, rien ne se passe. Il n'y a que lorsqu'on relance manuellement le démon que tout se remet à nouveau à fonctionner normalement. seulement, vous n'avez pas envie d'arrêter le démon et le relancer après chaque redémarrage de machine, surtout s'il s'agit d'une machine qui doit fonctionner sans intervention humaine de proximité (par exemple un serveur).
Mettez la commande de rédémarrage dans un shell placé dans le répertoire /etc/rc.d/. N'oubliez pas de lui donner les droits d'exécution.
Nommez le par exemple, syslog-restart, avec pour contenu :
#!/bin/sh
kill -9 `more /var/run/syslog.pid`
syslogd
Et n'oubliez pas de lui donner les droits en exécution (+x)
Cette commande sera automatiquement exécutée au démarrage, arrêtera le démon syslog pour le redémarrer.
Redémarrez votre machine et vérifiez que les logs se remplissent seuls.