Installez Fail2ban et associez-le à SSH et Nginx

Lorsque nous avons monté un serveur avec Linux et que nous voulons le gérer depuis Internet via le contrôle à distance SSH, il peut arriver que nous commencions à recevoir des attaques dans le but d'entrer dans le système et de pouvoir le contrôler à ses fins. Ces attaques sont généralement menées par des programmes informatiques (bots) qui tentent pendant longtemps d'accéder au système en utilisant la force brute.

Dans les articles précédents, j'ai expliqué comment configurer le service SSH, mais certains robots avancés n'entrent pas dans le service, mais ils peuvent tuer le service SSH sur le serveur en désactivant l'accès à distance.

Manuel complet de SSH (Secure Shell)

Nous pouvons l'éviter en utilisant le outil fail2ban, est très pratique et offre une grande marge de sécurité. Pour expliquer un peu comment ça marche. Il est capable de créer des iptables avant toute tentative de connexion infructueuse plus de 5 fois de suite, rejetant tout type de connexion une fois banni.

Installer Fail2ban


L'installation peut se faire directement depuis apt. D'abord, nous mettons à jour le système, puis nous installons Fail2ban.
 apt-get update && apt-get -y upgrade
 apt-get installer fail2ban
Cela installe non seulement le programme, mais le laisse également fonctionner et démarrer avec le système.

Configuration de Fail2ban


Le service Fail2ban a ses paramètres dans le répertoire /etc/fail2ban. Vous avez quelques options préconfigurées dans jail.conf, la meilleure chose dans ce cas est de copier le fichier et de ne pas y faire les modifications directement, lors de la mise à jour de fail2ban ces fichiers sont écrasés et vous pouvez perdre toutes les modifications apportées précédemment.

Dans ce cas, nous copions le fichier et le nommons jail.local afin qu'il puisse le trouver.

 sudo cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local
Une fois copié, nous pouvons l'ouvrir et voir comment cela fonctionne.
 vim /etc/fail2ban/jail.local
A l'intérieur du fichier, nous avons plusieurs paramètres que nous pouvons ajuster. Tout paramètre qui se trouve sous la balise [DEFAULT] sera appliqué à tous les services activés par Fail2ban tels que SSH, NGINX, APACHE, nous appellerons cela global, puis nous aurons des sections spécifiques pour chaque service.

Nous allons commencer par ajouter des paramètres à la section globale.

 ignoreip = 127.0.0.1
Nous ajoutons notre localhost de cette manière, il ignorera tout le trafic local, nous pouvons ajouter des adresses supplémentaires en les séparant par un espace.
 bantime = 600
Le bantime est la période de temps pendant laquelle le client sera banni après avoir été bloqué. L'unité est en secondes 600 secondes serait 10 minutes est la valeur par défaut.
 findtime = 600 maxretry = 3
Ensuite, nous avons findtime et maxretry. Il leur appartient d'établir les conditions pour qu'un client soit banni par défaut, on peut lire que tout utilisateur ayant plus de 3 tentatives infructueuses en moins de 10 minutes sera banni.
 destemail = root @ localhost sendername = Fail2Ban mta = sendmail
Si on veut créer des alertes pour les utilisateurs bannis, ces 3 paramètres sont nécessaires, on va définir la destination à qui envoyer l'email d'alerte, qui sera en charge de l'envoyer, et enfin le mta pour définir quel service email on va utiliser .
 action = $ (action_) s
Ici, nous allons définir les mesures à prendre lorsqu'une interdiction est requise. La valeur action_ est l'action par défaut basée sur le rejet de tout trafic client jusqu'à l'expiration du délai d'interdiction.

Si nous voulons envoyer une alerte par courrier, nous devons changer la valeur en action_mw, mais si nous voulons également qu'il joigne des lignes du journal dans le corps du courrier, nous utiliserons action_mwl. Nous devons nous assurer que les paramètres de messagerie sont corrects avant de modifier cette valeur.

Paramètres par service


Une fois les configurations globales terminées, nous ajouterons les paramètres qui seront appliqués exclusivement au

Service SSH, nous nous assurons d'ajouter les options sous la balise [SSH].

 activé = vrai
Par défaut le service SSH est activé, mais on peut le modifier si besoin dans cette option.

Toute cette section pourrait fonctionner avec les valeurs que je détaillerai plus tard mais vous pouvez la modifier pour l'adapter à vos besoins ou les laisser toutes par défaut.

Une autre des configurations sont les filtres qui indiquent si la connexion était correcte ou non et peuvent être ajoutés pour d'autres services, par exemple nous avons un serveur avec nginx et une partie de la page est protégée par mot de passe, mais un client attaque avec force brute , nous pouvons arrêter cela en ajoutant ce qui suit sous la balise [nginx-http-auth].

 [nginx-http-auth] enabled = true filter = nginx-http-auth port = http, https logpath = /var/log/nginx/error.log
Désormais, si un utilisateur a plus de 3 tentatives de connexion infructueuses, cela est reflété dans les journaux et fail2ban agira et bloquera tout le trafic utilisateur.

Environnement de test


Après avoir compris les bases, nous ferons un petit environnement de test où nous protégerons SSH et Nginx via Fail2ban en créant une politique de bannissement qui nous informera de l'IP qui a été bannie.

Nous installerons d'abord Nginx s'il n'est pas installé

 apt-get installer nginx
nous allons installer un service de messagerie pour les notifications, il peut s'agir de sendmail
 apt-get installer sendmail
Enfin, nous voulons que nos iptables soient persistants après un démarrage, nous pouvons soit créer un script rc.0, soit installer le paquet iptables-persistent.
 apt-get install iptables-persistent
Il sera installé.

Établir notre pare-feu


Après avoir installé ce qui précède, nous devons implémenter un pare-feu afin qu'il puisse bloquer le trafic. Je créerai un pare-feu de base dans des articles ultérieurs, je parlerai davantage d'iptables.

Nous autoriserons les connexions établies, le trafic serveur tel que les mises à jour et le trafic destiné aux ports SSH et Nginx. Tout le trafic restant sera refusé.

 sudo iptables -A INPUT -i lo -j ACCEPTER sudo iptables -A INPUT -m conntrack --ctstate ESTABLISHED, RELATED -j ACCEPTER sudo iptables -A INPUT -p tcp --dport 22 -j ACCEPTER sudo iptables -A INPUT -p tcp --dport 80 -j ACCEPTER sudo iptables -A INPUT -j DROP
On peut voir les changements avec :
 iptables -S
Cela devrait donner un résultat similaire.
 -P INPUT ACCEPT -P FORWARD ACCEPT -P OUTPUT ACCEPT -N fail2ban-ssh -A INPUT -p tcp -m multiport --dports 22 -j fail2ban-ssh -A INPUT -i lo -j ACCEPT -A INPUT -m conntrack --ctstate LIÉ, ÉTABLI -j ACCEPT -A INPUT -p tcp -m tcp --dport 22 -j ACCEPT -A INPUT -p tcp -m tcp --dport 80 -j ACCEPT -A INPUT -j DROP -A fail2ban -ssh -j RETOUR

Réglage des paramètres Fail2ban


Maintenant, nous devons configurer le fichier jail.local à notre convenance.
 vi /etc/fail2ban/jail.local
Nous pouvons prolonger la durée d'interdiction d'un utilisateur d'au moins 30 minutes, pensez à définir la valeur en secondes.
 bantime = 1800
Nous devons configurer un email qui reçoit toutes les alertes d'interdiction fail2ban, cherchons la valeur de l'email dans le fichier et mettons l'email.
 destemail = [email protected]
Nous pouvons changer l'expéditeur qui enverra l'alerte que je place habituellement avec le nom fail2ban afin que nous puissions mieux filtrer entre tous les journaux.

Après avoir changé la valeur de l'action, nous avons 2 options :

  • action_mw : envoie une alerte avec un rapport similaire à la commande whois du client banni.
  • action_mwl : envoyer une alerte beaucoup plus détaillée en incluant un journal dans le corps du message.

Dans ce cas, nous utiliserons la deuxième option :

 action =% (action_mwl) s 
Ensuite, nous irons dans la section [SSH] et nous pourrons éditer le nombre maximum de tentatives avant le ban, nous le laisserons à 5:
 essai max = 5
Si on a le service SSH sur un autre port que 22, ce qui est fortement recommandé, il faut mentionner son port.
 port = 45024
Ensuite, nous chercherons la balise [nginx-http-auth], nous la laisserons telle quelle.
 [nginx-http-auth] activé = vrai
Nous avons terminé et pouvons enregistrer et fermer le fichier.

Redémarrage du service Fail2ban


Pour toutes les modifications à appliquer, je recommande d'arrêter le service.
 arrêt du service fail2ban 
Ensuite, nous pouvons les redémarrer
 démarrage du service fail2ban
Cela prendra un certain temps, après environ 5 minutes, nous pouvons revoir nos règles avec
 iptables -S
 -P INPUT ACCEPT -P FORWARD ACCEPT -P OUTPUT ACCEPT -N fail2ban-nginx-http-auth -N fail2ban-ssh -A INPUT -p tcp -m multiport --dports 80 443 -j fail2ban-nginx-http-auth -A INPUT -p tcp -m multiport --dports 22 -j fail2ban-ssh -A INPUT -i lo -j ACCEPT -A INPUT -m conntrack --ctstate RELATED, ESTABLISHED -j ACCEPT -A INPUT -p tcp -m tcp - -dport 22 -j ACCEPTER -A INPUT -p tcp -m tcp --dport 80 -j ACCEPTER -A INPUT -j DROP -A fail2ban-nginx-http-auth -j RETURN -A fail2ban-ssh -j RETURN
Nous voyons comment fail2ban a ajouté de nouvelles politiques, cela peut varier en fonction de la configuration que vous avez définie dans /etc/fail2ban/jail.local.

ConclusionNous avons installé fail2ban et configuré pour fonctionner avec SSH et NGINX en cas d'APACHE nous devons changer les étiquettes et le répertoire des journaux mais c'est très similaire à nginx. Nous n'avons configuré que les bases, vous pouvez créer des filtres et des règles beaucoup plus avancées, je recommande de lire un peu leur page de manuel, les fichiers de configuration sont bien commentés, je recommande d'aller petit à petit découvrir toutes ses fonctions.

Avez-vous aimé et aidé ce tutoriel ?Vous pouvez récompenser l'auteur en appuyant sur ce bouton pour lui donner un point positif
wave wave wave wave wave