Blog CLEMANET
Systèmes et réseaux

Envoyer les logs nginx vers un serveur Graylog

L'objectif est de rediriger les logs vers un serveur de logs Graylog.

Voici le schéma:

schéma redirection de logs

Pour cet article, le serveur web est installé sur un serveur raspberry pi.

Le serveur Graylog est installé sur une distribution Linux Centos.

Configuration de la redirection de logs sur le serveur web

Il faut indiquer la redirection dans la configuration de nginx. On recherche les deux lignes de logs (access_log et error_log), puis on ajoute une ligne pour la redirection.

Les logs seront redirigés vers le port 1514 dans cet exemple.

pi@Raspi:~ $ sudo vi /etc/nginx/nginx.conf

       access_log /var/log/nginx/access.log;
       error_log /var/log/nginx/error.log;

       access_log syslog:server=192.168.1.116:1514,facility=local7,severity=info;
       error_log syslog:server=192.168.1.116:1514,facility=local7 warn;

Puis on redémarre le serveur nginx.

pi@Raspi:~ $ sudo systemctl restart nginx.service
pi@Raspi:~ $

Configuration de Graylog pour la réception des logs

Il faut aller dans l'onglet System/Inputs.

ajout de logs dans graylog

On ajoute une entrée Raw/Plaintext UDP.

On configure au moins un Titre. Le port sera modifié avec la valeur 1514 et on enregistre la configuration.

Vérification de l'entrée graylog

Enfin, on vérifie que l'entrée est active.

ajout de logs dans graylog

Bien sur, il faut ouvrir le port 1514 UDP sur le firewall:

[root@Graylog ~]# firewall-cmd --zone=public --add-port=1514/udp --permanent
success
[root@Graylog ~]# systemctl restart firewalld.service
success
[root@Graylog ~]# firewall-cmd --list-port
9000/tcp 1514/udp
[root@Graylog ~]# 

Et voici la visualisation des logs dans l'interface de Graylog.

Visualisation des logs dans graylog

Configuration de la partie extracteur (extractor) de donnée

Pour pouvoir agréger les données ou les filtrer, il est utile de séparer la ligne de logs en plusieurs champs que l'on pourra nommer.

C'est le role de l'extracteur.

Deux façons de faire :

  • en cliquant sur un message puis en sélectionnant "Create extractor",

  • en allant dans le menu System/Inputs puis, pour l'entrée "Logs-nginx", on clique sur le bouton "Manage extractors".

On choisit ici de partir d'un message.

créer un extracteur de logs

Ensuite, il faut choisir le type d'extracteur de donnée.

On choisit ici un modèle Grok.

choisir le type d'extracteur

Ensuite, il est possible de tester le modèle d'extraction de donnée.

Pour la requête du serveur Nginx, le modèle Grok configuré ici est:

<%{BASE10NUM}>%{MONTH} %{MONTHDAY} %{TIME} %{HOSTNAME} %{WORD:Service}: %{IP:srcIP} - - \[%{HTTPDATE:timestamp}\] "GET %{URIPATH} HTTP/%{NUMBER:httpversion}" %{BASE10NUM:codeHTTP} %{BASE10NUM:bytes} "%{URI}" "%{GREEDYDATA:Navigateur}"

exemple de chaine d'extracteur

On récupère dans ce modèle les IP sources, les pages chargées, le type de navigateur, ... Et on pourra ensuite faire des tris ou des regroupements sur ces types de donnée.

Enfin, quelques paramètres pour l'application du modèle et notamment la possibilité d'appliquer un filtre sur l'extraction.

exemple de chaine d'extracteur

On valide et nous pouvons extraire facilement des données à partir des trames.

Par exemple, la liste des codes http retournés dans l'ensemble des trames:

exemple d'utilisation d'extracteur

Quelques options pour la configuration de l'extracteur (extractor)

Si c'est un peu chargé au niveau des champs, il est possible de ne pas prendre en compte certain champ avec le mot clé unwanted.

Ca donne par exemple:

<%{BASE10NUM:UNWANTED}>%{MONTH:UNWANTED} %{MONTHDAY:UNWANTED} %{TIME} %{HOSTNAME} %{WORD:Service}: %{IP:srcIP} - - \[%{HTTPDATE:timestamp}\] "GET %{URIPATH} HTTP/%{NUMBER:httpversion}" %{BASE10NUM:codeHTTP} %{BASE10NUM:bytes} "%{URI}" "%{GREEDYDATA:Navigateur}"