Elastic stack, filebeat et fail2ban

Intégration de fail2ban à Elastic !

Elastic stack (anciennement ELK) est une plateforme logicielle dont la mission est d’ingérer simultanément des données provenant de multiples sources, puis de les transformer et les envoyer vers Elasticsearch, un moteur de recherche (nosql) et d’analyse, pour permettre aux utilisateurs de visualiser des données avec des tableaux et des graphes (dans kibana). Il est notamment l’un des SIEM (système de gestion des informations et des événements de sécurité) les plus utilisés…

On se sert (entre autres solutions possibles) de beats, qui sont des petits agents que l’on met sur les serveurs dont on veut analyser les logs… Et notamment de filebeat, qui est un agent avec de nombreux modules : apache, nginx, suricata… Mais aussi étrange que cela puisse paraître, filebeat n’a pas de module pour fail2ban ! Fail2ban étant, je le rappelle, un hips (host intrusion prevention system)…

Nous allons donc y remédier en nous servant des inputs de filebeat. Le but étant de parser les journaux de fail2ban et de les envoyer à elasticsearch…

Si nous regardons /var/log/fail2ban.log, voici ce que nous y voyons (j’ai tronqué les adresses ip) :

2023-06-11 04:59:25,467 fail2ban.filter         [921]: INFO    [sshd] Found 1x8.16x.180.1x - 2023-06-11 04:59:24
2023-06-11 04:59:26,131 fail2ban.actions        [921]: NOTICE  [sshd] Ban 188.1x6.1x0.17
2023-06-11 04:59:26,497 fail2ban.filter         [921]: INFO    [sshd] Found 1x8.16x.180.17 - 2023-06-11 04:59:26
2023-06-11 04:59:30,330 fail2ban.filter         [921]: INFO    [sshd] Found 1x.8x.51.2x4 - 2023-06-11 04:59:30

Il s’agit donc de disséquer ces lignes. Nous allons pour ça nous servir de dissect qui, comme son nom l’indique est un processeur de dissection qui segmente les chaînes entrantes à l’aide de modèles définis. Je vous laisse regarder sa documentation, mais voilà ce que, pour ma part, après quelques tâtonnements à l’époque et l’aide de https://dissect-tester.jorgelbg.me/, est devenue la section « Filebeat inputs » de /etc/filebeat/filebeat.yml :

filebeat.inputs:

# Each - is an input. Most options can be set at the input level, so
# you can use different inputs for various configurations.
# Below are the input specific configurations.

# filestream is an input for collecting log messages from files.
- type: filestream
  id: fail2ban
  enabled: true
  paths:
    - /var/log/fail2ban.log
  include_lines: ['Ban','Unban','Found']
  processors:
    - add_tags:
        tags: ['fail2ban']
        target: "service.type"
    - add_tags:
        tags: ['fail2ban']
        target: "event.module"
    - add_tags:
        tags: ['intrusion_detection']
        target: "event.category"
    - dissect:
        when:
          contains:
            message: "INFO"
        tokenizer: "%{+timestamp} %{+timestamp} %{component->} [%{pid}]: %{log_level->} [%{jail}] %{action} %{ip|ip} - %{} %{}"
        field: "message"
        target_prefix: "fail2ban"
    - dissect:
        when:
          contains:
            message: "NOTICE"
        tokenizer: "%{+timestamp} %{+timestamp} %{component->} [%{pid}]: %{log_level->} [%{jail}] %{action} %{ip|ip}"
        field: "message"
        target_prefix: "fail2ban"

Vous remarquerez que j’ai également ajouté des tags service.type, event.module et event.category qu’on retrouve dans les modules de filebeat et qui vont nous permettre de mettre en place des filtres…

Pour plus de clarté, nous pouvons séparer les inputs dans des fichiers séparés :
Dans filebeat.yml :

filebeat.config.inputs:
  enabled: true
  path: ${path.config}/inputs.d/*.yml



Nous pouvons maintenant écrire nos fichiers que nous placerons dans /etc/filebeat/input.d/.
Je tiens à disposition de qui veut un input de filebeat pour l’hids psad (Port Scan Attack Detector)…

Allez maintenant, je vous laisse découvrir et analyser le résultat dans kibana, onglet discover… Mais nous pouvons encore améliorer la chose. Et rajouter un ingest pipeline pour permettre d’ingérer des données supplémentaires, notamment de géolocalisation des adresses ip de nos attaquants…

Pour cela, il est possible d’utiliser l’interface graphique de kibana :

stack managment -> ingest pipeline -> create pipeline

En choisissant Geoip comme processeur.

Ou la console (menu Dev Tools) :

PUT _ingest/pipeline/fail2ban-geoip-pipeline
{
"processors": [
{
"geoip": {
"field": "fail2ban.ip",
"target_field": "fail2ban.geoip",
"ignore_missing": true
}
}
]
}

Il nous faut maintenant faire passer notre module filebeat à travers ce pipeline, ce qui nous donnera dans la section « Elasticsearch Output » de /etc/filebeat/filebeat.yml


output.elasticsearch:
  # Array of hosts to connect to.
  hosts: ["siem.example.com:9200"]
  pipeline: fail2ban-geoip-pipeline
...

Observez les nouveaux champs de votre source de données qui vont maintenant vous permettre de faire de belles visualisations pour vos tableaux de bords telles que :

Ou encore :

Pas mal, non ?