Intégrer des logs Nginx dans Splunk

Splunk Logo

Salut à tous, voici le second article de la série sur Splunk et aujourd’hui on va voir comment intégrer des logs Nginx dans Splunk, et ce qu’on peut en tirer dans un dashboard simple. Je vous invite à jeter un coup d’œil à mes précédents articles concernant Nginx du coup.

Apps Splunk pour NGINX.

Splunk propose un Add-on spécifique pour logs NGINX, vous pouvez le télécharger ici, mais aussi suivre la documentation . On ne va pas s’embêter à définir notre propre format de données et on va utiliser le leur directement. Depuis la page d’accueil commencez par cliquer sur l’engrenage à côté de Apps :Intégrer des logs Nginx dans SplunkPuis, cliquez sur installer « l’App » à partir du fichier.

Intégrer des logs Nginx dans Splunk

Et téléversez sur votre serveur le fichier splunk-add-on-for-nginx_100.tgz que vous avez préalablement téléchargé sur votre machine.

Intégrer des logs Nginx dans Splunk

Il vous faudra enfin redémarrer Splunk, soit en ligne de commande, soit directement depuis l’interface.Intégrer des logs Nginx dans SplunkLe message indique le plugin s’est installé correctement.

Intégrer des logs Nginx dans Splunk

Configurer NGINX avoir des logs au format attendu par Splunk.

L’Add-on Nginx supporte le format de logs par défaut de Nginx mais propose aussi une configuration de format de journaux plus complète, avec l’explication suivante :

« The Splunk Add-on for NGINX can ingest the NGINX access log in both the predefined combined format and the custom key-value pair format. Splunk recommends using the custom key-value pair format, which contains more verbose information and is easier to parse. »

Là, j’ai envie de dire : c’est vous qui voyez ! Ce que ne dit pas Splunk, c’est que le format paire clé-valeur proposé est aussi beaucoup plus verbeux et consommera en conséquence un volume de log sur votre licence plus important. L’idéal est logiquement de définir par vous-même un format de log pour Nginx et minimaliste en taille (i.e. octets) par ligne de log, puis de définir par vous-même le sourcetype associé à ce format dans Splunk. Ici, et de manière à simplifier et aussi pour qu’on parle tous la même langue dans ces articles (et vu que j’ai de la marge avant de faire 500Mo de log par jour sur Nginx…), je vais utiliser le formatage des logs proposé par Splunk.

Pour ça, rendez-vous dans les fichiers de configuration de votre serveur web (sur Debian 9 :  /etc/nginx/nginx.conf) et ajouter ou remplacer la ligne de configuration des logs par celle proposée par Splunk :

log_format splunk 'site="$server_name" server="$host" dest_port="$server_port" dest_ip="$server_addr" '
                   'src="$remote_addr" src_ip="$realip_remote_addr" user="$remote_user" '
                   'time_local="$time_local" protocol="$server_protocol" status="$status" '
                   'bytes_out="$body_bytes_sent" bytes_in="$upstream_response_length" '
                   'http_referer="$http_referer" http_user_agent="$http_user_agent" '
                   'nginx_version="$nginx_version" http_x_forwarded_for="$http_x_forwarded_for" '
                   'http_x_header="$http_x_header" uri_query="$query_string" uri_path="$uri" '
                   'http_method="$request_method" response_time="$upstream_response_time" '
                   'cookie="$http_cookie" request_time="$request_time" ';

Il faut ensuite indiquer dans la configuration de chaque site que cette dernière doit utiliser la configuration nommé splunk ci-dessus.

access_log /var/log/nginx/geekeries-access.log splunk;
error_log /var/log/nginx/geekeries-error.log;

Je vous recommande de vérifier que la configuration est bien acceptée par Nginx, avant de redémarrer le service.

# nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
# systemctl restart nginx

Intégrer des logs Nginx dans Splunk

Un fois vos logs au bon format, depuis le menu cliquer sur Ajouter des données.Intégrer des logs Nginx dans Splunk

Puis, en supposant que vos logs sont sur la même machine que Splunk, sélectionner surveiller fichiers et répertoires :

Intégrer des logs Nginx dans Splunk

Indiquer alors /var/log/nginx dans le champs fichier ou répertoire, ou le chemin complet vers votre fichier de log Nginx si vous avez de multiple site.

Intégrer des logs Nginx dans Splunk

avant de cliquer sur suivant en haut :Intégrer des logs Nginx dans SplunkSélectionner alors le type de source key-value du plugin pour Nginx : nginx:plus:kv.

Vérifier que les données sont correctement interprétés dans l’aperçu de droite (attention, vos anciens logs avant application de la configuration Nginx restent au format « combined » et non pas Key-Value et peuvent donc remonter en erreur. Pensez à faire un logrotate si besoin), puis cliquer sur suivant :

Intégrer des logs Nginx dans Splunk

Configurer ensuite votre entrée, vous pouvez laisser les paramètres par défaut mais je vous recommande de créer un nouvel index nommé Nginx qui regroupera tous vos logs issus du serveur web. Cela vous permettra de gérer intelligemment le volume maximum de log de votre serveur web que vous souhaitez conserver dans Splunk (attention à ne saturer votre disque, à vous de voir combien d’espace disque vous comptez allouer à Splunk) et au bout de combien de temps vous effacerez les logs ainsi enregistrés. De façon générale, il est intéressant de créer des index séparés par groupe de données (exemple : tous vos sites web dans un index, tous vos logs de sécurité dans un autre) de façon à pouvoir gérer finement les limites de tailles et de rotation temporelle. Bref, à vous de voir comment vous organiserez vos données dans vos index Splunk (RTFM!).

Intégrer des logs Nginx dans SplunkCela devrait vous donner la fenêtre suivante avant de cliquer sur Revoir.

Intégrer des logs Nginx dans Splunk

Et voilà, recommencez l’opération pour chaque fichier de log Nginx de type acces.log et vous aurez un bel index Splunk peuplé avec vos log Nginx.

Pour les logs d’erreurs, utilisez le même index Nginx et intégrez vos fichiers error.log dans le dossier Nginx. Mais cette fois utilisez le type de données nginx:plus:error au lieu de nginx:plus:kv.

Intégrer des logs Nginx dans SplunkEt il n’y a plus qu’à vous servir de la recherche pour voir ce qu’il y a dans les logs !

index=nginx ...

Suppression des logs de plus d’un an

On a créé un index de 50 Go au maximum, mais je souhaite supprimer les données de cet index qui auront plus d’un an, quoiqu’il arrive. Pour cela, il faut modifier le fichier /opt/splunk/etc/apps/search/local/indexes.conf et rajouter la ligne suivante.

frozenTimePeriodInSecs = 31536000

Qui placera tous les logs de plus 31 536 000 secondes en frozen. La subtilité c’est que, par défaut, Splunk supprime les logs passés en frozen (doc !). Donc rien besoin de faire d’autre pour que les logs de plus d’un an soit détruits, en dehors de redémarrer Splunk.

/opt/splunk/bin/splunk restart
Stopping splunkd...
Shutting down. Please wait, as this may take a few minutes.

Splunk’é vos logs Nginx !

Bon on a un bel index, on va essayer de se construire un petit tableau de bord Nginx pour suivre l’activité du site web geekeries.org. Voici quelques exemples de recherches

TitreRequête Splunk
Tableau de suivi d’activité basé sur le nombre de log par tranche d’une heure :
index=nginx site="geekeries.org" | timechart span=1h count
Pays accédant le plus à geekeries.org :
index=nginx site="geekeries.org" | iplocation src_ip | table src_ip lat, lon, Country | stats count by Country | sort - count

Carte des accès sur les dernières 24h.

index=nginx site="geekeries.org" | iplocation src_ip | table src_ip lat, lon, Country | geostats latfield=lat longfield=lon count

Version regroupée par Pays :

index=nginx "geekeries.org" | iplocation src_ip | table src_ip lat, lon, Country | stats count by Country | geom geo_countries featureIdField="Country"

Page les plus accédées sur le site :
index=nginx "geekeries.org" NOT "wp-admin" | stats count by http_referrer | sort - count
User agent les plus courant sur votre site :
index=nginx "geekeries.org"| top limit=20 http_user_agent
Nombre de visiteurs unique (« IP ») sur la période :
index=nginx "geekeries.org" | stats distinct_count(src_ip)
Pages en erreur :
index=nginx "geekeries.org" | timechart count(status) span=1h by status

Informations sur les temps de réponses du serveur :

index=nginx "geekeries.org"| stats min(response_time), max(response_time), avg(response_time), median(response_time), sparkline(count)

D’autres idées pour votre dashboard sur ce très bon post.

Volume de licence utilisé

Note, vous pouvez contrôler l’usage de votre licence par jour par index via cette page (doc)

index=_internal source=*license_usage.log type="Usage" splunk_server=* earliest=-1w@d idx=nginx | timechart span=1d eval(sum(b)/(1024*1024)) as volume_mb by idxµ

Et voici un joli dashboard :

Dashboard Splunk pour Nginx

Mais c’est quoi l’intérêt ?

Alors je vous vois venir avec votre « Ouais mais, moi j’ai Google Analytics sur mon site donc j’ai déjà tout ça, ça ne fait rien de plus ta bouse. » L’intérêt ? c’est que vous bossez sur vos propres logs et pas sur ce que le client veut bien vous renvoyer avec ses 18 bloqueurs de publicités empilé. On va faire un petit comparatif de mes données Google Analytics histoire que vous vous rendiez un peu comptes de ce que ça donne.

  • Google Analytics (ou GA pour les intimes) me donne 674 visiteurs unique sur une semaine, Splunk 2850…
  • L’ordre dans les pages les plus consulté change un peu, mais rien de révolutionnaire.
  • Analytics mesure un temps de réponse moyen de 0,27s du serveur, Splunk 0.22s.
  • GA me donne un top 3 des pays accédant en France, Maroc, Tunisie, Splunk lui indique : France, USA, Chine.

Je pense que vous avez compris, on ne travaille pas sur les mêmes données. Splunk et vos logs Nginx vous donne l’usage « réel » de votre serveur et compte donc les bots, les scans, les crawlers et toute la faune que l’on trouve sur internet. De son côté GA, accède à des données utilisateurs (âge, sexe, centre d’intérêts) et ne compte que les utilisateurs sans bloqueurs de publicités et traceurs.

Ces données sont donc complémentaires et non pas en doublons, et comme on le verra dans les TP suivants, Splunk permet aussi de croiser les données de ces index avec d’autres sources que vous pourriez avoir sur votre serveur : autres site web, firewall, IPS enfin n’importe quoi générant des logs.

That’s all folks, j’espère que vous avez compris comment intégrer des logs Nginx dans Splunk. Je vous dis à bientôt pour le prochain TP Splunk.

2 commentaires on “Intégrer des logs Nginx dans Splunk

  1. Petite coquille, je pense qu’il manque un « un », « Bon on a bel index, on …  »

    Merci pour la partage =)

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur comment les données de vos commentaires sont utilisées.