Tuto: Bloquer les requêtes selon le pays

Bonjour,

Selon l’usage que vous faîtes de Yunohost, il n’est pas forcément nécessaire de laisser un accès de n’importe où. Par exemple pour un usage personnel de Nextcloud, l’accès est suffisant uniquement de France par exemple et parfois de l’étranger quand on se déplace. Dans ce cas il est possible d’interdire l’accès de l’étranger avec les listes Ip de géolocalisation disponible ici et en cas de déplacement à l’étranger, activer un accès à partir du pays concerné rapidement avec son code iso disponible sur cette page.

Il suffit d’utiliser le script suivant à placer dans /usr/local/bin par exemple:

#!/bin/bash

maj_geoip () {
    cd /usr/share/GeoIP
    wget https://dl.miyuru.lk/geoip/maxmind/country/maxmind.dat.gz
    gunzip maxmind.dat.gz
    mv maxmind.dat GeoIP.dat
}

month=/usr/local/etc/maxmind
update=$(curl -s https://www.miyuru.lk/geoiplegacy | grep -oP "(?<=Maxmind : ).*(?=</li>)")
[[ "$(<$month)" != "$update" ]] && (echo "$update" > "$month";maj_geoip)
exit 0

Il suffit de créer une tâche cron ensuite pour vérifier la disponibilité de mise à jour. Une fois par mois est un bon compromis en mettant directement le script ou un lien symbolique vers celui-ci dans /etc/cron.monthly.

Ensuite créer le fichier /etc/nginx/country:

map $geoip_country_code $allowed_country {
   default no;
   # France
   FR yes;
   # Italie
   #IT yes;
   #Etc........
   }

Ajoutez les pays de votre choix, il suffit de dé-commenter le code iso 3166 des pays pour lesquelles on souhaite un accès comme ici dans l’exemple avec la France .

Ajouter à nginx.conf la ligne suivante en dessous de include /etc/nginx/sites-enabled/*; :

include /etc/nginx/country;

Ajouter au début de /etc/nginx/conf.d/yunohost_admin.conf en adaptant l’adresse de réseau local:

geo $lan-ip {
default no;
192.168.0.0/24 yes;
} 

Puis ajouter dans la section “server” (avant location/) de ce même fichier:

if ($lan-ip = yes) {
set $allowed_country yes;
}
    # block the country
    if ($allowed_country = no) {
        return 444;
    }

Ne connaissant pas trop comment fonctionne Nginx, j’ai ajouté ceci pour le port 80 et 443, je ne sais pas si c’était nécessaire vu que yunohost redirige vers le port 443, si quelqu’un peut apporter des précisions à ce sujet.

J’ai eu l’occasion de tester de l’étranger, l’accès est bien bloqué. Il a suffit de dé-commenter la ligne du pays concerné dans le fichier /etc/nginx/country pour avoir à nouveau accès au serveur à partir d’un navigateur.

4 Likes

Bonjour et merci pour ce tutoriel explicatif.

De mon côté, j’utilise une technique radicalement différente mais au résultat similaire : mon serveur Yunohost est placé dans une DMZ derrière un bastion IPfire sur lequel le blocage GeoIP est actif.
Cela permet d’avoir en sus une détection des évènements anormaux via le NIDS Suricata (que pour ma part je configure en mode NIPS) sur une plage de ports plus étendue, de mesurer/surveiller les flux, …

Sangokuss :slight_smile:

1 Like

Je ne connais pas les outils que tu utilises, merci pour la découverte.
Par contre, si je comprends bien, Ipfire tourne sur un autre serveur en amont de Yunohost? Est-ce bien ça?

Oui, c’est bien un second serveur qui se place en coupure (comme on dit) et qui par conséquent filtre l’ensemble des flux.

1 Like

Bonjour @metyun ,
pourquoi se limiter à nginx?
Si j’ai bien compris (attention je suis un noob total en administration serveur! :sweat_smile: ), ce tuto permet de filtrer par géolocalisation IP toutes les tentatives de connexion via le serveur web.
Or, si un attaquant essaie de se connecter en ssh sur mon serveur, il ne sera pas pris dans les mailles de ce filtre… J’ai bon?

Ne serait-il pas préférable de filtrer au niveau de fail2ban directement? Un peu comme dans cet article: https://www.webfoobar.com/node/54
Il me semble que l’approche via fail2ban englobe absolument tous les types de connexion, et pas seulement web.

Merci de me corriger si besoin!

Bonjour @polochon ,

Tout simplement parce que lors de mes recherches je n’étais pas tombé sur ton lien et que je ne savais même pas que fail2ban pouvais le faire.

J’ai recueilli des infos ici et là, et je voulais simplement partager les scripts que j’ai mis en place et qui sont fonctionnels. On voit bien les réponses 444 dans les logs de Nginx pour les Ip étrangères.

De ce que j’avais trouvé, la database GeoIP n’était plus maintenu et il fallait passer à GeoIP2, ce qui n’était pas possible nativement sur yunohost. Aussi j’ai fais le script de mise à jour de la database qui est vraisemblablement nécessaire.

Ce qui me chagrine dans la solution fail2ban si je comprends le dernier commentaire de ton lien, c’est que lorsque la banaction geohostsdeny est utilisée, on ne pourrait pas en utiliser une autre. Donc si une attaque provient d’un pays mis en liste blanche, l’IP de celle-ci ne serait jamais bannie, ce qui n’est pas vraiment l’idéal.
Avec la méthode que j’indique, le serveur ne retourne aucune information et ferme la connexion, le filtrage n’est pas fait après coup comme avec fail2ban. Néanmoins tu as raison de préciser que ça ne concerne que Nginx.

Pour SSH je n’ai pas ouvert le port car je ne m’y connecte qu’en local. Si je devais ouvrir celui-ci, je préfère de toute façon une connexion par échange de clefs qui me semble beaucoup plus sécurisée qu’une connexion par mot de passe.
Pour d’autres services comme le mail, je ne crois pas que bloquer les requêtes venant de l’étranger soit une bonne idée car on ne sait pas à l’avance la localisation des serveurs d’où partent les mails. Je fais peut-être erreur dans mon interprétation, idem, ne pas hésiter à me corriger ou y apporter des précisions.

Je n’ai peut-être pas bien tout compris, tout comme toi je n’ai pas de connaissance en administration serveur, yunohost est justement une formidable solution qui nous permet de s’auto-héberger, je ne saurais trop remercier toutes les personnes qui participent à cette aventure.

merci pour ta réponse complète!

c’est que lorsque la banaction geohostsdeny est utilisée, on ne pourrait pas en utiliser une autre. Donc si une attaque provient d’un pays mis en liste blanche, l’IP de celle-ci ne serait jamais bannie, ce qui n’est pas vraiment l’idéal.

Je n’ai lu que superficiellement la page que j’ai donné en lien, je voulais juste avoir un exemple à montrer. Effectivement ce n’est pas top :confused:
je vais essayer de chercher sérieusement quelque chose de plus abouti, mais sinon je n’avais pas pensé que fermer le port SSH sur ma box peut aussi être une solution (vu que je n’administre pas en dehors de chez moi).

Thanks :slight_smile:

Si tu te connectes en SSH que de chez toi, effectivement ça n’a aucun intérêt d’ouvrir le port dans ta box. Dans la box tu n’ouvres que les ports dont tu as besoin d’un accès de l’extérieur.

Je n’ai pas creusé la question mais si il n’y a pas moyen de mettre plusieurs banaction pour la même jail de fail2ban, il doit avoir moyen dans ce cas de dupliquer le filtre et de faire 2 jails.
Par exemple 2 filtres identiques [sshd] et [sshd-bis], dans le second on filtre par le pays en ajoutant la banaction geohostsdeny et un maxretry inférieur au 1er filtre.
Comme ça si le pays est en liste blanche mais tente une attaque, il est quand même bloqué par le filtre 1.

Une annonce qui pourrait t’intéresser @Sango

1 Like

Oui, lu (je suis de près les avancées d’IPfire :wink: )
Et j’aime bien cette idée de développement d’un outil indépendant !

Merci à toi d’avoir pensé à moi :slight_smile: