Focus sur Logwatch
Je n’ai trouvé sur le net aucun exemple concret en français de personnalisation de logwatch (j’ai peut-être pas cherché assez longtemps…). Donc voici le premier exemple de personnalisation de logwatch en français dans le monde. TADAAAA !!!
Des connaissances en perl et en expressions régulières sont indispensables.
Normalement les fichiers se trouvent aux mêmes endroits sur toutes les distributions, mais il se peut qu’il y ait certaines différences. Pour info je fais ceci avec Gentoo.
Location des fichiers :
/usr/share/logwatch/default.conf/logfiles
-> configuration relative aux logs du serveur (où les trouver, etc…)
/usr/share/logwatch/default.conf/services
-> quelles lignes dans un groupe de log correspondent à ce service
/usr/share/logwatch/scripts/services
-> la manière de parser les logs d’un service
C’est là la partie la plus intéressante
Pour le reste, man logwatch
Un exemple concret vaut souvent mieux qu’un discours abstrait, voici donc un exemple :
Le parsing des logs de postfix sur un serveur de mail me renvoyait de nombreuses lignes non parsées, ce qui génait considérablement la lecture du rapport. Voici des exemples de lignes «parasites» :
– des warnings SASL par centaine :
sql_select option missing
auxpropfunc error no mechanism available
_sasl_plugin_load failed on sasl_auxprop_plug_init for plugin: sql
– des rejets non analysés par centaine aussi :
NOQUEUE: reject_warning: RCPT from unknown[x.x.x.x]: 504 5.5.2 : Helo command rejected: need fully-qualified hostname; from=xxx to=yyy proto=SMTP helo=x.x.x.x
Pour parser ces données, il faut surcharger le script postfix :
cp /usr/share/logwatch/scripts/services/postfix /etc/logwatch/scripts/services/postfix
Ensuite on modifie la surcharge
vi /etc/logwatch/scripts/services/postfix
Pour ignorer les warnings SASL on ajoute :
( $ThisLine =~ m/sql_select option missing/ ) or
( $ThisLine =~ m/auxpropfunc error no mechanism available/ ) or
( $ThisLine =~ m/_sasl_plugin_load failed on sasl_auxprop_plug_init for plugin: sql/ )
Dans les lignes qui doivent être ignorées.
Pour parser correctement le rejet du «HELO : need FQDN» on ajoute la règle suivante :
elsif ( ($Host,$Error) = ($ThisLine =~ /reject_warning: RCPT from ([^ ]*[[^ ]*]): $re_DSN <.*>: (Helo command rejected: .*);.*/)) {
$HeloError{$Error}{$Host}++;
}
Ce qui nous ajoute dans le rapport la ligne suivante (en gras) :
Errors in HELO/EHLO conversation:
Helo command rejected: Invalid name: from 1 Host(s), 2 Time(s)
Helo command rejected: need fully-qualified hostname: from 32 Host(s), 41 Time(s)
C’est quand même plus joli 🙂