Comment bloquer les tentatives de connexion SSH indésirables avec PyFilter sur Ubuntu 16.04

L'auteur a choisiCode.org pour recevoir un don de 200 $ dans le cadre du programmeWrite for DOnations.

introduction

Secure Shell (SSH) est un protocole de réseau cryptographique permettant d’exploiter des services réseau de manière sécurisée. 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 rencontrerez des robots qui tenteront 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 sont envoyées. Cela 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, empêchant ainsi la connexion à votre serveur.

Dans ce tutoriel, vous allez installer et configurer PyFilter pour bloquer les requêtes SSH. Ensuite, vous installerez PyFilter en tant que service et vous pourrez éventuellement configurer la synchronisation des interdictions entre serveurs, une fonctionnalité qui permet à plusieurs serveurs de partager la liste des adresses IP interdites et à PyFilter d’enregistrer les données de localisation d’une adresse IP. Enfin, vous découvrirez comment annuler l’interdiction d’adresses IP.

Conditions préalables

Pour compléter ce tutoriel, vous aurez besoin de:

  • Un serveur Ubuntu 16.04 configuré en suivantthe Ubuntu 16.04 initial server setup guide, 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é avecsudo apt-get install python3-pip.

  • (Facultatif) Redis installé en suivantHow to Install Redis on Ubuntu 16.04 si vous souhaitez configurer la fonction de synchronisation d'interdiction de serveur de PyFilter dansStep 4.

[[step-1 -—- download-and-configuring-pyfilter]] == Étape 1 - Téléchargement et configuration de PyFilter

Nous allons télécharger PyFilter en clonant son dépôt à partir de Github. Basculez vers votre répertoire personnel et clonez le référentiel:

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

Puis passez 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é àConfig/config.default.json. Nous allons copier ceci et éditer la version copiée plutôt que d’éditer directement le fichier par défaut. Ainsi, si quelque chose ne va pas, vous devez comparer le fichier de configuration par défaut.

Copiez le fichier de configuration par défaut:

sudo cp Config/config.default.json Config/config.json

Vous pouvez utiliser la commandeless 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 de la dernière demande et que cela doit se produire 5 fois, elles sont assez bonnes pour y aller. Lançons PyFilter et veillons au bon fonctionnement.

[[step-2 -—- running-pyfilter]] == Étape 2 - Exécution de PyFilter

Le téléchargement PyFilter comprend un script appelérun.sh que vous devez utiliser pour lancer PyFilter.

Commencez par modifier 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 les résultats 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 font cinq demandes échouées ou plus qui se produisent dans les 5 secondes qui suivent la précédente. Vous pouvez changer cela dans le fichier de configuration de PyFilter.

Ces résultats sont également enregistrés dans le répertoire/usr/local/PyFilter/Log.

Quand une adresse IP a atteint les limites qui justifient une interdiction, vous verrez une sortie semblable à ceci:

Output2018-03-22 14:18:18 Found IP: 203.0.113.13 from server: your_server_name.

[.note] #Note: si vous vous excluez accidentellement de votre Droplet parce que vous vous êtes banni, vous pouvez suivre le didacticielHow To Use the DigitalOcean Console to Access your Droplet pour y revenir. Suivez ensuite les étapes deStep 6 pour supprimer l'adresse IP interdite.
#

Pour fermer PyFilter, appuyez surCTRL+C.

Maintenant, installons PyFilter en tant que service pour qu’il s’exécute automatiquement.

[[step-3 -—- creation-a-service-for-pyfilter]] == Étape 3 - Création d'un service pour PyFilter

Maintenant que vous savez que PyFilter fonctionne, nous allons le configurer pour qu’il s’exécute en tant que service afin qu’il démarre à chaque redémarrage du serveur.

Dans le répertoirePyFilter, 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 que vous puissiez l'exécuter:

sudo chmod +x install.sh

Puis lancez 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, indiquant que le service estactive:

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, relisez les étapes d'installation.

Voyons ensuite comment configurer PyFilter pour partager les adresses IP interdites avec d’autres serveurs.

[[step-4 -—- configuration-pyfilter-for-cross-server-ban-syncing-optional]] == Étape 4 - Configuration de PyFilter pour la synchronisation de l'interdiction entre serveurs (facultatif)

La synchronisation des interdictions entre serveurs permet de synchroniser l'adresse IP interdite avec tous les autres serveurs utilisant PyFilter, et d'interdire cette adresse même si elle n'a pas rempli les conditions requises. Cela signifie que vous pouvez avoir une longueur d’avance sur les robots potentiels qui ciblent vos autres systèmes car l’IP est déjà banni.

Comme indiqué dans les conditions préalables, Redis doit être installé et configuré.

Vous avez également besoin du module Pythonredis, que vous pouvez installer avecpip:

pip3 install redis

Ensuite, éditez votre fichier de configuration pour utiliser Redis au lieu de SQLite. Ouvrez le fichierConfig/config.json dans votre éditeur de texte:

nano Config/config.json

Localisez la ligne suivante:

Config/config.json

"database": "sqlite"

Remplacezsqlite parredis:

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 pour y inclure les détails de connexion de votre serveur Redis. Ensuite, dans la sectionsync_bans, remplacez lesname par votre nom d'hôte. Ce nom doit être unique pour chaque système individuel exécutant PyFilter utilisant le même serveur Redis pour que la synchronisation des interdictions entre serveurs fonctionne correctement.

Enregistrez le fichier et quittez l'éditeur. Ensuite, redémarrez PyFilter pour appliquer ces modifications:

sudo systemctl restart PyFilter

PyFilter est maintenant installé et en cours d'exécution.

[[step-5 -—- configuration-pyfilter-to-rassembl-location-data-about-ip-addresses-optional]] == Étape 5 - Configuration de PyFilter pour collecter les données de localisation sur les adresses IP (facultatif)

PyFilter peut récupérer des données de localisation concernant l'IP bannie afin de fournir des informations statistiques sur l'origine de la majorité des attaques. Ce module optionnel ajoutera ces informations aux journaux de PyFilter.

Pour utiliser cette fonctionnalité, vous avez d'abord besoin du module Pythongeoip2, que vous pouvez installer avecpip:

pip3 install geoip2

Une fois ce module installé, redémarrez PyFilter pour qu'il reconnaisse le nouveau module:

sudo systemctl restart PyFilter

Maintenant, lorsque vous voyez une adresse IP interdite, vous verrez des informations supplémentaires sur l’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 est en train de consigner avec succès le pays d'où proviennent les demandes.

Enfin, voyons comment annuler l’interdiction d’une adresse.

[[step-6 -—- un-banning-ip-addresses]] == Étape 6 - Annulation des adresses IP

PyFilter est uniquement 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 de 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 annuler l’interdiction de 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 avecsudo systemctl restart PyFilter et PyFilter mettra à jour vos règles de pare-feu à l'aide de ce fichier.

VoirHow To List and Delete Iptables Firewall Rules pour en savoir plus sur la gestion des règles avec iptables.

Vous pouvez également demander à 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

PyFilter est maintenant installé et surveille vos connexions SSH.

Pour en savoir plus sur chaque section du fichier de configuration et comment configurer la surveillance pour d'autres services, tels que MySQL et Apache, vérifiez lesPyFilter site..