Analyse de logs DHCP🔗

Posted by Médéric Ribreux 🗓 In projects/ ELK/

Introduction

Cette partie a pour objet de trouver le moyen d'obtenir le plus d'info possible des logs issus du serveur DHCP isc-dhcp-server. Ce dernier s'installe assez facilement et permet de gérer l'affectation des adresses IP.

Analyse

Voici les éléments qu'on cherche à analyser:

Contenu des logs

Voici le contenu d'un log DHCP:

Aug 29 23:59:09 medspx dhcpd: DHCPREQUEST for 192.168.0.22 from 74:29:af:2f:80:fb via eth0

Métriques

A partir de ces logs, on peut extraire les métriques suivantes:

Avec ces métriques, on doit pouvoir réaliser des statistiques intéressantes.

Fichier de configuration de logstash

Voici un exemple de filtre logstash qui capturera les différentes variables évoquées ci-dessus.

input {
  file {
      path => "/home/medspx/projects/ELK/test/datasource/dhcpd/dhcpd.log"
      start_position => beginning
      type => "dhcpd"
  }
}

filter {
  if [type] == "dhcp" {
    grok {
      match => [ "message" , "%{SYSLOGTIMESTAMP:syslog_timestamp} %{SYSLOGHOST:syslog_hostname} %{DATA:syslog_program}(?:\[%{POSINT:syslog_pid}\])?: %{GREEDYDATA:syslog_message}" ]
    }
    date {
      locale => "en"
      match => [ "syslog_timestamp", "MMM  d HH:mm:ss", "MMM dd HH:mm:ss" ]
    }
    if [syslog_message] =~ /^DHCPACK|^DHCPREQUEST|^DHCPOFFER|^DHCPNAK|^DHCPRELEASE/ {
      grok {
        match => [ "syslog_message", "(?<dhcp_action>.*) (of|on|for|to) %{IP:src_ip}.* (from|to) %{MAC:mac_address}.* via (?<iface>.*)" ]
      }
    }
    if [syslog_message] =~ /^DHCPDISCOVER/ {
      grok {
        match => [ "syslog_message", "(?<dhcp_action>.*) from %{MAC:mac_address}.* via (?<iface>.*)" ]
      }
    }
    if [syslog_message] =~ /^DHCPINFORM/ {
      grok {
        match => [ "syslog_message", "(?<dhcp_action>.*) from %{IP:src_ip}.* via (?<iface>.*)" ]
      }
    }
  }
}

Reporting

Introduction

Grâce au filtre logstash précédent, nous disposons de quelques variables. Que faire avec ? Voici ce que j'ai imaginé:

Comme d'habitude, n'oubliez pas de rafraîchir vos champs (Settings → Logstash-* → bouton Refresh).

Métrique: Visualiser les demandes DHCP en fonction du temps

Ce métrique est très simple. Voici la recette pour le constituer:

Métrique: Lister les adresses MAC qui font des demandes DHCP en les classant par nombre de requêtes.

Cette fois, nous allons utiliser une simple table.

Métrique: Lister les adresses IP les plus attribuées.

Ici aussi, nous allons utiliser une simple table.

Métrique: Quelle est la répartition des types de requêtes DHCP.

Pour ce cas simple, un simple camembert fait l'affaire.

Métrique: Lister les adresses MAC qui font l'objet d'un rejet de la part du serveur.

Ici, il faut filtrer les données selon le contenu du message syslog. En effet, voici un log qui précise un rejet:

Aug 30 13:09:51 medspx dhcpd: DHCPDISCOVER from 00:07:cb:c0:ee:22 via eth0: network 192.168.0.0/24: no free leases

Nous allons utiliser une table (normalement, le nombre de rejet doit être faible):

Conclusion

Voilà, avec ces mesures, on peut mieux observer ce qui se passe pour le DHCP sur le réseau local. On peut identifier les machines qui demandent des baux à répétition assez facilement et modifier les paramètres du client DHCP pour faire baisser le nombre de requêtes (durée du bail par exemple). On peut également voir quelles sont les adresse MAX qui font des demandes et voir s'il n'y a pas des machines non autorisées qui tentent de rejoindre le réseau local IP.

Cette nouvelle source de données vous permettra de continuer à réduire la charge sur votre réseau local et sur le service DHCP.

On peut aller plus loin en tentant d'écrire un filtre logstash qui traduirait les adresses MAC en nom de machines ou en utilisant le filtre translate pour le faire (pas vraiment dynamique mais mieux que rien).