Services et serveurs

rsyslog : Centralisation des logs sous Linux

Table des matières

ls_logs



Introduction



Comme vous le savez, je préfère rsyslog à syslog-ng.
Ainsi dans cet article, on va voir comment centraliser les logs de diverses machines Linux sur un serveur de log.
Rsyslog se comporte aussi bien en client qu'en serveur.

Il est très intéressant, surtout dans un contexte entreprise de centraliser les logs. En effet, si une machine est compromise, l'attaquant va s'empresser d'effacer toute trace.
Aussi, en cas de crash de la machine, les logs sont situés ailleurs, facilitant aussi la sauvegarde des logs, qu'on doit conserver pour une durée légale de 52 semaines.
De plus, si on a besoin d'exploiter les logs avec des outils, nous les installerons uniquement sur une seule machine.

Dans cet article, je vais utiliser 3 machines :
srv-centos1 : 192.168.21.140 (Client rsyslog)
srv-centos2 : 192.168.21.141 (Client rsyslog)
srv-log : 192.168.21.142 (Serveur rsyslog)

Rsyslog : Installation du serveur



Attention, nous allons stocker les logs dans /var/log. Il est conseillé d'avoir une partition séparée, afin d'éviter le blocage du système si cette partition se retrouve remplie à 100%.

Le service syslog écoute par défaut sur le port 514.
Il est possible d'utiliser les 2 protocoles de transport : TCP et UDP.

Chacun a ses avantages et ses inconvénients.
On sait que TCP est lent du aux contrôles qu'il effectue, mais est dit fiable.
A contrario, UDP est dit non fiable car aucun contrôle n'est fait, cependant il est plus rapide.

Il est tout à fait possible de laisser les 2 protocoles ouverts mais il faudra utiliser 2 ports différents.
Dans la suite de cet article, je vais laisser le port 514 pour UDP et utiliser le port 10514 pour le TCP.

On installe dans un premier temps rsyslog.
Sous CentOS :
Code BASH :
yum install rsyslog

Sous Debian :
Code BASH :
apt install rsyslog

Sous Gentoo :
Code BASH :
emerge -av app-admin/rsyslog


Le fichier de configuration de rsyslog est /etc/rsyslog.conf

Dans un premier temps, on va dé-commenter les 2 ports d'écoute TCP et UDP. Si vous ne souhaitez utiliser que TCP ou que UDP, ne dé-commentez que le pavé concerné

Code BASH :
# Provides UDP syslog reception
$ModLoad imudp
$UDPServerRun 514
# Provides TCP syslog reception
$ModLoad imtcp
$InputTCPServerRun 10514


On peut aussi afiner la sécurité des hôtes envoyant les logs :
Code BASH :
$AllowedSender UDP, 127.0.0.1/24, 192.168.21.0/24, *.linuxtricks.lan


On Active et on démarre le service.

Sous systemd (CentOS, Debian) :
Code BASH :
systemctl enable rsyslog
systemctl start rsyslog


Sous OpenRC (Gentoo) :
Code BASH :
rc-update add rsyslog default
/etc/init.d/rsyslog start



On vérifie que le(s) port(s) sont en écoute :

Code BASH :
ss -utln


Code BASH :
[root@srv-log ~]# ss -utln
Netid State      Recv-Q Send-Q     Local Address:Port                    Peer Address:Port
udp   UNCONN     0      0                      *:68                                 *:*
udp   UNCONN     0      0                      *:514                                *:*
udp   UNCONN     0      0                      *:44756                              *:*
udp   UNCONN     0      0                   [::]:514                             [::]:*
udp   UNCONN     0      0                   [::]:33514                           [::]:*
tcp   LISTEN     0      25                     *:10514                              *:*
tcp   LISTEN     0      128                    *:22                                 *:*
tcp   LISTEN     0      25                  [::]:10514                           [::]:*
tcp   LISTEN     0      128                 [::]:22                              [::]:*


Les ports 514 et 10514 sont en écoute.

Syslog : Rappels



Pour bien comprendre les concepts syslog, je vous renvoie à mon article traitant du sujet : Les journaux système sous Linux https://www.linuxtricks.fr/wiki/les-journaux-systeme-sous-linux

Rsyslog : Configurer les clients



Côté client, on va s'assurer que rsyslog est aussi installé, et le service démarré.

Le fichier de configuration de rsyslog est /etc/rsyslog.conf

Voici un exemple d'envoi des logs concernant l'authentification sur le serveur de log :
Code BASH :
auth,authpriv.* @192.168.21.142


Après chaque modif du fichier de config, il est nécessaire de relancer le service rsyslog.


Faire des règles sur le serveur pour trier



Notre serveur de log fonctionne : OK
Cependant, tous les logs sont écrits dans le /var/log/messages de notre serveur de log, et c'est le bazar :

Code BASH :
Feb  6 18:29:26 srv-log systemd: Started Session 257 of user root.
Feb  6 18:29:26 srv-log systemd-logind: New session 257 of user root.
Feb  6 18:29:27 srv-log root: Ceci est un texte d erreur
Feb  6 18:39:56 srv-log systemd: Started Session 259 of user root.
Feb  6 18:39:56 srv-log systemd-logind: New session 259 of user root.
Feb  6 18:40:04 srv-centos1 systemd-logind: New session 260 of user root.


On voit le log de notre client srv-centos1 au milieu de ceux du serveur (srv-log).

Dans le /etc/rsyslog.conf du serveur, on créé dans la section RULES une règle qui va trier les logs en fonction de la source :

Code BASH :
$template DynamicFile,"/var/log/syslogclients/%fromhost%-syslog.log"
*.* ?DynamicFile


On peut aussi créer des règles plus complexes, comme par exemple envoyer dans le dossier /var/log/syslogclients/ tous les logs sauf celui du serveur srv-log :

Code BASH :
:source, !isequal, "srv-log" *.* ?DynamicFile


On redémarre le service rsyslog :

Sous systemd (CentOS, Debian) :
Code BASH :
systemctl restart rsyslog


Sous OpenRC (Gentoo) :
Code BASH :
/etc/init.d/rsyslog restart


Et maintenant dans le dossier /var/log/syslogclients/ on a un fichier syslog.log par hôte :


Code BASH :
# ls /var/log/syslogclients/
192.168.21.140-syslog.log  srv-log-syslog.log



Code BASH :
# cat /var/log/syslogclients/192.168.21.140-syslog.log
Feb  6 18:47:02 srv-centos1 sshd[924]: Received disconnect from 192.168.21.200 port 54469:11: disconnected by user
Feb  6 18:47:02 srv-centos1 sshd[924]: Disconnected from 192.168.21.200  port 54469
Feb  6 18:47:02 srv-centos1 sshd[924]: pam_unix(sshd:session): session closed for user root
Feb  6 18:47:04 srv-centos1 sshd[939]: Accepted password for root from 192.168.21.200  port 54528 ssh2
Feb  6 18:47:04 srv-centos1 systemd-logind: New session 262 of user root.
Feb  6 18:47:04 srv-centos1 sshd[939]: pam_unix(sshd:session): session opened for user root by (uid=0)


Plus d'infos sur les templates rsyslog sur la documentation officielle : https://rsyslog.readthedocs.io/en/latest/configuration/templates.html
Cette page a été vue 46659 fois