1. Répondre aux bonnes questions #
Les outils à votre disposition.
Vue d’ensemble #
| Question | Réponse |
|---|---|
| Quelles IP sont bannies ? | cscli decisions list |
| Quelles attaques ont été détectées ? | cscli alerts list --since 24h |
| Combien de paquets ou requêtes ont été bloqués ? | cscli metrics show bouncers |
| Mes logs sont-ils lus et compris ? | cscli metrics show acquisition parsers |
| Quels scénarios se déclenchent ? | cscli metrics show scenarios |
| Mes bouncers sont-ils vivants ? | cscli bouncers list |
2. Avec cscli #
La vue immédiate.
Suivre les IP bannies #
sudo cscli decisions list
sudo cscli decisions list --origin crowdsec
sudo cscli decisions list --origin CAPI
sudo cscli decisions list -o json| ID | Source | Scope:Value | Reason | Action | Events | expiration |
| 1 | crowdsec | Ip:203.0.113.50 | crowdsecurity/ssh-bf | ban | 6 | 3h59m46s |La colonne Source indique l'origine : crowdsec (détection locale), cscli (manuelle), CAPI (communauté).
Analyser une attaque #
sudo cscli alerts list --since 24h
sudo cscli alerts inspect 3 --details- ID : 3
- Machine : test
- Simulation : false
- Remediation : true
- Reason : crowdsecurity/ssh-bf
- Events Count : 6
- Scope:Value : Ip:203.0.113.50Mesurer le blocage réel #
Une décision ne dit pas si quelque chose a été bloqué. Seul le bouncer le sait : cscli metrics show bouncers affiche par origine le nombre d'adresses actives et le volume bloqué (CrowdSec 1.6.3 et bouncer pare-feu 0.0.30 minimum).
sudo cscli metrics show bouncers
sudo nft list table ip crowdsec # compteurs du pare-feuDiagnostiquer #
| Symptôme | Cause probable | À vérifier |
|---|---|---|
| Aucune alerte | Log non déclaré | cscli metrics show acquisition |
| Beaucoup de lignes Unparsed | Mauvais type, collection manquante | cscli explain |
| Décision, mais pas de blocage | Pas de bouncer, mauvaise IP vue | cscli bouncers list |
| Ban d’une IP légitime | Faux positif | cscli alerts inspect, allowlist |
3. Prometheus et Grafana #
L’historique et les tableaux de bord.
Exposer les métriques #
Dans config.yaml :
prometheus:
enabled: true
level: full # none, aggregated ou full
listen_addr: 0.0.0.0 # 127.0.0.1 par défaut : à ouvrir pour un Prometheus distant
listen_port: 6060curl -s http://127.0.0.1:6060/metrics | grep -E '^cs_(active_decisions|alerts)'
# cs_active_decisions{action="ban",origin="crowdsec",reason="crowdsecurity/ssh-bf"} 1
# cs_alerts{kind="crowdsec",reason="crowdsecurity/ssh-bf"} 1scrape_configs:
- job_name: crowdsec
static_configs:
- targets: ["crowdsec:6060"]Niveau de détail. Le niveauaggregatedretire notammentcs_active_decisions,cs_alertset les métriques par bouncer. Gardezfullpour suivre les IP bloquées.
Les métriques utiles #
| Métrique | Ce qu’elle mesure |
|---|---|
cs_active_decisions | Décisions actives par raison, origine et action |
cs_alerts | Alertes par raison |
cs_bucket_overflowed_total | Débordements par scénario : les attaques détectées |
cs_parser_hits_ok_total, cs_parser_hits_ko_total | Lignes comprises ou non |
cs_filesource_hits_total | Lignes lues par fichier |
cs_lapi_bouncer_requests_total | Activité de chaque bouncer |
cs_appsec_reqs_total, cs_appsec_block_total | Requêtes inspectées et bloquées par AppSec |
cs_capi_last_pull_timestamp | Dernier téléchargement de la liste communautaire |
Les requêtes PromQL #
# IP actuellement bloquées, par scénario
sum by (reason) (cs_active_decisions)
# Décisions locales et communautaires
sum by (origin, action) (cs_active_decisions)
# Attaques détectées sur 24 h, par scénario
sum by (name) (increase(cs_bucket_overflowed_total[24h]))
# Lignes de log non comprises : un parser manque ?
sum by (source) (rate(cs_parser_hits_ko_total[5m]))
# Volume lu par source de logs
sum by (source) (rate(cs_filesource_hits_total[5m]))increase() ne compte pas le tout premier débordement d'un scénario : la série n'existe qu'à partir de lui. Pour un décompte exact, regardez aussi cs_alerts.
Pour Grafana, CrowdSec publie des tableaux de bord prêts à importer dans le dépôt crowdsecurity/grafana-dashboards (Overview, Insight, Details).
Alerter sur la santé #
Le pire incident est silencieux : CrowdSec ne lit plus rien et plus rien n'est bloqué.
groups:
- name: crowdsec
rules:
- alert: CrowdSecLogsNonLus
expr: sum(rate(cs_filesource_hits_total[10m])) == 0
for: 15m
labels: {severity: warning}
annotations:
summary: "CrowdSec ne lit plus aucune ligne de log"
- alert: CrowdSecLogsNonCompris
expr: sum(rate(cs_parser_hits_ko_total[10m])) > 1
for: 30m
labels: {severity: warning}
annotations:
summary: "Beaucoup de lignes de log ne sont pas comprises"4. Notifications et console #
Être prévenu en direct.
Les notifications #
Les plugins slack, email, http et splunk se configurent dans /etc/crowdsec/notifications/, par exemple http.yaml :
type: http
name: http_default
log_level: info
format: |
{{ range . -}}
{{ .Scenario }} : {{ range .Decisions }}{{ .Type }} {{ .Value }} pour {{ .Duration }}{{ end }}
{{ end -}}
url: https://exemple.fr/alertes
method: POSTActivez-les ensuite dans le profil, dans profiles.yaml :
notifications:
- http_defaultcrowdsecurity/ssh-bf : ban 203.0.113.50 pour 4hsudo cscli notifications list
sudo cscli notifications test http_defaultÉvitez le bruit. Une notification par attaque, sur un serveur exposé, cela fait vite beaucoup. Réservez-les aux scénarios importants, grâce à un profil dédié.
La console #
La console CrowdSec présente en ligne vos instances, alertes et décisions. Elle complète Prometheus, sans rien à héberger. Vous restez libre de ne pas l'utiliser.
Sources #
Commandes, métriques et notification HTTP vérifiées sur CrowdSec 1.8.2.
