SIEM : centraliser les logs Linux et Windows dans une base MySQL / MariaDB

Le démon Rsyslog possède de très nombreux modules nous permettant d’envoyer les logs des systèmes et des applications vers les bases de données MySQL / MariaDB, PostgreSQL, ElasticSearch, Redis, MongoDB à des fins d’analyse post-mortem et de Forensics par exemple. Autrement dit, à l’aide de evtsys installé sur les stations et les serveurs Windows (exécutable evtsys.exe à copier dans c:\windows\system32), vous pouvez construire un SIEM très simplement (en moins d’une heure) avec Rsyslog et MariaDB, en redirigeant les journaux d’événements vers un ou plusieurs serveurs Rsyslog eux-mêmes renvoyant vers une base de données ou un cluster Galera.

evtsys -i -h ip_ou_fqdn_machine_linux_rsyslog -l 0 -t win
net start evtsys

Installation du module rsyslog-mysql

Après avoir installé au préalable une instance MySQL/MariaDB, nous allons ajouter sur Fedora le paquet rsyslog-mysql :

dnf install rsyslog-mysql

Création de la base Syslog

En installant le module vous disposez d’un script pour créer la base de données Syslog :

mysql -u root -p < /usr/share/doc/rsyslog/mysql-createDB.sql

Le script crée une base Syslog (avec un S majuscule) et lui rattache les tables SystemEvents et SystemEventsProperties. Pensez à créer un utilisateur disposant des droits sur cette base à partir de l’interpréteur mysql :

CREATE USER utilisateur@localhost;
SET PASSWORD FOR utilisateur@localhost=PASSWORD('mot_de_passe');
GRANT ALL PRIVILEGES ON Syslog.* TO utilisateur@localhost IDENTIFIED BY 'mot_de_passe' WITH GRANT OPTION;

Configuration du fichier /etc/rsyslog.conf

Pensez à décommenter les lignes du fichier de configuration suivantes Rsyslog nécessaire à la mise en écoute et à la collecte des données :

module(load="imklog") # reads kernel messages (the same are read from journald)
module(load="immark") # provides --MARK-- message capability

module(load="imudp") # needs to be done just once
input(type="imudp" port="514")

Dans Fedora, après installation du paquet rsyslog-mysql, vous devez ajouter le module ommysql au fichier de configuration /etc/rsyslog.conf  :

module(load="ommysql")

Redirigez ensuite tous les messages en ajoutant tout à la fin de ce fichier, vers localhost dans l’exemple ci-dessous :

*.* :ommysql:localhost,Syslog,utilisateur,mot_de_passe

Vous pouvez redémarrer le service rsyslog , en faisant attention à configurer/désactiver SELinux/Firewalld :

systemctl restart rsyslog

Requête sur la table SystemEvents

Après vous être connecté à la base Syslog nouvellement créé, tapez, par exemple, la requête pour visualiser les logs :

SELECT 
    ReceivedAt,
    FromHost,
    Facility,
    Priority,
    Message,
    SysLogTag
FROM
    SystemEvents

Centraliser les logs rsyslog dans une base MySQL / MariaDB

Tables facility et severity

Afin d’établir les correspondances entre les codes des catégories et des niveaux d’erreur des messages, je vous conseille de créer les tables facility et severity :

CREATE TABLE facility
(
code INT,
keyword VARCHAR(50),
description VARCHAR(50)
);
INSERT INTO facility(code,keyword,description)
VALUES
(0,'kern','kernel messages'),
(1,'user','user-level messages'),
(2,'mail','mail system'),
(3,'daemon','system daemons'),
(4,'auth','security/authorization messages'),
(5,'syslog','messages generated internally by syslogd'),
(6,'lpr','line printer subsystem'),
(7,'news','network news subsystem'),
(8,'uucp','UUCP subsystem'),
(9,'cron','clock daemon'),
(10,'authpriv','security/authorization messages'),
(11,'ftp','FTP daemon'),
(12,'ntp','NTP subsystem'),
(13,'security','log audit'),
(14,'console','log alert'),
(15,'solaris-cron','scheduling daemon'),
(16,'local0','locally used facilities'),
(17,'local1','locally used facilities'),
(18,'local2','locally used facilities'),
(19,'local3','locally used facilities'),
(20,'local4','locally used facilities'),
(21,'local5','locally used facilities'),
(22,'local6','locally used facilities'),
(23,'local7','locally used facilities');

CREATE TABLE severity (
code INT,
title VARCHAR(20),
keyword VARCHAR(10)
);
INSERT INTO severity(code,title,keyword)
VALUES
(0,'Emergency','emerg'),
(1,'Alert','alert'),
(2,'Critical','crit'),
(3,'Error','err'),
(4,'Warning','warn'),
(5,'Notice','notice'),
(6,'Informational','info'),
(7,'Debug','debug'); 

Comprendre rsyslog

Vous disposez, sur Wikipédia, d’une excellente page consacrée à syslog dans laquelle vous aurez toutes les explications requises sur les valeurs figurant dans les colonnes Facility (la catégorie des messages) et Priority (le niveau de sévérité des messages).

Linux /