titre informatique

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 et input) 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 port PPP).

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 ''