Tuto: Bloquer les requêtes selon le pays

Pour un monitoring facilité tu peux regarder du côté de logwatch.

+1 pour Logwatch. Pflogsumm pour les mails dans une tâche cron est un bon complément.

En déterrant cette discussion @kit, ça m’a fait penser que j’utilise désormais un hook comme me l’avais conseillé @ljf. Pour ceux qui veulent s’en inspirer en attendant que je mette à jour le tuto.

/etc/yunohost/hooks.d/conf_regen/18-nginx_geoip

#!/bin/bash

action=$1
pending_dir=$4
nginx_dir=$pending_dir/../nginx/etc/nginx
nginx_security_conf=$nginx_dir/conf.d/security.conf.inc
nginx_country_conf=$nginx_dir/conf.d/country.conf

[[ $action == "pre" ]] || exit 0
[[ -d $nginx_dir ]] || exit 0
[[ -e $nginx_security_conf ]] || exit 0

echo '# GeoIP databases
geoip_country /usr/share/GeoIP/GeoIP.dat;

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

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

echo '

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

##############################################################

Comment administres-tu ton serveur? Uniquement en local ou également en externe? Car si c’est uniquement en local tu peux restreindre l’accès de l’interface Web admin et ne pas ouvrir ton port ssh sur la box.

Le hook se lance à chaque regen-conf, c’est ça ?

J’utilise essentiellement mon smartphone pour accéder au serveur, rarement du pc. L’application juicessh pour le ssh. Je me suis connecté la plupart du temps en interne, j’ai donc désactivé le port 22 du routeur et l’upnp du serveur quelques minutes après avoir posté mon message précédent.
Je suis nouveau dans l’univers Linux, je m’y suis mis avec yunohost il y a quelques mois. J’ai beaucoup lu et beaucoup à lire et à apprendre sur le sujet.

Oui.
Et lors des mises à jour, ça permet de garder un système à jour, si il y a des modifications apportées aux config nginx, elles sont appliquées et le hook s’exécute ensuite pour ajouter le blocage GeoIP. Ce hook évite également de modifier nginx.conf et yunohost_admin.conf.
C’est la meilleure façon de procéder quand on modifie les fichiers de configuration du “cœur” de Yunohost.
En partant d’un système vierge, il faut passer l’option --force à regen-conf pour forcer la création de country.conf.

2 Likes

Pour info, j’ai mis le tuto à jour.

1 Like

Plop

J’ai voulu refaire un peu propre chez moi avec le hook, mais fail quand je tente de relancer nginx (via restart ou reload) :

https://paste.yunohost.org/oracocecex.vbs

Apparemment le fichier /etc/nginx/conf.d/country.conf revient souvent avec des histoire de duplicates.

Voici son contenu :

# GeoIP databases
geoip_country /usr/share/GeoIP/GeoIP.dat;

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

geo $lan-ip {
  default no;
  xxx.xxx.xxx.0/24 yes;
}

Une idée ?

Salut @Kit ,

"geoip_country" directive is duplicate

C’est certainement dû à des résidus des modifications précédemment apportées. Avant d’utiliser le hook, un regen-conf --force de nginx devrait remettre la configuration par défaut puis refaire la procédure. A confirmer, je ne suis pas sûr que le regen-conf rétabli nginx.conf mais tu peux tenter.
Sinon pour le faire manuellement, regarde si tu n’as pas oublié dans le fichier nginx.conf de retirer les lignes:

# GeoIP databases
    geoip_country /usr/share/GeoIP/GeoIP.dat;

ainsi que:

include /etc/nginx/country;

Salut,

J’avais bien fait le regen-conf --force de nginx.

Je regarderai dans nginx.conf dès que possible :+1:

Tu l’as passé avant et après?

Vu que ça reset les fichiers, c’est sans importance non ?

(bon atm serveur injoignable, du coup je ne peux pas retester :/)

Ben non,
Avant ça remet la configuration par défaut, après ça remet la configuration par défaut + les modifications apportées par le hook. Pour retrouver la configuration initiale, il faut supprimer les hooks.

Oui tu as raison, ça ne change rien pour les fichiers originaux. Quand c’est fait après, ça apporte seulement en plus les modifications apportées par le hook.
Après vu que nginx.conf n’est pas un fichier spécifique à Yunohost, le regen-conf ne l’a apparemment pas remis d’origine. Du coup il faudra le faire manuellement mais l’erreur vient très certainement de là.

1 Like

Bien vu, c’était bien ces deux lignes dans nginx.conf qui posaient soucis. Je les ai passé en commentaire et j’ai redémarré le service : tout fonctionne à nouveau, merci :slight_smile:

Je profite de t’avoir sous la main pour poser une question : peut-on bloquer uniquement certaines pages ?
Je souhaiterais bloquer uniquement les pages contenant login (et yunohost/sso) dans leur URL de manière à laisser l’accès ouvert à n’importe quel pays à mes fichiers sous nextcloud ou mes repo git.

C’est possible ? Si oui, c’est pas trop crade comme manière de procéder ?

Je ne connais pas assez bien Nginx pour te conseiller sur ce que tu veux faire. Cependant j’ai fais une recherche rapide et ça semblerait possible avec un bloc location dans Nginx.

J’avais regardé un peu de ce côté là, mais il me semble que les internets semblaient assez mitigés sur l’utilisation de location.

Je vais recreuser de ce côté dès que j’aurai un peu de temps.

Plop !

J’ai pris un peu le temps de lire de la doc sur nginx, et je pense avoir une alternative au bloc suivant (dans le hook /etc/yunohost/hooks.d/conf_regen/18-nginx_geoip) pour ne bloquer que les pages contenant les string login ou sso, de manière à laisser les ressources accessibles à n’importe quel pays (exemple : hébergement d’images via nextcloud pour un quelconque forum) tout en restreignant l’accès aux pages de login :

# block the country
#if ($allowed_country = no) {
#  return 444;
#}
location ~ /(sso|login) {
 if ($allowed_country = no) {
  return 444;
 }
}

C’est du bricolage, du coup j’attends la validation par quelqu’un de rôdé sur le sujet :smiley:

Edit : Bizarre, la page https://monserveur.noho.st/nextcloud/login s’affiche, alors que le portail ou la page de login Gitea (https://monserveur.noho.st/gitea/user/login) est bloquée.

Sorry for replying in English here but even your cat’s French is better than mine, but I get this error.

Error: Could not run script: /usr/share/yunohost/hooks/conf_regen/15-nginx

Ah, i forgot sudo :woozy_face:

Je continue à expérimenter les location.

J’ai un soucis :

Lorsque je tente de mettre ceci dans le fichier security :

# block the country
location ~* /(sso|admin|login) {
 if ($allowed_country = no) {
  return 444;
 }
}

Voilà le résultat que j’'obtiens avec un pays autorisé en cherchant à me logguer sur une appli (ici Gitea) :

xxx.xxx.xxx.xxx - - [13/Mar/2022:15:49:14 +0100] "GET /gitea/user/login HTTP/2.0" 404 162 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:98.0) Gecko/20100101 Firefox/98.0"
xxx.xxx.xxx.xxx - - [13/Mar/2022:15:49:14 +0100] "GET /favicon.ico HTTP/2.0" 302 154 "https://xxx.noho.st/gitea/user/login" "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:98.0) Gecko/20100101 Firefox/98.0"
xxx.xxx.xxx.xxx - - [13/Mar/2022:15:49:14 +0100] "GET /yunohost/sso/?r=aHR0cHM6Ly9jaGF0b24ubm9oby5zdC9mYXZpY29uLmljbw== HTTP/2.0" 200 3120 "https://xxx.noho.st/gitea/user/login" "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:98.0) Gecko/20100101 Firefox/98.0"

Une belle erreur 404.

On dirait qu’il y a un appel/une redirection vers le portail du serveur à la fin (/yunohost/sso).

Note : pas de soucis pour me logguer directement sur le serveur (réponse 200) :

xxx.xxx.xxx.xxx - - [13/Mar/2022:15:56:12 +0100] "GET /yunohost/sso/?r=aHR0cHM6Ly9jaGF0b24ubm9oby5zdC8= HTTP/2.0" 200 3022 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:98.0) Gecko/20100101 Firefox/98.0"
xxx.xxx.xxx.xxx - - [13/Mar/2022:15:56:12 +0100] "GET /yunohost/sso/assets/js/ynh_portal.js HTTP/2.0" 200 14013 "https://xxx.noho.st/yunohost/sso/?r=aHR0cHM6Ly9jaGF0b24ubm9oby5zdC8=" "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:98.0) Gecko/20100101 Firefox/98.0"
xxx.xxx.xxx.xxx - - [13/Mar/2022:15:56:12 +0100] "GET /yunohost/sso/assets/themes/xxx/custom_portal.js HTTP/2.0" 200 1436 "https://xxx.noho.st/yunohost/sso/?r=aHR0cHM6Ly9jaGF0b24ubm9oby5zdC8=" "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:98.0) Gecko/20100101 Firefox/98.0"

Je continue à creuser (doucement, parce que je suis nul, que j’ai pas trop le temps et que ce n’est pas critique).

Si je reprends l’exemple précédent, à savoir l’accès à l’url https://xxx.noho.st/gitea/user/login en étant dans un pays autorisé, et que regarde dans le fichier de log /var/log/nginx/xxx.noho.st-error.log, j’ai cette ligne qui apparait :


2022/03/20 12:47:11 [error] 8972#8972: *46627 open() "/usr/share/nginx/html/gitea/user/login" failed (2: No such file or directory), client: xxx.xxx.xxx.xxx, server: xxx.noho.st, request: "GET /gitea/user/login HTTP/2.0", host: "xxx.noho.st"

Et effectivement, si je vais fouiller dans /usr/share/nginx/html/ :

root@xxx:~# ls /usr/share/nginx/html
index.html

Effectivement, il n’y a pas de dossier gitea, d’où l’erreur 404 j’imagine.