Surveiller votre Homelab avec Grafana, Loki et CrowdSec
Si vous gérez plusieurs conteneurs, vous avez besoin d’observabilité. Quand quelque chose casse — ou quand quelqu’un sonde vos services — vous voulez le savoir avant que cela ne devienne un problème.
Ma pile de surveillance combine trois outils :
- Loki pour l’agrégation de journaux
- Grafana pour les tableaux de bord et les alertes
- CrowdSec pour la détection d’intrusion et les menaces issues du crowd-sourcing
Architecture
Conteneur A ──→ Promtail ──→ Loki ──→ Grafana
Conteneur B ──→ Promtail ──→ ↑ ↑
Conteneur C ──→ rsyslog ──→ └── CrowdSec (LAPI)
│
bouncer (nginx)
↓
Bloquer IP malveillantes
Chaque conteneur envoie ses journaux via Promtail à Loki. CrowdSec analyse les journaux pour détecter des motifs d’attaque, partage des données anonymisées avec la communauté, et bloque les contrevenants récidivistes via un bouncer sur le proxy inverse.
Loki + Promtail
Loki est un système d’agrégation de journaux horizontalement scalable de Grafana Labs. Contrairement à Elasticsearch, il n’indexe pas le contenu des journaux — seulement les métadonnées (étiquettes), ce qui le rend beaucoup moins coûteux à exécuter.
Installation de Loki
Sur un conteneur dédié :
wget https://github.com/grafana/loki/releases/latest/download/loki-linux-amd64.deb
dpkg -i loki-linux-amd64.deb
Configuration de base (/etc/loki/config.yml) :
auth_enabled: false
server:
http_listen_port: 3100
ingester:
lifecycler:
ring:
kvstore:
store: inmemory
chunk_idle_period: 5m
schema_config:
configs:
- from: 2024-01-01
store: boltdb-shipper
object_store: filesystem
schema: v11
index:
prefix: index_
period: 24h
Promtail sur Chaque Conteneur
Promtail récupère les fichiers journaux et les pousse vers Loki. Configuration (/etc/promtail/config.yml) :
clients:
- url: http://mon-srv:3100/loki/api/v1/push
scrape_configs:
- job_name: syslog
static_configs:
- targets: [localhost]
labels:
job: syslog
__path__: /var/log/syslog
Grafana
Grafana se connecte à Loki comme source de données et vous permet de construire des tableaux de bord. J’en ai trois :
- Aperçu Système — CPU, mémoire, disque sur tous les conteneurs
- Événements de Sécurité — Alertes CrowdSec, tentatives de connexion SSH échouées, taux HTTP 4xx/5xx
- Santé des Services — Uptime, temps de réponse, expiration des certificats
Règles d’Alerte
Grafana peut alerter via email, Slack ou webhook. J’ai des règles pour :
- Les tentatives de brute force SSH dépassent un seuil
- Certificat renouvelé dans les 7 jours
- Conteneur arrêté depuis plus de 5 minutes
- Utilisation disque au-dessus de 85 %
CrowdSec
CrowdSec est un IPS moderne, piloté par la communauté. Il détecte les attaques en analysant les journaux, puis bloque l’IP incriminée via un bouncer.
La configuration se compose de :
- LAPI (Local API) : Le service central qui traite les alertes et sert les décisions
- Scénarios : Règles de détection d’attaques (brute force SSH, scan HTTP, scan de ports)
- Bouncers : Composants qui bloquent effectivement les IP (iptables, NGINX, nftables)
Après l’installation, CrowdSec commence immédiatement à apprendre vos schémas de trafic :
cscli alerts list
cscli decisions list
cscli metrics
La liste noire communautaire est ce qui rend CrowdSec puissant — quand quelqu’un attaque un utilisateur de CrowdSec, chaque autre utilisateur bénéficie de cette intelligence.
Tout Assembler
Mon conteneur de surveillance (mon-srv) exécute les trois services en utilisant environ 256 Mo de RAM au total. Les instances Promtail sur chaque conteneur ajoutent une surcharge négligeable — environ 10 Mo chacune.
Pour un homelab avec 10 à 15 conteneurs, cette pile est plus que suffisante et entièrement gratuite. En production, vous ajouteriez des répartiteurs de charge, de la réplication et des politiques de rétention, mais pour un laboratoire, cela fonctionne parfaitement dès la sortie de la boîte.