PROFIL / INDEX© Clément Depernet / 2026

← Retour à la liste

21 sept. 20262 min de lecture

Cheat sheet — ELK / Logstash : pipelines (Apache, Suricata)

Structurer les logs avant Elasticsearch avec Logstash : pipeline Apache (grok COMBINEDAPACHELOG + useragent), pipeline Suricata (codec JSON, filtre date, index journalier), gestion des droits et des secrets par keystore.

intermediate#elk#logstash#elasticsearch#siem#suricata#cheatsheet

Mis à jour le 21 sept. 2026

Logstash est l’étape Filter de la stack ELK : structurer les logs avant l’insertion permet ensuite des recherches et graphiques précis (« combien de 404 ? », « quels navigateurs ? »). Envoyer du texte brut à Elasticsearch gâche cet avantage.

Pipeline Apache (access.log)

input {
  file {
    path => "/var/log/apache2/access.log"
    start_position => "beginning"
    sincedb_path => "/dev/null"   # relire à chaque démarrage — à retirer en prod
  }
}

filter {
  # Grok découpe la ligne Apache standard
  grok { match => { "message" => "%{COMBINEDAPACHELOG}" } }
  # COMBINEDAPACHELOG extrait clientip, verb, response, bytes, agent, timestamp…

  # Analyse fine du User-Agent
  if [agent] {
    useragent { source => "agent" target => "navigateur_info" }
  }
}

output {
  stdout { codec => rubydebug }           # test
  # elasticsearch {
  #   hosts => ["localhost:9200"]
  #   index => "apache-logs-%{+YYYY.MM.dd}"
  # }
}
  • COMBINEDAPACHELOG : motif natif, inutile de réécrire une regex.
  • useragent : transforme la chaîne brute en champs clairs (name, os).
  • Permissions : le service logstash n’a souvent pas accès à /var/log/apache2/ → usermod -aG adm logstash (Debian).

Pipeline Suricata (eve.json)

input {
  file {
    path => "/var/log/suricata/eve.json"
    start_position => "beginning"
    sincedb_path => "/dev/null"
    codec => json            # lire directement en JSON structuré
  }
}

filter {
  if [timestamp] {
    date { match => ["timestamp", "ISO8601"] }   # heure de l'événement, pas de l'ingestion
  }
}

output {
  stdout { codec => rubydebug }
  elasticsearch {
    hosts => ["https://localhost:9200"]
    ssl_certificate_authorities => ["/etc/logstash/certs/http_ca.crt"]
    user => "admin"
    password => "${LS_PWD}"           # via keystore, jamais en clair
    index => "suricata-%{+YYYY.MM.dd}"
  }
}

Trois points clés :

  1. codec => json : chaque ligne est un objet structuré d’emblée.
  2. filtre date : sans lui, Elasticsearch horodate à la lecture, pas au moment de l’attaque.
  3. index journalier : Suricata est volumineux ; un index par jour facilite la rotation/nettoyage.

Secrets : le keystore Logstash

Ne jamais écrire un mot de passe en clair dans un pipeline. Le keystore les injecte via ${VAR} :

set +o history
/usr/share/logstash/bin/logstash-keystore create
/usr/share/logstash/bin/logstash-keystore add LS_PWD

Pour repérer les intrusions dans Kibana, tagger les événements Suricata de type alert dans le filter facilite ensuite le filtrage en tableau de bord.

SEC / OPS / CD-01

Astro + Tailwind, conteneurisé, servi derrière Caddy · Inspiration · Thème sonore : Severance (Theodore Shapiro) · Trop mignon le favicon, non ?

PRÊT / CD-01