Syslog-ng : Installation et configuration de Syslog-ng (Syslog New Generation)
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 :
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:
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 :
gzip |
$ gzip -dc syslog-ng-1.6.8.tar.gz |
Compilation des packages décompressés :
$ 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 :
Vous devez ensuite faire le lien entre ce script et le Run Level habituel de votre système.
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 :
/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 :
/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 :
/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 :
/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 :
/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é :
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 :
- 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 :
Maintenant, nous allons retourner dans le fichier de configuration afin d'y configurer au moins un log :
/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 :
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 :
/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 :
/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 :
/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 :
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