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 :
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 :
Puis ajouter un nouveau fichier de table de lookup :
Téléverser le CSV que vous voulez :
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 Ce 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.