Morefnu.org
Dyslexics have more fnu!
Dyslexics have more fnu!
Histoire de changer de sujet, un premier article technique sur la configuration d'apache2 et de fail2ban pour se prémunir de quelques attaques et autres scans de votre serveur web.
En regardant vos logs apache de plus près, vous verrez probablement des requêtes du genre :
195.5.132.17 - - [16/Mar/2008:04:56:50 +0100] "GET /index.php?page=http://www.maichantsite.com/echo.txt? HTTP/1.1" 403 211 "-" "libwww-perl/5.805"
C'est en général l'oeuvre de scripts scannant un site web, à la traque d"un éventuel exploit possible. Les pages mentionnées contiennent en général, un petit script vérifiant la configuration php pour les plus gentils (mic22, par exemple), jusqu'à des jolis bots se connectant à IRC par la suite, pour les moins polis ...
fail2ban est un outil permettant de déclencher des traitements donnés lorsque des lignes fichiers de log correspondent à des critères donnés. Il est typiquement utilisé pour bannir des adresses IP qui tentent de se connecter via SSH sur un serveur.
Attention ! Les solutions proposées ici ne permettent pas de se prémunir de toutes les attaques (loin de là [1]), mais éventuellement de limiter quelques dégats collatéraux. En effet, fail2ban analyse les fichiers a posteriori, ce qui signifie que ce qu'il voit s'est déjà passé sur la machine... on ne le dira jamais assez, soyez à l'écoute des mises à jour de vos applications php (et autres), et faites des updates réguliers.
Comme indiqué dans la note précédente, la solution décrite dans cet article ne rendra pas votre serveur étanche à toutes les attaques, elle permettra juste d'empêcher les répétitions d'attaques depuis la même machine. Une sécurisation de PHP est souvent bénéfique, en cas de faille non encore trouvée, surtout si vos applications ne font pas usage de tout.
Il est en général de bon ton de mettre les lignes suivantes dans votre php.ini (dans /etc/php5/apache2/php.ini sur une debian/ubuntu avec php5) :
disable_functions = exec,passthru,popen,proc_open,shell_exec,system
Force est de constater qu'une grande partie des scripts sus-cités gardent leur user-agent. Même si c'est facilement modifiable par l'attaquant, et n'est en aucun cas un gage de sécurité, il est bon de mettre ce genre de ligne dans la configuration de son apache :
BrowserMatchNoCase "^.*libwww.*$" denyua
Puis dans un .htaccess à la base de son site :
Deny from env=denyua
Cela bannira purement et simplement tout user-agent contenant libwww (et notamment le fameux "libwww-perl/5.805")
L'idée ici, est de bannir un utilisateur qui aura transmis une URL "saugrenue". Sera considérée comme URL "saugrenue" toute URL de type GET contenant "http://" dans la query string. A noter que fail2ban propose déjà un filtre apache-badbots.conf qui permet d'identifier des user-agent anormaux. Nous allons ajouter 2 fichiers de configuration spécifiques aux traitements que l'on souhaite faire :
[Definition] # Option: failregex # Values: TEXT # failregex = ^<HOST> -.*"GET\[^"]*=http://\[^"]*".*$ # Option: ignoreregex # Notes.: regex to ignore. If this regex matches, the line is ignored. # Values: TEXT # ignoreregex =
[Definition]
# Option: actionstart
# Notes.: command executed once at the start of Fail2Ban.
# Values: CMD
#
actionstart =
# Option: actionend
# 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> IP address
# <failures> number of failures
# <time> unix timestamp of the ban time
# Values: CMD
#
actionban = IP=<ip> &&
echo "Deny from $IP" >> <file>
# 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
#
Il nous suffit juste alors de définir les règles qui vont vien dans /etc/fail2ban/jail.conf, en y ajoutant la section :
[apache-baduri]
enabled = true
port = http, https
filter = apache-baduri
logpath = /var/log/apache2/access.log
action = sendmail[name=APACHE_BADURI, dest=mail_destinataire, logpath=%(logpath)s]
apachedenyfrom[file=emplacement_du_htaccess_a_generer]
maxretry = 1
(remplacer mail_destinataire, emplacement_du_htaccess_a_generer et /var/log/apache2/access.log par les valeurs adéquates :)
[1] on me sussure dans l'oreillette que la locution "loin s'en faut" est plus qu'hasardeuse
| Ce billet a été posté par Dsls, le 17 mars 2008 à 08:52 et est classé dans Techno . Suivez les réponses à cet article par le biais de son fil RSS. Vous pouvez poster une réponse ou faire un rétrolien depuis votre propre site. |
Pas (encore) de commentaire