17/11/2024

Apache

Apache2 et MaxMind : bloquer ou autoriser les connexions pour certains pays

I. Présentation

Dans ce tutoriel, nous allons configurer un serveur Web Apache de manière à bloquer l'accès à notre site Web à certains pays, ou à l'inverse, autoriser uniquement certains pays à se connecter. Pour cela, nous allons installer et configurer le module mod_maxminddb qui va permettre de faire de la géolocalisation d'adresses IP en utilisant la base MaxMind.

En ce qui me concerne, j'utilise une machine sous Debian 11 avec un serveur Web Apache déjà mis en place et répondant à l'adresse "it-connect.tech". Si besoin, vous pouvez consulter cet article pour la préparation d'un serveur Web :

II. Géolocalisation IP dans Apache : installation des prérequis

A. Installation des outils de développement Apache

Premièrement, nous devons installer le paquet "apache2-dev" car sinon il nous manquera une dépendance pour la suite. Voici les commandes à exécuter :

sudo apt-get update
sudo apt-get install apache2-dev

B. Installation de la librairie libmaxminddb

Deuxièmement, nous devons installer la librairie libmaxminddb sur le serveur dans le but de pouvoir lire les bases de données "MaxMind DB" notamment la base GeoIP2 qui contient les adresses IP publiques classées par pays. Cette librairie est publiée sur GitHub : libmaxminddb.

Pour cela, on va télécharger la dernière version :

cd /tmp
wget https://github.com/maxmind/libmaxminddb/releases/download/1.7.1/libmaxminddb-1.7.1.tar.gz

Puis, on va extraire le contenu de cette archive et se positionner dans le répertoire obtenu :

tar xzvf libmaxminddb-1.7.1.tar.gz
cd libmaxminddb-1.7.1/

Ici, on lance les commandes d'installation :

./configure
make
sudo make install
sudo ldconfig

Une fois que c'est fait, et s'il n'y a pas d'erreur, on peut passer à la suite.

C. Installation du paquet geoipupdate

Troisièmement, nous allons installer le paquet geoipupdate pour récupérer une copie des bases IP et surtout permettre une mise à jour automatique des bases d'adresses IP. Cela va nécessiter de s'inscrire sur le site de MaxMind pour obtenir une licence gratuite. Ce projet est également disponible sur GitHub : geoipupdate.

Nous allons télécharger le package DEB d'installation puisque l'on est sur Debian.

cd /tmp
wget https://github.com/maxmind/geoipupdate/releases/download/v4.10.0/geoipupdate_4.10.0_linux_amd64.deb

Une fois que l'on a ce package en notre possession, nous allons l'installer :

dpkg -i geoipupdate_4.10.0_linux_amd64.deb

Le fichier de configuration de ce paquet est "/etc/GeoIP.conf". Avant de le modifier, nous devons créer un compte sur le site MaxMind, à cette adresse :

Après l'inscription, vous allez recevoir un e-mail qui contient un lien vous permettant de définir votre mot de passe. Quand c'est fait, connectez-vous sur le site, cliquez à gauche sur "Manage License Keys" puis à droite sur "Generate new license key".

Apache - MaxMind - Licence GeoIP - 1

Donnez un nom à la licence et répondre "No" à la question posée. Confirmez. Une clé de licence sera affichée à l'écran avec un Account ID et une License Key. Copiez ces deux informations et gardez-les bien au chaud : la clé est visible une seule fois !

Apache - MaxMind - Licence GeoIP - 2

Retournez sur la ligne de commande de la machine Linux, et éditez le fichier de configuration :

sudo nano /etc/GeoIP.conf

Dans ce fichier, vous devez inclure votre ID de compte et votre clé de licence, en remplaçant les valeurs "YOUR_ACCOUNT_ID_HERE" et "YOUR_LICENSE_KEY_HERE".

Apache - GeoIP Config

Quand c'est fait, enregistrez le fichier. Exécutez la commande suivante pour mettre à jour les bases (le fait d'avoir le -v active le mode verbeux, mais cela fonctionne aussi sans cette option) :

geoipupdate -v

geoipupdate - Mise à jour des bases

Il est également possible d'automatiser l'actualisation de la base d'adresses IP. Sur le site officiel de MaxMind, un exemple est donné de manière à mettre à jour la base deux fois par semaine. Voici la ligne :

45 15 * * 0,3 /usr/bin/geoipupdate

A ajouter dans la crontab :

crontab -e

Ainsi, la base s'actualisera toute seule.

D. Installation du module Apache mod_maxminddb

Quatrièmement, nous devons installer le module mod_maxminddb pour Apache2 ! Toujours sur le même principe, nous allons récupérer les sources sur GitHub et procéder à l'installation. Voici le lien vers le projet GitHub : mod_maxminddb.

cd /tmp
wget https://github.com/maxmind/mod_maxminddb/releases/download/1.2.0/mod_maxminddb-1.2.0.tar.gz

Ensuite, on extrait le contenu de l'archive et on se positionne dans le répertoire :

tar xzvf mod_maxminddb-1.2.0.tar.gz
cd mod_maxminddb-1.2.0

Puis, on lance l'installation :

./configure
make
make install

Logiquement, l'installation va automatiquement activer le module dans Apache, mais on peut tout de même essayer de l'activer au cas où :

sudo a2enmod maxminddb
sudo systemctl restart apache2

Voilà, l'installation est terminée. Nous pouvons passer à la configuration d'Apache pour bloquer ou autoriser des pays.

III. Bloquer ou autoriser des pays dans Apache

Pour la suite de ce tutoriel, je vais modifier le fichier de configuration "/etc/apache2/sites-enabled/000-default.conf" correspondant au site activé par défaut dans Apache2. La racine de ce site est "/var/www/html". Pour rappel, j'utilise une machine sous Debian 11 avec la dernière version d'Apache 2.4.

C'est parti, éditons ce fichier de configuration :

sudo nano /etc/apache2/sites-enabled/000-default.conf

Puis, nous allons modifier ce fichier de manière à bloquer les connexions en provenance de Russie et de Chine sur notre site Web (vous pouvez obtenir les codes des pays ici). D'autres exemples sont donnés sur le GitHub officiel du module Apache.

<Directory /var/www/html>
  <IfModule mod_maxminddb.c>

    MaxMindDBEnable On
    MaxMindDBFile COUNTRY_DB /usr/share/GeoIP/GeoLite2-Country.mmdb
    MaxMindDBEnv MM_COUNTRY_CODE COUNTRY_DB/country/iso_code

    SetEnvIf MM_COUNTRY_CODE ^(RU|CH) BlockCountry
    Deny from env=BlockCountry

  </IfModule>
</Directory>

Pour tester, on peut aussi bloquer la France (FR) de manière à voir que ça bloque bien. Sinon, il faut utiliser un VPN pour se "téléporter" dans un autre pays. 😉

Ici, la directive s'applique à tout le site Web puisque l'on cible la racine "/var/www/html", mais on pourrait faire une configuration au niveau d'un autre dossier, voire même au niveau global d'Apache.

On enregistre, on redémarre Apache2 :

sudo systemctl restart apache2

Puis, on teste :

Apache2 blocage geoIP

La configuration fonctionne... Si je retire "FR", que je recharge Apache et que je retente ma chance, j'accède bien au site !

À l'inverse, on pourrait autoriser les connexions uniquement depuis la France et bloquer tout le reste, si ce n'est que l'on autorisera aussi l'adresse IP "192.168.100.1" qui est le reverse proxy utilisé dans mon lab :

<Directory /var/www/html>
  <IfModule mod_maxminddb.c>

    MaxMindDBEnable On
    MaxMindDBFile COUNTRY_DB /usr/share/GeoIP/GeoLite2-Country.mmdb
    MaxMindDBEnv MM_COUNTRY_CODE COUNTRY_DB/country/iso_code

    SetEnvIf MM_COUNTRY_CODE ^(FR) AllowCountry
    Allow from env=AllowCountry
    Allow from host 192.168.100.1
    Deny from all

  </IfModule>
</Directory>

En complément, voici ce que ça donne avec le fichier complet :

Apache2 bloquer ou autoriser des pays via MaxMind

IV. Conclusion

Voilà, grâce à cette configuration, vous disposez d'un serveur Web capable d'exploiter les bases GeoIP de MaxMind dans le but de bloquer ou d'autoriser les connexions en provenance de certains pays ! Plutôt sympa pour sécuriser un site Web ou une application qui n'a pas vocation à être utilisée à l'internationale.

author avatar
Florian BURNEL Co-founder of IT-Connect
Ingénieur système et réseau, cofondateur d'IT-Connect et Microsoft MVP "Cloud and Datacenter Management". Je souhaite partager mon expérience et mes découvertes au travers de mes articles. Généraliste avec une attirance particulière pour les solutions Microsoft et le scripting. Bonne lecture.
Partagez cet article Partager sur Twitter Partager sur Facebook Partager sur Linkedin Envoyer par mail

1 commentaire sur “Apache2 et MaxMind : bloquer ou autoriser les connexions pour certains pays

  • Bonjour, j’ai un petit soucis, bloquer les pays fonctionne bien ( tester avec le FR ) , mais l’inverse non, si je met pour autoriser les pays, je suis quand même bloquer

    avez vous une idée ?
    merci

    Répondre

Laisser un commentaire

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

Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur comment les données de vos commentaires sont utilisées.