Apache2 et MaxMind : bloquer ou autoriser les connexions pour certains pays
Sommaire
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".
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 !
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".
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
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 :
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 :
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.
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