Comment protéger SSH avec Fail2Ban sur CentOS 7

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 offre 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 de 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 modifient 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 CentOS 7.

Installez Fail2ban sur CentOS 7

Bien que Fail2ban ne soit pas disponible dans le référentiel de packages CentOS officiel, il est fourni pour le projet EPEL. EPEL, pour Extra Packages for Enterprise Linux, peut être installé avec un package de version qui est disponible auprès de CentOS :

sudo yum install epel-release

Vous serez invité à continuer—appuyez sur y, suivi de Enter :

yum promptTransaction Summary
============================================================================
Install  1 Package

Total download size: 14 k
Installed size: 24 k
Is this ok [y/d/N]: y

Nous devrions maintenant pouvoir installer le package fail2ban :

sudo yum install fail2ban

Encore une fois, appuyez sur y et Entrée lorsque vous êtes invité à continuer.

Une fois l'installation terminée, utilisez systemctl pour activer le service fail2ban :

sudo systemctl enable fail2ban

Configurer les paramètres locaux

Le service Fail2ban conserve ses fichiers de configuration dans le répertoire /etc/fail2ban. Là, vous pouvez trouver un fichier avec des valeurs par défaut appelé jail.conf. Étant donné que ce fichier peut être écrasé par les mises à niveau de packages, nous ne devons pas le modifier sur place. Au lieu de cela, nous allons écrire un nouveau fichier appelé jail.local. Toutes les valeurs définies dans jail.local remplaceront celles de jail.conf.

jail.conf contient une section [DEFAULT], suivie de sections pour les services individuels. jail.local peut remplacer n'importe laquelle de ces valeurs. De plus, les fichiers dans /etc/fail2ban/jail.d/ peuvent être utilisés pour remplacer les paramètres de ces deux fichiers. Les fichiers sont appliqués dans l'ordre suivant :

  1. /etc/fail2ban/jail.conf
  2. /etc/fail2ban/jail.d/*.conf, par ordre alphabétique
  3. /etc/fail2ban/jail.local
  4. /etc/fail2ban/jail.d/*.local, par ordre alphabétique

Tout fichier peut contenir une section [DEFAULT], exécutée en premier, et peut également contenir des sections pour des prisons individuelles. La dernière vavalue définie pour un paramètre donné est prioritaire.

Commençons par écrire une version très simple de jail.local. Ouvrez un nouveau fichier en utilisant nano (ou l'éditeur de votre choix) :

sudo nano /etc/fail2ban/jail.local

Collez ce qui suit :

/etc/fail2ban/jail.local

[DEFAULT]
# Ban hosts for one hour:
bantime = 3600

# Override /etc/fail2ban/jail.d/00-firewalld.conf:
banaction = iptables-multiport

[sshd]
enabled = true

Cela remplace trois paramètres : il définit une nouvelle valeur par défaut bantime pour tous les services, s'assure que nous utilisons iptables pour la configuration du pare-feu et active la prison sshd.

Quittez et enregistrez le nouveau fichier (dans nano, appuyez sur Ctrl-X pour quitter, y pour enregistrer et Enter pour confirmer le nom du fichier ). Nous pouvons maintenant redémarrer le service fail2ban en utilisant systemctl :

sudo systemctl restart fail2ban

La commande systemctl devrait se terminer sans aucune sortie. Afin de vérifier que le service est en cours d'exécution, nous pouvons utiliser fail2ban-client :

sudo fail2ban-client status
OutputStatus
|- Number of jail:      1
`- Jail list:   sshd

Vous pouvez également obtenir des informations plus détaillées sur une prison spécifique :

sudo fail2ban-client status sshd

Explorer les paramètres disponibles

La version de jail.local que nous avons définie ci-dessus est un bon début, mais vous voudrez peut-être ajuster un certain nombre d'autres paramètres. Ouvrez jail.conf et nous examinerons certaines des valeurs par défaut. Si vous décidez de modifier l'une de ces valeurs, n'oubliez pas qu'elles doivent être copiées dans la section appropriée de jail.local et ajustées là, plutôt que modifiées sur place.

sudo nano /etc/fail2ban/jail.conf

Paramètres par défaut pour toutes les prisons

Tout d'abord, faites défiler la section [DEFAULT].

ignoreip = 127.0.0.1/8

Vous pouvez ajuster les adresses source que Fail2ban ignore en ajoutant une valeur au paramètre ignoreip. Actuellement, il est configuré pour n'interdire aucun trafic provenant de la machine locale. Vous pouvez inclure des adresses supplémentaires à ignorer en les ajoutant à la fin du paramètre, séparées par un espace.

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.

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 doit être banni.

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, Fail2ban bannira un client qui tente sans succès de se connecter 3 fois dans une fenêtre de 10 minutes.

destemail = root@localhost
sendername = Fail2Ban
mta = sendmail

Si vous souhaitez configurer des alertes par e-mail, vous devrez peut-être remplacer les paramètres destemail, sendername et mta. 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.

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, vous pouvez remplacer cette valeur de action_ par action_mw. Si vous souhaitez que l'e-mail inclue les lignes de journal pertinentes, vous pouvez le remplacer par action_mwl. Vous devez vous assurer que les paramètres de messagerie appropriés sont configurés si vous choisissez d'utiliser les alertes par courrier.

Paramètres pour les prisons individuelles

Après [DEFAULT], nous rencontrerons des sections configurant des prisons individuelles pour différents services. Ceux-ci incluront généralement un port à interdire et un logpath pour surveiller les tentatives d'accès malveillantes. Par exemple, la prison SSH que nous avons déjà activée dans jail.local a les paramètres suivants :

/etc/fail2ban/jail.local

[sshd]

port    = ssh
logpath = %(sshd_log)s

Dans ce cas, ssh est une variable prédéfinie pour le port SSH standard, et %(sshd_log)s utilise une valeur définie ailleurs dans la configuration standard de Fail2ban (cela permet de garder jail.conf portable entre différents systèmes d'exploitation).

Un autre paramètre que vous pouvez rencontrer est le filter qui sera utilisé pour décider si une ligne dans un journal indique un échec d'authentification.

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. Ce fichier contient les expressions régulières qui déterminent si une ligne du journal est incorrecte. Nous ne couvrirons pas ce fichier en profondeur dans ce guide, car il est assez complexe 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 ê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 jail.conf que nous pouvons activer dans 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 d'ajouter un paramètre enabled pour la prison nginx-http-auth à jail.local :

/etc/fail2ban/jail.local

[DEFAULT]
# Ban hosts for one hour:
bantime = 3600

# Override /etc/fail2ban/jail.d/00-firewalld.conf:
banaction = iptables-multiport

[sshd]
enabled = true

[nginx-http-auth]
enabled = true

Et redémarrez le service fail2ban :

sudo systemctl restart fail2ban

Surveiller les journaux Fail2ban et la configuration du pare-feu

Il est important de savoir qu'un service comme Fail2ban fonctionne comme prévu. Commencez par utiliser systemctl pour vérifier l'état du service :

sudo systemctl status fail2ban

Si quelque chose ne va pas ici, vous pouvez résoudre le problème en consultant les journaux de l'unité fail2ban depuis le dernier démarrage :

sudo journalctl -b -u fail2ban

Ensuite, utilisez fail2ban-client pour interroger l'état général de fail2ban-server ou de toute prison individuelle :

sudo fail2ban-client status
sudo fail2ban-client status jail_name

Suivez le journal de Fail2ban pour un enregistrement des actions récentes (appuyez sur Ctrl-C pour quitter) :

sudo tail -F /var/log/fail2ban.log

Répertoriez les règles actuellement configurées pour iptables :

sudo iptables -L

Affichez les règles iptables dans un format qui reflète les commandes nécessaires pour activer chaque règle :

sudo iptables -S

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.