Stack tout-en-un de Network Security Monitoring (NSM) orchestrée avec Docker Compose : capture réseau (Suricata / Zeek), SIEM Elastic, Threat Intelligence (OpenCTI), analytics web et reverse proxy TLS automatique.
- Présentation
- Schéma d'architecture
- Stack technique & logos
- Composants & services
- Prérequis
- Installation
- Accès aux interfaces
- Structure du projet
Sonde déploie une sonde de détection réseau complète et un SOC miniature sur un seul hôte. Le trafic réseau est capturé par des sondes (Suricata, Zeek), normalisé puis ingéré par la stack Elastic (Beats → Logstash → Elasticsearch → Kibana). Les indicateurs de compromission sont gérés dans OpenCTI, les logs HTTP visualisés en temps réel via GoAccess, et l'ensemble des interfaces est exposé derrière Traefik avec des certificats Let's Encrypt obtenus automatiquement (DNS-challenge Cloudflare).
Une application volontairement vulnérable (DVWA) est incluse pour générer du trafic d'attaque et tester la chaîne de détection de bout en bout.
| Domaine | Outils |
|---|---|
| 🛰️ Capture / Sondes | Suricata, Zeek |
| 📦 Collecte & ingestion | Filebeat, Metricbeat, Logstash, Fleet Server + APM |
| 🔎 SIEM | Elasticsearch, Kibana |
| 🧠 Threat Intelligence | OpenCTI (+ Redis, MinIO, RabbitMQ) |
| 📊 Analytics web | GoAccess + nginx |
| 🌐 Reverse proxy / TLS | Traefik + Cloudflare |
| 🎯 Lab | DVWA |
flowchart TB
NET([" Trafic reseau / port miroir "]):::net
USER([" Analyste SOC "]):::user
CF([" Cloudflare DNS + TLS "]):::ext
subgraph PROBES["Sondes reseau (network_mode: host)"]
SURICATA["Suricata<br/>IDS / IPS"]
ZEEK["Zeek<br/>Analyse de flux"]
end
subgraph SHIP["Collecte & ingestion"]
FILEBEAT["Filebeat"]
METRICBEAT["Metricbeat"]
LOGSTASH["Logstash"]
FLEET["Fleet Server + APM<br/>(Elastic Agent)"]
end
subgraph ELK["Coeur Elastic (SIEM)"]
ES[("Elasticsearch")]
KIBANA["Kibana"]
end
subgraph CTI["Threat Intelligence"]
OPENCTI["OpenCTI"]
WORKER["Workers x3"]
REDIS[("Redis")]
MINIO[("MinIO / S3")]
RABBIT[("RabbitMQ")]
end
subgraph WEB["Analytics web"]
GOACCESS["GoAccess"]
GANGINX["nginx"]
end
subgraph LAB["Cible vulnerable"]
DVWA["DVWA"]
end
TRAEFIK{{"Traefik v3<br/>Reverse proxy + TLS"}}:::proxy
NET --> SURICATA
NET --> ZEEK
SURICATA -->|"eve.json"| FILEBEAT
ZEEK -->|"logs"| FILEBEAT
TRAEFIK -->|"access.log"| FILEBEAT
TRAEFIK -->|"access.log"| GOACCESS
FILEBEAT --> ES
METRICBEAT --> ES
LOGSTASH --> ES
FLEET --> ES
ES --> KIBANA
OPENCTI --> ES
OPENCTI --- REDIS
OPENCTI --- MINIO
OPENCTI --- RABBIT
WORKER --- OPENCTI
GOACCESS --> GANGINX
USER --> CF --> TRAEFIK
TRAEFIK --> KIBANA
TRAEFIK --> ES
TRAEFIK --> OPENCTI
TRAEFIK --> GANGINX
TRAEFIK --> DVWA
classDef net fill:#1f2937,stroke:#60a5fa,color:#fff
classDef user fill:#0f766e,stroke:#5eead4,color:#fff
classDef ext fill:#7c2d12,stroke:#fb923c,color:#fff
classDef proxy fill:#4338ca,stroke:#a5b4fc,color:#fff
💡 Le diagramme est rendu nativement sur GitHub. Version éditable : ouvrir sur Mermaid Live.
Flux de données :
- Les sondes Suricata & Zeek écoutent l'interface réseau (
network_mode: host) et écrivent leurs journaux sur disque. - Filebeat collecte ces journaux (+ logs Traefik & conteneurs Docker), Metricbeat les métriques, Logstash les ingestions custom.
- Tout converge vers Elasticsearch (chiffré TLS) et se visualise dans Kibana.
- OpenCTI corrèle la threat intelligence et indexe dans Elasticsearch.
- Traefik publie chaque interface en HTTPS sur
*.sonde.dylanlasjunies.fr.
|
Elasticsearch |
Kibana |
Logstash |
Beats / Fleet |
|
Suricata |
Zeek |
Traefik |
Cloudflare |
|
OpenCTI |
Redis |
RabbitMQ |
MinIO |
|
nginx |
GoAccess |
Docker |
DVWA |
Le compose.yml agrège plusieurs fichiers via include:. Chaque domaine fonctionnel est isolé dans son propre fichier Compose.
| Fichier | Service(s) | Image | Rôle |
|---|---|---|---|
elasticsearch.compose.yml |
setup |
elasticsearch:8.14.1 |
Génère la CA & les certificats TLS, initialise les mots de passe |
elasticsearch |
elasticsearch:8.14.1 |
Moteur de stockage & recherche (single-node, TLS) | |
kibana |
kibana:8.14.1 |
Visualisation, dashboards, SIEM | |
fleet-server |
elastic-agent:8.14.1 |
Gestion des agents + serveur APM | |
beats.compose.yml |
filebeat |
filebeat:8.14.1 |
Collecte des logs (Suricata, Zeek, Traefik, Docker) |
metricbeat |
metricbeat:8.14.1 |
Collecte des métriques (ES, Kibana, Logstash, Docker) | |
logstash.compose.yml |
logstash |
logstash:8.14.1 |
Pipeline d'ingestion personnalisé |
probe.compose.yml |
suricata |
jasonish/suricata:master |
IDS/IPS — détection d'intrusion réseau |
zeek |
blacktop/zeek:elastic |
Analyse passive de flux réseau | |
opencti.compose.yml |
opencti |
opencti/platform:6.2.0 |
Plateforme de Threat Intelligence |
opencti-worker ×3 |
opencti/worker:6.2.0 |
Workers d'enrichissement | |
opencti-redis |
redis:7.2.5 |
Cache / file de messages | |
opencti-minio |
minio:RELEASE.2024-05-28 |
Stockage objet S3 | |
opencti-rabbitmq |
rabbitmq:3.13-management |
Bus de messages AMQP | |
goaccess.compose.yml |
goaccess |
allinurl/goaccess:latest |
Analytics temps réel des logs HTTP |
goaccess-nginx |
nginx:latest |
Sert le rapport GoAccess | |
traefik.compose.yml |
traefik |
traefik:v3.1 |
Reverse proxy + TLS automatique (Cloudflare) |
compose.yml |
dvwa |
kaakaww/dvwa-docker |
Application web vulnérable (lab) |
- Réseaux :
elastic(interne),traefik(externe, à créer),vulnerable(isolation DVWA). - Volumes persistants :
certs,elastic-data,kibana-data,filebeat-data,metricbeat-data,logstash-data,fleetserver-data,goaccess-data,redisdata,s3data,amqpdata.
- Docker & Docker Compose v2 (
include:requiert Compose ≥ 2.20). - Un hôte Linux avec :
vm.max_map_count=262144(requis par Elasticsearch) ;- une interface réseau en écoute (par défaut
enp0s6, voirINTERFACE) ; - ≥ 24 Go de RAM recommandés (ES 12G + Kibana 8G + OpenCTI 8G).
- Un domaine géré par Cloudflare + un token DNS API (pour le challenge ACME).
- Le réseau externe Traefik créé au préalable :
docker network create traefik
-
Cloner le dépôt
git clone <repo-url> sonde && cd sonde
-
Configurer l'environnement — copier le gabarit puis renseigner les secrets :
cp .env.dist .env
Variables clés à définir dans
.env:Variable Description ELASTIC_PASSWORD/KIBANA_PASSWORDMots de passe Elastic (≥ 6 caractères) ENCRYPTION_KEYClé de chiffrement Kibana (saved objects, reporting) STACK_VERSIONVersion de la stack Elastic (défaut 8.14.1)INTERFACEInterface réseau écoutée par Suricata/Zeek (défaut enp0s6)ES_MEM_LIMIT/KB_MEM_LIMIT/LS_MEM_LIMITLimites mémoire CLOUDFLARE_EMAIL/CF_DNS_API_TOKENIdentifiants Cloudflare pour le TLS OPENCTI_*,MINIO_*,RABBITMQ_*Identifiants OpenCTI & dépendances -
Régler le paramètre kernel (Elasticsearch) :
sudo sysctl -w vm.max_map_count=262144
-
Démarrer la stack
docker compose up -d
Le service
setupgénère d'abord la CA et les certificats, puis les autres services démarrent en cascade via leurshealthcheck. -
Suivre le démarrage
docker compose ps docker compose logs -f setup
Une fois la stack démarrée, les interfaces sont exposées en HTTPS via Traefik
(remplacez le domaine par le vôtre dans les fichiers Compose et .env) :
| Service | URL | Port direct |
|---|---|---|
| 🔎 Kibana | https://kibana.sonde.dylanlasjunies.fr |
5601 |
| 🗄️ Elasticsearch | https://elastic.sonde.dylanlasjunies.fr |
9200 |
| 🧠 OpenCTI | https://opencti.sonde.dylanlasjunies.fr |
5050 |
| 📊 GoAccess | https://goaccess.sonde.dylanlasjunies.fr |
7890 |
| 🎯 DVWA (lab) | https://vulnerable.sonde.dylanlasjunies.fr |
8080 |
| 🚦 Traefik Dashboard | https://traefik.sonde.dylanlasjunies.fr |
— |
| 🛡️ Fleet Server / APM | — | 8220 / 8200 |
⚠️ Identifiants par défaut Elastic : utilisateurelastic, mot de passe =ELASTIC_PASSWORD.
sonde/
├── compose.yml # Point d'entrée — include des sous-fichiers + DVWA
├── elasticsearch.compose.yml # setup, elasticsearch, kibana, fleet-server
├── beats.compose.yml # filebeat, metricbeat
├── logstash.compose.yml # logstash
├── probe.compose.yml # suricata, zeek
├── opencti.compose.yml # opencti + redis/minio/rabbitmq + workers
├── goaccess.compose.yml # goaccess, goaccess-nginx
├── traefik.compose.yml # traefik (reverse proxy + TLS)
├── networks_volumes.compose.yml # définition des réseaux & volumes
├── .env.dist # gabarit de configuration
└── data/
├── filebeat.yml # config Filebeat
├── metricbeat.yml # config Metricbeat
├── logstash.conf # pipeline Logstash
├── kibana.yml # config Kibana
├── nginx.conf # config nginx (GoAccess)
├── modules.d/ # modules Filebeat (suricata, zeek, traefik activés)
├── suricata/ # suricata.yaml + règles + logs
├── zeek/ # local.zeek + pcap
└── traefik/ # letsencrypt, rules, logs
Stack de supervision réseau — Suricata · Zeek · Elastic · OpenCTI · Traefik