Voici quelques solutions pour sécuriser son serveur, tout du moins pour les attaques basiques, malheureusement un pirate expérimenté fera presque ce qu’il veut de votre serveur mais à quelle fin ? Aucune normalement (à moins que votre serveur n’héberge quelques « saletés » qui ne plaisent pas au pirate).

Mod_evasive

Ce module Apache permet plusieurs choses et notamment de stopper les attaques brutes. Il est par contre difficile à régler et inadéquat pour certain site web (à mon avis). En fait il consiste à compter les requêtes d’une adresse IP arrivant par URL ou par site et à bloquer temporairement cette IP si elle dépasse les limites fixées. Pour installer ce module Apache il suffit de taper le code :

apt-get install libapache2-mod-evasive

Ensuite configurer apache pour y intégrer les paramètres du modules, cela peut se faire dans apache2.conf ou dans le dossier conf.d

<IfModule mod_evasive20.c>
DOSHashTableSize 3097
DOSPageCount 5
DOSSiteCount 50
DOSPageInterval 2
DOSSiteInterval 2
DOSBlockingPeriod 300
DOSEmailNotify "contact@monsite.com"
DOSLogDir "/home/log/mod_evasive/"
#DOSSystemCommand "/sbin/iptables -I INPUT -s %s -j DROP"
#DOSSystemCommand "/bin/echo %s >> /home/log/mod_evasive/dos_evasive.log && /bin/date >> /home/log/mod_evasive/dos_evasive.log"
#DOSWhiteList 127.0.0.1
</IfModule>

Des logs seront écrits comme indiqué dans le dossier suivant qu’il faut donc créer :

mkdir /home/log/mod_evasive/
chown -R www-data /home/log/mod_evasive/

Voici la signification des paramètres :

DOSPageCount : Nombre de requêtes IP sur la même URL permis dans l’intervalle de temps défini avec DOSPageInterval (en seconde)

DOSSiteCount : Nombre de requêtes IP sur le site permis dans l’intervalle de temps défini avec DOSSiteInterval (en seconde)

DOSBlockingPeriod : Durée pendant laquelle l’IP est bloqué en seconde (erreur 403)

DOSEmailNotify : Email d’avertissement

DOSSystemCommand : Commande système, les exemples permettent par exemple d’inscrire dans iptables l’ip à bannir (donc bannissement définitif de cette ip) ou encore d’écrire un fichier log avec date etc…

DOSWhiteList : IP qui ne sera jamais banni

On voit avec les paramètres que si vous mettez un chiffre trop bas dans les count ou trop haut dans les intervalles alors vos visiteurs pourraient être bloqué par exemple s’ils demandent le même objet (par exemple une image répétitive dans un forum), il faut donc bien régler selon son serveur et son site web.

mod_security

Ce module est plus puissant mais aussi bien plus complexe, quelques livres sont disponibles à son sujet. Ce module analyse les requêtes HTTP d’ Apache, il permet ensuite de prendre des actions, il est très puissant car aussi bien l’entête que le corps des requêtes peuvent être analysées.

Pour installer ce module, rien de plus simple…

apt-get install libapache2-mod-security2

Par défaut, le module ne protège pas grand chose, il faut l’alimenter en règle. Chaque règle permet de détecter les intrusions, trojans ou autres scanners. Etant donné que tout cela est vaste, je vous conseille de consulter le site OWASP par exemple. Vous y trouverez de quoi alimenter le module en règle avec toute les explications sur l’installation.

Le module est livré avec quelques règles de base, faites un locate modsecurity pour trouver les règles en question plus la configuration minimale.

Si je passe peu de temps sur ce module, c’est pour vous exposer ma méthode personnelle…

Blocage depuis Apache

En effet Apache possède tout ce qu’il faut pour bloquer certaines requêtes HTTP et notamment celles des scans. C’est les plus dangereuse car il suffit d’appuyer sur un bouton pour déclencher un scanner qui va chercher toutes les failles possibles de votre site WEB. Hors que fait un scanner ? Il scanne toute les pages possible même celle qui n’existe pas…Lorsqu’un serveur est en production et stable, il n’a normalement aucune url qui retourne une erreur 404 (page inexistante)

L’idée consiste alors à bannir définitivement toute IP qui scanne votre site et tombe sur une url inexistante. Une autre idée consiste à connaitre le scanner, à trouver des mots clefs et à bannir les IP qui cherche des URL contenant ces mots clefs.

Par exemple le scanner Acunetix cherche des URL contenant son propre nom, voici une règle pouvant être mise en place dans Apache (mod_rewrite doit être activé)


RewriteCond %{REQUEST_URI} ^(.*acunetix.*)$
RewriteRule ^(.*)$ /acutix.php [L]

Cette règle détecte donc une URL contenant le mot cunetix et exécute (et renvoi) l’url acutix.php (il est important que le nom final de l’url ne contienne pas le nom recherché…). Dans cette page PHP, vous pouvez écrire un log et surtout appeler une fonction système pour bannir l’IP en question, voici par exemple le programme PHP


$path_bin = "/home/www/monsiteweb/acutix";
$parm=" ".ip();
$parm = escapeshellcmd($parm);
$result=passthru("$path_bin $parm",$error);

Ce code PHP appelle le script acutix avec comme paramètre l’adresse IP (retourné par la fonction ip() à écrire). Voici par exemple, un code possible pour acutix


#!/bin/bash

res=$(sudo /sbin/iptables -A INPUT -s $1 -j DROP)

Ce petit script rajoutera dans iptables l’adresse IP à exclure, toute connexion entrante avec cette IP sur le serveur sera ignorée…

Vous allez toutefois vous heurter à un problème. iptables ne pourra pas être exécuté si vous n’êtes pas root et normalement vous avez configuré Apache pour une exécution sous l’utilisateur www-data qui n’est pas root. Il faut donc donner les droits d’exécution à www-data. Pour cela il suffit d’éditer le fichier sudoers. Utilisez la commande visudo (si elle n’est pas disponible, faites un apt-get install sudo) et rajoutez ces lignes

www-data ALL=NOPASSWD:/sbin/iptables

Qui indique que l’utilisateur www-data sur toute les adresses (ALL) n’a pas besoin de mot de passe (NOPASSWD) pour exécuter la commande /sbin/iptables avec la commande sudo

Il suffit donc de rajouter la commande sudo devant la commande iptables (comme dans le script) pour exécuter cette commande en mode root.