Exploiter les alertes NtopNG

Exploiter les alertes NtopNG jpp

Note : cette description "date" un peu et une version plus récente est disponible ici.

Exploiter les alertes générées par NtopNG. 
Les dernières versions de NtopNG permettent d'activer un suivi d'alertes. Ces alertes sont levées pour différentes raisons :

  • Accès depuis une adresse "blacklistée" par utilisation d'une liste du site Emergingthreats.
  • Tentative d'accès à un port fermé ou bloqué
  • Autres anomalies de comportement

Or ces alertes sont stockées dans une base de données Sqlite et donc très faciles à exploiter. 
Les tables comportent le même type de renseignements que celles enregistrant les flux dans une base de données plus traditionnelle. 
Les principales données sont :

  • Données temporelles    . timestamp, firstswitched, lastswitched
  • Données sur le client.    . cli_addr, cli_country (code pays), cli_port
  • Données coté serveur.    . srv_addr, srv_country, srv_port
  • Données quantitatives.    . cli2srv_bytes, srv2cli_bytes, cli2srv_packets, srv2cli_packets
  • Données "techniques".    . flags IP, blacklist ou pas, .....

La conservation de ces données est ajustable dans le logiciel selon différents critères dans le paramétrage de NtopNG. 
Il vaut mieux limiter un peu le volume car Sqlite n'est pas adapté aux gros volumes. 
On peut repérer à partir de ces données tout "hit" sur un port fermé et par exemple bloquer cette adresse avec un "ipset" bien placé dans un règle de pare-feu. 
Le petit script suivant permet de repérer ces adresses IP :

select min(first_switched),cli_addr 
from flows_alerts 
where cli_addr not like '192.168.1%' 
  and cli_addr not like '192.168.2%' 
  and cli_addr not like '192.168.3%' 
  and cli_addr not like '%:%'            -- éliminer IPV6 
  and cli_addr not like '0.0.0.0' 
  and srv_port < 32768 
  and first_switched > ${DATEMIN} 
group by cli_addr 
order by first_switched;

Il faut éliminer : 
- les enregistrements "anciens", la date minimum est au format "epoch", j'utilise les deux dernières heures : 
    DATEMIN=$(date +%s) 
    DATEMIN=$(expr ${DATEMIN} - 7200) 
- les origines dans son propre réseau : 
- ceux qui utilisent des ports "client d'un service local", ici seuls les ports inférieurs à 32768 sont pris en compte. Voir ces limites avec la commande "sysctl -a | grep local_port_range" . 
Il est parfois un peu délicat de repérer les bases Sqlite car les noms de répertoires sont différents selon les machines. Pour moi le répertoire principal est /var/tmp/ntopng et les bases sont dans 
13/alerts/alerts_v7.db et 15/alerts/alerts_v7.db sur une machine, sur une autre machine les répertoires sont 1 et 3 donc très différents. 
Ce script est très rapide car la base Sqlite contient assez peu de rangs (moins de 5000) et peut être lancé par "cron" avec une fréquence importante pour alimenter régulièrement un "set" de blocage par IP.