La consultation des journaux des différentes machines et actifs d'un réseau est une tache indispensable et récurrente en administration réseau. Cela permet notamment de surveiller les activités des utilisateurs et détecter rapidement les événements inattendus (pannes, attaques). Dans un parc informatique conséquent, cette tache peut se révéler chronophage s'il faut passer de machine en machine.
Pour simplifier la consultation des journaux de l'ensemble d'un parc, il est possible de les centraliser sur un serveur grâce à Rsyslog (basé sur le protocole syslog), inclus nativement sur Linux (mais utilisable également avec Microsoft Windows via un agent payant).
Notions de base
Les événements stockés dans les journaux sont classés selon deux critères avec Rsyslog :
- Le type de l'événement (facility en anglais) ;
- La priorité de l'événement (severity en anglais).
Type d'événement (facility) | Description |
---|---|
kern |
Noyau |
user |
Espace utilisateur |
mail |
Messagerie |
daemon |
Processus |
auth |
Authentification |
syslog |
Journaux système |
lpr |
Impression |
news |
Actualités |
uucp |
Unix to Unix Copy |
cron |
Taches planifiées |
authpriv |
Élévation des privilèges |
ftp |
FTP |
ntp |
Synchronisation de temps |
security |
Audit |
console |
Alertes |
solaris-cron |
Taches planifiées |
local0 à local7 |
Libres pour un usage local |
Priorité d'événement (severity) | Description | |
---|---|---|
emergency |
0 | Système inutilisable |
alert |
1 | Intervention immédiate nécessaire |
critical |
2 | Erreur critique |
error |
3 | Erreur de fonctionnement |
warning |
4 | Avertissement |
notice |
5 | Signalement |
info |
6 | Information |
debug |
7 | Dépannage |
none |
- | Sans priorité |
Installation d'un serveur de journalisation
Présentation
Un serveur de journalisation sous Ubuntu Server va récupérer les journaux et les stocker dans une base de données MariaDB. Le logiciel Adiscon LogAnalyzer sera installé pour visualiser les journaux.
Préparation et installation des paquets
- Installer les paquets
apache2
,php
,php-gd
,libapache2-mod-php
,mariadb-server
,php-mysql
. - Utiliser la commande
mysql_secure_installation
pour définir un mot de passe pour l'administration de la base de données. - Installer le paquet
rsyslog-mysql
, choisir de créer une base de données pour Rsyslog et définir un mot de passe pour l'utilisateur de cette base de données.
Activation de la réception des journaux
- Ouvrir le fichier de configuration de Rsyslog (
/etc/rsyslog.conf
). - Décommenter les deux lignes activant la réception des journaux via TCP et/ou UDP (instructions
module
etinput
) selon vos choix.
Il est également possible de sécuriser la réception de journaux en choisissant les machines et réseaux autorisée à envoyer leur journaux au serveur, avec l'instruction $AllowedSender
, qui s'insère dans la section de définition des directives globales et s'utilise avec la syntaxe suivante : $AllowedSender protocole, adresse
protocole
: TCP ou UDP ;adresse
: adresse IP de la machine ou du réseau (au format CIDR) autorisée à envoyer des journaux au serveur Rsyslog (il est possible de préciser plusieurs adresses en les séparant par des virgules).
Les modifications du fichier sont prises en compte après redémarrage du service rsyslog
. Il est possible de vérifier que le service écoute bien les ports définis avec la commande ss -4altunp
.
Installation et configuration de LogAnalyzer
LogAnalyzer est disponible en téléchargement sur le site Internet d’Adiscon, la société qui a développé cette solution (https://loganalyzer.adiscon.com/).
- Créer le répertoire
/var/www/html/loganalyzer
sur le serveur de journalisation. - Télécharger LogAnalyzer sur le serveur de journalisation (dans le répertoire
/tmp
par exemple). - Décompresser le fichier de LogAnalyzer et copier le contenu du répertoire
src
dans le répertoire/var/www/html/loganalyzer
. - Attribuer le répertoire
/var/www/html/loganalyzer
et son contenu à l'utilisateur et groupe d'Apache2 (www-data
).
LogAnalyzer est installé, mais il faut maintenant le configurer.
- A partir d'un poste client, accéder à l'interface web de LogAnalyzer (en utilisant l'adresse IP du serveur de journalisation).
- Choisir d'installer LogAnalyzer.
- Étape 1 : cliquer sur suivant.
- Étape 2 : vérification que le fichier de configuration est modifiable (ce qui doit être normalement le cas, en suivant les instructions précédentes).
- Étape 3 :
- Choisir d'activer la base de données (en laissant les valeurs par défaut pour les autres champs) ;
- Saisir les informations concernant la base de données créée pour Rsyslog (nom de la base de données, nom de l'utilisateur, mot de passe de l'utilisateur)
- Étape 4 : vérification que la connexion à la base de données est opérationnelle.
- Étape 5 : création des tables de LogAnalyzer.
- Étape 6 : saisir un nom et un mot de passe pour accéder à l'interface d'administration de LogAnalyzer.
- Étape 7 :
- Choisir MYSQL Native comme source, ce qui fait apparaître un formulaire de configuration de la connexion à MySQL (ou MariaDB) ;
- Saisir les informations concernant la base de données de Rsyslog (nom, table, utilisateur et mot de passe) ;
- Laisser les autres champs avec leur valeur par défaut.
- Étape 8 : fin de l'installation.
Après l'installation, vous devez vous retrouver sur l'interface de LogAnalyzer.
Remarque : il se peut que vous ayez une page blanche. Si c'est le cas et s'il est indiqué dans le journal d'erreur d'Apache qu'un champ manque dans la base de données, vous pouvez l'ajouter (la liste des champs devant se trouve dans la table SystemEvents est à la fin de cet article).
Transfert de journaux d'une machine Ubuntu vers un serveur de centralisation
Configuration de Rsyslog
Rsyslog étant natif sur les machines Ubuntu, il n'est pas nécessaire de l'installer. La configuration de ce service se fait dans le fichier /etc/rsyslog.d/50-default.conf
.
Par défaut, ce fichier contient les instructions générant un certain nombre de journaux dans le répertoire /var/log
de votre serveur. Ces instructions débutent par un filtre indiquant les événements qui doivent être journalisés puis où stocker (ou envoyer) le journal concernant ces événements. Les filtres ont le format suivant : type.priorité
.
Les valeurs possibles pour le type et la priorité sont celles du logiciel Rsyslog. Il est possible de remplacer un type ou une priorité par le caractère *
, qui signifie que tous les types ou toutes les priorités sont concernés. Par exemple, la ligne kern.* -/var/log/kern.log
indique que tous les événements concernant le noyau du système sont envoyés au fichier /var/log/kern.log
(le –
devant le nom du fichier indique que la synchronisation de ce fichier est désactivée).
Transfert des journaux vers un serveur de centralisation
Afin de transférer les journaux définis dans le fichier /etc/rsyslog.d/50-default.conf
, il faut remplacer le nom du fichier par le nom de fichier par @X.X.X.X:port
(pour un envoi avec UDP) ou @@X.X.X.X:port
(pour un envoi avec TCP), en remplaçant X.X.X.X
par l’adresse IP du serveur de journalisation et port
par le port d’envoi.
Afin d'éviter de surcharger le fichier 50-default.conf
, vous pouvez créer un autre fichier dans le répertoire /etc/rsyslog.d
avec vos instructions.
Transfert de journaux non répertoriés dans Rsyslog
Par défaut, Rsyslog ne répertorie pas tous les services. Il faut donc ajouter dans sa configuration des instructions permettant de récupérer les journaux de ces services pour les envoyer sur le serveur de journalisation.
Par exemple, le service Apache fait partie des services non répertoriés. Si vous souhaitez transférer le journal d'erreur de ce service (/var/log/apache2/error.log
) vers un serveur de centralisation, vous pouvez ajouter ces instructions dans la configuration de Rsyslog (dans le fichier de configuration par défaut, ou dans un nouveau fichier, comme /etc/rsyslog.d/01-apache2.conf
) :
module(load="imfile" PollingInterval="10" statefile.directory="/var/spool/rsyslog")
input(type="imfile"
File="/var/log/apache2/error.log"
Tag="http_error"
Severity="error"
Facility="local0")
local0.error @@X.X.X.X:PPP
- La première ligne appelle le module
imfile
, qui permet de convertir un fichier texte en fichier de journalisation, en indiquant l’intervalle de lecture du fichier (PollingInterval
) et le fichier dans lequel stocker l’état du module (statefile.directory
) ; - L’instruction
type
indique le type du module ; - L’instruction
File
indique le fichier à consulter ; - L’instruction
Tag
précise une étiquette pour les messages de ce fichier ; - L’instruction
Severity
est la priorité à attribuer aux événements du fichier ; - L’instruction
Facility
définit le type à utiliser pour les événements du fichier ; - La dernière ligne envoie via TCP le journal à notre serveur de journalisation (adresse
X.X.X.X
et portPPP
).
Afin de filtrer les messages envoyés, il est également possible d'ajouter une condition (à placer avant l'instruction envoyant le journal au serveur de journalisation). Par exemple, pour transmettre seulement les messages ne comportant que les chiffres 500, 502 ou 404 (qui sont les codes d’erreur HTTP concernant une erreur du serveur ou une page non trouvée) :
if $programname == 'http_access' and not ($msg contains '500' or $msg contains '502' or $msg contains '404') then stop
Transfert de journaux de pare-feux pfSense et OPNsense vers un serveur RSyslog
pfSense
- Accéder aux journaux (Status -> System Log).
- Accéder au paramétrage des journaux (Settings).
- Passer les journaux au format syslog.
- Activer la transmission des journaux à un serveur distant (en bas de page).
- Indiquer une adresse source (généralement, celle de l'interface permettant de joindre le serveur de journalisation).
- Saisir l'adresse et le port d'écoute du serveur de journalisation dans un des champs prévus à cet effet.
- Pour éviter de surcharger le serveur de journalisation, vous pouvez choisir limiter les journaux à transmettre.
OPNsense
- Accéder à la configuration du transfert des journaux (Systèmes -> Paramètres -> Logging/targets).
- Dans l'onglet Destination, cliquer sur l'onglet + pour ajouter une destination aux journaux d'OPNsense.
- Dans la fenêtre qui apparaît, choisir en fonction de votre contexte :
- Le protocole de transport (UDP, TCP, TLS, en IPv4 ou IPv6) ;
- Les journaux des applications à transmettre au serveur de journalisation (tous les journaux seront transmis si vous n'en sélectionnez aucun) ;
- Les niveaux d'alerte événement à transmettre ;
- Les type d'événement à transmettre ;
- L'adresse et le port d'écoute du serveur de journalisation.
Annexe : champs de la table SystemEvents
Champ | Type | Options |
---|---|---|
ID | int(10) | UNSIGNED NOT NULL |
CustomerID | int(11) | NOT NULL DEFAULT 0 |
ReceivedAt | datetime | NOT NULL DEFAULT '0000-00-00 00:00:00' |
DeviceReportedTime | datetime | NOT NULL DEFAULT '0000-00-00 00:00:00' |
Facility | int(11) | NOT NULL DEFAULT 0 |
Priority | int(11) | NOT NULL DEFAULT 0 |
FromHost | varchar(60) | NOT NULL DEFAULT '' |
Message | text | NOT NULL |
NTSeverity | char(3) | NOT NULL DEFAULT '' |
Importance | char(3) | NOT NULL DEFAULT '' |
EventSource | varchar(60) | DEFAULT NULL |
EventUser | varchar(60) | NOT NULL DEFAULT '' |
EventCategory | int(11) | NOT NULL DEFAULT 0 |
EventID | int(11) | NOT NULL DEFAULT 0 |
EventBinaryData | text | NOT NULL |
MaxAvailable | int(11) | NOT NULL DEFAULT 0 |
CurrUsage | int(11) | NOT NULL DEFAULT 0 |
MinUsage | int(11) | NOT NULL DEFAULT 0 |
MaxUsage | int(11) | NOT NULL DEFAULT 0 |
InfoUnitID | int(11) | NOT NULL DEFAULT 0 |
SysLogTag | varchar(60) | DEFAULT NULL |
EventLogType | varchar(60) | DEFAULT NULL |
GenericFileName | varchar(60) | DEFAULT NULL |
SystemID | int(11) | NOT NULL DEFAULT 0 |
Checksum | int(11) | NOT NULL DEFAULT 0 |
processid | varchar(60) | NOT NULL DEFAULT '' |