Tuto: Bloquer les requêtes selon le pays

Si tu as un mauvais mots de passe d’admin oui.
Si il y a une énorme faille dans YunoHost ou dans une des apps que tu as installé⋅e aussi. Il faut faire les mises à jour et éviter d’installer des apps inutiles.
Si un⋅e attaquant⋅e à accès à ta machine ou ton VPS aussi… Par exemple ça pourrait être un⋅e employé⋅e de ton fournisseur de VPS.

Pour les tentatives via la porte classique:
Web admin > Service > SSH > /var/log/auth.log

Mais pas d’inquiétude si tu vois du monde qui essaie, c’est normal et il y a fail2ban qui banni. La vrai question c’est est-ce que quelqu’un⋅e réussi.

Tu peux commencer par: Security | Yunohost Documentation
Mais la config par défaut et pas si mal en vrai, si tu choisis une phrase de passe de plus de 12 caractères.

2 Likes

Donc je suis allé jeter un coup d’œil sur le fichier auth.log. Et bien il y a du monde. En 5 minutes 15 failed password for root. Des ip chinoises.
Mon mot de passe est >16 caractères, mais je pense que je vais restreindre l’accès pour la Chine (je connais personne là-bas :sweat_smile:)
Tout est à jour, je vérifie 2 fois par semaine. Je vais aussi virer quelques applications installées que je n’ai jamais utilisé.

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: