1 votes

fail2ban comportement bizarre des bannissements bannissements pas IP correctement

J'essaie de bannir toutes les erreurs 403 suspectes via fail2ban.

J'ai donc créé cette prison

# block 403 errors
[apache-403]
enabled = true
filter = apache-403
port = http,https
logpath = /var/log/apache2/other_vhosts_access.log
bantime = 3600
maxretry = 5
ignoreip = 127.0.0.1/8 37.4.226.100

avec ces règles de filtrage

failregex = <HOST> .* "(GET|POST|HEAD) .* HTTP/1\.[01]" 403 .*

Maintenant, j'ai vérifié avec fail2ban-client status apache-403 la prison et j'ai obtenu ceci

Status for the jail: apache-403
|- Filter
|  |- Currently failed: 0
|  |- Total failed: 51
|  `- File list:    /var/log/apache2/other_vhosts_access.log
`- Actions
   |- Currently banned: 1
   |- Total banned: 1
   `- Banned IP list:   de:443

Mais de:443 n'est pas une IP... Alors où est le problème ?

Une ligne de journal spécifique ressemble à ceci :

jotoma.de:443 45.133.192.140 - - [15/Apr/2021:01:42:42 +0200] "POST /wp-login.php HTTP/1.1" 403 10297 "-" "Mozilla/5.0 (Linux; Android 6.0.1; SM-G610M Build/MMB29K; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/65.0.3325.109 Mobile Safari/537.36 Instagram 41.0.0.13.92 Android (23/6.0.1; 480dpi; 1080x1920; samsung; SM-G610M; on7xelte; samsungexynos7870; pt_BR; 103516666)"

Que dois-je faire maintenant pour le corriger ? Avant, j'avais un gros problème pour faire fonctionner cette règle de filtrage, mais maintenant elle fonctionne, mais apparemment de façon erronée.

0voto

sebres Points 885

Le problème ici est votre regex "vulnérable" (non ancrée, avec de nombreux attrape-tout, etc.) ainsi que l'hypothèse non valide que la balise <HOST> correspondant à l'adresse IP uniquement (il peut également correspondre aux noms d'hôtes). Vous pouvez effectivement forcer fail2ban à ne faire correspondre que les adresses IP, soit en désactivant l'option usedns ou en utilisant une autre balise <ADDR> au lieu de <HOST> .

Mais au lieu de cela, il serait préférable d'utiliser des expressions rationnelles ancrées et plus précises :

failregex = ^(?:\S+:\d+ )?<ADDR> \S+ \S+ \[\] "[A-Z]+ /[^"]* \S+" 403\b

(remplacer l'étiquette <ADDR> con <HOST> si votre version de fail2ban est inférieure à la v.0.10).

Notez également que l'utilisation de l'horodatage au milieu du message n'est pas du tout recommandée, il serait préférable de reconfigurer le format du journal d'apache pour le placer en début de ligne, de sorte qu'il produise quelque chose comme ceci :

[15/Apr/2021:01:42:42 +0200] srv:443 192.0.2.1 - - "POST /wp-login.php HTTP/1.1" 403 ...

dans ce cas, votre prison pourrait alors ressembler à ceci :

[apache-403]
enabled = true
filter =
datepattern = ^\[%%d/%%b/%%Y:%%H:%%M:%%S(?:[.,]%%f)?(?: %%z)?\]
failregex = ^\s*(?:\S+:\d+ )?<ADDR> \S+ \S+ "[A-Z]+ /[^"]* \S+" 403\b
...

(a utilisé l'unique datepattern également ancré au début de la ligne).

Aussi, puisque vous semblez surveiller directement le journal d'accès, veuillez lire Fail2ban : : wiki : : Meilleure pratique car cette stratégie n'est pas du tout recommandée.

0 votes

Regex fonctionne, j'espère que le mécanisme d'interdiction aussi :)

0voto

ridcully Points 137

Merci. J'ai changé maintenant le LogFormat à ça :

#LogFormat "%v:%p %h %l %u %t \"%r\" %>s %O \"%{Referer}i\" \"%{User-Agent}i\"" vhost_combined
#LogFormat "%h %l %u %t \"%r\" %>s %O \"%{Referer}i\" \"%{User-Agent}i\"" combined
#LogFormat "%h %l %u %t \"%r\" %>s %O" common
LogFormat "%t %v:%p %h %l %u \"%r\" %>s %O \"%{Referer}i\" \"%{User-Agent}i\"" vhost_combined
LogFormat "%t %h %l %u \"%r\" %>s %O \"%{Referer}i\" \"%{User-Agent}i\"" combined
LogFormat "%t %h %l %u \"%r\" %>s %O" common

Je rapporterai si cela fonctionne ou non car le journal doit être nouvellement écrit et ne peut être testé avec fail2ban_regex .

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X