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 là. 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 :Puis, cliquez sur installer « l’App » à partir du fichier.
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.
Il vous faudra enfin redémarrer Splunk, soit en ligne de commande, soit directement depuis l’interface.Le message indique le plugin s’est installé correctement.
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.
Puis, en supposant que vos logs sont sur la même machine que Splunk, sélectionner surveiller fichiers et répertoires :
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.
avant de cliquer sur suivant en haut :Sé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 :
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!).
Cela devrait vous donner la fenêtre suivante avant de cliquer sur Revoir.
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.
Et 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
Titre | Requê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 :
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.
Petite coquille, je pense qu’il manque un « un », « Bon on a bel index, on … »
Merci pour la partage =)
Merci, c’est corrigé.