(Plesk pour Linux) Configurer la géolocalisation IP pour un site web¶
La géolocalisation IP identifie l’emplacement géographique réel de l’adresse IP du visiteur d’un site web, par exemple, un pays ou une ville.
Avec la géolocalisation IP, vous pouvez adapter l’affichage de votre site web en fonction du lieu de vie de l’internaute qui consulte votre site web. Par exemple, vous pouvez rediriger votre visiteur vers des pages web spécifiques à l’emplacement ou bloquer l’accès à votre site à des visiteurs de pays spécifiques.
Dans cette section, vous découvrirez comment définir la géolocalisation IP dans Plesk et comment l’utiliser dans des situations fréquentes, comme :
- Bloquer l’accès au site web à des internautes d’un pays spécifique.
- Bloquer l’accès à tous les sites web hébergés sur le serveur à des internautes d’un pays spécifique.
- Rediriger les visiteurs d’un site web vers une URL spécifique à la localisation géographique.
- Appliquer des décisions basées sur la géolocalisation aux sites web appartenant à un pack d’hébergement.
- Protéger un site web contre les attaques par force brute d’un même pays.
Configurer la géolocalisation IP dans Plesk¶
Vous pouvez configurer la géolocalisation IP dans Plesk à l’aide du module nginx ngx_http_geoip2_module
et des bases de données de géolocalisation MaxMind que vous devez télécharger.
1. Downloading MaxMind Geolocation Databases¶
L’entreprise MaxMind propose deux types de bases de données de géolocalisation : la version GeoLite2 (gratuite) et la version GeoIP2 (payante). La version payante est plus précise que la version gratuite.
Dans cette section, nous utiliserons la base de données gratuite GeoLite2 comme exemple. Vous pouvez toujours mettre à niveau vers GeoIP2.
Pour télécharger la base de données de géolocalisation GeoLite2, vous devez d’abord créer un compte gratuit GeoLite2, puis choisir comment télécharger les bases de données. Pour cela, vous pouvez :
Télécharger directement les archives des bases de données et les téléverser sur votre serveur Plesk.
Obtenir des liens permanents. Pour télécharger les bases de données, utilisez ces liens permanents avec des scripts ou les commandes
curl
etget
. Vous devrez également générer, puis utiliser une clé de licence pour votre compte GeoLite2. Découvrir comment obtenir et utiliser des liens permanents.(Recommandé) Utilisez l’utilitaire
geoipupdate
.Nous vous recommandons cette méthode de téléchargement pour les bases de données de géolocalisation, car l’utilitaire est disponible dans les dépôts des packages système de la plupart des distributions Linux. Avec l’utilitaire
geoipupdate
, vous pouvez à la fois télécharger et mettre à jour les bases de données de géolocalisation.
Pour télécharger la base de données de géolocalisation GeoLite2 à l’aide de l’utilitaire geoipupdate
:
Note
Pour voir la version de l’utilitaire disponible et les paramètres de l’utilitaire, exécutez geoipupdate -v
.
Connectez-vous à votre compte GeoLite2 et générez une clé de licence. Une fois terminé, copiez la clé et gardez-la en sécurité. Pour des questions de sécurité, les clés de licence sont affichées uniquement lorsqu’elles sont générées.
Lorsque vous générez une clé de licence, vous voyez également votre ID de compte. Lors de la prochaine étape, vous aurez besoin de l’ID de votre compte ainsi que de la clé de licence.
Ouvrez le fichier
/etc/GeoIP.conf
pour l’éditer. Le chemin vers le fichierGeoIP.conf
peut varier en fonction de votre distribution Linux.Collez l’ID de votre compte, la clé de licence et les ID de l’édition des bases de données que vous voulez télécharger. Séparez les différentes éditions par des espaces. Une fois que vous avez terminé la configuration, enregistrez le fichier.
Pour télécharger les bases de données, exécutez
sudo geoipupdate
ousudo geoipupdate -v
(pour voir les informations détaillées comme les bases de données téléchargées et leur emplacement).
2. Enabling ngx_http_geoip2_module in Plesk¶
Dans Plesk 18.0.46 et les versions ultérieures, nginx est déjà compilé avec ngx_http_geoip2_module. Par défaut, le module est désactivé.
Note
Pour vérifier si nginx est compilé avec le module, exécutez nginx -V
. Le cas échéant, vous verrez mod_geoip2
dans le résultat.
Pour activer ngx_http_geoip2_module :
- Connectez-vous à votre serveur Plesk via SSH.
- Activez le module en exécutant
plesk bin nginx -e geoip2
.
Le module est activé. Vous le verrez dans la liste des modules nginx activés si vous exécutez plesk bin nginx -s
.
3. Configuring variables¶
Pour utiliser les données de géolocalisation et prendre des décisions en conséquence, vous devez associer l’adresse IP du visiteur d’un site web à diverses propriétés (comme un nom de ville ou de pays) et stocker ces informations en tant que variables dans les fichiers de configuration nginx.
Pour configurer les variables :
Ajoutez les directives suivantes au fichier
/etc/nginx/conf.d/geoip2.conf
:geoip2 <path-to-the-database>/GeoLite2-Country.mmdb { auto_reload 5m; $geoip2_metadata_country_build metadata build_epoch; $geoip2_data_country_code country iso_code; $geoip2_data_country_name country names en; } geoip2 <path-to-the-database>/GeoLite2-City.mmdb { $geoip2_data_city_name city names en; }
Remplacez
<path-to-the-database>
par le chemin effectif de la base de données, par exemple : /usr/share/GeoIP/GeoLite2-Country.mmdbSur CentOS, AlmaLinux et d’autres OS de type Red Hat, les emplacements par défaut des bases de données sont les suivants :
/usr/share/GeoIP/GeoLite2-ASN.mmdb
/usr/share/GeoIP/GeoLite2-City.mmdb
/usr/share/GeoIP/GeoLite2-Country.mmdb
Sur Debian et Ubuntu, l’emplacement par défaut des bases de données est :
/var/lib/GeoIP
.Exécutez la commande
service nginx reload
pour actualiser le fichier de configuration nginx.
Vous avez terminé la configuration de la géolocalisation IP dans Plesk. Vous pouvez désormais utiliser ngx_http_geoip2_module
dans les diverses situations décrites ci-dessous.
Pour utiliser ces cas d’études, vous devez configurer les directives nginx qui référencent les variables suivantes :
Nom de la variable | Signification de la variable |
---|---|
$geoip2_metadata_country_build |
Heure de création de la base de données GeoLite2-Country |
$geoip2_data_country_code |
Code ISO à deux lettres du pays |
$geoip2_data_country_name |
Nom du pays en anglais |
$geoip2_data_city_name |
Nom de la ville en anglais |
Bloquer l’accès à un site web pour les visiteurs d’un pays spécifique¶
Vous pouvez refuser l’accès au site web aux visiteurs d’un pays spécifique. Lors de la tentative d’accès au site web, ceux-ci verront le code d’erreur HTTP 403, ce qui indique que l’accès à la ressource demandée est interdit.
Pour bloquer l’accès à un site web aux visiteurs d’un pays spécifique :
Allez dans Sites Web & Domaines > domaine > onglet « Hébergement et DNS » > Paramètres d’Apache et Nginx.
Saisissez ceci dans le champ texte « Directives supplémentaires Nginx » et cliquez sur OK.
if ($geoip2_data_country_code = "XX") { return 403; }
XX
correspond au code ISO en deux lettres du pays pour lequel vous voulez interdire l’accès des visiteurs (par exemple,AQ
pour l’Antarctique).
Les visiteurs provenant des pays dont vous avez spécifié le code ISO ne pourront plus accéder à votre site web.
Rediriger les visiteurs du site web vers une URL spécifique à la géolocalisation¶
Vous pouvez rediriger les visiteurs qui accèdent via l’URL générale (par exemple : https://example.com/test
) vers une URL spécifique au pays (par exemple : https:// example.com/US/test`).
Pour rediriger les visiteurs d’un site web vers une URL spécifique géolocalisée :
Allez dans Sites Web & Domaines > domaine > onglet « Hébergement et DNS » > Paramètres d’Apache et Nginx.
Saisissez ceci dans le champ texte « Directives supplémentaires Nginx » et cliquez sur OK.
location = /test { return 301 https://$host/$geoip2_data_country_code/<geolocation-specific-URL-part>; }
<geolocation-specific-URL-part>
correspond à la partie géolocalisée (par exemple :test
).
Par exemple, les visiteurs des États-Unis seront alors redirigés vers https://example.com/US/test
.
Appliquer des décisions basées sur la géolocalisation aux sites web appartenant à un pack d’hébergement¶
Vous pouvez par exemple bloquer ou rediriger les visiteurs d’un pays spécifique et appliquer cette mesure non seulement à un site web, mais aussi à tous les sites web inclus dans le pack d’hébergement. Cette situation est similaire aux deux précédentes avec un site web individuel. Cependant, au lieu d’utiliser les paramètres nginx du domaine, vous utilisez les paramètres nginx du pack d’hébergement.
Voyons comment procéder par exemple avec le blocage de l’accès au site web.
Pour bloquer l’accès aux sites web qui appartiennent au pack d’hébergement aux visiteurs d’un pays spécifique :
Allez dans Pack de services et cliquez sur le nom de l’accès au pack de services dont vous voulez bloquer les sites web.
Dans l’onglet « Serveur Web », ajoutez ce qui suit dans le champ texte « Directives supplémentaires Nginx » et cliquez sur OK.
if ($geoip2_data_country_code = "XX") { return 403; }
XX
correspond au code ISO en deux lettres du pays pour lequel vous voulez interdire l’accès des visiteurs (par exemple,AQ
pour l’Antarctique).
Les visiteurs des pays dont vous avez saisi le code ISO ne peuvent plus accéder à aucun site web de ce pack d’hébergement.
Bloquer l’accès à tous les sites web hébergés sur le serveur aux visiteurs d’un pays spécifique¶
Il y a deux manières de procéder : utiliser le template de configuration ou les paramètres du pack d’hébergement. Nous venons de traiter cette dernière méthode. Ci-dessous, nous verrons comment utiliser des templates de configuration personnalisés.
Note
Vous pouvez utiliser soit les templates de configuration soit les paramètres du pack d’hébergement. Vous ne pouvez pas refuser l’accès à tous les sites web hébergés sur le serveur en ajoutant le fichier de configuration nginx global à /etc/nginx/conf.d
.
Pour bloquer l’accès à tous les sites web hébergés sur le serveur aux visiteurs d’un pays spécifique :
Créez un template de configuration personnalisé nginxDomainVirtualHost.php` en suivant cette procédure.
Cherchez le texte suivant à la fin du template par défaut copié :
<?php if (is_file($VAR->domain->physicalHosting->customNginxConfigFile)) : ?> include "<?php echo $VAR->domain->physicalHosting->customNginxConfigFile ?>"; <?php endif ?> }
Insérez vos directives pour la restriction d’accès avant l’accolade fermante, comme sur l’exemple ci-dessous :
<?php if (is_file($VAR->domain->physicalHosting->customNginxConfigFile)) : ?> include "<?php echo $VAR->domain->physicalHosting->customNginxConfigFile ?>"; <?php endif ?> if ($geoip2_data_country_code = "XX") { return 403; } }
XX
correspond au code ISO en deux lettres du pays pour lequel vous voulez interdire l’accès des visiteurs (par exemple,AQ
pour l’Antarctique).Exécutez la commande suivante pour vérifier si les templates modifiés sont des fichiers PHP valides :
php -l nginxDomainVirtualHost.php
Exécutez la commande suivante pour générer de nouveaux fichiers de configuration :
plesk sbin httpdmng --reconfigure-all
Les visiteurs provenant des pays dont vous avez spécifié le code ISO ne pourront plus accéder à aucun site web hébergé sur le serveur.
Protéger un site web contre les attaques par force brute d’un même pays¶
Vous pouvez protéger votre site web contre les attaques par force brute en limitant les requêtes des adresses IP avec le même code pays ISO. Vous pouvez appliquer cette protection comme suit :
- Un site web unique
- Tous les sites web d’un même pack d’hébergement
- Tous les sites web hébergés sur le serveur
- Une ou plusieurs pages web (par exemple :
example.com/test
)
Pour protéger un site web contre les attaques par force brute d’un même pays :
Ajoutez la directive du modèle suivant au fichier
/etc/nginx/conf.d/limit_req_zone.conf
:limit_req_zone $geoip_data_country_code zone=country_code:10m rate=5r/m;
Cela crée une zone mémoire partagée parmi les processus de travail nginx. La zone stocke le statut de chaque adresse IP et le nombre d’accès à une URL avec limite de requêtes. La directive ci-dessus limite le nombre de requêtes depuis les adresses IP avec un même code ISO de pays à cinq par minutes (
rate=5r/m
).La deuxième étape dépend de quels sites web et du nombre de sites web que vous voulez protéger :
(Site web unique) Allez dans Sites Web & Domaines > domaine > onglet « Hébergement et DNS » > Paramètres d’Apache et Nginx. Placez ce qui suit dans le champ texte « Directives supplémentaires Nginx » et cliquez sur OK.
limit_req zone=country_code;
(Tous les sites web d’un même pack d’hébergement) Allez dans Pack de services et cliquez sur le nom du pack de services dont vous voulez protéger les sites web. Ensuite, allez dans l’onglet « Serveur Web » et ajoutez ce qui suit dans le champ texte « Directives supplémentaires Nginx » et cliquez sur OK.
limit_req zone=country_code;
(Tous les sites web hébergés sur le serveur) Placez ce qui suit dans le fichier
/etc/nginx/conf.d/limit_req.conf
:limit_req zone=country_code;
Vous avez limité les requêtes à un ou plusieurs sites web depuis des adresses IP provenant d’un pays avec le même code ISO à cinq par minutes.
Vous pouvez également protéger une ou plusieurs pages web en limitant les requêtes provenant d’adresses IP avec le même code pays ISO. La procédure varie en fonction du type d’hébergement de votre site web :
- Hébergement Apache+nginx
- Hébergement nginx uniquement
- nginx configuré pour servir directement PHP
(Hébergement Apache+nginx) Pour protéger une page web spécifique contre les attaques par force brute d’un même pays :
Ajoutez la directive du modèle suivant au fichier
/etc/nginx/conf.d/limit_req_zone.conf
:limit_req_zone $geoip_data_country_code zone=country_code:10m rate=5r/m;
Cela crée une zone mémoire partagée parmi les processus de travail nginx. La zone stocke le statut de chaque adresse IP et le nombre d’accès à une URL avec limite de requêtes. La directive ci-dessus limite le nombre de requêtes depuis les adresses IP avec un même code ISO de pays à cinq par minutes (
rate=5r/m
).Créez un template de configuration personnalisé nginxDomainVirtualHost.php` en suivant cette procédure.
Cherchez le texte suivant à la fin du template par défaut copié :
<?php if ($VAR->domain->physicalHosting->proxySettings['nginxProxyMode']): ?> location / { <?php if ($VAR->domain->physicalHosting->scriptTimeout): ?> proxy_read_timeout <?php echo min($VAR->domain->physicalHosting->scriptTimeout, 2147483) ?>; <?php endif ?> <?php echo $VAR->includeTemplate('domain/service/proxy.php', $OPT) ?> }
Puis insérez vos directives après ceci comme suit, en remplaçant
example.com
par votre nom de domaine et /test`— par la page web exacte à laquelle vous voulez appliquer la limite :<?php if ($VAR->domain->physicalHosting->proxySettings['nginxProxyMode']): ?> location / { <?php if ($VAR->domain->physicalHosting->scriptTimeout): ?> proxy_read_timeout <?php echo min($VAR->domain->physicalHosting->scriptTimeout, 2147483) ?>; <?php endif ?> <?php echo $VAR->includeTemplate('domain/service/proxy.php', $OPT) ?> } <?php if ($VAR->domain->asciiName == 'example.com'): ?> location = /test { limit_req zone=country_code; <?php if ($VAR->domain->physicalHosting->scriptTimeout): ?> proxy_read_timeout <?php echo min($VAR->domain->physicalHosting->scriptTimeout, 2147483) ?>; <?php endif ?> <?php echo $VAR->includeTemplate('domain/service/proxy.php', $OPT) ?> } <?php endif ?>
Exécutez la commande suivante pour vérifier si les templates modifiés sont des fichiers PHP valides :
php -l nginxDomainVirtualHost.php
Exécutez la commande suivante pour générer de nouveaux fichiers de configuration :
plesk sbin httpdmng --reconfigure-all
Vous avez limité les requêtes de la page web pour les adresses IP provenant d’un pays avec le même code ISO à cinq par minute.
(Hébergement nginx uniquement) Pour protéger une page web spécifique contre les attaques par force brute du même pays :
Ajoutez la directive du modèle suivant au fichier
/etc/nginx/conf.d/limit_req_zone.conf
:limit_req_zone $geoip_data_country_code zone=country_code:10m rate=5r/m;
Cela crée une zone mémoire partagée parmi les processus de travail nginx. La zone stocke le statut de chaque adresse IP et le nombre d’accès à une URL avec limite de requêtes. La directive ci-dessus limite le nombre de requêtes depuis les adresses IP avec un même code ISO de pays à cinq par minutes (
rate=5r/m
).Allez dans Sites Web & Domaines > domaine > onglet « Hébergement et DNS » > Paramètres d’Apache et Nginx.
Ajoutez ce qui suit dans le champ texte « Directives supplémentaires Nginx ». Remplacez
/test
par la page web exacte à laquelle vous voulez appliquer la limite :location = /test { limit_req zone=country_code; }
Cliquez sur OK.
Vous avez limité les requêtes de la page web pour les adresses IP provenant d’un pays avec le même code ISO à cinq par minute.
(nginx configuré pour servir directement PHP) Pour protéger un script PHP spécifique contre les attaques par force brute du même pays :
Ajoutez la directive du modèle suivant au fichier
/etc/nginx/conf.d/limit_req_zone.conf
:limit_req_zone $geoip_data_country_code zone=country_code:10m rate=5r/m;
Cela crée une zone mémoire partagée parmi les processus de travail nginx. La zone stocke le statut de chaque adresse IP et le nombre d’accès à une URL avec limite de requêtes. La directive ci-dessus limite le nombre de requêtes depuis les adresses IP avec un même code ISO de pays à cinq par minutes (
rate=5r/m
).Créez un template de configuration personnalisé nginxDomainVirtualHost.php` en suivant cette procédure.
Cherchez le texte suivant à la fin du template par défaut copié :
location ~ \.php(/.*)?$ { <?php if ($VAR->domain->physicalHosting->scriptTimeout): ?> fastcgi_read_timeout <?php echo min($VAR->domain->physicalHosting->scriptTimeout, 2147483) ?>; <?php endif ?> <?php echo $VAR->includeTemplate('domain/service/fpm.php', $OPT) ?> }
Puis insérez vos directives avant le texte en incluant
limit_req
. Remplacezexample.com
par votre nom de domaine et/test\.php
— par le script PHP exact auquel vous voulez appliquer la limite :<?php if ($VAR->domain->asciiName == 'example.com'): ?> location ~ ^/test\.php$ { limit_req zone=country_code; <?php if ($VAR->domain->physicalHosting->scriptTimeout): ?> fastcgi_read_timeout <?php echo min($VAR->domain->physicalHosting->scriptTimeout, 2147483) ?>; <?php endif ?> <?php echo $VAR->includeTemplate('domain/service/fpm.php', $OPT) ?> } <?php endif ?> location ~ \.php(/.*)?$ { <?php if ($VAR->domain->physicalHosting->scriptTimeout): ?> fastcgi_read_timeout <?php echo min($VAR->domain->physicalHosting->scriptTimeout, 2147483) ?>; <?php endif ?> <?php echo $VAR->includeTemplate('domain/service/fpm.php', $OPT) ?> }
Exécutez la commande suivante pour vérifier si les templates modifiés sont des fichiers PHP valides :
php -l nginxDomainVirtualHost.php
Exécutez la commande suivante pour générer de nouveaux fichiers de configuration :
plesk sbin httpdmng --reconfigure-all
Vous avez limité les requêtes du script PHP depuis les adresses IP d’un pays avec le même code ISO à 5 par minute.