Centraliser ses logs avec Syslog-ng
[30 mn de lecture - paru le 10/7/2005 11:11:11 AM - Public : Débutant]
|
   
|
Auteur
2 Configuration du serveur Syslog-NG
2.1 Organisation du fichier syslog-ng.conf
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.
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
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
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)
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
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")
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 devrezprincipalement vous concentrer.
Exemple permettant de récupérer les erreurs d'authentification
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!
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
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).
Pour plus de précisions, vous pouvez consulter la documentation officielle :
http://www.balabit.com/products/syslog_ng/reference-1.6/syslog-ng.html/book1.html
2.2 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é.
# Définition de la configuration de syslog-ng
options
{ # Nombre d'évènements avant d'écrire dans les journaux sync (0); # Nombre de secondes que l'on va attendre si la connexion est tombée time_reopen(10); # etc };
# 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.
|