Analyse de logs Syslog🔗
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:
- L'interface réseau d'entrée.
- L'interface réseau de sortie.
- L'IP d'entrée.
- L'IP de sortie.
- Le protocole utilisé (UDP ou TCP).
- Le port source.
- Le port de destination.
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:
- Nombre de requêtes bloquées selon le temps.
- Quels sont les ports sources et destination qui sont le plus bloqués ?
- Quelles sont les 10 adresses externes qui sont le plus bloquées ?
Dovecot:
- Histogramme des connexions selon une plage de temps.
- Quelles sont les 10 adresses IP qui font le plus de connexion au serveur et quels sont les logins qui correspondent ?
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:
- Filtre: type:syslog AND syslog_type:netfilter
- Visualize: Area chart.
- X-Axis
- Aggregation: Date Histogram
- Field: @timestamp
- Interval: Auto
Métrique: Les principaux ports bloqués
Ici, nous allons utiliser une table de données avec des entrées multiples.
- Filtre: type:syslog AND syslog_type:netfilter
- Visualize: Data Table
- buckets: split rows.
- Aggregation: Terms.
- Field: netfilter_proto.raw
- Order: Top, Count: 2
- Add Sub Bucket.
- Split Rows
- Aggregation: Terms.
- Field: netfilter_dpt.raw
- Order: Top, Count: 10
- Add Sub Bucket.
- Split Rows
- Aggregation: Terms.
- Field: netfilter_spt.raw
- Order: Top, Count: 10
- Options: View Option: per page 100.
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.
- Filtre: type:syslog AND syslog_type:netfilter
- Visualize: New Data Table.
- Buckets: split Rows.
- Aggregation: Terms
- Field: netfilter_dst.raw
- Order:Top, Size: 10.
- Order by: metric: Count
Métrique: Histogramme des connexions Dovecot selon le temps
C'est le même principe que pour netfilter, seul le filtre change.
- Filtre: type:syslog AND syslog_type:dovecot
- Visualize: Vertical Bar Chart.
- X-Axis
- Aggregation: Date Histogram
- Field: @timestamp
- Interval: Auto
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.
- Filtre: type:syslog AND syslog_type:dovecot
- Visualize: Data Table.
- Buckets: split rows.
- Aggregation: Terms
- Field: dovecot_remote_ip.raw
- Order:Top, Size: 10.
- Order by: metric: Count
- Add sub-bucket: Split rows.
- Aggregation: Terms
- Field: dovecot_user.raw
- Order:Top, Size: 10.
- Order by: metric: Count
- Options: Per page : 50.
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.