Comment protéger SSH avec Fail2Ban sur Ubuntu 14.04

De Get Docs
Aller à :navigation, rechercher

Introduction

Bien que la connexion à votre serveur via SSH puisse être très sécurisée, le démon SSH lui-même est un service qui doit être exposé à Internet pour fonctionner correctement. Cela comporte un certain risque inhérent et crée un vecteur d'attaque pour les agresseurs potentiels.

Tout service exposé au réseau est une cible potentielle de cette manière. Si vous prêtez attention aux journaux d'application pour ces services, vous verrez souvent des tentatives de connexion répétées et systématiques qui représentent des attaques par force brute de la part des utilisateurs et des bots.

Un service appelé fail2ban peut atténuer ce problème en créant des règles qui peuvent modifier automatiquement la configuration de votre pare-feu iptables en fonction d'un nombre prédéfini de tentatives de connexion infructueuses. Cela permettra à votre serveur de répondre aux tentatives d'accès illégitimes sans intervention de votre part.

Dans ce guide, nous expliquerons comment installer et utiliser fail2ban sur un serveur Ubuntu 14.04.

Installer Fail2Ban sur Ubuntu 14.04

Le processus d'installation de cet outil est simple car l'équipe de packaging d'Ubuntu maintient un package dans les référentiels par défaut.

Tout d'abord, nous devons mettre à jour notre index de package local, puis nous pouvons utiliser apt pour télécharger et installer le package :

sudo apt-get update
sudo apt-get install fail2ban

Comme vous pouvez le voir, l'installation est triviale. Nous pouvons maintenant commencer à configurer l'utilitaire pour notre propre usage.

Configurez Fail2Ban avec vos paramètres de service

Le service fail2ban conserve ses fichiers de configuration dans le répertoire /etc/fail2ban. Il existe un fichier avec des valeurs par défaut appelé jail.conf.

Étant donné que ce fichier peut être modifié par des mises à niveau de packages, nous ne devons pas modifier ce fichier sur place, mais plutôt le copier afin que nous puissions apporter nos modifications en toute sécurité. Pour que ces deux fichiers fonctionnent ensemble avec succès, il est préférable d'inclure uniquement les paramètres que vous souhaitez remplacer dans le fichier jail.local. Toutes les options par défaut seront extraites du fichier jail.conf.

Même si nous ne devrions inclure que les écarts par rapport à la valeur par défaut dans le fichier jail.local, il est plus facile de créer un fichier jail.local basé sur le fichier jail.conf existant. Nous allons donc copier ce fichier, avec le contenu commenté, comme base du fichier jail.local. Vous pouvez le faire en tapant :

awk '{ printf "# "; print; }' /etc/fail2ban/jail.conf | sudo tee /etc/fail2ban/jail.local

Une fois le fichier copié, nous pouvons ouvrir le fichier d'origine jail.conf pour voir comment les choses sont configurées par défaut

sudo nano /etc/fail2ban/jail.conf

Dans ce fichier, il y a quelques paramètres que vous souhaiterez peut-être ajuster. Les paramètres situés sous la section [DEFAULT] seront appliqués à tous les services activés pour fail2ban qui ne sont pas remplacés dans la propre section du service.

/etc/fail2ban/jail.conf

[DEFAULT]
. . .
ignoreip = 127.0.0.1/8
. . .

Le paramètre ignoreip configure les adresses source ignorées par fail2ban. Par défaut, il est configuré pour n'interdire aucun trafic provenant de la machine locale. Vous pouvez ajouter des adresses supplémentaires à ignorer en ajoutant une section [DEFAULT] avec un paramètre ignoreip en dessous au fichier jail.local. Vous pouvez ajouter des adresses supplémentaires en les ajoutant à la fin de la directive, séparées par un espace.

/etc/fail2ban/jail.conf

[DEFAULT]
. . .
bantime = 600
. . .

Le paramètre bantime définit la durée pendant laquelle un client sera banni lorsqu'il n'a pas réussi à s'authentifier correctement. Ceci est mesuré en secondes. Par défaut, il est défini sur 600 secondes ou 10 minutes.

/etc/fail2ban/jail.conf

[DEFAULT]
. . .
findtime = 600
maxretry = 3
. . .

Les deux paramètres suivants auxquels vous voulez prêter attention sont findtime et maxretry. Ceux-ci travaillent ensemble pour établir les conditions dans lesquelles un client s'avère être un utilisateur illégitime qui devrait être interdit.

La variable maxretry définit le nombre d'essais qu'un client doit s'authentifier dans une fenêtre de temps définie par findtime, avant d'être banni. Avec les paramètres par défaut, le service fail2ban bannira un client qui tente sans succès de se connecter 3 fois dans une fenêtre de 10 minutes.

/etc/fail2ban/jail.conf

[DEFAULT]
. . .
destemail = root@localhost
sendername = Fail2Ban
mta = sendmail
. . .

Vous voudrez évaluer les paramètres destemail, sendername et mta si vous souhaitez configurer des alertes par e-mail. Le paramètre destemail définit l'adresse e-mail qui doit recevoir les messages d'interdiction. Le sendername définit la valeur du champ "De" dans l'e-mail. Le paramètre mta configure le service de messagerie qui sera utilisé pour envoyer le courrier. Encore une fois, ajoutez-les au fichier jail.local, sous l'en-tête [DEFAULT] et définissez les valeurs appropriées si vous souhaitez les ajuster.

/etc/fail2ban/jail.conf

[DEFAULT]
. . .
action = $(action_)s
. . .

Ce paramètre configure l'action que fail2ban prend lorsqu'il veut instituer une interdiction. La valeur action_ est définie dans le fichier peu avant ce paramètre. L'action par défaut consiste simplement à configurer le pare-feu pour rejeter le trafic de l'hôte incriminé jusqu'à ce que le délai d'interdiction soit écoulé.

Si vous souhaitez configurer des alertes par e-mail, ajoutez ou décommentez l'élément action au fichier jail.local et changez sa valeur de action_ à action_mw. Si vous souhaitez que l'e-mail inclue les lignes de journal pertinentes, vous pouvez le remplacer par action_mwl. Assurez-vous que les paramètres de messagerie appropriés sont configurés si vous choisissez d'utiliser les alertes par e-mail.

Paramètres de prison individuels

Enfin, nous arrivons à la partie du fichier de configuration qui traite des services individuels. Ceux-ci sont spécifiés par les en-têtes de section, comme [ssh].

Chacune de ces sections peut être activée en décommentant l'en-tête dans jail.local et en changeant la ligne enabled pour qu'elle soit "true" :

/etc/fail2ban/jail.local

[jail_to_enable]
. . .
enabled = true
. . .

Par défaut, le service SSH est activé et tous les autres sont désactivés.

Ces sections fonctionnent en utilisant les valeurs définies dans la section [DEFAULT] comme base et en les modifiant si nécessaire. Si vous souhaitez remplacer des valeurs, vous pouvez le faire en ajoutant la section du service approprié à jail.local et en modifiant ses valeurs.

Certains autres paramètres définis ici sont le filter qui sera utilisé pour décider si une ligne dans un journal indique un échec d'authentification et le logpath qui indique à fail2ban où se trouvent les journaux de ce service particulier. situé.

La valeur filter est en fait une référence à un fichier situé dans le répertoire /etc/fail2ban/filter.d, avec son extension .conf supprimée. Ces fichiers contiennent les expressions régulières qui déterminent si une ligne du journal est une tentative d'authentification ayant échoué. Nous ne couvrirons pas ces fichiers en profondeur dans ce guide, car ils sont assez complexes et les paramètres prédéfinis correspondent bien aux lignes appropriées.

Cependant, vous pouvez voir quels types de filtres sont disponibles en consultant ce répertoire :

ls /etc/fail2ban/filter.d

Si vous voyez un fichier qui semble être lié à un service que vous utilisez, vous devez l'ouvrir avec un éditeur de texte. La plupart des fichiers sont assez bien commentés et vous devriez au moins être en mesure de dire contre quel type de condition le script a été conçu pour se prémunir. La plupart de ces filtres ont des sections appropriées (désactivées) dans le fichier jail.conf que nous pouvons activer dans le fichier jail.local si vous le souhaitez.

Par exemple, imaginez que nous servons un site Web en utilisant Nginx et réalisez qu'une partie protégée par mot de passe de notre site est victime de tentatives de connexion. Nous pouvons dire à fail2ban d'utiliser le fichier nginx-http-auth.conf pour vérifier cette condition dans le fichier /var/log/nginx/error.log.

Ceci est en fait déjà configuré dans une section appelée [nginx-http-auth] dans notre fichier /etc/fail2ban/jail.conf. Nous aurions juste besoin de décommenter la section dans le fichier jail.local et d'inverser le paramètre enabled pour protéger notre service :

/etc/fail2ban/jail.local

. . .
[nginx-http-auth]

enabled = true
. . .

Si vous l'activez, vous devrez redémarrer votre service fail2ban pour vous assurer que vos règles sont correctement construites.

Mettre tous ensemble

Maintenant que vous comprenez l'idée de base derrière fail2ban, passons en revue une configuration de base.

Nous allons configurer une politique d'interdiction automatique pour SSH et Nginx, comme nous l'avons décrit ci-dessus. Nous voulons que fail2ban nous envoie un e-mail lorsqu'une adresse IP est interdite.

Tout d'abord, installons tous les logiciels pertinents.

Si vous ne l'avez pas déjà, vous aurez besoin de nginx, car nous allons surveiller ses journaux, et vous aurez besoin de sendmail pour nous envoyer des notifications. Nous allons également saisir iptables-persistent pour permettre au serveur de configurer automatiquement nos règles de pare-feu au démarrage. Ceux-ci peuvent être acquis à partir des référentiels par défaut d'Ubuntu :

sudo apt-get update
sudo apt-get install nginx sendmail iptables-persistent

Arrêtez le service fail2ban pendant un moment afin que nous puissions établir un pare-feu de base sans les règles qu'il ajoute :

sudo service fail2ban stop

Établir un pare-feu de base

Lorsque cela est terminé, nous devrions implémenter un pare-feu par défaut. Vous pouvez apprendre comment configurer un pare-feu iptables sur Ubuntu 14.04 ici. Nous allons simplement créer un pare-feu de base pour ce guide.

Nous allons lui dire d'autoriser les connexions établies, le trafic généré par le serveur lui-même, le trafic destiné à nos ports SSH et serveur Web. Nous supprimerons tout autre trafic. Nous pouvons configurer ce pare-feu de base en tapant :

sudo iptables -A INPUT -i lo -j ACCEPT
sudo iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
sudo iptables -A INPUT -p tcp --dport 22 -j ACCEPT
sudo iptables -A INPUT -p tcp -m multiport --dports 80,443 -j ACCEPT
sudo iptables -A INPUT -j DROP

Ces commandes implémenteront la politique ci-dessus. Nous pouvons voir nos règles de pare-feu actuelles en tapant :

sudo iptables -S
Output-P INPUT ACCEPT
-P FORWARD ACCEPT
-P OUTPUT ACCEPT
-A INPUT -i lo -j ACCEPT
-A INPUT -m conntrack --ctstate RELATED,ESTABLISHED -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

Vous pouvez enregistrer les pare-feux afin qu'ils survivent à un redémarrage en tapant :

sudo dpkg-reconfigure iptables-persistent

Ensuite, vous pouvez redémarrer fail2ban pour implémenter les règles d'encapsulation :

sudo service fail2ban start

Nous pouvons voir nos règles de pare-feu actuelles en tapant :

sudo iptables -S
Output-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 RELATED,ESTABLISHED -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 RETURN

Nous avons notre politique par défaut pour chacune de nos chaînes, puis les cinq règles de base que nous avons établies. En rouge, nous avons également la structure par défaut mise en place par fail2ban puisqu'il implémente déjà les politiques d'interdiction SSH par défaut. Ceux-ci peuvent ou non apparaître au début, car parfois fail2ban n'ajoute pas la structure jusqu'à ce que la première interdiction soit mise en œuvre.

Réglage de la configuration Fail2ban

Maintenant, nous devons configurer fail2ban en utilisant les paramètres que nous aimerions. Ouvrez le fichier jail.local :

sudo nano /etc/fail2ban/jail.local

Nous pouvons définir une durée d'interdiction plus sévère ici. Recherchez et décommentez l'en-tête [DEFAULT]. Sous l'en-tête par défaut, modifiez le paramètre bantime afin que notre service bannisse les clients pendant une demi-heure :

/etc/fail2ban/jail.local

[DEFAULT]
. . .
bantime = 1800
. . .

Nous devons également configurer nos informations d'e-mail d'alerte. Tout d'abord, recherchez le paramètre destemail, qui devrait également figurer sous l'en-tête [DEFAULT]. Entrez l'adresse e-mail que vous souhaitez utiliser pour collecter ces messages :

/etc/fail2ban/jail.local

[DEFAULT]
. . .
destemail = [email protected]
. . .

Vous pouvez régler le sendername sur autre chose si vous le souhaitez. Il est cependant utile d'avoir une valeur qui peut être facilement filtrée à l'aide de votre service de messagerie, sinon votre boîte de réception habituelle pourrait être inondée d'alertes s'il y a beaucoup de tentatives d'interruption à partir de divers endroits.

En descendant, nous devons ajuster le paramètre action à l'une des actions qui nous envoie un e-mail. Les choix sont entre action_mw qui institue l'interdiction et nous envoie ensuite un rapport "whois" sur l'hôte incriminé, ou action_mwl qui fait ce qui précède, mais envoie également par e-mail les lignes de journal pertinentes.

Nous allons choisir action_mwl car les lignes de journal nous aideront à résoudre les problèmes et à recueillir plus d'informations en cas de problème :

/etc/fail2ban/jail.local

[DEFAULT]
. . .
action = %(action_mwl)s
. . .

Passant à notre section SSH, si nous voulons ajuster le nombre de tentatives infructueuses qui doivent être autorisées avant qu'une interdiction ne soit établie, vous pouvez modifier l'entrée maxretry. Si vous utilisez un port autre que "22", vous devrez ajuster le paramètre port de manière appropriée. Comme nous l'avons déjà dit, ce service est déjà activé, nous n'avons donc pas besoin de le modifier.

Ensuite, recherchez la section nginx-http-auth. Décommentez l'en-tête et changez le paramètre enabled pour lire "true".

/etc/fail2ban/jail.local

. . .
[nginx-http-auth]

enabled = true
. . .

Cela devrait être tout ce que vous avez à faire dans cette section, sauf si votre serveur Web fonctionne sur des ports non standard ou si vous avez déplacé le chemin du journal des erreurs par défaut.

Redémarrage du service Fail2ban

Lorsque vous avez terminé, enregistrez et fermez le fichier.

Maintenant, démarrez ou redémarrez votre service fail2ban. Parfois, il est préférable d'arrêter complètement le service, puis de le redémarrer :

sudo service fail2ban stop

Maintenant, nous pouvons le redémarrer en tapant :

sudo service fail2ban start

Le remplissage de toutes vos règles de pare-feu peut prendre quelques instants. Parfois, les règles ne sont pas ajoutées tant que la première interdiction de ce type n'est pas instituée. Cependant, après un certain temps, vous pouvez vérifier les nouvelles règles en tapant :

sudo iptables -S
Output-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 ACCEPT
-A INPUT -p tcp -m tcp --dport 80 -j ACCEPT
-A INPUT -j DROP
-A fail2ban-nginx-http-auth -j RETURN
-A fail2ban-ssh -j RETURN

Les lignes en rouge sont celles que nos politiques fail2ban ont créées. À l'heure actuelle, ils dirigent simplement le trafic vers de nouvelles chaînes presque vides, puis laissent le trafic revenir directement dans la chaîne INPUT.

Cependant, ces nouvelles chaînes sont celles où les règles d'interdiction seront ajoutées.

Tester les politiques d'interdiction

À partir d'un autre serveur, qui n'aura pas besoin de se connecter à votre serveur fail2ban, nous pouvons tester les règles en faisant bannir notre deuxième serveur.

Après vous être connecté à votre deuxième serveur, essayez de vous connecter en SSH au serveur fail2ban. Vous pouvez essayer de vous connecter en utilisant un nom inexistant par exemple :

ssh blah@fail2ban_server_IP

Entrez des caractères aléatoires dans l'invite de mot de passe. Répétez cela plusieurs fois. À un moment donné, le serveur fail2ban cessera de répondre avec le message Permission denied. Cela signale que votre deuxième serveur a été banni du serveur fail2ban.

Sur votre serveur fail2ban, vous pouvez voir la nouvelle règle en vérifiant à nouveau nos iptables :

sudo iptables -S
Output-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 ACCEPT
-A INPUT -p tcp -m tcp --dport 80 -j ACCEPT
-A INPUT -j DROP
-A fail2ban-nginx-http-auth -j RETURN
-A fail2ban-ssh -s 203.0.113.14/32 -j REJECT --reject-with icmp-port-unreachable
-A fail2ban-ssh -j RETURN

Comme vous pouvez le voir dans la ligne en surbrillance, nous avons une nouvelle règle dans notre configuration qui rejette le trafic vers le port SSH provenant de l'adresse IP de notre deuxième serveur. Vous devriez également avoir reçu un e-mail concernant l'interdiction du compte que vous avez configuré.

Conclusion

Vous devriez maintenant être en mesure de configurer certaines politiques d'interdiction de base pour vos services. Fail2ban est très facile à configurer et constitue un excellent moyen de protéger tout type de service utilisant l'authentification.

Si vous souhaitez en savoir plus sur le fonctionnement de fail2ban, vous pouvez consulter notre didacticiel sur comment fonctionnent les règles et les fichiers fail2ban.

Pour plus d'informations sur l'utilisation de fail2ban pour protéger d'autres services, essayez ces liens :