Dashboards versionnés en JSON (façon provisioning Grafana). La source de vérité
est openobserve/dashboards/*.json ; ils s'importent tels quels via l'UI
OpenObserve (Dashboards → Import) ou via le provisioning automatique.
Automatique au démarrage de la stack. Le service dashboard-provisioner
(dans compose.yml) attend qu'OpenObserve réponde, puis importe tous les
dashboards/*.json — à chaque docker compose up. Conteneur one-shot qui
s'arrête une fois l'import fait (restart: "no").
Manuel (hors stack, ou pour réimporter après édition) :
python3 openobserve/provision.pyStdlib uniquement, aucune dépendance. Config via l'environnement (défauts =
stack locale localhost:5080 / admin@laruche.local) : OPENOBSERVE_URL,
OPENOBSERVE_ORG, OPENOBSERVE_USER, OPENOBSERVE_PASSWORD, DASHBOARDS_DIR.
L'import est idempotent : un dashboard de même titre est supprimé puis recréé
(OpenObserve régénère le dashboardId à l'import, donc on déduplique par titre).
| Fichier | Titre | État |
|---|---|---|
global.json |
Honeypot — Global | ✅ fonctionnel |
ssh.json |
Honeypot — SSH | ✅ fonctionnel |
ftp.json |
Honeypot — FTP | ✅ fonctionnel |
http.json |
Honeypot — HTTP | ✅ fonctionnel (dès qu'il y a du trafic HTTP) |
geo_threat_intel.json |
Honeypot — Geo & Threat Intel | ⏳ carte + géo : nécessite GeoIP + IP publiques |
Trafic global / heure, trafic par service / heure, top 10 IP sources,
event_type × protocole, compteurs (connexions, interactions, IP distinctes),
sévérité des classifications.
Top mots de passe, top usernames, méthodes d'auth, profil bot/human, top commandes, top enchaînements (fingerprint de session), connexions, sessions → escalade de privilèges, interactions moyennes / session.
Top credentials (usernames / mots de passe), commandes FTP, dossiers et fichiers les plus accédés, path traversal, connexions, uploads, sévérité.
URLs les plus visitées, méthodes, user-agents, accès .env / fichiers
sensibles, tentatives webshell / scan.
Carte mondiale (geomap) des IP sources, top pays, top ASN/fournisseurs, réputation des IP (AbuseIPDB).
OpenObserve construit le schéma du stream à partir des events réellement ingérés et renvoie une erreur sur toute colonne jamais vue. La carte et les panneaux géo se remplissent donc seulement quand l'enrichissement produit des coordonnées :
- Déposer les bases MaxMind GeoLite2 dans
./data/geoip/(GeoLite2-City.mmdbpour pays/ville/lat/lon,GeoLite2-ASN.mmdbpour l'ASN). - Recevoir du trafic depuis des IP publiques (les IP privées de test ne sont
pas géolocalisables →
latitude/longitudeànull, ignorées par la carte). - Optionnel :
ABUSEIPDB_API_KEY/GREYNOISE_API_KEYdans.envpour la réputation et la classification scanner.
Nombre de Mo de logs: pas un panneau ; visible dans OpenObserve → Streams (storage_sizedu streamhoneypot_events).
honeypots → JSONL bruts → analyzer (enrichissement) → enriched/events.jsonl → Fluent Bit → OpenObserve. L'analyzer ajoute le bloc enrichment +
classification.profile. Fluent Bit aplatit les objets imbriqués en colonnes
_ : payload.command → payload_command, classification.severity →
classification_severity, enrichment.latitude → enrichment_latitude.
Stream cible : honeypot_events.
Format dashboard OpenObserve v3 : filtres = tableau vide, requêtes SQL
custom, colonnes mappées par alias (x_axis_* / y_axis_*, et
latitude / longitude / weight pour la geomap). Éditer dans l'UI puis
réexporter, ou modifier le JSON puis relancer provision.py.