rsyslog : Centralisation des logs sous Linux
Table des matières
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)
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 :
Sous Debian :
Sous Gentoo :
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é
On peut aussi afiner la sécurité des hôtes envoyant les logs :
On Active et on démarre le service.
Sous systemd (CentOS, Debian) :
Sous OpenRC (Gentoo) :
On vérifie que le(s) port(s) sont en écoute :
Les ports 514 et 10514 sont en écoute.
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
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 :
Après chaque modif du fichier de config, il est nécessaire de relancer le service rsyslog.
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 :
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 :
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 :
On redémarre le service rsyslog :
Sous systemd (CentOS, Debian) :
Sous OpenRC (Gentoo) :
Et maintenant dans le dossier /var/log/syslogclients/ on a un fichier syslog.log par hôte :
Plus d'infos sur les templates rsyslog sur la documentation officielle : https://rsyslog.readthedocs.io/en/latest/configuration/templates.html
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
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