Logstash pour les devs - 24 - Sécurité Logstash : SSL, auth et secrets

Chiffrer les communications, authentifier les connexions et gerer les secrets dans Logstash.

  1. 01 Logstash pour les devs - 00 - Pourquoi Logstash existe encore en 2026
  2. 02 Logstash pour les devs - 01 - L'Elastic Stack de A a Z
  3. 03 Logstash pour les devs - 02 - Installer Logstash avec Docker en 5 minutes
  4. 04 Logstash pour les devs - 03 - Anatomie d'un pipeline Logstash
  5. 05 Logstash pour les devs - 04 - Inputs stdin et file : lire des donnees locales
  6. 06 Logstash pour les devs - 05 - Input Beats : recevoir des logs de Filebeat
  7. 07 Logstash pour les devs - 06 - Inputs HTTP, TCP et UDP : recevoir des donnees réseau
  8. 08 Logstash pour les devs - 07 - Inputs Kafka et JDBC : sources avancees
  9. 09 Logstash pour les devs - 08 - Les codecs : decoder et encoder les donnees
  10. 10 Logstash pour les devs - 09 - Le filtre Grok : parser n'importe quel log
  11. 11 Logstash pour les devs - 10 - Le filtre Dissect : parser sans regex
  12. 12 Logstash pour les devs - 11 - Le filtre Mutate : transformer les champs
  13. 13 Logstash pour les devs - 12 - Filtres Date et GeoIP : temps et geolocalisation
  14. 14 Logstash pour les devs - 13 - Filtres KV, JSON et XML : parser les formats structures
  15. 15 Logstash pour les devs - 14 - Le filtre Ruby : quand les autres ne suffisent pas
  16. 16 Logstash pour les devs - 15 - Filtres Aggregate et Metrics : correler les événements
  17. 17 Logstash pour les devs - 16 - Conditionnels et contrôle de flux
  18. 18 Logstash pour les devs - 17 - Output Elasticsearch : envoyer les donnees
  19. 19 Logstash pour les devs - 18 - Outputs file, stdout et les autres
  20. 20 Logstash pour les devs - 19 - Gerer le multiline : stack traces et logs multi-lignes
  21. 21 Logstash pour les devs - 20 - Pipelines multiples et pipeline-to-pipeline
  22. 22 Logstash pour les devs - 21 - Performance et tuning Logstash
  23. 23 Logstash pour les devs - 22 - Monitoring Logstash : metriques et alertes
  24. 24 Logstash pour les devs - 23 - Dead Letter Queue : ne plus perdre d'événements
  25. 25 Logstash pour les devs - 24 - Sécurité Logstash : SSL, auth et secrets
  26. 26 Logstash pour les devs - 25 - Debugger un pipeline Logstash
  27. 27 Logstash pour les devs - 26 - Tester ses pipelines avant la prod
  28. 28 Logstash pour les devs - 27 - Cas pratique : centraliser des logs applicatifs
  29. 29 Logstash pour les devs - 28 - Cas pratique : ETL avec Logstash et PostgreSQL
  30. 30 Logstash pour les devs - 29 - Cas pratique : enrichir des donnees en temps réel
  31. 31 Logstash pour les devs - 30 - Logstash en production : architecture et bonnes pratiques
  32. 32 Logstash pour les devs - 31 - Glossaire Logstash de A a Z

24 - Sécurité Logstash : SSL, auth et secrets

Ce que tu vas apprendre

  • Chiffrer la communication Filebeat -> Logstash avec TLS
  • Chiffrer la communication Logstash -> Elasticsearch avec TLS
  • Utiliser le keystore Logstash pour les secrets (mots de passe, API keys)
  • Gerer les certificats dans Docker
  • Une checklist sécurité pour la production

Prerequisites

  • Un pipeline Filebeat -> Logstash -> Elasticsearch fonctionnel
  • Des bases sur TLS/SSL (ou avoir lu la serie Cles et chiffrement)

Pourquoi sécuriser Logstash

En dev local, tout est en clair sur localhost. En production, les donnees transitent entre des serveurs. Les logs contiennent des IPs, des emails, des tokens, parfois des mots de passe ecrits par erreur. Sans TLS, n'importe qui sur le réseau peut les intercepter.

Trois points a sécuriser :

┌──────────┐   TLS   ┌──────────┐   TLS   ┌──────────────┐
│ Filebeat │ ──────> │ Logstash │ ──────> │ Elasticsearch│
│          │  :5044  │          │  :9200  │              │
└──────────┘         └──────────┘         └──────────────┘
                     │
                     │ Secrets : mots de passe,
                     │ API keys dans le keystore

TLS entre Filebeat et Logstash

Generer les certificats

Pour du test, des certificats auto-signes suffisent. En production, utilise une CA interne ou Let's Encrypt.

bash# Creer une CA
openssl req -x509 -newkey rsa:4096 -days 365 -nodes \
  -keyout ca.key -out ca.crt \
  -subj "/CN=Logstash CA"

# Creer la cle et le CSR pour Logstash
openssl req -newkey rsa:4096 -nodes \
  -keyout logstash.key -out logstash.csr \
  -subj "/CN=logstash"

# Signer avec la CA
openssl x509 -req -in logstash.csr -CA ca.crt -CAkey ca.key \
  -CAcreateserial -out logstash.crt -days 365

Structure des fichiers

logstash-secure/
├── compose.yaml
├── certs/
│   ├── ca.crt
│   ├── logstash.crt
│   └── logstash.key
├── filebeat/
│   └── filebeat.yml
└── logstash/
    ├── config/
    │   ├── logstash.yml
    │   └── pipelines.yml
    └── pipeline/
        └── secure.conf

Configuration Logstash (input Beats avec TLS)

# logstash/pipeline/secure.conf

input {
  beats {
    port => 5044
    ssl_enabled => true
    ssl_certificate => "/certs/logstash.crt"
    ssl_key => "/certs/logstash.key"
    ssl_certificate_authorities => ["/certs/ca.crt"]
    ssl_client_authentication => "optional"
  }
}

filter {
  # ... tes filtres
}

output {
  stdout { codec => rubydebug }
}
Paramètre Description
ssl_enabled Active TLS
ssl_certificate Certificat du serveur Logstash
ssl_key Cle privee du serveur
ssl_certificate_authorities CA pour vérifier les clients
ssl_client_authentication none, optional, required

Configuration Filebeat

yaml# filebeat/filebeat.yml

filebeat.inputs:
  - type: log
    paths:
      - /logs/*.log

output.logstash:
  hosts: ["logstash:5044"]
  ssl.certificate_authorities: ["/certs/ca.crt"]
  ssl.verification_mode: "full"

Filebeat vérifié le certificat de Logstash avec la CA. Si le certificat est invalide ou expire, Filebeat refuse la connexion.

compose.yaml avec les certificats

yamlservices:
  logstash:
    image: docker.elastic.co/logstash/logstash:8.17.0
    volumes:
      - ./certs/:/certs/:ro
      - ./logstash/pipeline/:/usr/share/logstash/pipeline/
      - ./logstash/config/logstash.yml:/usr/share/logstash/config/logstash.yml:ro
      - ./logstash/config/pipelines.yml:/usr/share/logstash/config/pipelines.yml:ro
    ports:
      - "5044:5044"

  filebeat:
    image: docker.elastic.co/beats/filebeat:8.17.0
    user: root
    volumes:
      - ./filebeat/filebeat.yml:/usr/share/filebeat/filebeat.yml:ro
      - ./certs/:/certs/:ro
      - logs-volume:/logs:ro
    command: ["filebeat", "-e", "-strict.perms=false"]

Les certificats sont montes en lecture seule dans les deux conteneurs.

TLS entre Logstash et Elasticsearch

output {
  elasticsearch {
    hosts => ["https://elasticsearch:9200"]
    ssl_enabled => true
    ssl_certificate_authorities => ["/certs/ca.crt"]
    ssl_verification_mode => "full"
    user => "logstash_writer"
    password => "${ES_PASSWORD}"
  }
}

ssl_verification_mode :

  • full : vérifié le certificat ET le hostname (recommande)
  • certificate : vérifié le certificat mais pas le hostname
  • none : pas de vérification (dangereux, seulement pour le debug)

Le keystore Logstash

Les mots de passe dans les fichiers .conf en clair, c'est un problème. Le keystore Logstash chiffre les secrets et les rend accessibles via des variables.

Creer le keystore

bashdocker exec -it logstash bin/logstash-keystore create

Ajouter des secrets

bash# Le mot de passe Elasticsearch
docker exec -it logstash bin/logstash-keystore add ES_PASSWORD
# (tape le mot de passe quand demande)

# Une API key
docker exec -it logstash bin/logstash-keystore add ES_API_KEY

Lister les secrets

bashdocker exec logstash bin/logstash-keystore list

Utiliser les secrets dans le pipeline

output {
  elasticsearch {
    hosts => ["https://elasticsearch:9200"]
    user => "logstash_writer"
    password => "${ES_PASSWORD}"
  }
}

${ES_PASSWORD} est remplace par la valeur du keystore au démarrage. Le mot de passe n'apparaît jamais en clair dans les fichiers.

Keystore dans Docker

Le keystore est stocke dans /usr/share/logstash/config/logstash.keystore. Pour le persister entre les redemarrages, monte un volume :

yamllogstash:
  volumes:
    - logstash-config:/usr/share/logstash/config

Ou copie le keystore dans l'image custom :

dockerfileFROM docker.elastic.co/logstash/logstash:8.17.0
COPY logstash.keystore /usr/share/logstash/config/logstash.keystore

Variables d'environnement

Alternative au keystore, les variables d'environnement Docker :

yaml# compose.yaml
logstash:
  environment:
    - ES_PASSWORD=s3cret
    - ES_HOSTS=https://elasticsearch:9200
# pipeline
output {
  elasticsearch {
    hosts => ["${ES_HOSTS}"]
    password => "${ES_PASSWORD}"
  }
}

C'est plus simple que le keystore, mais les variables d'environnement apparaissent dans docker inspect et dans /proc/*/environ. Le keystore est plus sécurisé.

Pour les projets sur paltemps.fr, j'utilise les variables d'environnement en dev (simplicité) et le keystore en production (sécurité).

Checklist sécurité production

  1. TLS partout : Filebeat -> Logstash, Logstash -> Elasticsearch, API monitoring
  2. Authentification : user/password ou API key sur l'output Elasticsearch
  3. Secrets dans le keystore : pas de mots de passe en clair dans les .conf
  4. Certificats valides : pas d'auto-signe en prod, rotation avant expiration
  5. Moindre privilege : l'utilisateur logstash_writer n'a que les droits d'écriture sur les index nécessaires
  6. API monitoring protégée : restreindre l'acces au port 9600 (firewall ou bind sur localhost)
  7. Pas de root : le conteneur Logstash tourne en user logstash (défaut dans l'image officielle)
  8. Logs sensibles : masquer les champs sensibles dans le pipeline (voir filtre Ruby, article 14)

Résumé

  • TLS chiffre les communications entre Filebeat, Logstash et Elasticsearch
  • Le keystore Logstash stocke les secrets chiffres, accessibles via ${VARIABLE}
  • Les variables d'environnement sont plus simples mais moins securisees
  • En production : TLS partout, keystore pour les secrets, moindre privilege pour les users ES
  • Les certificats auto-signes suffisent pour le dev, utilise une CA en production

Precedent : 23 - Dead Letter Queue | Suivant : 25 - Debugging

Sources

Réservez un audit gratuit de 30 minutes. Je vous montre concrètement ce qu'on peut automatiser.