Linux : envoyer les logs vers Graylog avec rsyslog
Sommaire
I. Présentation
Dans ce tutoriel, nous allons apprendre à configurer une machine Linux pour qu'elle envoie ses journaux (logs) vers un serveur Graylog. Pour cela, on va procéder à l'installation et à la configuration de Rsyslog sur le système.
Pour suivre ce tutoriel, vous avez besoin d'un serveur Graylog et d'une machine sous Linux (Debian, Ubuntu, Rocky Linux, etc...). Pour rappel, dans un précédent article, nous avions appris à installer Graylog sur Debian :
L'installation de Graylog ne sera pas abordée dans ce tutoriel, mais nous verrons comment configurer notre puits de logs pour recevoir les journaux de machines Linux. Pour ma part, la machine qui doit envoyer ses logs sur Graylog est une machine nommée "srv-docker" sous Debian 12.
II. Configurer Graylog pour recevoir les logs Linux
Nous allons commencer par la configuration de Graylog. Il y a trois étapes à accomplir :
- La création d'un Input pour créer un point d'entrée permettant aux machines Linux d'envoyer les journaux Syslog via UDP.
- La création d'un nouvel Index pour stocker et indexer tous les journaux Linux.
- La création d'un Stream pour router les journaux reçus par Graylog vers le nouvel Index Linux.
A. Créer un Input pour Syslog
Connectez-vous à l'interface de Graylog, cliquez sur "System" dans le menu puis sur "Inputs". Dans la liste déroulante, sélectionnez "Syslog UDP" puis cliquez sur le bouton intitulé "Launch new input". Il est également possible de créer un Input Syslog en TCP, mais cela implique d'utiliser un certificat TLS : c'est un plus pour la sécurité, mais ce point ne sera pas abordé dans cet article.
Un assistant va s'afficher à l'écran. Commencez par donner un nom à cet Input, par exemple "Graylog_UDP_Rsyslog_Linux" et choisissez un port. Par défaut, le port est "514" mais vous pouvez le personnaliser. Ici, le port "12514" est retenu.
Vous pouvez aussi cocher l'option "Store full message" pour que le message de log complet soit stocké dans Graylog. Cliquez sur "Launch Input".
Le nouvel Input a été créé et il est désormais actif. Désormais, Graylog peut recevoir les logs Syslog sur le port 12514/UDP, mais nous n'en avons pas fini avec la configuration de l'application.
Remarque : un seul Input peut être utilisé pour stocker les journaux de plusieurs machines Linux.
B. Créer un nouvel Index Linux
Nous devons créer un Index dans Graylog pour stocker les journaux des machines Linux. Un index dans Graylog est une structure de stockage qui contient les logs reçus, c'est-à-dire les messages reçus. Graylog utilise OpenSearch comme moteur de stockage et les messages sont indexés pour permettre des recherches rapides et efficaces.
À partir de Graylog, cliquez sur "System" dans le menu puis sur "Indices". Au sein de la nouvelle page qui s'affiche, cliquez sur "Create index set".
Nommez cet index, par exemple "Linux Index", ajoutez une description et un préfixe, avant de valider. Ici, nous allons stocker tous les journaux Linux dans cet index. Il est également possible de créer des index spécifiques pour stocker uniquement certains logs (uniquement les logs SSH, du service Web, etc...).
Désormais, nous devons créer un nouveau stream pour router les messages vers cet index.
C. Créer un Stream
Pour créer un nouveau Stream, cliquez sur "Streams" dans le menu principal de Graylog. Ensuite, cliquez sur le bouton "Create stream" situé sur la droite. Dans la fenêtre qui apparaît, nommez le stream, par exemple "Linux Stream" et choisissez l'index "Linux Index" pour le champ nommé "Index Set". Validez.
Remarque : les messages correspondants à ce stream seront aussi inclus dans le "Default Stream", sauf si vous cochez l'option "Remove matches from 'Default Stream'".
Ensuite, dans les paramètres de votre steam, cliquez sur le bouton "Add stream rule" pour ajouter une nouvelle règle de routage des messages. Si vous ne trouvez pas cette fenêtre, cliquez sur "Streams" dans le menu, puis sur la ligne correspondante à votre stream, cliquez sur "More" puis "Manage Rules".
Choisissez le type "match input" et sélectionnez l'Input Rsyslog en UDP créée précédemment. Validez avec le bouton "Create Rule". Ainsi, tous les messages à destination de notre nouvel Input seront envoyés dans l'Index pour Linux.
Votre nouveau Stream doit s'afficher dans la liste et il doit être sur l'état "Running". La bande passante de message indique "0 msg/s" car pour le moment, nous n'envoyons aucun journal vers l'Input Rsyslog UDP. Pour voir les journaux d'un stream, cliquez simplement sur son nom.
Tout est prêt du côté de Graylog. Passons à la suite, à savoir la configuration de la machine Linux.
III. Installer et configurer Rsyslog sur Linux
Connectez-vous à la machine Linux, en local ou à distance, et utilisez un compte utilisateur disposant des permissions pour élever ses privilèges (via sudo). Sinon, utilisez directement le compte "root".
A. Installer le paquet Rsyslog
Commencez par mettre à jour le cache des paquets et installer le paquet nommé "rsyslog".
sudo apt-get update
sudo apt-get install rsyslog
Puis, vérifiez le statut du service. En principal, il est déjà en cours d'exécution.
sudo systemctl status rsyslog
B. Configurer Rsyslog
Rsyslog dispose d'un fichier de configuration principal situé à cet emplacement :
/etc/rsyslog.conf
En complément, le répertoire "/etc/rsyslog.d/" est utilisé pour stocker des fichiers de configuration supplémentaires pour Rsyslog. Dans le fichier de configuration principal, il y a une directive Include permettant d'importer tous les fichiers ".conf" situé ce répertoire. Ceci permet d'avoir des fichiers complémentaires pour configurer Rsyslog sans modifier le fichier principal.
Dans ce répertoire, vous devez utiliser des numéros pour définir l'ordre de chargement, parce que le chargement des fichiers se fait dans l'ordre alphabétique. Ainsi, le fait d'ajouter un préfixe numérique permet de gérer la priorité entre plusieurs fichiers de configuration. Ici, nous n'aurons qu'un seul fichier complémentaire, donc ce n'est pas gênant.
Dans ce répertoire, nous allons créer le fichier intitulé "10-graylog.conf" :
sudo nano /etc/rsyslog.d/10-graylog.conf
Dans ce fichier, insérez cette ligne :
*.* @192.168.10.220:12514;RSYSLOG_SyslogProtocol23Format
Voici comment interpréter cette ligne :
- *.* : signifie qu’on doit envoyer tous les logs Syslog de la machine Linux vers Graylog.
- @ : indique que le transport est effectué en UDP. Il convient de préciser "@@" pour basculer en TCP.
- 192.168.10.220:12514 : indique l’adresse du serveur Graylog, ainsi que le port sur lequel on envoie les logs (correspondant à l'Input).
- RSYSLOG_SyslogProtocol23Format : correspond au format des messages que l’on veut envoyer à Graylog.
Quand c'est fait, enregistrez le fichier et redémarrez Rsyslog.
sudo systemctl restart rsyslog.service
Suite à cette action, les premiers messages devraient arriver sur votre serveur Graylog !
IV. Afficher les journaux Linux dans Graylog
À partir de Graylog, vous pouvez cliquer sur "Streams" et sélectionner votre nouveau stream pour afficher les messages associés. Sinon, cliquez sur "Search" et effectuez la sélection de votre Steam et lancez une recherche.
Voici quelques éléments clés dans l'interface :
1 - Sélectionnez la période pour laquelle afficher les messages. Par défaut, ce sont les messages des 5 dernières minutes qui s'affichent.
2 - Sélectionnez le(s) stream(s) à afficher.
3 - Activer le refresh automatique de la liste des messages (toutes les 5 secondes, par exemple). Sinon, c'est statique et c'est à vous de faire un refresh manuel.
4 - Cliquez sur la loupe pour lancer la recherche après avoir modifié la période, le stream, ou le filtre.
5 - Barre de saisie pour indiquer vos filtres de recherche. Ici, je précise "source:srv\-docker" pour afficher uniquement les journaux de la nouvelle machine sur laquelle je viens de configurer Rsyslog.
Des journaux sont bien envoyés par la machine Linux :
V. Identifier un échec de connexion SSH
La force de Graylog, c'est d'indexer les journaux et de permettre de faire une recherche selon différents critères : machine source, horodatage, contenu du message, etc... Nous pourrions chercher à identifier les échecs de connexion effectués en SSH.
À partir d'une machine distante (le serveur Graylog, par exemple), tentez de vous connecter à votre serveur Linux sur lequel vous venez de configurer Rsyslog. Par exemple :
ssh [email protected]
Puis indiquez volontairement un nom d'utilisateur et un mot de passe incorrect, afin de générer des erreurs de connexion. Dans le fichier "/var/log/auth.log", ceci va générer des messages de logs similaires à celui-ci :
Failed password for invalid user it-connect from 192.168.10.199 port 50352 ssh2
Vous devriez retrouver ces messages sur Graylog.
Sur Graylog, utilisez le filtre de recherche suivant pour afficher uniquement les messages correspondants :
message:Failed password AND application_name:sshd
Si vous avez plusieurs serveurs et que vous souhaitez analyser les logs d'un serveur spécifique, précisez son nom en supplément :
message:Failed password AND application_name:sshd AND source:srv\-docker
Voici un aperçu du résultat sur une machine où j'ai généré plusieurs erreurs de connexion, à différents moments de la journée :
Les tentatives de connexion infructueuses sont effectuées à partir de la machine avec l'adresse IP "192.168.10.199". Si vous souhaitez en savoir plus sur l'activité de cet hôte, vous pouvez effectuer une recherche sur cette adresse IP. Graylog vous sortira tous les logs où cette adresse IP est référencée, sur tous les hôtes (pour lesquels l'envoi de logs est configuré).
Dans ce cas, le filtre à utiliser pourra être :
message:"192.168.10.199"
Nous obtenons des résultats supplémentaires (ce qui n'est pas étonnant, car nous ne filtrons pas sur l'application SSH) :
VI. Conclusion
En suivant ce tutoriel, vous devriez être en mesure de configurer une machine Linux pour qu'elle envoie ses logs sur un serveur Graylog. Ainsi, vous serez en mesure de centraliser les journaux de vos hôtes Linux dans votre puits de logs !
Pour aller plus loin, envisager de créer des tableaux de bords et des alertes pour recevoir une notification lorsqu'une anomalie est détectée.