Apache : Générer sa liste noire (anti-spam)

Si vous surveillez vos logs Apache ([cci]/var/log/apache2/access.log[/cci]) il se peut que vous vous demandiez d’où peuvent venir toutes ces IPs.

Certes, nombre d’entre elles correspondent à des bots servant à vous référencer. Mais si vous y regardez de plus près, et d’autant plus si vous hébergez des services « connus » (tels que phpBB, galleries photos, …) vous pourrez y trouver des logs plutôt inquiétants…

Prenons exemple sur la ligne de log suivante

27.153.235.238 - - [10/May/2014:11:17:23 +0200] 
    "POST /galleries/maGallerie/picture.php?/69/category/4 HTTP/1.1" 200 3564
    "http://mon.site.com/galleries/maGallerie/picture.php?/69/category/4" 
    "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)"

Ces quelques points devraient vous alerter :

  • POST : Les bots de référencement font plutôt des accès GET
  • 200 : La demande a été acceptée (normal)
  • Source de l’IP : L’utilisateur de l’adresse IP 27.153.235.238 (238.235.153.27.broad.pt.fj.dynamic.163data.com.cn – Chinanet) est situé à Putian (China – Fujian). A moins de faire un site pour les chinois, il est probable que cette IP soit indésirable

L’ensemble de ces informations permet de penser qu’il s’agit peut-être d’une attaque. Pour se tromper le moins possible, l’idéal pourrait être d’installer un forum ou une gallerie qui n’est pas utilisée. Il sera ainsi plus facile d’analyser les logs pointant vers ces sites fantômes et détecter les IP indésirables.

Configurer Apache

Le but du jeu consiste à lister les IP et à renvoyer les demandes provenant de ces IPs vers une erreur 403 – Accès Refusé pour éviter à votre serveur d’être attaqué, d’être surchargé de demandes illégitimes, de fausser vos stats (compteur de visites, etc).

Définir une liste noire d’IPs au sein du VirtualHost

Exemple :

<Directory /var/www>
   Options Indexes FollowSymLinks MultiViews
   AllowOverride All
   Order allow, deny
   allow from all
   deny from x.x.x.x
   deny from x.x.x.x
   ...
</Directory>

Avec le mod Include :

<Directory /var/www>
   Options Indexes FollowSymLinks MultiViews
   AllowOverride All
   Order allow, deny
   allow from all
   Include /path/to/blacklists/*.txt
</Directory>

On a ici une stratégie d’exclusion. On autorise tout le monde sauf une liste d’IPs. Il est possible de faire l’inverse (Order deny, allow - deny from all - allow x.x.x.x)

Construire sa blacklist

La méthode brutale : bannir un pays

Il est possible de trouver des listes accessibles à tous sur nixbits
Il suffit d’inclure ces fichiers dans la config d’Apache comme vu plus haut.

La méthode laborieuse

Nous allons scruter les logs, et détecter les accès POST sur un forum sur lequel il n’y a aucune raison d’effectuer de requête POST.
On va donc générer une liste d’IP à bannir, la trier et l’unifier (dédoublonner les adresses). Il faut repasser le script de temps en temps pour mettre à jour la liste des adresses à bannir.

Scrutation du fichier access.log d’Apache :

#!/bin/sh
KEYWORD=maGallerie
cat /var/log/apache2/access.log | \
    awk '$6 ~ /.POST/ && $7 ~ /.*'$KEYWORD'.*/ {print $1 }' | \
    sort -n -u | sed -e 's/^/deny from /g' > blacklist.new

Il s’agit ensuite de fusionner le fichier blacklist.new avec le fichier original. On va pour cela utiliser vim ou sort.

Exemple avec vim :

vim blacklist.txt
# nouvelle fenêtre puis ouverture 2e fichier
^w v ^w w
:e blacklist.new
# Sélection globale puis copier
gg V G y
# Retour sur le premier fichier, 
# coller à la fin du fichier
^w w G p
# Tout sélectionner
# Tri numérique avec suppression de doublons
gg V G y
:sort u n

Ces IPs, une fois le serveur Apache redémarré et la configuration incluant le fichier blacklist.txt seront bannies et les clients recevront une erreur 403.

Scrutation en arrière plan

Lecture en continu du fichier access.log :

#!/bin/sh
KEYWORD=maGallerie
tail -F /var/log/apache2/access.log | \
        while read line ; do
                echo $line | \
    awk '$0 ~ /" 200 [0-9]+/ && $6 ~ /.POST/ && $7 ~ /.*'$KEYWORD'.*/ {print $1 }' | \
    sed -e 's/^/deny from /g' >> blacklistd.new
        done

On lit donc chaque ligne du fichier, et s’il contient le code HTTP 200 (accès réussi) et que le champ 6 contient la méthode POST, et que l’URL contient « maGallerie » ; alors on retourne l’IP située dans le champ 1. Ensuite, on complète pour rendre compatible avec le fichier Apache en rajoutant deny from.

Refaire l’opération de fusion de temps en temps, du fichier généré blacklistd.new avec le fichier blacklist.txt.

Ne pas oublier de redémarrer le serveur Apache pour que les modifications soient prises en compte.

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *