« LINUX:LogWatch » : différence entre les versions
Aucun résumé des modifications |
Aucun résumé des modifications |
||
Ligne 26 : | Ligne 26 : | ||
La structure est identique; si un fichier du même nom se retrouve aux deux endroits, celui sous le répertoire "/etc/logwatch" a la priorité. Donc pour adapter la configuration, il suffit de recopier le fichier correspondant du répertoire "/usr/share/logwatch" dans le répertoire "/etc/logwatch" ou du moins de reprendre dans ce fichier, le paramètre que l'on veut changer. Normalement on ne devrait rien changer. | La structure est identique; si un fichier du même nom se retrouve aux deux endroits, celui sous le répertoire "/etc/logwatch" a la priorité. Donc pour adapter la configuration, il suffit de recopier le fichier correspondant du répertoire "/usr/share/logwatch" dans le répertoire "/etc/logwatch" ou du moins de reprendre dans ce fichier, le paramètre que l'on veut changer. Normalement on ne devrait rien changer. | ||
Voici la structure des éléments principaux: | |||
* Les répertoires "/etc/logwatch/scripts/services" et "/usr/share/logwatch/scripts/services" contiennent les scripts qui effectuent l'analyse des journaux ou effectuent des commandes ciblées. Ces fichiers portent le nom du service correspondant. | |||
* Les répertoires "/etc/logwatch/conf/services" et "/usr/share/logwatch/default.conf/services" regroupent les divers paramètres de configuration du service correspondant. Dans le cas d'une analyse de journaux, ils font référence à un groupe de journaux. C'est la variable "LogFile" qui redirige cette action vers un fichier du point suivant. Ces fichiers portent le nom du service correspondant suivis de l’extension ".conf". | |||
* Les répertoires "/etc/logwatch/conf/logfiles" et "/usr/share/logwatch/default.conf/logfiles" définissent un groupe de journaux à analyser. Ces fichiers portent le nom du groupe de journaux correspondant suivis de l'extention ".conf". | |||
* Les fichiers de configuration des répertoires "/etc/logwatch/conf" et ""/usr/share/logwatch/default.conf" définissent les paramètres généraux du logiciel. Nous y retrouvons les fichiers: | |||
** '''logwatch.conf''' : fichier de configuration de LogWatch | |||
** '''override.conf''' : fichier contenant les paramètres qui auront la priorité absolue sur tout autre défini autre part | |||
** '''ignore.conf''' : fichier contenant les lignes du rapport final que l'on ne veut plus voir apparaître | |||
Il est à noter que certains services n'analysent aucun fichier journal mais on leur propre type de traitement. | |||
Quelques exemples: | |||
* Analyse des journaux du service "SSHD" | |||
Ce service porte le nom de "sshd". Il utilisera le script "/usr/share/logwatch/scripts/services/sshd", le fichier de paramétrage "/usr/share/logwatch/default.conf/services/sshd". Ce dernier fait référence au groupes de journaux ""/usr/share/logwatch/default.conf/logfiles/secure" "/usr/share/logwatch/default.conf/logfiles/messages". On y retrouve notamment parmis bien d'autres les journaux "/var/log/secure" et "/var/log/messages". Dans ces journaux, ils vont repérer les lignes correspondant au processus "sshd". | |||
* Analyse des espaces disques | |||
Ce service porte le nom de "zz-disk_space". Il utilisera le script "/usr/share/logwatch/scripts/services/zz-disk_space", le fichier de paramétrage "/usr/share/logwatch/default.conf/services/zz-disk_space". Il n'analyse aucun journal et donc ne fera pas appel à un fichier groupe de journaux. Mais dans le script, on y retrouvera l'appel à la commande de ligne "df". | |||
=Fichier "logwatch.conf"= | |||
En premier lieu, on peut s'intéresser au fichier de configuration générale: "logwatch.conf" | En premier lieu, on peut s'intéresser au fichier de configuration générale: "logwatch.conf" | ||
et spécialement au paramètres suivants: | et spécialement au paramètres suivants: |
Version du 17 novembre 2024 à 17:39
But
Ce logiciel effectue un résumé des activités de la veille du serveur sur base majoritairement des journaux. Il met l'accent sur les problèmes et alertes rencontrés. Le résultat est envoyé par messagerie. En le visionnant, j'ai pu mettre le doigt sur divers problèmes et prendre les mesures correspondantes.
Principe
Ce logiciel passe en revue divers services. Chaque analyse s'effectue sur base d'un script. Ces scripts font souvent appel à des scripts généraux ou fonctions. Les scripts des services peuvent être divisés en deux grands groupes:
- ceux qui effectuent des commandes directes tels l'analyse des espaces disques ou des températures du matériel
- ceux qui analysent des groupes de journaux ciblés ("logfiles").
Chaque service est piloté par un fichier de configuration.
Par défaut ce sont les journaux de la veille et donc clôturés qui sont analysés.
Installation
La première étape consiste à installer le paquet:
dnf install logwatch
Configuration: structure
Les fichiers de configuration personnalisables se trouvent dans le répertoire "/etc/logwatch" et ceux de référence dans le répertoire "/usr/share/logwatch".
La structure est identique; si un fichier du même nom se retrouve aux deux endroits, celui sous le répertoire "/etc/logwatch" a la priorité. Donc pour adapter la configuration, il suffit de recopier le fichier correspondant du répertoire "/usr/share/logwatch" dans le répertoire "/etc/logwatch" ou du moins de reprendre dans ce fichier, le paramètre que l'on veut changer. Normalement on ne devrait rien changer.
Voici la structure des éléments principaux:
- Les répertoires "/etc/logwatch/scripts/services" et "/usr/share/logwatch/scripts/services" contiennent les scripts qui effectuent l'analyse des journaux ou effectuent des commandes ciblées. Ces fichiers portent le nom du service correspondant.
- Les répertoires "/etc/logwatch/conf/services" et "/usr/share/logwatch/default.conf/services" regroupent les divers paramètres de configuration du service correspondant. Dans le cas d'une analyse de journaux, ils font référence à un groupe de journaux. C'est la variable "LogFile" qui redirige cette action vers un fichier du point suivant. Ces fichiers portent le nom du service correspondant suivis de l’extension ".conf".
- Les répertoires "/etc/logwatch/conf/logfiles" et "/usr/share/logwatch/default.conf/logfiles" définissent un groupe de journaux à analyser. Ces fichiers portent le nom du groupe de journaux correspondant suivis de l'extention ".conf".
- Les fichiers de configuration des répertoires "/etc/logwatch/conf" et ""/usr/share/logwatch/default.conf" définissent les paramètres généraux du logiciel. Nous y retrouvons les fichiers:
- logwatch.conf : fichier de configuration de LogWatch
- override.conf : fichier contenant les paramètres qui auront la priorité absolue sur tout autre défini autre part
- ignore.conf : fichier contenant les lignes du rapport final que l'on ne veut plus voir apparaître
Il est à noter que certains services n'analysent aucun fichier journal mais on leur propre type de traitement.
Quelques exemples:
- Analyse des journaux du service "SSHD"
Ce service porte le nom de "sshd". Il utilisera le script "/usr/share/logwatch/scripts/services/sshd", le fichier de paramétrage "/usr/share/logwatch/default.conf/services/sshd". Ce dernier fait référence au groupes de journaux ""/usr/share/logwatch/default.conf/logfiles/secure" "/usr/share/logwatch/default.conf/logfiles/messages". On y retrouve notamment parmis bien d'autres les journaux "/var/log/secure" et "/var/log/messages". Dans ces journaux, ils vont repérer les lignes correspondant au processus "sshd".
- Analyse des espaces disques
Ce service porte le nom de "zz-disk_space". Il utilisera le script "/usr/share/logwatch/scripts/services/zz-disk_space", le fichier de paramétrage "/usr/share/logwatch/default.conf/services/zz-disk_space". Il n'analyse aucun journal et donc ne fera pas appel à un fichier groupe de journaux. Mais dans le script, on y retrouvera l'appel à la commande de ligne "df".
Fichier "logwatch.conf"
En premier lieu, on peut s'intéresser au fichier de configuration générale: "logwatch.conf" et spécialement au paramètres suivants:
- MailTo = root : le message est envoyé à l'utilisateur "root"
- Detail = Low : le niveau de détail affiché est au plus bas. Je conseille de le laisser à cette valeur. On peut le mettre à la valeur "Med" pour obtenir plus de détails mais on risque d'être submergé avec pour conséquence de ne plus regarder le rapport. Ne parlons pas du niveau maximal "High".
Personnalisation de la configuration
Normalement la configuration fournie est opérationnelle mais en fouillant cette configuration, nous avons été amené à l'adapter.
Voici quelques cas rencontrés. Certains font suite à des modifications personnelles.
PHP
En analysant le fichier "/usr/share/logwatch/default.conf/logfiles/php.conf", nous avons remarqué que les noms des journaux n'étaient pas les bons et en outre, nous avions ajouté le support des divers anciennes versions de PHP provenant les dépôts de Remi.
Nous avons donc créé le fichier de configuration "/etc/logwatch/conf/logfiles/php.conf" dont voici le contenu hors commentaires sur base du fichier "/usr/share/logwatch/default.conf/logfiles/php.conf":
# PHP (8.2) de la distribution LogFile = php-fpm/error.log LogFile = php-fpm/www-error.log # PHP (7.4, 8.0 et 8.1) du dépôt de Remi LogFile = /var/opt/remi/php74/log/php-fpm/error.log LogFile = /var/opt/remi/php74/log/php-fpm/www-error.log LogFile = /var/opt/remi/php80/log/php-fpm/error.log LogFile = /var/opt/remi/php80/log/php-fpm/www-error.log LogFile = /var/opt/remi/php81/log/php-fpm/error.log LogFile = /var/opt/remi/php81/log/php-fpm/www-error.log # PHP (8.2) de la distribution Archive = php-fpm/error.log-* Archive = php-fpm/www-error.log-* # PHP (7.4, 8.0 et 8.1) du dépôt de Remi Archive = /var/opt/remi/php74/log/php-fpm/error.log-* Archive = /var/opt/remi/php74/log/php-fpm/www-error.log-* Archive = /var/opt/remi/php80/log/php-fpm/error.log-* Archive = /var/opt/remi/php80/log/php-fpm/www-error.log-* Archive = /var/opt/remi/php81/log/php-fpm/error.log-* Archive = /var/opt/remi/php81/log/php-fpm/www-error.log-*
IPTABLES
Nous redirigeons les messages venant du FireWall IPtables vers le fichier "/var/log/iptables" et via le logiciel LogRotate, les archives se retrouvent dans les fichiers "/var/log/iptables-*".
Nous avons donc créé le fichier de configuration "/etc/logwatch/conf/logfiles/php.conf" dont voici le contenu hors commentaires sur base du fichier "/usr/share/logwatch/default.conf/logfiles/iptables.conf":
LogFile = iptables Archive = iptables-* *ApplyStdDate
MariaDB
Il existe un service "mysql" mais il est non opérationnel pour MariaDB principalement suite au format de la date précédent tout message.
Dans ce script, le format de la date est '%y%m%d %H:%M:%S', par exemple "230814 12:03:45" alors que nous avons besoin d'un format '%Y-%m-%d %H:%M:%S', par exemple "2023-08-14 12:03:45". En outre, nous souhaitions ne voir apparaître les messages "Note" que dans le cas d'un niveau de détail "High". De plus le nom des journaux étaient autres que ceux de MySQL. L'ordre des types de messages a été modifié. Nous avons donc créé un nouveau service sur base des fichiers du service "mysql".
Nous avons créé le fichier de configuration "/etc/logwatch/conf/logfiles/mariadb.conf" dont voici le contenu hors commentaires:
LogFile = mariadb/mariadb.log Archive = mariadb/mariadb.log-* *ExpandRepeats
Nous avons créé aussi le fichier de configuration "/etc/logwatch/conf/services/mariadb.conf" dont voici le contenu hors commentaires:
Title = "MariaDB" LogFile = mariadb
Et nous avons adapté le script "/etc/logwatch/scripts/services/mariadb" sur base du script "/usr/share/logwatch/scripts/services/mysql" hors commentaires du début et de la fin pour ne pas surcharger la présentation. Il est écrit en Perl. Voici son contenu, en gras et en italique les modifications apportées et les lignes modifiées sont mises en commentaire:
use strict; use Logwatch ':dates'; use Time::Local; use POSIX qw(strftime); #my $date_format = '%y%m%d %H:%M:%S'; my $date_format = '%Y-%m-%d %H:%M:%S'; my $filter = TimeFilter($date_format); my $detail = exists $ENV{'LOGWATCH_DETAIL_LEVEL'} ? $ENV{'LOGWATCH_DETAIL_LEVEL'} : 0; # we do not use any Date:: package (or strptime) as they are probably not available my %month2num = ( Jan => 0, Feb => 1, Mar => 2, Apr => 3, May => 4, Jun => 5, Jul => 6, Aug => 7, Sep => 8, Oct => 9, Nov => 10, Dec => 11 ); # array of message categories (we do not use a hash to keep the order) # first element: category name # second element: matching regexp ($1 should contain the message) # third element: anonymous hash ref (stores message counts) my @message_categories = (['Note', qr/\[Note\] (.*)$/o, {}], ['Warnings', qr/\[Warning] (.*)$/o, {}], ['Errors', qr/\[ERROR\] (.*)$/o, {}], ['Other', qr/(.*)$/o, {}]); # counting messages while(<>) { my $line = $_; # skipping messages that are not within the requested range next unless $line =~ /^($filter)/o; # $1 =~ /(\d\d)(\d\d)(\d\d)\s+(\d+):(\d+):(\d+)/; $1 =~ /(\d+)-(\d+)-(\d+)\s+(\d+):(\d+):(\d+)/; my $time; { # timelocal is quite chatty local $SIG{'__WARN__'} = sub {}; $time = timelocal($6, $5, $4, $3, $2-1, $1); } # Count lines with increasing number as one: # [Warning] Aborted connection 107194 to db: ... $line =~ s/(Aborted connection) \d+ (to db)/$1 $2/; foreach my $cur_cat (@message_categories) { if($line =~ /$cur_cat->[1]/) { my $msgs = $cur_cat->[2]; $msgs->{$1} = {count => '0', first_occurrence => $time, sum => 0, sqrsum => 0} unless exists $msgs->{$1}; $msgs->{$1}->{'count'}++; # summing up timestamps and squares of timestamps # in order to calculate the rms # using first occurrence of message as offset in calculation to # prevent an integer overflow $msgs->{$1}->{'sum'} += $time - $msgs->{$1}->{'first_occurrence'}; $msgs->{$1}->{'sqrsum'} += ($time - $msgs->{$1}->{'first_occurrence'}) ** 2; last; } } } # generating summary foreach my $cur_cat (@message_categories) { # skipping non-requested message types next unless keys %{$cur_cat->[2]}; my ($name, undef, $msgs) = @{$cur_cat}; my $etat = 0; if(($detail <= 5) and ($name eq "Note")) {$etat = 1}; if($etat == 0) { print $name, ":\n"; my $last_count = 0; # sorting messages by count my @sorted_msgs = sort { $msgs->{$b}->{'count'} <=> $msgs->{$a}->{'count'} } keys %{$msgs}; foreach my $msg (@sorted_msgs) { # grouping messages by number of occurrence print "\n", $msgs->{$msg}->{'count'}, " times:\n" unless $last_count == $msgs->{$msg}->{'count'}; my $rms = 0; # printing timestamp print '['; if($msgs->{$msg}->{'count'} > 1) { # calculating rms $rms = int(sqrt( ($msgs->{$msg}->{'count'} * $msgs->{$msg}->{'sqrsum'} - $msgs->{$msg}->{'sum'}) / ($msgs->{$msg}->{'count'} * ($msgs->{$msg}->{'count'} - 1)))); print strftime($date_format, localtime($msgs->{$msg}->{'first_occurrence'}+int($rms/2))); print ' +/-'; # printing rms if($rms > 86400) { print int($rms/86400) , ' day(s)'; } elsif($rms > 3600) { print int($rms/3600) , ' hour(s)'; } elsif($rms > 60) { print int($rms/60) , ' minute(s)'; } else { print $rms, ' seconds'; } } else { # we have got this message a single time print strftime($date_format, localtime($msgs->{$msg}->{'first_occurrence'})); } print '] ', $msg, "\n"; $last_count = $msgs->{$msg}->{'count'}; } print "\n"; } }
Audit
Si on élève le niveau de détail de "Low" à "Med", on est submergé par le très grand nombre de messages d'audit.
Pour y pallier, nous avons créé le fichier de configuration "/etc/logwatch/conf/services/audit.conf" dont voici le contenu:
Detail = Low
Activation de services désactivés
Dans le fichier de fonfiguration générale "/usr/share/logwatch/default.conf/logwatch.conf", les services "zz-network" et "zz-sys" sont désactivés. Nous désirons les réactiver sauf le service "eximstats". Cette opération demande une configuration spéciale.
Dans le fichier de configuration "/etc/logwatch/conf/override.conf", on ajoute les lignes suivantes:
logwatch: Service = logwatch: Service = All logwatch: Service = "-eximstats"
La première ligne annule les options "Service" dans le fichier "/usr/share/logwatch/default.conf/logwatch.conf". On les remplace par l'activation de tous les services ("All") sauf le service "eximstats" ("-eximstats").
Exécution
Ce programme s'exécute une fois par jour via le service Cron. Cette commande se trouve dans le fichier "/etc/cron.daily/0logwatch". Il traite les journaux de la veille et envoie un message à l'utilisateur "root" par défaut.
Il est possible de l'exécuter en direct via la commande:
logwatch
Dans ce cas, le résultat s'affiche directement à l'écran et concerne tous les services.
On peut se limiter à un service en le précisant. Par exemple pour le service "postfix, cette commande:
logwatch --service postfix
donne:
################### Logwatch 7.9 (07/22/23) #################### Processing Initiated: Fri Aug 18 15:11:28 2023 Date Range Processed: yesterday ( 2023-Aug-17 ) Period is day. Detail Level of Output: 0 Type of Output/Format: stdout / text Logfiles for Host: serverdb.home.dom ################################################################## --------------------- Postfix Begin ------------------------ 2.419M Bytes accepted 2,536,824 2.419M Bytes delivered 2,536,824 ======== ================================================== 119 Accepted 100.00% -------- -------------------------------------------------- 119 Total 100.00% ======== ================================================== 530 Connections 530 530 Disconnections 530 119 Removed from queue 119 119 Delivered 119 1 Postfix start 1 1 Postfix stop 1 ---------------------- Postfix End ------------------------- ###################### Logwatch End #########################
D'autre paramètres sont disponibles; un mérite notre attention: "--detail" suivi du niveau: ("Low", "Med" ou "High"). La commande équivalente à celle ci-dessus devient:
logwatch --service postfix --detail Low
Par défaut ce sont les événements de la veille qui sont synthétisés. Si on veut ceux du jour même, on utilise l'option suivante:
logwatch --service postfix --range Today
Si le service n'est pas utilisé ou si aucune information n'est retenue, il n'y a pas d'affichage.
Ces commandes exécutées en direct sont intéressantes pour vérifier le bon fonctionnement d'un service suite à toute modification.
Compléments
Voyez l'article sur la Surveillance de la température; il permet d'ajouter une section liée à la surveillance des températures de la carte mère (CPU, GPU,...) et des disques durs.