mercredi, mars 12, 2014

Comment utiliser GeoIP avec Nginx pour bloquer les arnaqueurs provenant de certains pays

Je possède un site de petites annonces et comme tout bon site de petites annonces, il est souvent la cible des annonces de spam et d'arnaques et je vous propose une solution pour les bannir de votre site une bonne fois pour toutes.





Vous savez, c'est le genre de merde avec les prêts de plusieurs milliers d'euros ou des ventes de produits de luxe. Mais avant, j'aimerais faire une déclaration officielle :

Je hais ces putains d'enculés d'arnaqueurs qui pourrissent nos sites et on peut leur souhaiter les pires maladies sur terre !

Maintenant que c'est fait, on peut envisager différentes solutions pour bloquer ces rebuts de la nature humaine. Que vous ayez un site de petites annonces sous Joomla, Wordpress, Dolphin ou Drupal, vous aurez accès à des plugins qui permettent de bannir des utilisateurs selon leurs adresses mail et adresse IP. C'est une solution qui convient si vous n'avez que quelques annonces d'arnaque de temps en temps, mais si cela devient systématique, alors il faut utiliser les gros moyens.

Un autre problème de bloquer uniquement des adresses mails et des adresses IP précises est que cela n'est pas très efficace. Premièrement, ces enculés d'arnaqueurs possèdent des centaines d'adresses mails et surtout, la totalité provient d'Afrique avec ces 4 pays en tête de liste :


  • Le Bénin
  • La Cote d'Ivoire
  • Le Nigéria
  • Le Sénégal


Dans ces pays, la connexion internet se base sur une allocation dynamique de l'IP gérée par le FAI. De ce fait, on pourra bloquer toutes les IP qu'on veut, ils reviendront à la charge. La solution est d'utiliser GeoIP pour bloquer les utilisateurs d'un pays entier. Je vous montre la procédure pour installer GeoIP avec Nginx, mais la procédure ne devrait pas être si difficile avec Apache.

GeoIP, c'est quoi ?


MaxMind GeoIP est un service qui propose des bases de donnée sur les pays et les villes pour permettre aux webmestres d'adapter leurs sites selon chaque pays. Par exemple, GeoIP est souvent utilisé lorsqu'on veut proposer un site multi-lingues où on propose une version différente du site selon le pays du visiteur.

Mais on peut également utiliser GeoIP pour bloquer les arnaqueurs qui proviennent des mêmes pays en général. Notez que GeoIP propose une base de donnée payante et gratuite, mais on va se concentrer sur la version gratuite.

Notons que cela ne fonctionne que pour ceux qui possèdent un VPS et un serveur dédié, car cela nécessite une modification du fichier de configuration.

Télécharger et configurer GeoIP avec Nginx


Nginx supporte GeoIP avec le modèle HttpGeoipModule. En général, il est activé par défaut sur la plupart des machines sous Debian et Ubuntu. Pour vérifier si votre Nginx possède GeoIP, tapez la commande suivante :


nginx -V


Dans les résultats, cherchez la mention --with-http_geoip_module comme le suivant :

root@server1:~# nginx -V
nginx version: nginx/1.2.1

configure arguments: --prefix=/etc/nginx --conf-path=/etc/nginx/nginx.conf --error-log-path=/var/log/nginx/error.log --http-client-body-temp-path=/var/lib/nginx/body --http-fastcgi-temp-path=/var/lib/nginx/fastcgi --http-log-path=/var/log/nginx/access.log --http-proxy-temp-path=/var/lib/nginx/proxy --http-scgi-temp-path=/var/lib/nginx/scgi --http-uwsgi-temp-path=/var/lib/nginx/uwsgi --lock-path=/var/lock/nginx.lock --pid-path=/var/run/nginx.pid --with-pcre-jit --with-debug --with-http_addition_module --with-http_dav_module --with-http_geoip_module --with-http_gzip_static_module --with-http_image_filter_module --with-http_realip_module --with-http_stub_status_module --with-http_ssl_module --with-http_sub_module --with-http_xslt_module --with-ipv6 --with-sha1=/usr/include/openssl --with-md5=/usr/include/openssl --with-mail --with-mail_ssl_module --add-module=/build/buildd-nginx_1.2.1-2.1-amd64-fMGfEu/nginx-1.2.1/debian/modules/nginx-auth-pam --add-module=/build/buildd-nginx_1.2.1-2.1-amd64-fMGfEu/nginx-1.2.1/debian/modules/nginx-echo --add-module=/build/buildd-nginx_1.2.1-2.1-amd64-fMGfEu/nginx-1.2.1/debian/modules/nginx-upstream-fair --add-module=/build/buildd-nginx_1.2.1-2.1-amd64-fMGfEu/nginx-1.2.1/debian/modules/nginx-dav-ext-module
root@server1:~#

Si vous ne le voyez pas, alors il faudra recompiler Nginx avec ce module. Et c'est un processus assez long que je ne couvrirais pas cet article, mais vous pourrez trouver de très bons tutoriels sur le sujet.

Télécharger la base de donnée GeoIP


Sur Debian ou Ubuntu, on peut télécharger la base de donnée GeoIP avec la commande !

apt-get install geoip-database libgeoip1

Par défaut, cela va placer cette base dans /usr/share/GeoIP. Cependant, vous pouvez créer un répertoire plus explicite tel que :

mkdir /etc/nginx/geoip/

Ensuite, vous accédez à ce répertoire :

cd /etc/nginx/geoip/

Et vous lancez la commande précédente pour télécharger la base de GeoIP. Certains disent que l'installation automatique de GeoIP n'est pas performante, car on aura une base de donnée obsolète. Mais on peut également télécharger la base de donnée la plus récente avec wget (dans le répertoire que nous avons crée) :


cd /etc/nginx/geoip/
wget http://geolite.maxmind.com/download/geoip/database/GeoLiteCountry/GeoIP.dat.gz

Et vous décompressez l'archive avec la commande :

gunzip GeoIP.dat.gz


Configurer Nginx avec GeoIP


Allez dans /etc/nginx et ouvrez le fichier nginx.conf avec votre éditeur de texte (nano, vi, etc)

nano /etc/nginx/nginx.conf

Et placez ce code à l'intérieur du block http{} avant la moindre directive Include :




    geoip_country /etc/nginx/geoip/GeoIP.dat;
    map $geoip_country_code $allowed_country {
        default yes;
        US no;
        RU no;
        IL no;
    }

Ce code autorise tous les pays à accéder à votre site sauf 3 que nous avons marqué sur No. Notez également le chemin d'accès puisque nous avons téléchargé une version récente de GeoIP dans /etc/nginx/geoip/ et vous devez changer ce répertoire si vous avez utilisé un autre répertoire.

Les symboles US, RU et IL représente les code des pays et dans notre exemple, nous avons bloqué les Etats-Unis, la Russie et Israël. Vous pouvez retrouver la liste complète des codes de pays que vous pouvez utiliser avec GeoIP.

Mais vous pouvez aussi faire l'inverse avec ce code :


    geoip_country /etc/nginx/geoip/GeoIP.dat;
    map $geoip_country_code $allowed_country {
        default no;
        UL yes;
        RU yes;
        IL yes;
    }
 
Cette fois, nous bloquons tous les pays à l'exception de 3. Toutefois, ce code ne bloque pas les pays en question, car il ne fait que définir la variable $allowed_country.

Pour bloquer réellement les pays, vous avez besoin de modifier le fichier configuration de vos hôtes virtuels (les fichiers qui sont dans le dossier site-available). Ouvez le fichier d'hôtes virtuels et copiez le code suivant dans le bloc server{} et dans chaque bloc location {} :

        if ($allowed_country = no) {
            return 444;
        }

Ainsi, si un visiteur provenant d'un des pays listés tente d'accéder à votre site, alors il aura une erreur 444 (la connexion sera coupée avant même le téléchargement des entêtes). Vous pouvez également spécifier l'erreur 403 pour indiquer que le visiteur n'est pas autorisé à accéder au site.

Après ces modifications, vous devez recharger la configuration de Nginx avec la commande :

/etc/init.d/nginx reload

ou

service nginx reload

Maintenant, on peut se demander comment vérifier que le blocage est effectif ? C'est très simple. Entrez le code de votre propre pays dans le fichier de configuration de Nginx et essayez d'accéder au site. Vous verrez si cela fonctionne ou non. En général, les changements après le rechargement de la configuration de Nginx sont immédiats, donc vous pourrez tester dans la minute qui suit.

Certes, cette solution est comme un bazooka qui va bloquer des milliers de visiteurs potentiels et innocents alors que les arnaqueurs ne sont que quelques centaines de cafards. Toutefois, cela dépend du site et de la pertinence des visiteurs. Si vous avez un site axé sur le local ou l'hyperlocal, alors les visiteurs des autres pays ne vous intéressent pas et vous pouvez les bloquer sans aucun problème.