Pare-feu : Fail2ban, jails et filtres
Protéger des services précis avec des jails et écrire ses propres filtres.
[sshd]enabled = truemaxretry = 3findtime = 10mbantime = 1hmode = aggressivemode |
Échecs comptés |
|---|---|
normal (défaut) |
Mots de passe erronés, clés refusées |
ddos |
+ connexions interrompues avant l’authentification |
extra |
normal + ddos |
aggressive |
Tout, y compris les utilisateurs inexistants |
Voir SSH : durcissement du serveur.
[nginx-http-auth]enabled = true
[nginx-limit-req]enabled = true
[nginx-botsearch]enabled = true| Jail | Détecte |
|---|---|
nginx-http-auth |
Échecs d’authentification basique |
nginx-limit-req |
Dépassements de limit_req |
nginx-botsearch |
Recherche de scripts inexistants |
Ces filtres lisent /var/log/nginx/error.log.
[apache-auth]enabled = true
[apache-badbots]enabled = true
[apache-noscript]enabled = trueCaddy : filtres sur le journal JSON
Section intitulée « Caddy : filtres sur le journal JSON »Caddy n’a pas de jail intégrée. Il écrit un journal d’accès JSON (voir Exemple : VPS avec Caddy) :
{"level":"info","ts":1791217629.04,"logger":"http.log.access.log0","msg":"handled request","request":{"remote_ip":"203.0.113.9","client_ip":"203.0.113.9","method":"GET","host":"exemple.com","uri":"/admin/"},"status":401}Filtre /etc/fail2ban/filter.d/caddy-auth.conf (401 et 403) :
[Definition]failregex = ^.*"client_ip":"<ADDR>".*"status":(?:401|403),datepattern = "ts":{EPOCH}ignoreregex =Filtre /etc/fail2ban/filter.d/caddy-sondes.conf (sondes de scanners) :
[Definition]failregex = ^.*"client_ip":"<ADDR>".*"uri":"[^"]*(?:/\.env|/\.git|wp-login\.php|xmlrpc\.php|phpmyadmin|/admin\.php|/cgi-bin)[^"]*".*"status":404,datepattern = "ts":{EPOCH}ignoreregex =Jails :
[caddy-auth]enabled = trueport = http,httpsfilter = caddy-authlogpath = /var/log/caddy/acces.logmaxretry = 5findtime = 10mbantime = 1h
[caddy-sondes]enabled = trueport = http,httpsfilter = caddy-sondeslogpath = /var/log/caddy/acces.logmaxretry = 3bantime = 1d<ADDR> désigne une adresse IP (IPv4 ou IPv6) ; {EPOCH} indique une date en horodatage Unix (champ ts de Caddy).
Écrire et vérifier un filtre
Section intitulée « Écrire et vérifier un filtre »- Repérer une ligne de journal représentative d’un échec.
- Écrire
failregexen remplaçant l’adresse par<ADDR>. - Vérifier avec
fail2ban-regex, sans rien bannir.
sudo fail2ban-regex /var/log/caddy/acces.log caddy-authsudo fail2ban-regex 'ligne copiée' 'regex'sudo fail2ban-regex systemd-journal sshdsudo fail2ban-regex --print-all-missed /var/log/caddy/acces.log caddy-auth | headLines: 17 lines, 0 ignored, 8 matched, 9 missedmatched : lignes reconnues comme échec ; missed : lignes non reconnues (normal pour les accès réussis). Si matched vaut 0 alors que des échecs existent, ajuster failregex et vérifier datepattern.
logpath, backend et journalmatch
Section intitulée « logpath, backend et journalmatch »| Réglage | Usage |
|---|---|
logpath = /var/log/… |
Surveille un fichier (jokers possibles) |
backend = systemd |
Lit le journal systemd |
journalmatch = _SYSTEMD_UNIT=ssh.service |
Limite à une unité |
Un fichier de journal absent empêche la jail de démarrer : le créer ou corriger le chemin.
Récidivistes
Section intitulée « Récidivistes »[recidive]enabled = truebantime = 1wfindtime = 1dmaxretry = 3recidive lit /var/log/fail2ban.log : trois bannissements en un jour valent une semaine de blocage.
Bases de données
Section intitulée « Bases de données »Pour une base exposée à un réseau, restreindre l’accès par adresse avec UFW (voir UFW : écrire des règles) plutôt que de compter sur Fail2ban.
sudo grep -E "Ban |Unban " /var/log/fail2ban.log | tail -20sudo fail2ban-client statusLes alertes par e-mail (action_mwl) exigent un serveur de messagerie local configuré.
Dépannage
Section intitulée « Dépannage »| Symptôme | Piste |
|---|---|
Failed to initialize any backend |
Fichier de journal absent ou illisible |
No file(s) found for glob |
logpath incorrect |
| Aucune ligne reconnue | fail2ban-regex ; format JSON, datepattern |
| Échecs comptés, pas de bannissement | maxretry non atteint, ignoreip, ignoreself |
| Adresse du proxy bannie | Configurer trusted_proxies (Caddy) ou le module realip (Nginx) |
| Jail active, rien n’est bloqué | Mauvais port ; sudo nft list ruleset | grep f2b |
Ubuntu 24.04 et 26.04 : différences à connaître
Section intitulée « Ubuntu 24.04 et 26.04 : différences à connaître »Les filtres livrés évoluent entre 1.0.2 et 1.1.0 (prise en charge de sshd-session, filtres supplémentaires) ; les filtres personnalisés ci-dessus sont indépendants de la version.
Pour aller plus loin
Section intitulée « Pour aller plus loin »- Manuel :
man jail.conf,man fail2ban-regex - Suite : Diagnostic et règles réelles