Syslog-ng : Installation et configuration de Syslog-ng (Syslog New Generation)

From Deimos.fr / Bloc Notes Informatique
Jump to: navigation, search

1 Introduction

Syslog-ng est un gestionnaire de journaux système de nouvelle génération. Il permet de centraliser les logs des machines d'un parc informatique avec une facilité déconcertante, et de les trier tout aussi simplement. Ce daemon est donc tout à fait indispensable pour les administrateurs réseau soucieux des performances de leurs machines.

Gratuit et fonctionnant sur de nombreux systèmes tels que Linux, FreeBSD, HP-UX, Solaris ou bien encore AIX, Syslog-Ng remplace efficacement le daemon de base syslogd. Il permet ainsi de pallier à ses nombreux manques :

  • Une portabilité reconnue
  • Configuration de base très avancée
  • Possibilité de "chrooter" son environnement
  • Export des logs reçus vers un serveur mySQL
  • Utilisation de macros possible pour le nom des logs
  • Possibilité de chiffrer les logs envoyés via la technologie SSL
  • Utilisation des protocoles UDP et TCP lors du transports des logs
  • Possibilité de trier les logs suivant les contenus, leur provenance ou bien encore leur facilité, et ce en pouvant utiliser les expressions régulières

Grâce à lui, vous pourrez donc retrouver très simplement les logs d'une machine donnée, suivant vos propre critères, et ce avec une sécurité accrue lors de leurs transmissions grâce à la puissance du chiffrage SSL. Permettant un traitement des plus avancés des logs dès leur reception, il vous évitera de passer par des scripts Bash ou Perl de traitement de fichiers plats, comme cela pouvait être le cas en utilisant syslogd.

2 Installation

2.1 Debian

Pour l'install sur Debian :

Command apt-get
apt-get install syslog-ng

2.2 Despuis les sources

Remarque : les commandes commençant par # doivent être exécutées en mode root.

Avant tout, nous devons télécharger les archives permettant de faire tourner Syslog-NG, soit sa propre archive ainsi que la librairie "libol".

Téléchargement des packages syslog-ng et libol avec Wget:

Command wget
wget http://www.balabit.com/downloads/libol/0.3/libol-0.3.16.tar.gz http://www.balabit.com/downloads/syslog-ng/1.6/src/syslog-ng-1.6.8.tar.gz

Décompactage :

Command gzip

$ gzip -dc syslog-ng-1.6.8.tar.gz


Compilation des packages décompressés :

Command
$ cd /usr/local/src/libol-0.3.16
$ ./configure
# make && make install
 
$ cd /usr/local/src/syslog-ng-1.6.8
$ ./configure
 
# make && make install

Voila, votre système est équipé de Syslog-ng. Il faut à présent lancer syslog-ng au démarrage, sous forme de tâche de fond, ainsi que le script syslog_mysql.sh, que nous étudierons dans les prochaines pages. Pour cela, il suffit de créer un service lui correspondant.

Script de démarrage /etc/init.d/syslog-ng :

Configuration File /etc/init.d/syslog-ng
#! /bin/sh
 
# /etc/init.d/syslog-ng
 
# Description: Syslog-ng est le système qui 
# va servir à la machine à  monitorer les 
# logs de l'ensemble du parc
 
NAME=syslog-ng
DAEMON=/usr/local/sbin/syslog-ng
PIDFILE=/var/run/$NAME.pid
case "$1" in
 
start)
 echo "Lancement de $NAME..."
 start-stop-daemon --start --pidfile $PIDFILE \
 --exec $DAEMON 
 PID=`more /var/run/syslog-ng.pid`
 echo "Système de synchro $NAME mySQL..."  
 /scripts/syslog_mysql.sh $PID &
 ;;
 
stop) 
 echo "Arret de    $NAME"
 start-stop-daemon --stop --pidfile $PIDFILE \
 --oknodo --exec $DAEMON
 rm –f /var/log/mysql.pipe
 ;;
 
*)    
 echo "Appel de syslog-Ng autre que start et stop"
 exit 1
 
 esac
 exit 1

Vous devez ensuite faire le lien entre ce script et le Run Level habituel de votre système.

Command ln
$ ln -s /etc/init.d/syslog-ng /etc/rc2.d/S99syslog-ng

3 Configuration

Syslog-ng charge lors de son lancement un fichier de configuration, se trouvant dans etc/syslog-ng/syslog-ng.conf. Vous pouvez néanmoins utiliser un autre fichier de configuration en utilisant l'option -f. Le fichier est divisé suivant 5 grandes sections :

  • Options, permettant de définir les paramètres généraux du serveurs de logs
  • Sources, permettant de définir les différentes sources possibles
  • Destination, permettant de définir l'endroit où le log sera stocké
  • Filter, permettant de définir les filtres s'opérant sur les logs (contenu, facilité, etc...).
  • Log, permettant de définir les actions et la prise en charge des logs

On traite les logs suivant leurs sources, leurs destinations et leurs formes (filtres). On peut ainsi tout à fait ignorer une bonne partie des logs que l’on reçoit en fixant des règles de filtres restrictives lorsque l’on traite les logs.

3.1 La section options

Voici la liste des paramètres possibles, permettant de personnaliser le fonctionnement du Daemon :

  • log_msg_size() : Taille maximale en octet d’un message
  • sync() : Nombre d'évènement avant d'écrire dans les journaux
  • log_fifo_size() : La pile de traitement des évènements, permet de stocker en mémoire x lignes
  • time_reap() : Ferme un fichier de journalisation après x secondes
  • time_reopen() : Nombre de secondes que l'on attend si la connexion est tombée
  • create_dirs() : Créer les répertoires de logs si nécessaire (Yes ou No)
  • perm() et dir_perm() : Permissions des fichiers de logs et du répertoire de logs
  • group() et dir_group() : Groupe propriétaire des logs et des répertoires de logs
  • owner() et dir_owner() : Utilisateur propriétaire des logs et des répertoires de logs
  • use_dns() : Utilisation des serveurs DNS pour résoudre les noms
  • long_hostnames() : Utilisation de noms longs DNS (On ou Off)
  • check_hostname() : Vérifie que le nom des clients DNS est valide (Yes ou No)
  • use_fqdn() : Utilisation des FQDN dans les noms de logs (Yes ou No)
  • keep_hostname() : Spécifie si l'on dois faire "confiance" au hostname (Yes or No)
  • dns_cache(), dns_cache_size(), dns_cache_expire() : Activation du cache DNS pour x Hosts pendant X Secondes
  • use_time_recvd() : Utiliser l'heure locale au lieu de l'horodatage (Yes ou No)
  • gc_busy_threshold() : Lancement du Garbage Collector au bout de X évènements quand syslog-ng est actif
  • gc_idle_threshold () : Lancement du Garbage Collector au bout de X évènements quand syslog-ng est inactif

3.2 La section source

On définit les différentes sources possibles des logs, on peut en définir plusieurs d'un coup, afin de regrouper plusieurs "sources" en une seule "virtuelle".

Exemple permettant de récupérer les logs arrivant de 10.0.1.5 en TCP :

Configuration File /etc/syslog-ng/syslog-ng.conf
source ip780 {
   tcp (ip ("10.0.1.5") );
};

  • Les sources possibles :
    • file() = ouvre un fichier donné et le lit
    • internal() = les messages internes de syslog-ng
    • pipe(), fifo() = ouvre un fichier fifo donné et le lit
    • udp() , tcp() = écoute sur le port udp ou tcp spécifié
    • sun-stream(), sun-streams() = écoute les systèmes Solaris
    • unix-dgram() = lit les sockets UNIX en mode SOCK_DGRAM (BSD)
    • unix-stream() = lit les sockets UNIX en mode SOCK_STREAM (Linux)

Si vous ne voulez pas vous prendre la tête, et accepter toutes les requêtes en tcp et udp :

Configuration File /etc/syslog-ng/syslog-ng.conf
source s_all {
   ...
   udp();
   tcp();
};

3.3 La section destination

On définit les différentes destinations possibles des logs, on peut en définir plusieurs d'un coup, afin d'envoyer les logs sur plusieurs fichiers par exemple.

Exemple permettant d'envoyer le message via un programe, ici un script perl, et vers un fichier :

Configuration File /etc/syslog-ng/syslog-ng.conf
destination mailfile {
   program("perl /scripts/log_mailsend.pl $MSG ");
   file ("/var/log/syslog-ng/$YEAR.$MONTH.$DAY/$HOST/logfile.log");
};

Il est à noter que les noms de fichiers supportent les Macros. C'est un des aspects les plus intéressants de syslog-ng : vous pouvez en effet facilement trier vos fichiers de logs grâce à des noms facilement reconnaissables et personnalisables. Ainsi, les macros permettent de nommer le nom du fichier de logs suivant la machine, son IP, la date, etc...
Dans notre exemple, le fichier pourra par exemple s'appeller /var/log/syslog-ng/2005.10.04/MACHINE/logfile.log.

  • Les destinations possibles :
    • file() = écrit sur un fichier donné
    • usertty() = envoie le log sur un tty donné
    • fifo(), pipe() = écrit sur un fichier fifo donné
    • udp(),tcp() = envoie le message sur le port spécifié
    • program() = lance un programme donné et lui envoie le message
    • unix-dgram() = envoie un message contenant le log en SOCK_DGRAM
    • unix-stream() = envoie un message contenant le log en SOCK_STREAM
  • Les Macros utilisables :
    • FACILITY : facilité du log
    • LEVEL ou PRIORITY : niveau du log
    • DATE : la date durant laquelle le log a été
    • DAY : le jour durant lequel le log a été envoyé
    • HOST : le nom de la machine ayant envoyé le log
    • YEAR : l'année durant laquelle le log a été envoyé
    • HOUR : l'heure durant laquelle le log a été envoyé
    • MIN : la minute durant laquelle le log a été envoyé
    • MONTH : le mois durant lequel le log a été envoyé
    • SEC : la seconde durant laquelle le log a été envoyé
    • PROGRAM : le nom du programme ayant envoyé le log
    • FULLDATE : la date entière du log : avec l'heure, minute et seconde
    • WEEKDAY : les trois premières lettres du jour durant lequel le log a été envoyé (exemple : "Wed")

3.4 La section filter

On définit les filtres permettant de limiter les logs pris en compte. Partie primordiale du serveur syslog-ng, car permettant de traiter directement les logs, dès leur arrivée, sans avoir à les parser ou les traiter après réception. C'est sur cette section que vous devrez principalement vous concentrer.

Exemple permettant de récupérer les erreurs d'authentification :

Configuration File /etc/syslog-ng/syslog-ng.conf
filter auth_errors { level(error) and facility(auth); };

A noter la possibilité de les inverser avec NOT et d'utiliser les opérandes AND et OR

  • Les filtres possibles :
    • facility() = le facility du log
    • level(), priority() = le niveau du log
    • filter() = évalue le log suivant un autre filtre
    • netmask() = vérifie le masque de sous réseau
    • match() = modèle du message (supporte les Regex)
    • host() = la machine présentant le log (supporte les Regex)
    • program() = le programme qui a généré le log (supporte les Regex)

Attention, les développeurs de Syslog-ng préconisent d'utiliser le moins possible les expressions régulières afin de ne pas trop surcharger le CPU des machines exécutant le daemon. Il est ainsi préférable d'utiliser plusieurs filtres "match", couplés avec des opérandes "AND", plutôt que d'utiliser un seul filtre "match" utilisant les Regex. Réfléchissez donc beaucoup avant de les utiliser!

3.5 La section log

Cette dernière partie permet tout simplement de "construire" vos captures de logs à partir des sections que nous avons définies auparavant. Vous pouvez donc complètement configurer l'application suivant vos besoins.

Exemple de section log :

Configuration File /etc/syslog-ng/syslog-ng.conf
log exemple {
   source(ip780);
   destination(mailfile);
   filter(auth_errors);
};

Cet exemple permet ainsi de récupérer les erreurs d'authentification (filter auth_errors) venant de la machine 10.0.1.5 (source ip780) et de les envoyer sur le fichier défini dans la destination (mailfile).

3.6 Exemple de fichier de configuration

Afin de mieux comprendre le système général de Syslog-ng, voici un exemple de fichier de configuration basique commenté :

Configuration File /etc/syslog-ng/syslog-ng.conf
#
# Configuration file for syslog-ng under Debian
#
# attempts at reproducing default syslog behavior
 
# the standard syslog levels are (in descending order of priority):
# emerg alert crit err warning notice info debug
# the aliases "error", "panic", and "warn" are deprecated
# the "none" priority found in the original syslogd configuration is
# only used in internal messages created by syslogd
 
 
######
# options
 
options {
        # disable the chained hostname format in logs
        # (default is enabled)
        chain_hostnames(0);
 
        # the time to wait before a died connection is re-established
        # (default is 60)
        time_reopen(10);
 
        # the time to wait before an idle destination file is closed
        # (default is 60)
        time_reap(360);
 
        # the number of lines buffered before written to file
        # you might want to increase this if your disk isn't catching with
        # all the log messages you get or if you want less disk activity
        # (say on a laptop)
        # (default is 0)
        #sync(0);
 
        # the number of lines fitting in the output queue
        log_fifo_size(2048);
 
        # enable or disable directory creation for destination files
        create_dirs(yes);
 
        # default owner, group, and permissions for log files
        # (defaults are 0, 0, 0600)
        #owner(root);
        group(adm);
        perm(0640);
 
        # default owner, group, and permissions for created directories
        # (defaults are 0, 0, 0700)
        #dir_owner(root);
        #dir_group(root);
        dir_perm(0755);
 
        # enable or disable DNS usage
        # syslog-ng blocks on DNS queries, so enabling DNS may lead to
        # a Denial of Service attack
        # (default is yes)
        use_dns(yes);
 
        # maximum length of message in bytes
        # this is only limited by the program listening on the /dev/log Unix
        # socket, glibc can handle arbitrary length log messages, but -- for
        # example -- syslogd accepts only 1024 bytes
        # (default is 2048)
        #log_msg_size(2048);
 
        #Disable statistic log messages.
        stats_freq(0);
};
 
# Les différentes sources possibles
 
# Evènements locaux
source s_localhost 
{
    pipe ("/proc/kmsg" log_prefix("kernel: "));
    unix-stream ("/dev/log");
    internal();
};
 
 
# Tous les logs Réseaux udp
source s_network { udp( port(514) ); };
 
# Les destinations possibles
# Pour tous les logs locaux
destination d_localhost {
file ("/var/log/syslogng/$YEAR.$MONTH.$DAY/localhost/$FACILITY.log");
};          
 
# Pour tous les logs Réseaux
destination d_network {
# Possibilité d’utiliser mySQL via un fifo file
 
pipe ("/tmp/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) );
 
file ("/var/log/syslog-ng/$YEAR.$MONTH.$DAY/$HOST/reseau.log");          
 
};
 
 
# Filtres 
filter f_local6 { facility(user); };
 
 
# Traitements des logs à proprement parlé
log {
    source(s_localhost);
    destination(d_localhost);
};
 
 
log {
    source(s_network);
    filter(f_local6);
    destination(d_network);
};

La configuration du serveur est à présent terminée. Mais cela ne suffit évidemment pas, il faut à présent spécifier aux machines cibles qu'elles doivent transmettre leurs trames syslog à ce serveur. Nous allons donc expliquer le fonctionnement du démon de base syslogd, et le configurer afin qu'il redirige convenablement ses trames.

4 MySQL

Pour une intégration des logs dans MySQL, voici un exemple de destination à rajouter dans le fichier de conf :

Configuration File /etc/syslog-ng/syslog-ng.conf
destination d_mysql {
       program(
               "mysql -usyslogng -psyslogng syslogng -B > /dev/null"
               template("INSERT INTO logs (host, facility, priority,
                       level, tag, date, time, program, msg) VALUES ( '$HOST', '$FACILITY', '$PRIORITY', '$LEVEL',
                       '$TAG', '$YEAR-$MONTH-$DAY $HOUR:$MIN:$SEC', '$PROGRAM', '$MSG' );\n")
               template-escape(yes)
       );  
};

  • Le nom de la destination est ici d_mysql.
  • -u : pour le nom de l'utilisateur mysql.
  • -p : le mot de passe mysql.
  • sysloggn : c'est le nom de la base de donnée ici.
  • logs : le nom de la table qui va récupérer les logs.

Rajoutez également l'enregistrement de la table logs dans la base de donnée syslogng :

Command mysql
$ mysql -uroot -p
create database syslogng;
use syslogng;
create table logs (
host varchar(32) default NULL,
facility varchar(10) default NULL,
priority varchar(10) default NULL,
level varchar(10) default NULL, 
tag varchar(10) default NULL,
datetime time default NULL,
program varchar(15) default NULL,
msg text, seq int(10) unsigned NOT NULL auto_increment,
PRIMARY kEY (seq))
TYPE=MyISAM;

Maintenant, nous allons retourner dans le fichier de configuration afin d'y configurer au moins un log :

Configuration File /etc/syslog-ng/syslog-ng.conf
log {
       source(s_all);
       filter(f_daemon);
       destination(d_mysql);
       destination(df_daemon);
};

J'ai rajouté ici ma ligne de destination. Ce qui signifie qu'en plus d'écrire dans un fichier se trouvant dans /var/log je vais envoyer les logs dans mysql. Vous n'avez peut être pas besoin des 2 lignes. A vous de voir.

Pour une bonne lecture et interprétation des logs, je vous invites à suivre l'article expliquant la mise en place de php-syslog-ng.

Pour tester le bon fonctionnement, je vous conseil de procéder comme ceci :

  • Redémarrer sur la machine cliente le service ssh
  • Regarder votre fichier de log /var/log/auth.log sur le serveur. Vous devriez voir les logs de la machine distante arriver.
  • Dans le cas ou vous utilisez la résolution de nom et que le serveur DNS ne résoud pas, insérez votre machine dans /etc/hosts (ceci arrive si vous ne voyez pas votre table sql s'incrémenter)

5 Clients

Pour les clients, il existe plusieurs syslogs et plusieurs OS. Nous verrons donc comment arriver faire avec un peu tout.

5.1 Linux avec Syslog

Sur Linux et la plus part des distributions, Syslog est le serveur de logs installé par défaut. C'est pourquoi nous allons voir comment envoyer depuis syslog vers syslog-ng les logs qui nous intéressent. Editez le fichier /etc/syslog.conf :

Configuration File /etc/syslog.conf
auth,authpriv.*                 @192.168.0.193
auth,authpriv.*                 /var/log/auth.log
*.*;auth,authpriv.none          @192.168.0.193
*.*;auth,authpriv.none          -/var/log/syslog
#cron.*                         /var/log/cron.log
daemon.*                        @192.168.0.193
daemon.*                        -/var/log/daemon.log
kern.*                          @192.168.0.193
kern.*                          -/var/log/kern.log
lpr.*                           @192.168.0.193
lpr.*                           -/var/log/lpr.log
mail.*                          @192.168.0.193
mail.*                          -/var/log/mail.log
user.*                          @192.168.0.193
user.*                          -/var/log/user.log
uucp.*                          @192.168.0.193
uucp.*                          /var/log/uucp.log

Ici mon serveur Syslogng possède l'adresse IP : 192.168.0.193. Je spécifie un "@" pour indiqué la redirection suivit de l'IP. J'ai rajouté des lignes pour le serveur, car je veux que les logs soient en local et sur le serveur Syslogng. Si vous ne les voulez pas en local, supprimez les lignes qui ne sont pas en gras ci dessus. Si vous ne souhaitez pas faire de détailet tout envoyer, mettez cette ligne :

Configuration File /etc/syslog.conf
*.*            @ip_server_syslog

Le signe "-" devant les fichiers de log signifie que l'on veut enregistrer les logs de façon asynchrone, cela évite les goulets d'étranglements.

Ensuite on redémarre le service :

Command
/etc/init.d/sysklogd restart

5.2 Linux avec Syslogng

Pour un client Linux muni d'un serveur Syslog-ng, il suffit de définir une autre destination :

Configuration File /etc/syslog-ng/syslog-ng.conf
destination dtcp_syslog_server { tcp("192.168.0.193" port(514)); };

Ici, j'ai choisi d'envoyer en tcp sur le serveur 192.168.0.193 et le port 514 mes logs. Cependant, c'est juste la destination, je n'envoie rien pour le moment. C'est pourquoi il va falloir configurer les logs :

Configuration File /etc/syslog-ng/syslog-ng.conf
...
log {
       source(s_all);
       filter(f_auth);
       destination(df_auth);
       destination(dtcp_syslog_server);
};

# *.*;auth,authpriv.none          -/var/log/syslog
log {
        source(s_all);
        filter(f_syslog);
        destination(df_syslog);
        destination(dtcp_syslog_server);
};

# daemon.*                        -/var/log/daemon.log
log {
       source(s_all);
       filter(f_daemon);
       destination(df_daemon);
       destination(dtcp_syslog_server);
};

# kern.*                          -/var/log/kern.log
log {
       source(s_all);
       filter(f_kern);
       destination(df_kern);
       destination(dtcp_syslog_server);
};
...

Comme vous pouvez le voir dans l'exemple ci dessus, il suffit juste de rajouter dans log les destinations récédement configurer. Il ne reste plus qu'a redémarrer le service et c'est bon :-)

6 FAQ

6.1 I/O error occurred while writing; fd='6', error='Broken pipe (32)'

Ceci est certainement dû à un problème de connexion à la base de donnée. Vérifiez donc vos droits ainsi que les identifiants utilisés dans le fichier de conf.

7 Ressources

http://www.supinfo-projects.com/fr/2005/syslogng_2005/1/
Installer un serveur Syslog