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.
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
logstashn’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 :
codec => json: chaque ligne est un objet structuré d’emblée.- filtre
date: sans lui, Elasticsearch horodate à la lecture, pas au moment de l’attaque. - 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
alertdans lefilterfacilite ensuite le filtrage en tableau de bord.