149 lines
5.8 KiB
Markdown
149 lines
5.8 KiB
Markdown
---
|
|
title: Fail2Ban
|
|
created: 2026-06-07
|
|
updated: 2026-06-07
|
|
type: app
|
|
tags: [catalogue, networking, security, brute-force, ip-banning, python]
|
|
confidence: high
|
|
contested: false
|
|
sources: [https://selfh.st/apps/?tag=networking, https://github.com/fail2ban/fail2ban]
|
|
---
|
|
|
|
# 🚫 Fail2Ban
|
|
|
|
> **Daemon de protection anti-brute-force** qui surveille les logs de services (SSH, web, mail…) et bannit automatiquement les IP suspectes via iptables/nftables. Le standard historique de la sécurité périmétrique self-hosted.
|
|
|
|
| Métadonnée | Valeur |
|
|
| :--- | :--- |
|
|
| **Site web** | [fail2ban.org](https://www.fail2ban.org) |
|
|
| **GitHub** | [fail2ban/fail2ban](https://github.com/fail2ban/fail2ban) |
|
|
| **License** | GPL-2.0 |
|
|
| **Langage** | Python |
|
|
| **Étoiles** | 14 800 ⭐ |
|
|
| **Dernière MAJ** | 2026-05-12 |
|
|
| **Catégorie** | [[cat-networking\|Networking]] |
|
|
|
|
## Description
|
|
|
|
Fail2Ban est un **framework de prévention d'intrusions** écrit en Python qui lit en continu les fichiers de journalisation (syslog, auth.log, nginx, postfix, etc.) et déclenche des actions — le plus souvent un **ban IP via iptables, nftables ou ufw** — lorsqu'un comportement suspect est détecté. Plusieurs tentatives SSH échouées depuis la même IP ? Fail2Ban ajoute cette IP à une « jail » et la bloque pour une durée configurable (par défaut 10 minutes, récidive = durée exponentielle).
|
|
|
|
L'outil est structuré autour de **filtres (regex)** et de **jails (politiques)** : un filtre reconnaît un motif dans les logs (ex. « Failed password for »), une jail définit combien d'occurrences déclenchent un ban, sur quelle durée, et quelle action exécuter. Plus de 100 filtres sont fournis par défaut (sshd, apache, nginx, postfix, dovecot, recidive, etc.), couvrant la majorité des services courants d'un homelab.
|
|
|
|
Fail2Ban s'intègre dans une **défense en profondeur** : il ne remplace pas un pare-feu applicatif (WAF) ni l'authentification forte, mais il **réduit drastiquement la surface d'attaque** en bloquant en bordure les scans et attaques automatisées. Il est l'ancêtre et le complément local de solutions collaboratives comme [[app-crowdsec]], qui pousse la logique plus loin avec un partage d'IOC entre instances.
|
|
|
|
## Installation
|
|
|
|
### Docker Compose (recommandé)
|
|
|
|
L'image officielle monte le daemon avec iptables, en `network_mode: host` ou via un sidecar : le plus simple est `network_mode: host` afin que Fail2Ban puisse manipuler la table INPUT d'iptables du système hôte.
|
|
|
|
```yaml
|
|
# docker-compose.yml
|
|
services:
|
|
fail2ban:
|
|
image: crazymax/fail2ban:latest
|
|
container_name: fail2ban
|
|
restart: unless-stopped
|
|
network_mode: host
|
|
cap_add:
|
|
- NET_ADMIN
|
|
- NET_RAW
|
|
volumes:
|
|
- /var/log:/var/log:ro
|
|
- /home/fail2ban/data:/data
|
|
- ./action.d:/etc/fail2ban/action.d:ro
|
|
- ./filter.d:/etc/fail2ban/filter.d:ro
|
|
- ./jail.d:/etc/fail2ban/jail.d:ro
|
|
- ./fail2ban.local:/etc/fail2ban/fail2ban.local:ro
|
|
logging:
|
|
driver: json-file
|
|
options:
|
|
max-size: "10m"
|
|
max-file: "3"
|
|
```
|
|
|
|
### Installation manuelle (Debian/Ubuntu)
|
|
|
|
```bash
|
|
sudo apt update && sudo apt install fail2ban -y
|
|
sudo systemctl enable --now fail2ban
|
|
```
|
|
|
|
## Configuration
|
|
|
|
Le fichier canonique est `/etc/fail2ban/jail.local` (qui surcharge `jail.conf`). Exemple minimaliste :
|
|
|
|
```ini
|
|
[DEFAULT]
|
|
backend = systemd
|
|
bantime = 1h
|
|
findtime = 10m
|
|
maxretry = 5
|
|
banaction = nftables-multiport
|
|
|
|
[sshd]
|
|
enabled = true
|
|
port = ssh
|
|
filter = sshd
|
|
logpath = %(sshd_log)s
|
|
maxretry = 3
|
|
|
|
[nginx-http-auth]
|
|
enabled = true
|
|
filter = nginx-http-auth
|
|
port = http,https
|
|
logpath = /var/log/nginx/error.log
|
|
```
|
|
|
|
Commandes utiles :
|
|
|
|
```bash
|
|
sudo fail2ban-client status # état global
|
|
sudo fail2ban-client status sshd # état d'une jail
|
|
sudo fail2ban-client set sshd unbanip 203.0.113.42
|
|
sudo fail2ban-client banned # IP bannies cumulées
|
|
```
|
|
|
|
## Alternatives
|
|
|
|
### Open Source
|
|
|
|
- [[app-crowdsec]] — Successeur moderne, collaboratif (blocklist partagée), Go
|
|
- [[app-crowdsec-manager]] — Dashboard web de visualisation CrowdSec
|
|
- **DenyHosts** — Spécialisé SSH, plus maintenu
|
|
- **sshguard** — Plus léger, écrit en C, basé sur PF/ipfw
|
|
- **iptables recent match** — Solution noyau sans daemon (règle pure)
|
|
|
|
### Propriétaire (ce que Fail2Ban remplace)
|
|
|
|
- **Cloudflare WAF** (payant) — filtrage en périphérie CDN
|
|
- **Imperva / Akamai** Bot Manager (entreprise)
|
|
- **Fail2ban-as-a-Service** (Cognito, Castle.io)
|
|
|
|
## Sécurité
|
|
|
|
- **Mettre à jour** régulièrement (CVE historiques sur le parsing des filtres).
|
|
- **Ne jamais logger en clair les mots de passe** : Fail2Ban stocke les bannis, pas les credentials.
|
|
- **Combiner avec un VPN** (WireGuard) plutôt qu'exposer SSH sur Internet.
|
|
- **Whitelist IP de confiance** via `ignoreip = 192.168.0.0/16 203.0.113.0/24` dans `[DEFAULT]`.
|
|
- **Utiliser `recidive`** : une jail qui bannit longuement (1 semaine) les IP qui recidivent après un premier ban.
|
|
- **Notifications** : webhook Discord/Slack via `action.d/` pour réagir en temps réel.
|
|
- **Docker** : attention aux containers en `bridge` — `network_mode: host` est nécessaire pour qu'iptables voie le trafic entrant réel.
|
|
|
|
## Ressources
|
|
|
|
- [Site officiel](https://www.fail2ban.org)
|
|
- [Wiki & documentation](https://github.com/fail2ban/fail2ban/wiki)
|
|
- [Image Docker crazy-max](https://github.com/crazy-max/docker-fail2ban)
|
|
- [Awesome Fail2Ban](https://github.com/chaifeng/awesome-fail2ban)
|
|
- [Communauté](https://github.com/fail2ban/fail2ban/discussions)
|
|
|
|
## Pages Liées
|
|
|
|
- [[cat-networking|Networking]] — Catégorie parente
|
|
- [[cat-security|Sécurité]] — Catégorie transversale
|
|
- [[app-crowdsec]] — Successeur moderne et collaboratif
|
|
- [[app-crowdsec-manager]] — Dashboard CrowdSec
|
|
- [[recettes-docker-compose|Recettes Docker Compose]] — Templates partagés
|
|
- [[securisation-home-lab]] — Guide sécurité global
|