Analyse de logs Syslog🔗

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

Introduction

Cette partie a pour objet de trouver le moyen d'obtenir le plus d'informations possible des logs issus de Syslog. Il serait trop ambitieux de travailler sur l'ensemble des choses qui passent par syslog. C'est pourquoi je m'attarderai sur deux exemples d'intérêt: dovecot, un serveur IMAP et les logs de rejets de firewall.

Contenu des logs

Avant de commencer, étudtions un peu ce qu'on peut récupérer dans un log syslog:

...
Sep  6 05:05:30 medspx kernel: [2399673.305129] [ipv4 netfilter DROP]:IN= OUT=eth0 SRC=192.168.0.4 DST=46.4.123.172 LEN=40 TOS=0x00 PREC=0x00 TTL=64 ID=44734 DF PROTO=TCP SPT=443 DPT=59802 WINDOW=0 RES=0x00 RST URGP=0
Sep  5 16:23:10 medspx dovecot: imap-login: Login: user=<mederic.ribreux>, method=PLAIN, rip=192.168.0.254, lip=192.168.0.4, mpid=17931, TLS, session=<qEGAwQAfGQDAqAD+>
Sep  5 17:10:21 medspx dovecot: imap(mederic.ribreux): Disconnected: Logged out in=1980 out=275168
...

J'ai mis uniquement les logs qui nous intéressent: dovecot et netfilter. On voit bien qu'il y a une racine commune à tous les logs qui passent par syslog: on trouve un timestamp suivi du nom d'hôte et du programme qui envoie dans syslog. Au delà de ces éléments, on récupère le contenu du log qui est fonction du programme qui remonte de l'information.

En ce qui concerne netfilter (firewall), le message est assez standard et contient beaucoup d'informations. En ce qui concerne Dovecot, on voit essentiellement des traces de connexions suivies de déconnexions et également des messages d'erreur (non visibles). Il va falloir faire du tri.

Capturer l'information du log

Logstash vient avec un filtre grok pour la base syslog. Il s'agit de SYSLOGBASE. Pour le reste, il faut faire à la main !

En ce qui concerne netfilter, on peut récupérer:

En ce qui concerne Dovecot, nous allons nous concentrer sur les demandes de connexions. Elles permettent de récupérer l'identifiant de l'utilisateur connecté ainsi que l'adresse IP à partir de laquelle la connexion est réalisée. Si vous voulez tracer plus de choses sous Dovecot, libre à vous !

Fichier de configuration de logstash

Voici les entrées et les filtres pour Logstash qui correspond à la configuration cible exposée ci-dessus. Nous allons ajouter un type nommé syslog pour identifier les logs de syslog des autres. Mais nous devos aussi aller plus loin et identifier dans un champ ce qui relève de dovecot ou de netfilter. Cela permettra de simplifier les requêtes et d'alléger les temps de traitement.

# Entrée d'un fichier Syslog
file {
  path => "/home/medspx/projects/ELK/test/datasource/syslog/syslog.log"
  start_position => beginning
  type => "syslog"
}

filter {
  # Filtres basés sur syslog
  if [type] == "syslog" {
    if [message] !~ /dovecot: imap-login/ and [message] !~ /netfilter/ {
      drop { }
    }
    # Filtre pour les connexions dovecot (imap)
    if [message] =~ /dovecot: imap-login/ {
      grok {
        patterns_dir => "./patterns"
	add_field => { "syslog_type" => "dovecot" }
	match => { "message" => "%{SYSLOGBASE} imap-login: Login: user=\<(?<dovecot_user>[^\>]+)\>, method=%{WORD:dovecot_method}, rip=%{IP:dovecot_remote_ip}" }
      }
    }
    # Filtre pour netfilter
    if [message] =~ /ipv(4|6) netfilter DROP/ {
     grok {
       patterns_dir => "./patterns"
       add_field => { "syslog_type" => "netfilter" }
       match => { "message" => "%{SYSLOGBASE} .* \[ipv(4|6) netfilter DROP\]:IN=( |%{NOTSPACE:netfilter_in} ).*OUT=( |%{NOTSPACE:netfilter_out} ).*SRC=%{IP:netfilter_src} DST=%{IP:netfilter_dst}.*PROTO=%{WORD:netfilter_proto}.*SPT=%{POSINT:netfilter_spt}.*DPT=%{POSINT:netfilter_dpt}" }
       }
    }
    date {
      match => [ "timestamp", "MMM dd HH:mm:ss", "MMM  d HH:mm:ss" ]
    }
  }
}

Notez le timestamp pour récupérer la date de l'évènement. On doit présenter plusieurs motifs (MMM dd et MMM d) pour que la conversion se fasse correctement.

Pour identifier le type de log analysé, on utilise la directive add_field de manière statique.

Reporting

Introduction

Grâce aux filtres logstash précédents, nous disposons de quelques variables que nous allons exploiter. Voici ce que j'ai imaginé:

Netfilter:

Dovecot:

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

Métrique: Nombre de requêtes bloquées selon le temps.

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

Métrique: Les principaux ports bloqués

Ici, nous allons utiliser une table de données avec des entrées multiples.

Métrique: Les 10 adresses externes les plus bloquées

Encore une fois, nous allons afficher une table de données.

Autre métrique assez simple qui travaille sur le champ domain que nous avons défini dans le filtre Logstash.

Métrique: Histogramme des connexions Dovecot selon le temps

C'est le même principe que pour netfilter, seul le filtre change.

Métrique: Quelles sont les 10 adresses IP qui font le plus de connexions au serveur Dovecot ?

Pour cette mesure, nous allons utiliser une table.

Conclusion

Ce qui est bien avec syslog, c'est que Logstash assure le motif de gestion de la date. Au delà, c'est à vous de vous débrouiller mais maintenant, vous avez l'habitude… A vous d'élaborer les motifs qui correspondent à ce que vous cherchez. D'autre part, il sera sans doute nécessaire d'adopter une politique de nommage de champs. En effet, Elasticsearch n'est pas une base de données et Kibana vous permettra de faire des requêtes sur des champs qui n'existent pas pour une série de données.

Avec syslog, on peut rapidement avoir un volume de logs important. Il faudra y faire attention pour ne pas trop surcharger vos instances Elasticsearch ou Logstash avec du "bruit".

Ce qu'il faut retenir de ces exemples c'est que, de toute manière, pour élaborer vos motifs, il vous faudra jetter un coup d'oeil à vos logs. Vous allez sans doute vous apercevoir que certains programmes sont trop verbeux et il faudra intervenir sur leur configuration pour éviter de polluer vos beaux diagrammes avec quelquechose de non représentatif.