Bloquer l’accès à votre site depuis certains pays

29 mars 2016 Sécurité 2 Commentaires

Pourquoi vouloir bloquer l’accès à votre site depuis certains pays ? Hé bien parce que les attaques (DoS, Flood, Spam) ont une grande tendance à venir des mêmes pays (Ukraine, Biélorussie, Chine, etc.)

Voici donc un petit mémo vous permettant d’apprendre à bloquer l’accès à votre site depuis certains pays avec Apache et NGinx

 

 

Bloquer l’accès à votre site depuis certains pays avec Apache

Le plus simple avec Apache reste d’utiliser un .htacess et vous pouvez en générer avec IP2LOCATION.

Première étape : Choisissez le type d’adresse à bloquer IPV4 ou IPV6

Deuxième étape : Sélectionnez les pays que vous souhaitez bloquer

Troisième étape : Sélectionnez le format correspondant à votre version d’Apache

Une fois ces trois étapes terminées votre navigateur télécharge un fichier texte. Il ne vous restera qu’à copier et coller son contenu dans un fichier .htaccess que vous placerez à la racine de votre site.

 

 

Bloquer l’accès à votre site depuis certains pays avec NGinx

NGinx ne gère pas les .htacess, nous allons donc devoir utiliser un module. NGinx doit avoir été compilé avec le support du mod http_geoip_module

Pour vérifier la présence de ce module utilisez la commande suivante

nginx -V

 

Qui dans notre cas, nous retourne :

root@noobunbox:/# nginx -V
nginx version: nginx/1.9.13
built by gcc 4.9.2 (Debian 4.9.2-10)
built with OpenSSL 1.0.2g 1 Mar 2016
TLS SNI support enabled
configure arguments: --prefix=/etc/nginx --sbin-path=/usr/sbin/nginx --conf-path=/etc/nginx/nginx.conf --error-log-path=/var/log/nginx/error.log --http-log-path=/var/log/nginx/access.log --pid-path=/var/run/nginx.pid --lock-path=/var/run/nginx.lock --http-client-body-temp-path=/var/cache/nginx/client_temp --http-proxy-temp-path=/var/cache/nginx/proxy_temp --http-fastcgi-temp-path=/var/cache/nginx/fastcgi_temp --user=www-data --group=www-data --with-threads --with-http_ssl_module --with-http_v2_module --with-ipv6 --with-http_geoip_module --with-http_mp4_module --with-http_auth_request_module --with-http_slice_module --with-file-aio --with-cc-opt='-g -O2 -fstack-protector-strong -Wformat -Werror=format-security' --add-module=/opt/headers-more-nginx

 

Installation de la base de données GeoIP

Sous Debian et Ubuntu, la base de donnés GeoIP peut être installée via la commande suivante

sudo apt-get install geoip-database libgeoip1

 

Cette base de données est par défaut stockée dans le dossier /usr/share/GeoIP/. Nous allons donc effectuer une sauvegarde de la BDD puis la mettre à jour

mv /usr/share/GeoIP/GeoIP.dat /usr/share/GeoIP/GeoIP.dat_bak
cd /usr/share/GeoIP/
wget http://geolite.maxmind.com/download/geoip/database/GeoLiteCountry/GeoIP.dat.gz
gunzip GeoIP.dat.gz

 

Configuration de NGinx

Modifions le fichier de configuration de nginx

sudo nano /etc/nginx/nginx.conf

 

Dans notre exemple nous bloquerons les accès depuis : la Biélorussie, la Chine et l’Ukraine, consultez la page suivante pour connaitre les codes utilisés par chaque pays.

Dans le bloc http avant les lignes de configuration includes ajoutez le code suivant :

geoip_country /usr/share/GeoIP/GeoIP.dat;
 map $geoip_country_code $allowed_country {
 default yes;
 BY no;
 CN no;
 UKR no;
 }

 

Vous pouvez aussi n’autorisez que certains pays, il vous suffira de remplacer la variable default yes par default no et de lister ensuite les pays qui pourront accéder à votre site.

Dans l’exemple ci-dessous, nous autoriserons seulement les visites provenant des USA et de la France

geoip_country /usr/share/GeoIP/GeoIP.dat;
 map $geoip_country_code $allowed_country {
 default yes;
 FR yes;
 US yes;
 }

 

Il ne nous reste plus qu’à configurer le blocage par site. Dans votre virtual host ajoutez dans le bloc server le code suivant

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

 

Maintenant vérifiez la configuration de NGinx et si tout va bien rechargez la

sudo nginx -t
sudo service nginx reload

 

Sources