[GeoIP] [Fail2Ban] Bannir les tentatives de connexions par mod_proxy ou par SSH

Plop

Je vous propose un petit script basé sur l’utilisation de fail2ban, visant à bannir les IP qui font des tentatives de connexion par mod_proxy ou tentent de se loguer en SSH sans déclencher fail2ban (tentatives trop espacées).

A mettre en tâche cron à la fréquence de votre choix, perso je le fais tourner toutes les heures.

Le programme effectue aussi un test geoip sur une base préalablement téléchargée (voir ce topic de @metyun pour automatiser sa récupération) histoire de ne pas trop spammer l’API afin de :

  • loguer le pays de l’IP banni
  • ne pas bannir les tentatives SSH provenant des pays sélectionnés (si comme moi vous faites régulièrement des fautes de frappes et que vous avez une IP dynamique).

  • Le script est prévu uniquement pour les IPv4 (mes serveur n’ont pas d’IPv6). Ca pourrait être interessant d’en dev une version IPv6, il faut regarder comment f2b fonctionne dans ce cas et modifier la façon dont on récupère les IP.
  • Le log n’est pas obligatoire (il suffit en ce cas de désactiver les fonctions le concernant)
  • Le log est prévu pour être mis dans une balise sur une page dokuwiki, mais vous pouvez modifier ça si votre config est différente.

Commentaires et observations bienvenus, forkez le et modifiez le à l’envie.

Edit : testé sur un yuno à base de vieil Atom C2350 avec pas grand chose en tâche de fond, le script tourne en moyenne (100 lancements) en moins d’une seconde quand il n’y a pas d’IP à bannir et sans login desdites IP :

# multitime -q -n 100 "/home/purge_ip.bash"
===> multitime results
1: -q /home/purge_ip.bash
            Mean        Std.Dev.    Min         Median      Max
real        0.806       0.032       0.756       0.801       0.918
user        0.610       0.023       0.547       0.610       0.665
sys         0.221       0.032       0.145       0.217       0.317

Bonjour,

Je suis désolé de déterrer ce post, mais est-ce toujours d’actualité pour Yunohost 12 ?

Depuis quelque temps, je subis des tentatives d’intrusions, SSH, des avertissements postfix [fail2ban] :

banni par Fail2Ban après 5 tentatives

banned by Fail2Ban after 5
152.32.134.156
165.154.128.199

J’ai suivi cette info pour durcir la sécurité Modifier le port SSH et Passer une adresse IP en liste blanche / whitelist

banni par Fail2Ban après 3 tentatives

banned by Fail2Ban after 3
64.226.71.50
207.90.244.15
5.101.0.66
185.165.191.26
207.90.244.11
199.45.155.95
211.252.168.97
15.204.171.201
207.90.244
167.172.176.79
167.172.183.13
185.142.236.36
167.94.145.104
15.204.171.201

J’ai voulu voir avec l’Authentification SSH par clé, mais j’ai l’impression que ce n’est pas complet, je me trompe peut-être.
Qu’il manque quelque chose avant et après cette commande :
sudo yunohost settings set security.ssh.ssh_password_authentication -v no
Avant : Parce que je ne vois pas comment faire si on a déjà modifié le port SSH ?
Après : Parce que, là aussi, que doit-on faire après avoir utilisé la commande ?

Et aujourd’hui, en plus de tout ce que j’ai mentionné ci-dessus, je voudrais mettre en place quelque chose pour bannir certains pays.
Mettre GeoIP en place est-il possible aujourd’hui ?

Merci pour l’aide et réponse.

Salut (et désolé, je n’avais pas vu le post).

Il faut voir comment fonctionne yunohost settings, mais dans les grandes lignes, après avoir modifié un fichier de configuration, il faut recharger la config.

Hors commandes spécifiques à yunohost, les fichiers de config SSH se trouve dans /etc/ssh, et notamment /etc/ssh/sshd_config qui est managé par Yunohost, et où on retrouve le port et les lignes suivantes :

# PLEASE: if you wish to force everybody to authenticate using ssh keys, run this command:
# yunohost settings set security.ssh.ssh_password_authentication -v no

PasswordAuthentication no

Si cette ligne est à yes, alors tu peux toujours te logguer en utilisant un mot de passe.

Attention, si tu la passe à no, vérifie bien que la ligne PubkeyAuthentication yes est bien à yes, sinon tu risque de t’enferme dehors.

Si tout est ok, tu peux faire un yunohost service reload_or_restart sshpour recharger la config.

Pour répondre aux questions :

sudo yunohost settings set security.ssh.ssh_password_authentication -v no
Avant : Parce que je ne vois pas comment faire si on a déjà modifié le port SSH ?
Après : Parce que, là aussi, que doit-on faire après avoir utilisé la commande ?

→ Le choix du port SSH est décorrélé de la façon de s’y connecter (par password ou clef)
→ Voir si-dessus pour ce qu’il faut faire après avoir modifier les fichiers de conf. Attention, je déconseille de jouer à la fois avec les commandes yunohostet de faire des modifs manuellement.

Tu peux aussi mettre la commande dans un hook de regen-conf si tu veux conserver une config modifiée :

#!/bin/bash

# A placer dans /etc/yunohost/hooks.d/conf_regen/

# Yunohost et SSH       : voir https://yunohost.org/en/ssh
# Yunohost et Sécurité  : voir https://yunohost.org/en/security

# Spécificités Yunohost
action=$1 # Sommes-nous en train de faire l'étape "pre" ou "post" ?
pending_dir=$4 # Il s'agit du dossier dans lequel sont stockés les conf "pending"
# Dans cet exemple, il s'agit de surcharger la conf SSH ... qui est en fait dans `$pending_dir/../ssh` (généré par le hook ssh "de base") ... puis ensuite il s'agit d'une arborescende unix-like classique avec `etc/ssh/sshd_config` ...
ssh_conf=$pending_dir/../ssh/etc/ssh/sshd_config

# Si on est pas dans l'action pre, on sort tout de suite car on ne veut rien faire de spécial dans l'action post
[[ "$action" == "pre" ]] || exit 0
# Si le fichier à override n'existe pas ... on quitte sans rien faire de spécial. Cette ligne n'est pas ultra importante
[[ -e "$ssh_conf" ]] || exit 0

# Variables
USERS=(user) # liste des utilisateurs, à séparer par des espaces.
PORT=12345 # Port SSH (22 par défaut)
PWD=False # (True|False) : True pour autoriser l'authentification par mot de passe, False pour forcer l'authentification par clef
COMPATIBILITY=modern # (intermediate|modern) # Gestion de TLS 1.2, voir https://wiki.mozilla.org/Security/Server_Side_TLS#Intermediate_compatibility_.28default.29


for i in "${USERS[@]}" # on boucle sur les différents utilisateurs de l'array USERS
do
        if [[ $(yunohost user list | grep "username: $i") != "" ]];then # si le user est un user yunohost
                if [[ $(getent group ssh.main | grep $i) == "" ]]; then #Si le user n'appartient pas au groupe LDAP ssh
                        yunohost user permission add ssh $i #on ajoute le user au groupe ssh.main (groupe LDAP)
                fi
        elif [[ $(getent group ssh.app | grep $i) == "" ]]; then #Si l'utilisateur n'appartient pas au groupe UNIX ssh
                usermod -a -G ssh.app $i #on ajoute le user au groupe ssh.app (groupe UNIX)
        fi
done


# MaJ du port ssh
if [[ $(grep "Port $PORT" /etc/ssh/sshd_config) == "" ]]; then #test si le port ssh correspond à celui de la variable $PORT
        yunohost settings set security.ssh.ssh_port -v $PORT
fi

# Révocation de la possibilité de se connecter avec un password.
#****** /!\ si $PWD=False, assurez vous d'avoir au préalable ajouté une clef à vos users ! /!\ ******


if [[ $(yunohost settings get security.ssh.ssh_password_authentication) != "$PWD" ]]; then #test si la possibilité se connecter en SSH avec un mot de passe correspond à la variable $PWD
        if [[ $PWD == "False" ]]; then
                yunohost settings set security.ssh.ssh_password_authentication -v no #on force l'authentification par clef
        elif [[ $PWD == "True" ]]; then
                yunohost settings set security.ssh.ssh_password_authentication -v yes #on autorise l'authentification par mot de passe
        fi
fi


# Gestion TLS 1.2
if [[ $(yunohost settings get security.ssh.ssh_compatibility) != "$COMPATIBILITY" ]]; then #test si on est déjà dans le mode de compatibilité voulu
        yunohost settings set security.ssh.ssh_compatibility -v $COMPATIBILITY

Pour faire du GeoIP sur SSH, ça me semble peu utile si obligation de s’authentifier avec une clef.

Je ne suis pas certains d’avoir vraiment répondu à tes questions, n’hésites pas si je suis à côté :smiley:

1 Like

Salut,

Merci beaucoup pour ces infos, ça m’aide mieux.
Et merci pour le script :slight_smile: