Intitulé du document : Comment installer/configurer un serveur de log avec syslog-ng ?
Localisation : http://www.opendoc.net/comment-installer-configurer-serveur-log-syslog-ng
Auteur : Alexandre Bray
Vos questions : support@opendoc.net
Date de création : 2010/04/16
Date de modification : 2010/08/14
Source : http://www.hsc.fr/ressources/breves/syslog-ng.html.fr
Tags :
Etat de la documentation : 80% completed
Vous souhaitez contribuer : Comment soutenir opendoc ?
Informations : Quelle est notre démarche ?
Licence : Contrat Creative Commons
opendoc.net est mis à disposition selon les termes de la licence Creative Commons Paternité - Pas d'Utilisation Commerciale - Partage à l'Identique 3.0 non transcrit.

Comment installer/configurer un serveur de log avec syslog-ng ?

Cette procédure risque d'être modifiée régulièrement, car le système est en semi-production et n'a donc pas été validé dans le temps. Néanmoins elle reste fonctionnelle dans l'état actuel.

7 Installation

7.1 Debian

L'installation pour Debian est très simple il vous suffit de taper :

apt-get install syslog-ng

7.2 CentOs

Malheureusement pour la CentOs l'installation de Syslog-ng n'est pas native, il vous faut au préalable télécharger 2 RPM :

Sinon installer les rpm directement depuis opendoc :

rpm -Uvh http://www.opendoc.net/_media/eventlog-0.2.7-1.fc8.i386.rpm
rpm -Uvh http://www.opendoc.net/_media/syslog-ng-2.0.9-3.fc8.i386.rpm

8 Configuration

8.1 Client

Le “client” syslog-ng s'installe sur une machine où l'on souhaite exporter ses logs. Comme vous l'avez compris les machines concernées sont généralement des serveurs. Grâce à syslog-ng, vous pouvez définir ce que vous souhaitez exporter et vers quelle machine :

Exemple :

vim /etc/syslog-ng/syslog-ng.conf

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 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(no);

        # 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);

        # Some program send log messages through a private implementation.
        # and sometimes that implementation is bad. If this happen syslog-ng
        # may recognise the program name as hostname. Whit this option
        # we tell the syslog-ng that if a hostname match this regexp than that
        # is not a real hostname.
        bad_hostname("^gconfd$");
};

# vous indiquez ici la source des logs

### src
source local {
  unix-stream("/dev/log");
  internal();
};

# vous indiquez ici le destination des logs

### dst

# serveur distant
destination srv_dist {
  tcp("192.168.244.128");
};

# local
destination local_messages { 
file("/var/log/messages"); 
};

# vous pouvez ici créer un "lien" entre la source et la destination




log {
  source(local);
  destination(srv_dist);
};

log {
  source(local);
  destination(local_messages);
};

Comme vous pouvez le constater, pour une même source vous pouvez avoir plusieurs destinations, une local, et une distante. Mais vous pouvez très bien imaginer d'exporter vos logs vers plusieurs serveurs.
Par choix je ne fais pas d'exception dans les log envoyés. Le serveur aura des filtres qui lui permettra d'exclure certains paramètres.

8.2 Serveur

Exemple

### server 
# options

options {
        # disable the chained hostname format in logs
        # (default is enabled)
        chain_hostnames(1);

        # 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(no);

        # 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);

        # Some program send log messages through a private implementation.
        # and sometimes that implementation is bad. If this happen syslog-ng
        # may recognise the program name as hostname. Whit this option
        # we tell the syslog-ng that if a hostname match this regexp than that
        # is not a real hostname.
        bad_hostname("^gconfd$");

};



######
# sources

# all known message sources
source local {
        # message generated by Syslog-NG
        internal();
        # standard Linux log source (this is the default place for the syslog()
        # function to send logs to)
        unix-stream("/dev/log" max-connections(40));
        # messages from the kernel
        file("/proc/kmsg" log_prefix("kernel: "));
        # use the following line if you want to receive remote UDP logging messages
        # (this is equivalent to the "-r" syslogd flag)
        # udp();
        tcp(ip(0.0.0.0));
        udp(ip(0.0.0.0));
};
# Vous pouvez constater les différentes sources des logs
# le serveurs lui-même ainsi que les sources tcp et udp.
# En effet, je préconise les log en TCP car ce mode transport, utilisant un aquitement, permet de rejouter les paquets en d'échec de livraison (ce qui n'est pas le cas de l'UDP).
# Cependant certain équipement n'accepte pas le tcp, le serveur doit pouvoir recueillir les logs en UDP.

######
# destinations

destination dst-all-messages {
                        file("/var/log/archive/$R_YEAR-$R_MONTH-$R_DAY/messages"
                        template("$HOUR:$MIN:$SEC $HOST <$FACILITY.$PRIORITY> $MSG\n")
                        template_escape(no)
                        );
};

destination dst-srv_1-messages {
                        file("/var/log/archive/$R_YEAR-$R_MONTH-$R_DAY/srv_1-messages"
                        template("$HOUR:$MIN:$SEC $HOST <$FACILITY.$PRIORITY> $MSG\n")
                        template_escape(no)
                        );
};


destination dst-srv_2-messages {
                        file("/var/log/archive/$R_YEAR-$R_MONTH-$R_DAY/srv_2-messages"
                        template("$HOUR:$MIN:$SEC $HOST <$FACILITY.$PRIORITY> $MSG\n")
                        template_escape(no)
                        );
};

destination dst-srv_2-apache2-error {
                        file("/var/log/archive/$R_YEAR-$R_MONTH-$R_DAY/srv_2-apache-error"
                        template("$HOUR:$MIN:$SEC $HOST <$FACILITY.$PRIORITY> $MSG\n")
                        template_escape(no)
                        );
};

destination dst-proxy {
                        file("/var/log/archive/$R_YEAR-$R_MONTH-$R_DAY/proxy"
                        template("$HOUR:$MIN:$SEC $HOST <$FACILITY.$PRIORITY> $MSG\n")
                        template_escape(no)
                        );
};

destination dst-drop {
                        file("/var/log/archive/$R_YEAR-$R_MONTH-$R_DAY/drop"
                        template("$HOUR:$MIN:$SEC $HOST <$FACILITY.$PRIORITY> $MSG\n")
                        template_escape(no)
                        );
};


######
# filters
filter flt-host-srv_1 { host("srv_1"); };
filter flt-host-srv_2 { host("srv_2"); };
filter flt-program-squid { host("routeur") and program("squid"); };
filter flt-not-program-squid { not program("squid"); };
filter flt-not-program-snmpd { not program("snmpd"); };

filter flt-program-apache2 { host("srv_2") and program("apache2"); };
#filter flt-not-program-apache2 { not match("apache2"); };

filter flt-match-kernel-drop { host("routeur") and program("kernel") and match("DROP"); };
######
# logs

log {
        source(local);
        filter(flt-not-program-squid);
        filter(flt-not-program-snmpd);
        destination(dst-all-messages);
};

log {
        source(local);
        filter(flt-host-srv_1);
        destination(dst-srv_1-messages);
};

log {
        source(local);
        filter(flt-host-srv_2);
        destination(dst-srv_2-messages);
};

log {
        source(local);
        filter(flt-program-apache2);
        destination(dst-srv_2-apache2-error);
};

log {
        source(local);
        filter(flt-program-squid);
        destination(dst-proxy);
};

log {
        source(local);
        filter(flt-match-kernel-drop);
        destination(dst-drop);

Quelques explications :

Sources

Dans la section source local j'ai indiqué sur quelle ip le serveur doit écouter, ici 0.0.0.0. Cela permet d'indiquer au serveur d'écouter sur toutes ses interfaces et de recevoir des logs de différentes sources. De plus vous pouvez constater que le serveur écoute aussi bien en TCP qu'en UDP, cela peut être utile quand l'équipement utilisé n'est pas paramétrable. De manière générale je conseil que les logs soient exportés en TCP pour éviter les pertes.

Destinations

Dans la section destination vous allez pouvoir déterminer la destination des logs. Il est possible d'utiliser des variables propre à syslog-ng comme :

$R_YEAR : année en cours
$R_MONTH : mois en cours
$R_DAY : jour
$HOUR : heure
$MIN : minute
$SEC : seconde
$HOST : hôte

L'utilisation des ces variables vous permet de créer automatiquement des chemins pour y stocker vos logs : /var/log/archive/$R_YEAR-$R_MONTH-$R_DAY/messages
Chaque changement de jour créera un nouveau répertoire. De même pour l'option template, vous pouvez imposer un ordre dans lequel seront affichés les différents éléments.

Filters

L'option filter permet de déterminer des filtres qui seront utilisé afin de répartir les logs dans déférentes destinations. exemples :

filter flt-program-squid { host(“routeur”) and program(“squid”); }; : je créé un filtre nommé flt-program-squid qui permet d'imposer deux conditions : l'hôte doit ce nommer “routeur” et le programme qui écrit le log doit être squid. Typiquement, cette ligne sert à exporter les logs d'un UTM pour y faire ensuite des traitements.

filter flt-not-program-snmpd { not program(“snmpd”); }; : je créé un filtre flt-not-program-snmpd qui permet de ne pas matcher le programme snmpd. Typiquement cela permet d'exclure des logs les accès au deamon snmpd qui peut polluer vos logs. Cela est très utile quand nous avons pas la main sur la machine et l'équipement pour y faire les modifications.

Logs

Comme précédemment écrit, l'option log permet de réaliser le lien entre la source, filter, et destination.

exemple 1 :

log {
        source(local);
        filter(flt-program-squid);
        destination(dst-proxy);
};

exemple 2 :

log {
        source(local);
        filter(flt-not-program-snmpd);
        destination(dst-all-messages);
};

Dans l'exemple 1, j'indique que tous les logs portant sur le programme squid sont à destination de dst-proxy
Dans l'exemple 2, j'indique que tous les logs venant du programme snmpd sont exclue de la destination dst-all-messages.

Il peut être utile de ne pas utiliser de template dst-all-messages pour simplifier le traitement des logs

9 Montage automatique

Afin d'accéder simplement aux logs du jour il est possible de réaliser un montage spéciale. En effet, imaginons que nous sommes le 23 mai 2010, pour accéder aux logs il faudrait ce déplacer dans /var/log/archive/2010-05-23. Avec un montage binder vous pouvez monter les log du jour vers /var/log/today. Pour cela vous pouvez créer un fichier utilisable pour cron :

mkdir /var/log/today
mkdir /var/log/yesterday
vim /etc/cron.daily/syslog-ng
#!/bin/sh
umount /var/log/today
umount /var/log/yesterday
mount --bind `date +/var/log/archive/%Y-%m-%d` /var/log/today
mount --bind `date --date '1 days ago' +/var/log/archive/%Y-%m-%d` /var/log/yesterday

ce montage réaliser par cron est valable si est déclanché à 00:00

00 00   * * *   root    test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.daily ) \\


si ce n'est pas le cas, créé le fichier /etc/cron.d/syslog-ng contenant les infos suivantes et mettre le script dans /root/bin/sylog-ng

MAILTO=root\\
00 00   * * *   root    /root/bin/sylog-ng\\

10 Traitement des log

Maintenant que vos logs sont centralisés, il peut être intéressant de réaliser un traitement global. Personnellement j'utilise Logwatch, qui permet de réaliser un résumé des logs envoie le tout par mail.

10.1 Installation logwatch

Debian

apt-get install logwatch

Cent0s

yum install logwatch

10.2 configuration logwatch

Normalement si vous avez suivie la procédure, vous n'aurez pas grand chose à modifier. Il faut changer le repertoire de stockage des logs :

vim /etc/logwatch/conf/logwatch.conf
LogDir = /var/log/yesterday

Vous pouvez réaliser un test :

/usr/sbin/logwatch --logdir /var/log/yesterday/

Il vous faut ajouter la commande dans le fichier cron “syslog-ng” créé précédemment :

/usr/sbin/logwatch --logdir /var/log/yesterday/ | mail -s "logwatch - `date +%Y-%m-%d`" root


11 Lecture des logs

Si vous souhaitez lire vos log avec un peux de couleur, je vous conseil d'utiliser CCZE

sudo apt-get install ccze

Il ne vous reste plusqu'a rediriger le flux de vos log vers ccze

tail -f /var/log/today/messages | ccze -A

12 LogZilla

En cours de rédaction : a ce jour de nombreux beugs ne me permet pas de statuer de manière positive sur le produit. Il exite 2 solutions :

  1. soit le produit évolue et les correctifs sont apportés
  2. j'essaierais une version moins récente mais qui me satisfera.

apt-get install make gcc libmysqld-dev
cd /var/www/
wget http://php-syslog-ng.googlecode.com/files/logzilla_3.0.85.tgz
tar xvzf logzilla_3.0.85.tgz
cpan Date::Calc Text::LevenshteinXS String::CRC32
apt-get install libdate-calc-perl libstring-crc32-perl
passer temporairement en mode testing
apt-get install mysql-server
./install.pl
cp -rp ioncube /usr/local/ioncube
zend_extension = /usr/local/ioncube/ioncube_loader_lin_5.2.so

13 Ajustement du temps

Si vous ne posséder pas de serveur de temps, vous allez constater une incohérence sur la date des logs. Pour y remédier je vous conseil de consulter l'article sur Comment installer/configurer un serveur de temps avec ntp ?

solutions/comment-installer-configurer-serveur-log-syslog-ng.txt · Dernière modification: 2013/07/14 17:19 (modification externe)
 
Sauf mention contraire, le contenu de ce wiki est placé sous les termes de la licence suivante : CC Attribution-Noncommercial-Share Alike 3.0 Unported
Recent changes RSS feed Donate Powered by PHP Valid XHTML 1.0 Valid CSS Driven by DokuWiki