Table des matières
Surveillance des autres services
Apache
Les filtres
Pour apache, c'est plus compliqué. Il gère ses propres logs dans /var/log/apache2
, les erreurs étant relevées dans le fichier error.log
.
De plus, il existe plusieurs filtres dont l'action correspond à divers types d'attaques:
cd /etc/fail2ban/filter.d ls apache* apache-auth.conf apache-fakegooglebot.conf apache-overflows.conf apache-badbots.conf apache-modsecurity.conf apache-pass.conf apache-botsearch.conf apache-nohome.conf apache-shellshock.conf apache-common.conf apache-noscript.confIl n'est pas question d'activer par défaut tous ces filtres. «apache-noscript» est probablement à étudier en priorité. Cependant, il faut avoir présent à l'esprit que les robots d'indexation peuvent légitimement rechercher certains scripts dans leur recherches d'indexation. Il reste donc nécessaire de garder un œil sur l'activité du filtre mis en place.
Une configuration comme celle-ci peut être envisagée:
[apache-noscript]
enabled = true
port = http, https
filter = apache-noscript
logpath = /var/log/apache*/*error.log
maxretry = 3
bantime = 1hour
action = %(action_mwl)s
L'action choisie permettra, en cas de bannissement d'une IP, de vérifier plus facilement si l'action est justifiée.
Un exemple
Notre hacker malformé va chercher sur notre serveur de test des scripts réputés faiblards dans le très réputé CMS «Wordpress», un script nommé «sms_send» présent sur certains routeurs…
fail2ban réagit en bannissant l'intrus:
nft list tables table inet filter table inet f2b-table root@trixie-nft:/etc/fail2ban/jail.d# nft list table inet f2b-table table inet f2b-table { set addr6-set-apache-noscript { type ipv6_addr elements = { 2a01:e0a:875:b1d0:5054:ff:fefe:c099 } } chain f2b-chain { type filter hook input priority filter - 1; policy accept; tcp dport { 80, 443 } ip6 saddr @addr6-set-apache-noscript reject with icmpv6 port-unreachable } }Et, comme le demande la configuration, «root» reçoit ce message:
From root@trixie-nft.home.nain-t.net Fri Jul 4 16:44:27 2025 X-Original-To: root@localhost Subject: [Fail2Ban] apache-noscript: banned 2a01:e0a:875:b1d0:5054:ff:fefe:c099 from trixie-nft.home.nain-t.net Date: Fri, 04 Jul 2025 16:44:27 +0200 From: Fail2Ban <root@trixie-nft.home.nain-t.net> To: root@localhost Hi, The IP 2a01:e0a:875:b1d0:5054:ff:fefe:c099 has just been banned by Fail2Ban after 3 attempts against apache-noscript. # Le compte-rendu Whois: Here is more information about 2a01:e0a:875:b1d0:5054:ff:fefe:c099 : % This is the RIPE Database query service. % The objects are in RPSL format. % % The RIPE Database is subject to Terms and Conditions. % See https://docs.db.ripe.net/terms-conditions.html % Note: this output has been filtered. % To receive output for a database update, use the "-B" flag. % Information related to '2a01:e00::/26' % Abuse contact for '2a01:e00::/26' is 'abuse@proxad.net' inet6num: 2a01:e00::/26 netname: FR-PROXAD-20080121 country: FR ... # Le reste des infos transmises par le whois... ... Lines containing failures of 2a01:e0a:875:b1d0:5054:ff:fefe:c099 (max 1000) [Fri Jul 04 16:43:19.552511 2025] [php:error] [pid 980:tid 980] [client 2a01:e0a:875:b1d0:5054:ff:fefe:c099:56072] script '/var/www/html/wp-login.php' not found or unable to stat [Fri Jul 04 16:43:34.452577 2025] [php:error] [pid 979:tid 979] [client 2a01:e0a:875:b1d0:5054:ff:fefe:c099:52002] script '/var/www/html/xmlrpc.php' not found or unable to stat [Fri Jul 04 16:43:49.319599 2025] [cgi:error] [pid 981:tid 981] [client 2a01:e0a:875:b1d0:5054:ff:fefe:c099:37622] AH02811: stderr from /usr/lib/cgi-bin/sms_send: script not found or unable to stat [Fri Jul 04 16:44:27.390816 2025] [php:error] [pid 983:tid 983] [client 2a01:e0a:875:b1d0:5054:ff:fefe:c099:59220] script '/var/www/html/xmlrpc.php' not found or unable to start Regards, Fail2BanMais comme ce hacker est décidément un bourrin, il essaye encore ssh, des fois que…
Et au final:
table inet f2b-table { set addr6-set-apache-noscript { type ipv6_addr elements = { 2a01:e0a:875:b1d0:5054:ff:fefe:c099 } } set addr6-set-sshd { type ipv6_addr elements = { 2a01:e0a:875:b1d0:5054:ff:fefe:c099 } } chain f2b-chain { type filter hook input priority filter - 1; policy accept; tcp dport { 80, 443 } ip6 saddr @addr6-set-apache-noscript reject with icmpv6 port-unreachable tcp dport 22 ip6 saddr @addr6-set-sshd reject with icmpv6 port-unreachable } }
Postfix
La gestion de Postfix par systemd nécessite quelques remarques.
Si la commande journalctl -u postfix.service
permet d'obtenir toutes les informations nécessaires dans le cas de Debian 13 «Trixie», ce n'est pas le cas pour les versions antérieures (12 «Bookworm») où il faudra adopter l'une de ces commandes
journalctl _SYSTEMD_SLICE=system-postfix.slice journalctl _SYSTEMD_UNIT=postfix@-.service
Fail2ban propose par défaut un seul filtre: postfix.conf
, mais il peut lui aussi être plus ou moins «aménagé» au moyen des modes.
# Parameter "mode": more (default combines normal and rbl), auth, normal, rbl, ddos, extra or aggressive (combines all) # Usage example (for jail.local): # [postfix] # mode = aggressive # # # or another jail (rewrite filter parameters of jail): # [postfix-rbl] # filter = postfix[mode=rbl] # # # jail to match "too many errors", related postconf `smtpd_hard_error_limit`: # # (normally included in other modes (normal, more, extra, aggressive), but this jail'd allow to ban on the first message) # [postfix-many-errors] # filter = postfix[mode=errors] # maxretry = 1 # mode = moreDans la mesure où Postfix utilise SASL pour authentifier les clients sortants, le mode auth est redondant avec l'authentification Dovecot. En revanche, il peut être utile de surveiller les «ddos», ce que le mode «normal» (ou «more» qui est désormais équivalent) ne fait pas.
En revanche, les modes «extra» ou «aggressive» le font, mais également mettent en jeu la surveillance de l'authentification.
Dovecot
La définition proposée pour la prison «dovecot» est la suivante:
[dovecot] enabled = true port = pop3,pop3s,imap,imaps,submission,465,sieve logpath = %(dovecot_log)s backend = %(dovecot_backend)Nous n'utilisons pas les protocoles pop3 ni pop3s. donc nous mettrons plutôt:
port = imap,imaps,submission,465,sieve