Protéger Apache grâce à Fail2ban

apache_software_foundation_logo_3074-300x158

Suite au précédent article où j’ai abordé Fail2ban pour sécuriser mon architecture ESXI, nous allons voir ici comment protéger un serveur Apache de diverses attaques en provenance d’Internet.

Il existe plusieurs « Jail » prédéfinis qu’il suffit d’activer, pour le reste :

W00tw00t

Le wootwoot est la signature laissée dans les logs d’Apache par des scripts kiddies. Bien que massivement présent sur Internet, ces scripts sont la plupart du temps inoffensifs, ils ne font que polluer nos logs .

Configuration :

Il faut configurer le filtre :
nano /etc/fail2ban/filter.d/apache-w00tw00t.conf

[Definition]
failregex = ^<HOST> -.*"GET \/.*w00t.*".*
\[client <HOST>\] client sent HTTP\/1\.1 request without hostname \(see RFC2616 section 14\.23\)$
ignoreregex =

On configure à présent la prison :
nano /etc/fail2ban/jail.conf

[apache-w00tw00t]
enabled = true
filter = apache-w00tw00t
action = iptables[name=Apache-w00tw00t,port=80,protocol=tcp]
logpath = /var/log/apache2/*.log
maxretry = 1

Bruteforce

Une attaque bruteforce a pour but de déterminer votre mot de passe en essayant toutes les combinaisons possibles. En plus de cela, ces attaques polluent nos logs Apache. En effet, les scripts s’attaquent aux modules génériques d’un serveur WEB, même si ces derniers ne sont pas installés.

Configuration :

Il faut configurer le filtre :
nano /etc/fail2ban/filter.d/apache-bruteforce.conf

[Definition]
failregex = [[]client <HOST>[]] File does not exist: /var/www/admin.*
[[]client <HOST>[]] File does not exist: /usr/share/.*
[[]client <HOST>[]] request failed: error reading the headers
[[]client <HOST>[]] File does not exist: /var/www/3rdparty.*
[[]client <HOST>[]] File does not exist: /var/www/PHPMYADMIN.*
[[]client <HOST>[]] File does not exist: /var/www/PMA.*
[[]client <HOST>[]] File does not exist: /var/www/phpMyAdmin.*
[[]client <HOST>[]] File does not exist: /var/www/round.*
[[]client <HOST>[]] File does not exist: /var/www/rc.*
[[]client <HOST>[]] File does not exist: /var/www/mss2.*
[[]client <HOST>[]] File does not exist: /var/www/mail.*
[[]client <HOST>[]] File does not exist: /var/www/rms.*
[[]client <HOST>[]] File does not exist: /var/www/web.*
[[]client <HOST>[]] File does not exist: /var/www/wm.*
[[]client <HOST>[]] File does not exist: /var/www/bin.*
[[]client <HOST>[]] File does not exist: /var/www/cube.*
[[]client <HOST>[]] File does not exist: /var/www/proxy.*
[[]client <HOST>[]] File does not exist: /var/www/ip.*
[[]client <HOST>[]] File does not exist: /var/www/mysql.*
[[]client <HOST>[]] File does not exist: /var/www/myadmin.*
[[]client <HOST>[]] File does not exist: /var/www/bbs.*
[[]client <HOST>[]] File does not exist: /var/www/cpadmin.*
[[]client <HOST>[]] File does not exist: /var/www/blog.*
[[]client <HOST>[]] File does not exist: /var/www/forum.*
[[]client <HOST>[]] File does not exist: /var/www/e107.*
[[]client <HOST>[]] File does not exist: /var/www/www.*
[[]client <HOST>[]] File does not exist: /var/www/SSLMySQLAdmin.*
[[]client <HOST>[]] File does not exist: /var/www/SQL.*
[[]client <HOST>[]] File does not exist: /var/www/~.*
[[]client <HOST>[]] File does not exist: /var/www/db.*
[[]client <HOST>[]] File does not exist: /var/www/sql.*
[[]client <HOST>[]] File does not exist: /var/www/Myadmin.*
[[]client <HOST>[]] File does not exist: /var/www/php.*
[[]client <HOST>[]] File does not exist: /var/www/2phpmyadmin.*
[[]client <HOST>[]] File does not exist: /var/www/tool.*
[[]client <HOST>[]] File does not exist: /var/www/path.*
[[]client <HOST>[]] File does not exist: /var/www/data.*
[[]client <HOST>[]] File does not exist: /var/www/doesnotexist.*
ignoreregex =

On configure à présent la prison :
nano /etc/fail2ban/jail.conf

[apache-bruteforce]
enabled = true
filter = apache-bruteforce
action = iptables[name=Apache-bruteforce,port=80,protocol=tcp]
logpath = /var/log/apache2/error*.log
maxretry = 1

Bruteforce wordpress

Ces règles sont spécifiques aux attaques brutforce sur l’interface d’administration WordPress.

Il faut configurer le filtre :
nano /etc/fail2ban/filter.d/apache-wp-login.conf

[Definition]
failregex = <HOST>.*] "POST /wp-login.php
ignoreregex =

On configure à présent la prison :
nano /etc/fail2ban/jail.conf

[apache-wp-login]
enabled = true
port   = http,https
filter = apache-wp-login
action = iptables[name=WP, port=http, protocol=tcp]
logpath = /var/log/apache2/access.log
maxretry = 3

DDOS

Une attaque par déni de service vise à rendre un serveur/service indisponible en surchargeant la bande passante du serveur, ou en accaparant toutes ses ressources. Nous bannirons ici toutes les IP faisant plus de 2,5 requêtes GET par seconde.

Il faut configurer le filtre :
nano /etc/fail2ban/filter.d/http-get-dos.conf

[Definition]
failregex = ^<HOST>.*\"GET
ignoreregex =

On configure à présent la prison :
nano /etc/fail2ban/jail.conf

[http-get-dos]
enabled = true
port = http,https
filter = http-get-dos
logpath = /var/log/apache2/error.log
maxretry = 360
findtime = 150
action = iptables[name=HTTP, port=http, protocol=tcp]
bantime = 600

N’oubliez pas de redémarrer le service Fail2ban pour prendre en application les modifications :
/etc/init.d/fail2ban restart

XMLRPC

Suite à cette article, voici une prison visant à protéger votre WordPress des failles XMLRPC.

Il faut configurer le filtre :
nano /etc/fail2ban/filter.d/xmlrpc.conf

[Definition]
failregex = ^ .*POST .*xmlrpc\.php.*
ignoreregex =

On configure à présent la prison :
nano /etc/fail2ban/jail.conf

[xmlrpc]
enabled = true
port = http,https
filter = xmlrpc
action = iptables[name=xmlrpc, port=http, protocol=tcp]
logpath = /var/log/apache2/access.log
maxretry = 2
bantime = 100000

 

Bookmarquez le permalien.
  • Nicolas Richard

    Je cherchais quelques règles Fail2ban que j’aurai pu oublier dans ma config. Très bonne idée pour le flood. Cependant cela doit occasionner une charge CPU assez importante lors du parse des logs.
    Je préconiserais de réduire le niveau de log d’Apache, voire de filtrer ce qui est loggué.
    J’aimais une réserve par contre : comment le nom du filter dans jail.conf (préféré jail.local pour les maj) peut être différent du nom du fichier dans le répertorie filter ?

  • powtos

    Salut,

    Merci pour tes remarques très intéressante. En effet, pour le nom des filtres, je me suis trompé plusieurs fois dans l’article ( mauvais copié collé ), tout est corrigé, merci encore!

    Je complèterais cette article pour une configuration plus précise en filtrant les LOG, des filtres que j’ai ajouté par la suite etc..