1. Le rôle d’un bouncer #
Appliquer les décisions.
Le principe #
Un bouncer (remediation component) applique les décisions de la LAPI. Il s'authentifie avec une clé générée par cscli. Le moteur et les bouncers peuvent être sur des machines différentes.
sudo cscli bouncers add mon-bouncer
sudo cscli bouncers list
sudo cscli bouncers delete mon-bouncerLa clé ne s'affiche qu'une fois. Conservez-la dans un gestionnaire de secrets. Utilisez une clé par bouncer, pour pouvoir en révoquer une seule.
Où bloquer ? #
| Bouncer | Niveau | À retenir |
|---|---|---|
| Pare-feu | Noyau | Protège tous les ports : SSH, SMTP, bases de données |
| Traefik | Proxy | Plugin communautaire, voir la leçon dédiée |
| Nginx, OpenResty, Apache | Serveur web | Ban, captcha et WAF AppSec |
| HAProxy SPOA | Proxy | Remplace l’ancien bouncer Lua, déprécié |
| Cloudflare, Fastly, AWS WAF | CDN, WAF | Bloque avant vos serveurs |
| Blocklist Mirror | Réseau | Publie une liste pour pfSense, Fortinet, MikroTik… |
| WordPress, PHP, Magento | Application | Sans accès root |
La liste complète est sur le Hub. Le bouncer Ingress Nginx est lui aussi déprécié.
Live ou stream ? #
En test réel avec le plugin Traefik, une IP tout juste bannie continuait de passer en mode live tant que son statut « autorisée » restait en cache. En mode stream, elle était bloquée dès la synchronisation suivante.
L’API des décisions #
Tous les bouncers utilisent cette API. Une IP sans décision renvoie null ; sans clé valide, la réponse est 403.
curl -s -H "X-Api-Key: $KEY" "http://127.0.0.1:8080/v1/decisions?ip=203.0.113.50"
# [{"duration":"3h59m44s","origin":"crowdsec","scenario":"crowdsecurity/ssh-bf","scope":"Ip","type":"ban","value":"203.0.113.50"}]
curl -s -H "X-Api-Key: $KEY" "http://127.0.0.1:8080/v1/decisions/stream?startup=true"
# {"new": [...], "deleted": [...]}2. Le bouncer pare-feu #
Installation, configuration et contrôle.
Installer #
sudo apt install crowdsec-firewall-bouncer-nftables
# ou : crowdsec-firewall-bouncer-iptables
sudo systemctl status crowdsec-firewall-bouncer
sudo cscli bouncers listSur la même machine que la LAPI, le paquet crée sa clé tout seul. Sinon, générez-la et reportez-la dans la configuration.
Configurer #
Le fichier est /etc/crowdsec/bouncers/crowdsec-firewall-bouncer.yaml. Placez vos réglages dans un fichier .yaml.local pour qu'ils survivent aux mises à jour.
mode: nftables
update_frequency: 10s
log_mode: file
log_dir: /var/log/
log_level: info
api_url: http://127.0.0.1:8080/
api_key: VOTRE_CLE
disable_ipv6: false
deny_action: DROP
deny_log: false
nftables:
ipv4:
enabled: true
set-only: false
table: crowdsec
chain: crowdsec-chain
priority: -10
ipv6:
enabled: true
set-only: false
table: crowdsec6
chain: crowdsec6-chain
priority: -10| Option | Rôle |
|---|---|
mode | nftables, iptables, ipset, pf |
update_frequency | Fréquence de mise à jour |
deny_action | DROP (par défaut) ou REJECT |
iptables_chains | Chaînes à protéger. Ajoutez DOCKER-USER pour les ports de conteneurs publiés |
set-only | Vous gérez les règles, le bouncer remplit seulement le set |
Vérifier #
sudo cscli decisions add --ip 203.0.113.50 --duration 10m
sudo nft list table ip crowdsec
sudo cscli metrics show bouncers
sudo cscli decisions delete --ip 203.0.113.50table ip crowdsec {
counter crowdsec-blacklists-cscli {
packets 3 bytes 180
}
set crowdsec-blacklists-cscli {
type ipv4_addr
flags timeout
elements = { 203.0.113.50 timeout 9m58s expires 9m50s }
}
}Ne vous bannissez pas. Avant de tester, ajoutez votre adresse d'administration à une allowlist et gardez un accès console chez votre hébergeur.
Sources #
Commandes et blocage vérifiés sur CrowdSec 1.8.2 et le bouncer pare-feu 0.0.38 en mode nftables.
