Intégration et analyse des logs iptables dans Splunk

Splunk Logo

Salut à tous, aujourd’hui on va regarder ce qu’on peut tirer de nos logs iptables dans Splunk. Dans mon dernier article sur iptables je vous ai déjà montré comment configurer les logs iptables, on va voir dans ce TP comment les intégrer simplement dans Splunk et ce qu’on peut tirer des logs iptables dans Splunk.

Intégrer les logs iptables dans Splunk

Dans le premier TP je vous ai déjà montré comment ajouter des logs via une app dédiée, on va recommencer dans la mesure où une app existe aussi pour iptables (source) ! Elle a un prérequis qui est que le champ de log doit être préfixé par « ACTION= ». Ça tombe bien, c’est ce que j’ai fait précédemment (à croire que je savais où j’allais, incroyable). Vous pouvez donc suivre facilement les même étapes que pour intégrer les logs Nginx, mais avec le fichier /var/log/iptables.log et le source type linux:netfilter. Je vous conseille encore une fois d’utiliser un index dédié avec un politique de rétention adaptée à vos logs de firewall et votre espace disque.

Analyse de logs iptables avec Splunk

Je vous propose ci-dessous quelques recherches sur vos log iptables pour évaluer un peu le trafic généré par ou vers votre serveur.

Camembert des actions sur vos paquets.

index=iptables | stats count by ACTION

Vos plus gros clients.

index=iptables dest=<votreIP> | top src

Les machines que vous contactez le plus.

index=iptables src=<votreIP> | top dest

Statistique sur les ports en entrée qui passent le firewall au cours de la journée.

index=iptables ACTION="ACCEPT-INPUT" | timechart span=1h count by dest_port

Idem mais pour ceux refusés.

index=iptables ACTION!="ACCEPT-INPUT" | timechart span=1h count by dest_port

Proportion de trafic autorisé vers la machine.

index=iptables| timechart span=30min count by ACTION

Clients avec du trafic autorisé réparti par pays.

index=iptables ACTION="ACCEPT-INPUT" | iplocation src_ip | table src_ip lat, lon, Country, Action | stats count by Country | geom geo_countries featureIdField="Country"

L’IP se prenant le plus de refus.

index=iptables ACTION!="ACCEPT-INPUT" | stats count by src | head 1 | lookup dnslookup clientip as src OUTPUT clienthost as src_ns

Les 50 ports les moins demandés.

index=iptables | rare limit=50 dest_port

Les 50 ports les plus demandés.

index=iptables dest!=163.172.218.255 | top limit=50 dest_port

Retour sur expérience du piège à port-scanner configuré précédemment (techniquement il peut rester quelques paquet en states INVALID dans cette action mais bon peut vérifier par rapport aux différents ports qu’on avait « piégés ») : qui se fait jeter à cause de tentatives de scans ?

index=iptables ACTION=DROP-INPUT dest_port=21 OR dest_port=23 OR dest_port=111 OR dest_port=139 OR dest_port=445 OR dest_port=1433 OR dest_port=3389 | stats count values(dest_port) by src_ip | sort - count | head 50 | lookup dnslookup clientip as src_ip OUTPUT clienthost as src_ns

Pour analyse de la protection DDOS RAW avec hashlimit.

index=iptables ACTION=DROP-RAW

Idem en drop paquets non conformes..

index=iptables ACTION=DROP-PREROUTING

Les 10 derniers logs.

index=iptables | head 10

D’autres idées de recherches sur ce blog.

Dashboard iptables !

Et voilà ce que ça peut donner en vrai comme dashboard maison :

logs iptables dans Splunk - dashboard iptables

Lookup – network service name

On va se terminer en créant un petit lookup pour identifier les services réseaux associés à nos numéros de port. La version facile consiste à télécharger un CSV tout prêt sur le site du iana. Le CSV est téléchargeable ici. Mais il nécessite un peu de traitement pour être intégrable dans Splunk.

L’autre option est d’en générer un à partir du fichier /etc/services proposé avec nmap et qui référence les couples services/port pour l’appli. Et de le passer à la moulinette d’une regex pour en faire un csv. Je vous donne une belle regex avec sed pour faire ça :

awk 'NF' /etc/services | grep -v "^#" | sed -e "s/^\(\S\+\)\s\+\(\S\+\)\/\(\S\+\)\s*\([^#]\+\)\?#\?\s\?\(.*\)/\1, \2, \3, \4, \5/gm" > network_services.csv && sed -i '1i service_name, port, protocol, alias, comment' network_services.csv

Ensuite, pour en faire un lookup de votre CSV dans Splunk :

logs iptables dans Splunk - lookup services

Puis ajouter un nouveau fichier de table de lookup :

logs iptables dans Splunk - lookup services

Téléverser le CSV que vous voulez :

logs iptables dans Splunk - lookup services

Vous pouvez d’ores et déjà vérifier le contenu de votre lookup à l’aide de la commande Splunk :

| inputlookup network_services.csv

Mais on ne va pas s’arrêter là et on va définir notre lookup directement dans Splunk. Pour cela, revenez dans l’écran de configuration « Lookups » et cliquer sur Définitions de lookup « ajouter un nouveau » :

Et créer un lookup logs iptables dans Splunk - lookup servicesCe qui vous permettra de croiser vos connexions avec leurs ports associés :

index=iptables | top limit=50 dest_port,PROTO | lookup network_services port as dest_port,protocol as PROTO OUTPUT service_name

Conclusion

Pour conclure, quelques trucs rigolos que j’ai découvert en préparant ce TP sur les logs iptables dans Splunk. D’abord, je me suis aperçu en analysant les log iptables du serveur de geekeries.org que trois machines dans mon subnet IPv4 me spammait comme des porcs en UDP sur un obscur port UDP utilisé par plex, et à raisons de plusieurs centaines de paquets par minute. J’ai donc blacklisté ces machines en amont dans mes règles iptables. Autre exemple, l’analyse des ports-scanner permet aussi de construire une liste des IP « peu fréquentables » récurrentes : à blacklister sans scrupule. Enfin et surtout cela m’a permis d’obtenir une vision très fine de l’activité réseau du serveur des période d’activité des différents services hébergés.

Voilà c’est tout pour aujourd’hui et sauf révolution dans une prochaine version d’iptables cela devrait conclure ma série d’article sur iptables. On se voit prochainement pour parler de l’IPS suricata et de Splunk.

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.