Comment bloquer les tentatives de connexion SSH indésirables avec PyFilter sur Ubuntu 16.04
L'auteur a sélectionné Code.org pour recevoir un don dans le cadre du programme Write for DOnations.
Introduction
Secure Shell (SSH) est un protocole réseau cryptographique pour l'exploitation sécurisée des services réseau. Il est généralement utilisé pour le contrôle à distance d'un système informatique ou pour le transfert de fichiers. Lorsque SSH est exposé à l'Internet public, cela devient un problème de sécurité. Par exemple, vous trouverez des robots essayant de deviner votre mot de passe via des méthodes de force brute.
PyFilter vise à filtrer toutes les demandes de connexion illégitimes à votre serveur et à les bloquer si trop de demandes sont envoyées. Il fonctionne en lisant les fichiers journaux et en vérifiant si une demande ayant échoué provient de la même adresse IP dans un délai configurable par l'utilisateur. Il ajoute ensuite des règles au pare-feu s'il capture trop de tentatives infructueuses, refusant la possibilité de se connecter à votre serveur.
Dans ce didacticiel, vous allez installer et configurer PyFilter pour bloquer les requêtes SSH. Ensuite, vous installerez PyFilter en tant que service et configurerez éventuellement la synchronisation des interdictions inter-serveurs, une fonctionnalité qui permet à plusieurs serveurs de partager la liste des adresses IP interdites et permettra à PyFilter d'enregistrer des données de localisation sur une adresse IP. Enfin, vous découvrirez comment annuler l'interdiction des adresses IP.
Conditions préalables
Pour terminer ce tutoriel, vous aurez besoin de :
- Un serveur Ubuntu 16.04 configuré en suivant le guide de configuration initiale du serveur Ubuntu 16.04, y compris un utilisateur sudo non root et un pare-feu.
- Python 3, qui est déjà installé par défaut sur Ubuntu 16.04.
- PIP installé avec
sudo apt-get install python3-pip
.
- (Facultatif) Redis est installé en suivant Comment installer Redis sur Ubuntu 16.04 si vous souhaitez configurer la fonction de synchronisation d'interdiction inter-serveurs de PyFilter dans Étape 4.
Étape 1 - Téléchargement et configuration de PyFilter
Nous allons télécharger PyFilter en clonant son dépôt depuis Github. Basculez vers votre répertoire personnel et clonez le dépôt :
cd ~ git clone https://github.com/Jason2605/PyFilter.git
Cela créera un répertoire appelé PyFilter
. Déplacez ce dossier vers le dossier /usr/local
:
sudo mv PyFilter /usr/local/PyFilter
Passez ensuite au répertoire /usr/local/PyFilter
:
cd /usr/local/PyFilter
Ensuite, nous devons créer un fichier de configuration. PyFilter est livré avec un fichier de configuration par défaut situé dans Config/config.default.json
. Nous allons copier ceci et modifier la version copiée plutôt que de modifier directement le fichier par défaut. De cette façon, si quelque chose ne va pas, vous avez le fichier de configuration par défaut à comparer.
Copiez le fichier de configuration par défaut :
sudo cp Config/config.default.json Config/config.json
Vous pouvez utiliser la commande less
pour afficher le contenu du fichier de configuration :
less Config/config.json
Les paramètres par défaut exigent que les demandes soient dans les 5 secondes suivant la dernière demande et cela doit se produire 5 fois, elles sont assez bonnes pour commencer. Exécutons PyFilter et assurons-nous que tout fonctionne.
Étape 2 - Exécution de PyFilter
Le téléchargement de PyFilter inclut un script appelé run.sh
que vous devez utiliser pour lancer PyFilter.
Tout d'abord, modifiez les autorisations sur le script pour le rendre exécutable.
sudo chmod +x run.sh
Une fois les autorisations accordées, exécutez le script pour démarrer PyFilter :
./run.sh
PyFilter commencera à regarder les journaux et vous verrez la sortie au fur et à mesure que les événements se produisent :
OutputNo file to check within rule: Mysql No file to check within rule: Apache No file to check within rule: Nginx Checking Ssh logs
Par défaut, PyFilter interdit les adresses IP qui effectuent au moins cinq demandes ayant échoué dans les 5 secondes suivant l'échec de la demande précédente. Vous pouvez modifier cela dans le fichier de configuration PyFilter.
Ces résultats sont également enregistrés dans le répertoire /usr/local/PyFilter/Log
.
Lorsqu'une adresse IP a atteint les limites qui justifient une interdiction, vous verrez une sortie semblable à celle-ci :
Output2018-03-22 14:18:18 Found IP: 203.0.113.13 from server: your_server_name.
Remarque : Si vous vous verrouillez accidentellement hors de votre Droplet parce que vous vous êtes banni, vous pouvez suivre le tutoriel Comment utiliser la console DigitalOcean pour accéder à votre Droplet pour y revenir. Suivez ensuite les étapes de Étape 6 pour supprimer l'adresse IP interdite.
Pour fermer PyFilter, appuyez sur CTRL+C
.
Installons maintenant PyFilter en tant que service pour qu'il s'exécute automatiquement.
Étape 3 - Création d'un service pour PyFilter
Maintenant que vous savez que PyFilter fonctionne, configurons-le pour qu'il s'exécute en tant que service afin qu'il démarre à chaque redémarrage du serveur.
Dans le répertoire PyFilter
, il y a un script appelé install.sh
qui crée un service pour PyFilter et lui permet de s'exécuter au démarrage du système.
Modifiez le script pour pouvoir l'exécuter :
sudo chmod +x install.sh
Lancez ensuite le script :
./install.sh
Vous verrez cette sortie, indiquant que l'installation a réussi :
OutputService created and enabled, check the status of it by using "sudo systemctl status PyFilter"
Faisons donc cela pour nous assurer que tout fonctionne correctement :
sudo systemctl status PyFilter
Vous verrez cette sortie, montrant que le service est active
:
Output● PyFilter.service - PyFilter Loaded: loaded (/etc/systemd/system/PyFilter.service; enabled; vendor preset: enabled) Active: <^>active^> (running) since Wed 2018-03-21 18:55:35 UTC; 12s ago Main PID: 8383 (bash) CGroup: /system.slice/PyFilter.service ├─8383 bash /usr/local/PyFilter/run.sh ├─8384 sudo python3 run.py └─8387 python3 run.py
Si vous voyez une erreur, revoyez les étapes d'installation à nouveau.
Voyons ensuite comment configurer PyFilter pour partager des adresses IP interdites avec d'autres serveurs.
Étape 4 - Configuration de PyFilter pour la synchronisation des interdictions entre serveurs (facultatif)
La synchronisation d'interdiction entre serveurs permet à l'adresse IP interdite d'être synchronisée avec tous les autres serveurs utilisant PyFilter pour les protéger, et d'interdire cette adresse même si elle n'a pas rempli les conditions d'interdiction. Cela signifie qu'il peut avoir une longueur d'avance sur les robots potentiels ciblant vos autres systèmes car l'adresse IP est déjà interdite.
Comme indiqué dans les prérequis, vous aurez besoin que Redis soit installé et configuré.
Vous avez également besoin du module Python redis
, que vous pouvez installer avec pip
:
pip3 install redis
Modifiez ensuite votre fichier de configuration pour utiliser Redis au lieu de SQLite. Ouvrez le fichier Config/config.json
dans votre éditeur de texte :
nano Config/config.json
Localisez la ligne suivante :
Config/config.json
"database": "sqlite"
Remplacez sqlite
par redis
:
Config/config.json
"database": "redis"
Ensuite, modifiez les informations de connexion Redis. Localisez cette section du fichier :
Config/config.json
"redis": { "host": "127.0.0.1", "password": null, "database": 0, "sync_bans": { "active": true, "name": "your_hostname", "check_time": 600 } },
Modifiez cette section afin qu'elle inclue les détails de connexion de votre serveur Redis. Ensuite, dans la section sync_bans
, remplacez name
par votre nom d'hôte. Ce nom doit être unique pour chaque système individuel exécutant PyFilter à l'aide du même serveur Redis afin que la synchronisation d'interdiction inter-serveurs fonctionne correctement.
Enregistrez le fichier et quittez l'éditeur. Redémarrez ensuite PyFilter pour appliquer ces modifications :
sudo systemctl restart PyFilter
PyFilter est maintenant installé et en cours d'exécution.
Étape 5 - Configuration de PyFilter pour collecter des données de localisation sur les adresses IP (facultatif)
PyFilter peut récupérer des données de localisation sur l'adresse IP interdite afin de fournir des informations statistiques sur l'origine de la majorité des attaques. Ce module facultatif ajoutera ces informations aux journaux de PyFilter.
Pour utiliser cette fonctionnalité, vous avez d'abord besoin du module Python geoip2
, que vous pouvez installer avec pip
:
pip3 install geoip2
Une fois que vous avez installé ce module, redémarrez PyFilter pour qu'il reconnaisse le nouveau module :
sudo systemctl restart PyFilter
Désormais, lorsque vous voyez une adresse IP interdite, vous voyez des informations supplémentaires sur l'adresse IP :
Output2018-03-22 14:18:18 Found IP: 203.0.113.13 from server: your_server_name. The IP was from United Kingdom.
PyFilter enregistre maintenant avec succès le pays d'où proviennent les requêtes.
Enfin, regardons comment dé-bannir une adresse.
Étape 6 - Annulation des adresses IP
PyFilter est purement un moyen d'interdire les adresses IP en créant des règles iptables. Lorsqu'il interdit une adresse IP, il met à jour les règles du pare-feu, puis enregistre des instantanés des règles dans les fichiers /usr/local/PyFilter/Config/blacklist.v4
et /usr/local/PyFilter/Config/blacklist.v6
.
Voici un exemple de plusieurs adresses IPv4 interdites dans /usr/local/PyFilter/Config/blacklist.v4
:
/usr/local/PyFilter/Config/blacklist.v4
# Generated by iptables-save v1.6.0 on Thu Mar 22 19:53:04 2018 *filter :INPUT ACCEPT [217:30580] :FORWARD ACCEPT [0:0] :OUTPUT ACCEPT [249:30796] -A INPUT -s 203.0.113.13/32 -j DROP -A INPUT -s 203.0.113.14/32 -j DROP -A INPUT -s 203.0.113.15/32 -j DROP COMMIT # Completed on Thu Mar 22 19:53:04 2018
Pour dé-bannir cette adresse IP, ouvrez le fichier de liste noire associé dans votre éditeur de texte :
sudo nano /usr/local/PyFilter/Config/blacklist.v4
Supprimez les règles iptables associées du fichier. Dans ce cas, nous avons supprimé 203.0.113.13
du fichier :
/usr/local/PyFilter/Config/blacklist.v4
# Generated by iptables-save v1.6.0 on Thu Mar 22 19:53:04 2018 *filter :INPUT ACCEPT [217:30580] :FORWARD ACCEPT [0:0] :OUTPUT ACCEPT [249:30796] -A INPUT -s 203.0.113.14/32 -j DROP -A INPUT -s 203.0.113.15/32 -j DROP COMMIT # Completed on Thu Mar 22 19:53:04 2018
Enregistrez ensuite le fichier et fermez l'éditeur. Redémarrez PyFilter avec sudo systemctl restart PyFilter
et PyFilter mettra à jour vos règles de pare-feu à l'aide de ce fichier.
Voir Comment répertorier et supprimer les règles de pare-feu Iptables pour en savoir plus sur la gestion des règles avec iptables.
Vous pouvez également indiquer à PyFilter d'ignorer certaines adresses IP en les ajoutant à la section de la liste blanche dans le fichier /usr/local/PyFilter/Config/config.json
.
Conclusion
Vous avez maintenant PyFilter installé et surveillant vos connexions SSH.
Pour en savoir plus sur chaque section du fichier de configuration et sur la configuration de la surveillance pour d'autres services, tels que MySQL et Apache, consultez le site PyFilter..