Vous êtes sur la page 1sur 13

Gestion et surveillance de rseau

0.1 Objectifs
0.2 Notes
1 Exercices
2 Configurez votre routeur virtuel afin qu'il envoie des messages
3 ditez /etc/syslog-ng/syslog-ng.conf
4 Crez le rpertoire /var/log/network/
5 Redmarrez syslog-ng:
6 Tester syslog
7 Sur votre PC, regardez si des messages commencent apparatre sous
8 En cas de problme

% Utilisation de syslog-ng pour la gestion des journaux
0.1 Objectifs
Apprendre utiliser syslog-ng pour grer les journaux syslogs
0.2 Notes
Les commandes prcdes de "$" signifient que vous devez excuter la
commande en tant qu'utilisateur gnral - et non en tant qu'utilisateur root.
Les commandes prcdes de "#" signifient que vous devez travailler en tant
qu'utilisateur root.
Les commandes comportant des lignes de commande plus spcifiques (par exemple
"rtrX>" ou "mysql>") signifient que vous excutez des commandes sur des
quipements distance, ou dans un autre programme.
1 Exercices
Veuillez identifier les participants qui utilisent le mme routeur que vous, s'il y'en a.
Constituez un groupe et faites ensemble l'exercice suivant. Il s'agit de dsigner une
personne pour se connecter au routeur de votre groupe, mais chacun d'entre vous participera
la configuration effective.
2 Configurez votre routeur virtuel afin qu'il
envoie des messages
syslog votre serveur :
Vos routeurs sont capables d'envoyer des messages syslog de multiples destinations, ainsi
un routeur peut envoyer des messages 4 voire 5 destinations diffrentes. Nous devons
donc configurer le routeur pour qu'il envoie des messages chacun des PC de votre groupe.
Vous allez vous connecter en SSH au routeur de votre groupe et effectuer les oprations
suivantes :
$ ssh cisco@10.10.X.254
rtrX> enable
rtrX# config terminal
Rptez la commande "logging 10.10.X.Y" pour chaque PC de votre groupe. En d'autres
termes, si votre groupe est sur le routeur 6 et que vous utilisez les PC 21, 22, 23 et 24 vous
rpterez la commande quatre reprises avec l'IP de chaque machine (10.10.6.21,
10.10.6.22, et ainsi de suite).
rtrX(config)# logging 10.10.X.Y
...
rtrX(config)# logging facility local0
rtrX(config)# logging userinfo
rtrX(config)# exit
rtrX# write memory
Regardons le rsum de la configuration des journaux (logs) avec 'show logging'
rtrX# show logging
Dconnectez-vous du routeur (exit)
rtrX# exit
C'est fait. Le routeur devrait maintenant envoyer des paquets UDP SYSLOG votre PC sur
le port 514. Pour vrifier, ouvrez une session sur votre PC et effectuez l'opration
suivante :
$ sudo -s
# apt-get install tcpdump (ne vous inquitez pas si il est
dj install)
# tcpdump -s0 -nv -i eth0 port 514
Puis demandez une personne de votre groupe de se connecter au routeur et d'entrer les
commandes suivantes :
$ ssh cisco@10.10.X.254
rtrX> enable
rtrX# config terminal
rtrX(config)# exit
rtrX> exit
Des informations de TCPDUMP devraient s'afficher sur l'cran de votre PC. Celles-ci
devraient ressembler ce qui suit :
08:01:12.154604 IP (tos 0x0, ttl 255, id 11, offset 0, flags [none], proto
UDP (17), length 138)
10.10.9.254.57429 > 10.10.9.36.514: SYSLOG, length: 110
Facility local0 (16), Severity notice (5)
Msg: 23: *Feb 19 08:01:10.855: %SYS-5-PRIV_AUTH_PASS: Privilege level
set to 15 by cisco on vty0 (10.10.0.117)
08:01:15.519881 IP (tos 0x0, ttl 255, id 12, offset 0, flags [none], proto
UDP (17), length 130)
10.10.9.254.57429 > 10.10.9.36.514: SYSLOG, length: 102
Facility local0 (16), Severity notice (5)
Msg: 24: *Feb 19 08:01:14.215: %SYS-5-CONFIG_I: Configured from console
by cisco on vty0 (10.10.0.117)
Vous pouvez maintenant configurer le logiciel de journalisation sur votre PC afin qu'il
reoive ces informations et les enregistre dans un nouvel ensemble de fichiers :
2. Installez syslog-ng
Ces exercices s'effectuent en tant qu'utilisateur root. Si vous n'tes pas un utilisateur root sur
votre machine, vous pouvez le devenir en tapant :
$ sudo -s
# apt-get install syslog-ng
3 ditez /etc/syslog-ng/syslog-ng.conf
Localisez les lignes
source s_src {
system();
internal();
};
et remplacez-les par :
source s_src {
system();
internal();
udp();
};
Sauvez le fichier et quitter.
Maintant, crez une configuration pour nos logs d'quipement rseau:
# cd /etc/syslog-ng/conf.d/
# editor 10-network.conf
Dans ce fichier, copier et coller les lignes suivantes:
filter f_routers { facility(local0); };

log {
source(s_src);
filter(f_routers);
destination(routers);
};

destination routers {
file("/var/log/network/$YEAR/$MONTH/$DAY/$HOST-$YEAR-$MONTH-$DAY-
$HOUR.log"
owner(root) group(root) perm(0644) dir_perm(0755) create_dirs(yes)
template("$YEAR $DATE $HOST $MSG\n"));
};
Sauvez le fichier et quitter.
4 Crez le rpertoire /var/log/network/
# mkdir /var/log/network/
5 Redmarrez syslog-ng:
# service syslog-ng restart
6 Tester syslog
Pour s'assurer qu'il y ait des messages syslog, reconnectez vous au routeur et effectuez des
commandes "config", puis dconnectez vous, c'est dire:
# ssh cisco@10.10.X.254
rtrX> enable
rtrX# config terminal
rtrX(config)# exit
rtrX> exit
Veillez vous dconnecter du routeur. Si un trop grand nombre de personnes se
connectent et oublient de se dconnecter, d'autres ne pourront pas accder au routeur.
7 Sur votre PC, regardez si des messages
commencent apparatre sous
/var/log/network/2013/.../
$ cd /var/log/network
$ ls
$ cd 2013
$ ls
... ceci vous montrera le contenu du rpertoire pour le mois en cours
... faites 'cd' et le nom de ce rpertoire
$ ls
... recommencer au niveau suivant (le jour du mois)
$ ls
8 En cas de problme
Si aucun fichier n'apparait sous le rpertoire /var/log/network, alors une autre commande
essyer pendant qu'on est logg sur le routeur, en mode configuration, est de faire un
shutdown / no shutdown sur une interface Loopback (locale), par eemple:
$ ssh cisco@rtrX

rtrX> enable
rtrX# conf t
rtrX(config)# interface Loopback 999
rtrX(config-if)# shutdown
Attendre quelques secondes
rtrX(config-if)# no shutdown
Puis quitter, et sauver la configuration ("write mem"):
rtrX(config-if)# exit
rtrX(config)# exit
rtrX# write memory
rtr1# exit
Vrifiez les logs sous '/var/log/network'
# cd /var/log/network
# ls
... suivre la hirarchie des rpertoires.
Toujours pas de logs ?
Essayez la commande suivante pour envoyer un message de log en local:
# logger -p local0.info 'Hello World!'
Si aucun fichier n'a t cr sous '/var/log/network', alors vrifier la configuration
pour des fautes de frappe. Ne pas oublier de redmarrer le service syslog-ng chaque fois
que vous changez la configuration.
Quelles autres commandes pouvez vous employer sur le routeur (ATTENTION!) qui
provoqueront l'envoi de messages syslog ? Vous pouvez essayer de vous loger sur le router et
taper un mot de passe incorrect pour "enable"
Assurez-vous de faire un "ls" dans le rpertoire de vos logs pour voir si des logs ont
t crs un moment ou un autre.

Serveur SYSLOG : Syslog-ng
Linux et de multiples quipements rseaux effectuent une journalisation des vnements qui
s'oprent sur leur systme. Ces journaux sont stocks localement et bass sur le protocole
Syslog.
L'intrt d'un serveur Syslog-ng est donc de permettre une centralisation de ces journaux
d'vnements, permettant de reprer plus rapidement et efficacement les dfaillances de
machines prsentes sur un rseau.
Avant mme d'aller plus loin, je vous invite lire l'excellent article "Syslog, matrisez
l'historique" de Vincent Renardias, paru dans le numro 19 de Linux Magazine.
C'est une excellente base et une approche simple de la journalisation sous Linux qui va
suivre Syslog-ng est une solution de journalisation sous systmes Unix et Linux depuis les
annes 1980.
Pr-requis
Pour la suite des oprations, des pr-requis sont ncessaires :
Disposer des droits d'administration ;
Disposer d'une connexion Internet configure et active ;
Avoir activ l'accs au dpt APT 'universe';
Un serveur LAMP (Linux Apache Mysql Php) fonctionnel si vous dcidez d'installer php-
syslog-ng.
Qu'est-ce que Syslog-NG ?
Nous nous intresserons ici syslog-ng, un remplaant de syslog. Il permet notamment de
dissocier les logs entrants sur d'autres critres que le 'facility' comme par exemple : le nom ou
l'adresse IP de la machine qui met le log.
Son installation n'est pas trs complexe, mais ncessite un peu de rigueur.
1. Installer Syslog-NG
Vous devez au pralable activer le dpot universe ; l'installation de syslog-ng supprimera les
paquets klogd et sysklogd, respectivement en charge de la journalisation des vnements lis
au noyau et au reste du systme. Idem pour le paquet ubuntu-minimal.
Installez le paquet syslog-ng
Editez le fichier /etc/default/syslog-ng
et remplacez
#CONSOLE_LOG_LEVEL=0 par
CONSOLE_LOG_LEVEL=1
Pouvez-vous expliquer pourquoi la valeur par dfaut ne convient pas?
Aprs avoir effectu ces changements, redmarrez syslog-ng avec la commande :
sudo /etc/init.d/syslog-ng restart
Configuration de Syslog-NG
Le fichier de configuration par dfaut est situ dans /etc/syslog-ng/syslog-ng.conf
Pour que syslog-ng accepte de recevoir des messages d'une machine distante, vous devez
dcommenter une ligne ; pour cela remplacer :
# (this is equivalent to the "-r" syslogd flag)
# udp();
Par
# (this is equivalent to the "-r" syslogd flag)
udp();
Pour ma part: J'ai du laisser comment udp() et ajouter une nouvelle source:
source s_net {
udp();
};
sinon tous les messages venant du rseaux sont re-dirig vers les fichiers /var/log/messages et
/var/log/syslog en plus du fichier paramtr
Rien de tout a ne semble fonctionner avec Ubuntu 12.04, vu les changements dans le fichier de
configuration il est possible que l'authentification et le cryptage soit ncessaire pour accepter les logs
distants.
2. Configuration du client Syslog d'une machine
Si vous souhaitez envoyer tous les messages syslog d'une station ou d'un serveur sur le
serveur syslog qui les collectera (plutt que localement), vous devez Editez le fichier
/etc/syslog.conf et ajouter la ligne suivante :
*.* @ip_server_syslog
Maintenant, redmarrez le client syslog de la machine :
sudo /etc/init.d/sysklogd restart
partir de maintenant, le serveur syslog-ng est fonctionnel : les logs de la machine lui sont
envoys.
3. Configuration de php-syslog-ng
php-syslog-ng est une interface web base sur un script php qui permet de lire les logs qu'aura
stock dans une base mysql un serveur syslog-ng. Elle n'est pas indispensable mais permet
d'accder aux logs plus facilement et intuitivement. Vous devez avoir un serveur LAMP de
fonctionnel (Linux Apache MySQL PHP)
Tlcharger et installer le logiciel
mkdir phpsyslogng
cd phpsyslogng
wget http://php-syslog-ng.googlecode.com/files/php-syslog-ng-2.9.8.tgz
tar -zxvf php-syslog-ng-*
cd ..
sudo mv phpsyslogng /var/www/
cd /var/www/phpsyslogng
Configuration de MySQL
Le moyen le plus rapide est d'utiliser le fichier dbsetup.sql dans le rpertoire
'scripts'(/var/www/phpsyslogng/html/scripts). ditez ce fichier et renseignez les mots de passe
des 3 utilisateurs (sysloguser, syslogfeeder, syslogadmin) qui seront crs (en remplaant
PW_HERE). Le script crera une table pour les journaux et une pour l'authentification des
utilisateurs, et affectera des droits sensiblement diffrents pour chaque utilisateur.
Si vous effectuez d'autres changements comme changer le nom de la base de donnes ou des
tables, assurez-vous de faire correspondre ces changement dans le fichier config.php.
Aprs avoir modifi le script dbsetup.sql excutez le simplement avec la commande :
sudo mysql -u root -p < dbsetup.sql
Configuration de syslog-ng
Maintenant vous devez configurer syslog-ng pour rediriger les messages dans la base
MySQL. Vous devrez ajouter 2 entres dans le fichier de configuration de syslog-ng. Le
fichier de configuration est habituellement dans /etc/syslog-ng/syslog-ng.conf
Vous devez premirement ajouter une entre 'destination'. Ajoutez ceci :
destination d_mysql {
pipe("/var/log/mysql.pipe"
template("INSERT INTO logs
(host, facility, priority, level, tag, datetime, program, msg)
VALUES ( '$HOST', '$FACILITY', '$PRIORITY', '$LEVEL', '$TAG', '$YEAR-
$MONTH-$DAY $HOUR:$MIN:$SEC',
'$PROGRAM', '$MSG' );\n") template-escape(yes));
};
Ceci va prendre vos logs et les formater dans une requte SQL qui pourra tre excute pour
les ajouter dans la base de donnes.
Vous devrez galement ajouter une entre de type 'log' qui dterminera quels vnements
faire suivre dans la base de donnes (fonctionnement bas sur le mode First In First Out).
Vous voudrez srement faire suivre tous les logs dans MySQL et ils seront aussi une entre de
type 'source' pour cela dans votre fichier syslog-ng.conf (habituellement appels src ou s_all).
Pour rattacher cette source la destination que vous venez juste de crer, vous devez ajouter
le code suivant :
log {
source(s_all);
destination(d_mysql);
};
Configurer syslog-ng pour la redirection vers MySQL
Un exemple de script qui redirige les logs vers la base MySQL est inclus dans le rpertoire
des scripts (/var/www/phpsyslogng/html/scripts). Le script se nomme syslog2mysql.sh
#!/bin/bash

if [ ! -e /var/log/mysql.pipe ]
then
mkfifo /var/log/mysql.pipe
fi
while [ -e /var/log/mysql.pipe ]
do
mysql -u syslogfeeder --password=PASS_HERE syslog < /var/log/mysql.pipe
>/dev/null
done
Vous devez remplacer PASS_HERE par le mot de passe que vous avez affect l'utilisateur
'syslogfeeder'. Vous voudrez aussi probablement que le script soit lanc automatiquement
chaque dmarrage du serveur syslog-ng. Aussi, ajoutez une entre dans inittab ou dmarrez le
script via init.d. Mais bien faire attention lancer le script une fois que Mysql a dmarr.
Avec un script init.d Ubuntu : Crez un fichier syslog2mysql dans /etc/init.d/ ayant comme
contenu :
#! /bin/sh

# Do NOT "set -e"

PATH=/usr/sbin:/usr/bin:/sbin:/bin
DESC="Fetch queries from syslog-ng to mysql db"
NAME=syslog2mysql
PIDFILE=/var/run/$NAME.pid
SCRIPTNAME=/etc/init.d/$NAME

# Exit if mysql client is not installed
[ -x "/usr/bin/mysql" ] || exit 0

# Load the VERBOSE setting and other rcS variables
[ -f /etc/default/rcS ] && . /etc/default/rcS

# Define LSB log_* functions.
# Depend on lsb-base (>= 3.0-6) to ensure that this file is present.
. /lib/lsb/init-functions

#
# Function that starts the daemon/service
#
do_start()
{
[ ! -e /var/log/mysql.pipe ] && echo " (Creating $NAME pipe)." &&
mkfifo /var/log/mysql.pipe
if [ -e $PIDFILE ]; then
if ps -p $(cat $PIDFILE) >/dev/null; then
echo -n -e "\nError: $NAME seems to be already running!"
return 1
else
rm -f $PIDFILE
fi
fi
{
while [ -e /var/log/mysql.pipe ]
do
mysql -u syslogfeeder --password=PASS_HERE syslog <
/var/log/mysql.pipe >/dev/null
sleep 1
done
} &
echo $! > $PIDFILE
}

#
# Function that stops the daemon/service
#
do_stop()
{
if [ -e $PIDFILE ]; then
PID=$(cat $PIDFILE)
if ps -p $PID >/dev/null; then
# get PID of child
CPID=$(pgrep -P $PID)
# kill script
kill $PID
# kill child
kill $CPID
rm -f $PIDFILE
return 0
else
echo -e "\nWarning: $NAME was not running."
echo -n -e "\nCleaning PID file"
rm -f $PIDFILE
return 1
fi
else
echo -n -e "\nWarning: $NAME was not running"
return 1
fi
}

case "$1" in
start)
[ "$VERBOSE" != no ] && log_daemon_msg "Starting $DESC" "$NAME"
do_start
case "$?" in
0|1) [ "$VERBOSE" != no ] && log_end_msg 0 ;;
2) [ "$VERBOSE" != no ] && log_end_msg 1 ;;
esac
;;
stop)
[ "$VERBOSE" != no ] && log_daemon_msg "Stopping $DESC" "$NAME"
do_stop
case "$?" in
0|1) [ "$VERBOSE" != no ] && log_end_msg 0 ;;
2) [ "$VERBOSE" != no ] && log_end_msg 1 ;;
esac
;;
restart|force-reload)
#
# If the "reload" option is implemented then remove the
# 'force-reload' alias
#
log_daemon_msg "Restarting $DESC" "$NAME"
do_stop
case "$?" in
0|1)
do_start
case "$?" in
0) log_end_msg 0 ;;
1) log_end_msg 1 ;; # Old process is still running
*) log_end_msg 1 ;; # Failed to start
esac
;;
*)
# Failed to stop
log_end_msg 1
;;
esac
;;
*)
echo "Usage: $SCRIPTNAME {start|stop|restart|force-reload}" >&2
exit 3
;;
esac

:
Pensez modifier le pwd de syslogfeeder dedans
Crez le lien pour lancer le script au dmarrage
sudo update-rc.d syslog2mysql defaults
Maintenant dmarrez le service syslog2mysql :
sudo /etc/init.d/syslog2mysql start
ou si vous prfrez ne pas utiliser init.d et utiliser directement le script :
sudo ./syslog2mysql.sh &
Note : ce script doit toujours s'excuter en tache de fond parce qu'en l'utilisant tout les
messages sont redirigs dans la base de donnes MySQL.
Il est maintenant temps de redmarrer le dmon syslog-ng et d'envoyer les logs dans la base
de donnes :
sudo /etc/init.d/syslog-ng restart
Modification du fichier config.php
Si vous utilisez la base de donnes par dfaut initialise par le fichier dbsetup.sql, tout ce que
vous avez faire est d'entrer le mot de passe pour les utilisateurs sysloguser et syslogadmin,
dfinir l'hote et le port du serveur de base de donnes s'il n'est pas sur le mme serveur que le
serveur web, et saisir une URL valide.
Sinon, parcourez le fichier config.php et configurez les paramtres dont vous avez besoin.
Toutes les options sont expliques dans le fichier.
sudo vi /var/www/phpsyslogng/config/config.php
php-syslog-ng est maintenant accessible l'adresse : http://votre_webserver/phpsyslogng Un
compte administrateur (admin) a t cr par dbsetup.sql avec le mot de passe admin
Si aprs la connexion vous obtenez le message "Query failed: You have an error in your SQL
syntax; check the manual that corresponds to your MySQL server version for the right syntax
to use near '' at line 1", c'est parce que votre base mysql n'est pas encore alimente. Pour les
plus presss, vous pouvez crer un enregistrement factice via la requte SQL suivante :
INSERT INTO `search_cache` ( `tablename` , `type` , `value` ,`updatetime` )
VALUES ('logs', 'HOST', 'localhost', NOW( ) );
4. Configuration de la rotation des journaux
La rotation permet d'archiver et/ou purger les plus anciens vnements des journaux afin
d'viter que leur stockage ne devienne trop volumineux
Rotation des journaux de la base MYSQL
Il est prfrable d'utiliser le service de rotation des logs plutt que de supprimer les
enregistrements directement dans la table principale de la base de donnes. Ceci vite de
causer des problmes de performance. Dplacer les logs de la table principale amliore aussi
les performances car la table qui contient les anciens logs est statique et peut donc tre
optimise.
Vous devez diter le fichier logrotate.php dans le rpertoire 'scripts' pour spcifier le chemin
d'installation de php-syslog-ng.
Si vous choissiez d'utiliser le script logrotate.php, ajoutez simplement celui-ci dans votre
crontab et excutez le aussi souvent que vous le souhaitez (le maximum est actuellement
d'une fois par jour).
Pour cela, ditez la crontab du superutilisateur
sudo crontab -e
pour y ajouter une entre :
00 22 * * 0 php /var/www/phpsyslogng/scripts/logrotate.php
Ici, la rotation des logs se fera tout les lundis (0) 22h00
Si vous activez le paramtre LOGROTATERETENTION du fichier config.php, alors les logs
plus anciens que ce paramtre seront supprims l'excution du fichier 'logrotate.php'. (activ
par dfaut 90 jours)
5. Rsolution des problmes
Si vous rencontrez le messages d'erreur "Query failed: Can't find file: 'all_logs' (errno: 2)"
aprs vous tre identifi, il vous faut excuter la commande suivante :
php /var/www/phpsyslogng/scripts/logrotate.php
La commande ne rsout que temporairement le problme !

Contributeurs : sidney_v