fail2ban apache-noscript ne fonctionne pas sur squeeze

Je suis en train de préparer un nouveau serveur chez Online avec une Debian Squeeze 32 bits. J’ai installé Fail2ban avec aptitude et le fonctionnement est correct avec la “jail” ssh de base sur le port 22 : les robots se font bien bannir par iptables. Pour limiter au mieux les tentatives de connexion, j’ai changé le port d’écoute du sshd. Maintenant je n’ai plus de tentative de connexions mais si je faits des erreurs volontaire, elles sont bien vu dans la jail par “fai2ban-client status ssh”.

Jusque là tout va bien mais dès que j’active la “jail” apache-noscript cette dernière ne fonctionne pas. La quasi totalité des tentatives de connexion ne sont pas vues par la “jail” alors qu’elles sont bien présentes dans le fichier /var/log/apache2/error.log

j’ai pensé qu’il y avait un problème d’expression régulière ou de chemin des fichiers log. Pour tester cela, j’ai utilisé la commande fail2ban-regex

[code]root@ft-dev01:/etc/fail2ban# fail2ban-regex /var/log/apache2/error.log /etc/fail2ban/filter.d/apache-noscript.conf
/usr/share/fail2ban/server/filter.py:442: DeprecationWarning: the md5 module is deprecated; use hashlib instead
import md5

Running tests

Use regex file : /etc/fail2ban/filter.d/apache-noscript.conf
Use log file : /var/log/apache2/error.log

Results

Failregex
|- Regular expressions:
| [1] [[]client []] (File does not exist|script not found or unable to stat): /\S*(.php|.asp|.exe|.pl)
| [2] [[]client []] script ‘/\S*(.php|.asp|.exe|.pl)\S*’ not found or unable to stat *$
|
`- Number of matches:
[1] 0 match(es)
[2] 9 match(es)

Ignoreregex
|- Regular expressions:
|
`- Number of matches:

Summary

Addresses found:
[1]
[2]
212.124.118.115 (Tue Mar 01 01:05:08 2011)
212.124.118.115 (Tue Mar 01 01:05:44 2011)
212.124.118.115 (Tue Mar 01 01:05:44 2011)
212.124.118.115 (Tue Mar 01 01:06:02 2011)
212.124.118.115 (Tue Mar 01 01:06:20 2011)
212.124.118.115 (Tue Mar 01 01:06:20 2011)
38.113.189.99 (Tue Mar 01 13:08:49 2011)
38.124.20.42 (Tue Mar 01 21:15:26 2011)
78.240.44.133 (Wed Mar 02 15:08:31 2011)

Date template hits:
2771 hit(s): MONTH Day Hour:Minute:Second
0 hit(s): WEEKDAY MONTH Day Hour:Minute:Second Year
0 hit(s): WEEKDAY MONTH Day Hour:Minute:Second
0 hit(s): Year/Month/Day Hour:Minute:Second
0 hit(s): Day/Month/Year Hour:Minute:Second
0 hit(s): Day/Month/Year Hour:Minute:Second
0 hit(s): Day/MONTH/Year:Hour:Minute:Second
0 hit(s): Month/Day/Year:Hour:Minute:Second
0 hit(s): Year-Month-Day Hour:Minute:Second
0 hit(s): Day-MONTH-Year Hour:Minute:Second[.Millisecond]
0 hit(s): Day-Month-Year Hour:Minute:Second
0 hit(s): TAI64N
0 hit(s): Epoch
0 hit(s): ISO 8601
0 hit(s): Hour:Minute:Second
0 hit(s): <Month/Day/Year@Hour:Minute:Second>

Success, the total number of match is 9

However, look at the above section ‘Running tests’ which could contain important
information.
[/code]

Le chemin et les regex sont donc corrects !!! Normal ce sont celles du paquet.
Pour tester, j’ai volontairement accédé à des répertoires invalides. j’ai eu une détection par la “jail”.

root@ft-dev01:/etc/fail2ban# fail2ban-client status apache-noscript Status for the jail: apache-noscript |- filter | |- File list: /var/log/apache2/error.log | |- Currently failed: 1 | `- Total failed: 1 `- action |- Currently banned: 0 | `- IP list: `- Total banned: 0
J’ai ensuite laissé tourné jusqu’à avoir des tentatives de robots externes. Après en avoir eu, (cela n’a pas été long…) j’ai regardé le status de la “jail”. Aucune tentative n’a été détectée alors que ces dernières sont bien présentes dans le error.log.

root@ft-dev01:/etc/fail2ban# fail2ban-client status apache-noscript Status for the jail: apache-noscript |- filter | |- File list: /var/log/apache2/error.log | |- Currently failed: 0 | `- Total failed: 1 `- action |- Currently banned: 0 | `- IP list: `- Total banned: 0

Voici la fin du log d’apache.

[Wed Mar 02 15:09:30 2011] [error] [client 78.240.44.133] File does not exist: /var/www/script [Wed Mar 02 15:12:41 2011] [error] [client 190.30.227.242] File does not exist: /var/www/mysql [Wed Mar 02 15:12:41 2011] [error] [client 190.30.227.242] File does not exist: /var/www/mysql [Wed Mar 02 15:12:42 2011] [error] [client 190.30.227.242] File does not exist: /var/www/mysql [Wed Mar 02 15:12:42 2011] [error] [client 190.30.227.242] File does not exist: /var/www/mysql [Wed Mar 02 15:12:42 2011] [error] [client 190.30.227.242] File does not exist: /var/www/phpmyadmin [Wed Mar 02 15:12:42 2011] [error] [client 190.30.227.242] File does not exist: /var/www/phpMyadmin [Wed Mar 02 15:12:43 2011] [error] [client 190.30.227.242] File does not exist: /var/www/phpMyAdmin .../... j'ai supprimé des lignes pour ne pas encombrer le post .../... [Wed Mar 02 15:13:12 2011] [error] [client 190.30.227.242] File does not exist: /var/www/administrator [Wed Mar 02 15:13:12 2011] [error] [client 190.30.227.242] File does not exist: /var/www/administrator [Wed Mar 02 15:13:12 2011] [error] [client 190.30.227.242] File does not exist: /var/www/administrator [Wed Mar 02 15:13:13 2011] [error] [client 190.30.227.242] File does not exist: /var/www/administrator [Wed Mar 02 16:09:14 2011] [error] [client 87.106.97.10] File does not exist: /var/www/toto [Wed Mar 02 16:32:29 2011] [error] [client 87.251.185.213] client sent HTTP/1.1 request without hostname (see RFC2616 section 14.23): /w00tw00t.at.ISC.SANS.test0:) [Wed Mar 02 16:55:58 2011] [error] [client 78.240.44.133] File does not exist: /var/www/titi [Wed Mar 02 16:58:05 2011] [error] [client 78.240.44.133] File does not exist: /var/www/titi [Wed Mar 02 16:58:05 2011] [error] [client 78.240.44.133] File does not exist: /var/www/favicon.ico, referer: http://ft-dev01.futur-tech.net/titi [Wed Mar 02 17:00:57 2011] [error] [client 78.240.44.133] File does not exist: /var/www/titi [Wed Mar 02 17:00:57 2011] [error] [client 78.240.44.133] File does not exist: /var/www/favicon.ico, referer: http://ft-dev01.futur-tech.net/titi

Si je relance la commande fail2ban-regex, la sortie est strictement la même. A partir de ce moment, c’est comme si cette “Jail” ne prend plus en compte les modifs du fichier de log d’apache. Plus rien n’est vu, y compris mes erreurs volontaires.

Nota : la “jail” ssh continue a détecter.

J’ai arrêté / démarré le service fail2ban pour voir si j’arrivais à reprendre la main. pas mieux (je passe outre le fait que les chaines iptables ne sont pas bien initialisées dès qu’il y a 2 jails ou plus, c’est un autre problème).

A l’aide, car je commence à criser… :119 :smiling_imp:


Linux ft-dev01 2.6.32-5-686-bigmem #1 SMP Wed Jan 12 04:40:25 UTC 2011 i686 GNU/Linux

Bonjour,

Quel est la valeur du maxretry au niveau de apache-noscript et de findtime ?

findtime n’est pas défini dans le fichier jail.conf ni jail.local !!!

voici la “jail” dans jail.local
J’ai volontairement limité sa porté tant que le pb n’est pas résolu.

[code][apache-noscript]

enabled = true
port = http,https
filter = apache-noscript

logpath = /var/log/apache*/*error.log

logpath = /var/log/apache*/error.log
maxretry = 6
[/code]

Bonjour,

Pour tester peux tu mettre le maxretry à 1 au lieu de 6. Ainsi dès la premiere tentative, il y aura bannissement.

Peux tu donner le contenu de /var/log/fail2ban.log ?

OK.

Je pense avoir localisé le problème. L’expression régulière qui sert à cette jail est différente de celle que j’ai sur un autre serveur. les tentatives des robots pour trouver l’alias de phpmyadmin ne sont plus filtrées par cette jail.
J’ai donc créé un filtre spécifique qui permet également de filtrer les /w00tw00t.at.ISC.SANS.DFind:

voici ce filtre que j’ai appelé apache-noscript-ft.conf

# Fail2Ban configuration file
#
# Author: Cyril Jaquier
#
# $Revision: 728 $
#

[Definition]

# Option:  failregex
# Notes.:  regex to match the password failure messages in the logfile. The
#          host must be matched by a group named "host". The tag "<HOST>" can
#          be used for standard IP/hostname matching and is only an alias for
#          (?:::f{4,6}:)?(?P<host>[\w\-.^_]+)
# Values:  TEXT
#
# failregex = [[]client <HOST>[]] (File does not exist|script not found or unable to stat): /\S*(\.php|\.asp|\.exe|\.pl)
failregex = [[]client <HOST>[]] (File does not exist|script not found or unable to stat): .*$
            [[]client <HOST>[]] script '/\S*(\.php|\.asp|\.exe|\.pl)\S*' not found or unable to stat *$
            [[]client <HOST>[]] client sent HTTP/1.1 request without hostname.*\/w00tw00t\.at\.ISC\.SANS.*

# Option:  ignoreregex

Attention, ce filtre est assez “violent”. le moindre accès à des pages inaccessibles va être comptabilisé. A utiliser avec précautions…

Je continue le testing et dès que c’est bon, je passe en résolu.

Je viens de finir de tuner fail2ban pour ma config. Pour ceux qui veulent interfacer fail2ban avec apf-firewall, voici le fichier à ajouter dans /etc/fai2ban/action.d/

[code]# Fail2Ban configuration file

Author: Pascal HULLIN based on the shorewall configuration script

$Revision: 661 $

[Definition]

Option: actionstart

Notes.: command executed once at the start of Fail2Ban.

Values: CMD

actionstart =

Option: actionstop

Notes.: command executed once at the end of Fail2Ban

Values: CMD

actionstop =

Option: actioncheck

Notes.: command executed once before each actionban command

Values: CMD

actioncheck =

Option: actionban

Notes.: command executed when banning an IP. Take care that the

command is executed with Fail2Ban user rights.

Tags: IP address

number of failures

unix timestamp of the ban time

Values: CMD

actionban = apf -d “Banned by fail2ban after failures”

Option: actionunban

Notes.: command executed when unbanning an IP. Take care that the

command is executed with Fail2Ban user rights.

Tags: IP address

number of failures

unix timestamp of the ban time

Values: CMD

actionunban = apf -u

[Init]
[/code]

Rien d’extraordinaire me direz vous ! sauf que je me suis basé sur le fichier shorewall.conf pour ne pas réinventer la roue… Et cela ne fonctionne pas CAR IL MANQUAIT LE [Init] à la fin du fichier. Je suppose donc que le fichier shorewall.conf ne fonctionne pas lui aussi.
Un petit bogue dans le paquet.

Maintenant c’est bon.

Bonjour,

Pour info, la ligne 1 de

failregex = [[]client <HOST>[]] (File does not exist|script not found or unable to stat): .*$ [[]client <HOST>[]] script '/\S*(\.php|\.asp|\.exe|\.pl)\S*' not found or unable to stat *$ [[]client <HOST>[]] client sent HTTP/1.1 request without hostname.*\/w00tw00t\.at\.ISC\.SANS.*
existe (quasi) déjà dans le fichier apache-nohome.conf. Tu n’as qu’à ajouter dans ton fichier jail.conf

[quote][apache-nohome]

enabled = true
port = http,https
filter = apache-nohome
logpath = /var/log/apache*/*error.log
maxretry = 6[/quote]

Par contre, je te prends ton idée pour les 2 secondes lignes…

Edit : pour les w00tw00t … pense à scanner les fichiers log acces également