Comment protéger SSH avec Fail2Ban sur CentOS 7

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 constitue un vecteur d’attaque pour les assaillants potentiels.

Tout service exposé au réseau est une cible potentielle de cette manière. Si vous prêtez attention aux journaux d'applications 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 robots.

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.

Installer Fail2ban sur CentOS 7

Bien que Fail2ban ne soit pas disponible dans le référentiel officiel de paquets CentOS, il est packagé pour lesEPEL project. EPEL, pour Extra Packages for Enterprise Linux, peut être installé avec un package de version queisest disponible à partir de CentOS:

sudo yum install epel-release

Vous serez invité à continuer - appuyez sury, suivi deEnter:

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 packagefail2ban:

sudo yum install fail2ban

Encore une fois, appuyez sury etEnter lorsque vous êtes invité à continuer.

Une fois l'installation terminée, utilisezsystemctl pour activer le servicefail2ban:

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. Ce fichier pouvant être écrasé par les mises à jour du paquet, nous ne devrions pas le modifier sur place. Au lieu de cela, nous allons écrire un nouveau fichier appeléjail.local. Toutes les valeurs définies dansjail.local remplaceront celles dejail.conf.

jail.conf contient une section[DEFAULT], suivie de sections pour les services individuels. jail.local peut remplacer l'une 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 dejail.local. Ouvrez un nouveau fichier en utilisantnano (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 un nouveaubantime par défaut pour tous les services, s'assure que nous utilisonsiptables pour la configuration du pare-feu et active la prison desshd.

Quittez et enregistrez le nouveau fichier (dansnano, appuyez surCtrl-X pour quitter,y pour enregistrer etEnter pour confirmer le nom de fichier). Nous pouvons maintenant redémarrer le servicefail2ban en utilisantsystemctl:

sudo systemctl restart fail2ban

La commandesystemctl doit se terminer sans aucune sortie. Afin de vérifier que le service fonctionne, nous pouvons utiliserfail2ban-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 dejail.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. Ouvrezjail.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 dejail.local et y être ajustées, plutôt que modifiées sur place.

sudo nano /etc/fail2ban/jail.conf

Paramètres par défaut pour toutes les jails

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

ignoreip = 127.0.0.1/8

Vous pouvez ajuster les adresses source ignorées par Fail2ban en ajoutant une valeur au paramètreignoreip. Actuellement, il est configuré pour interdire tout 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ètrebantime définit la durée pendant laquelle un client sera banni lorsqu'il ne parvient pas à s'authentifier correctement. Ceci est mesuré en secondes. Par défaut, ce paramètre est défini sur 600 secondes ou 10 minutes.

findtime = 600
maxretry = 3

Les deux paramètres suivants auxquels vous voulez prêter attention sontfindtime etmaxretry. Ceux-ci travaillent ensemble pour établir les conditions dans lesquelles un client devrait être banni.

La variablemaxretry définit le nombre de tentatives qu'un client doit authentifier dans une fenêtre de temps définie parfindtime, avant d'être banni. Avec les paramètres par défaut, Fail2ban interdira 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ètresdestemail,sendername etmta. Le paramètredestemail définit l'adresse e-mail qui doit recevoir les messages d'interdiction. Lesendername définit la valeur du champ «De» dans l'e-mail. Le paramètremta configure le service de messagerie qui sera utilisé pour envoyer le courrier.

action = $(action_)s

Ce paramètre configure l'action que Fail2ban entreprend lorsqu'il veut instituer une interdiction. La valeuraction_ est définie dans le fichier juste avant ce paramètre. L'action par défaut consiste simplement à configurer le pare-feu pour qu'il rejette le trafic de l'hôte en cause jusqu'à la fin du délai d'interdiction.

Si vous souhaitez configurer des alertes par e-mail, vous pouvez remplacer cette valeur deaction_ àaction_mw. Si vous souhaitez que l'e-mail inclue les lignes de journal appropriées, vous pouvez le changer enaction_mwl. Vous voudrez vous assurer que les paramètres de messagerie appropriés sont configurés si vous choisissez d'utiliser des alertes par courrier.

Paramètres pour les prisons individuelles

Après[DEFAULT], nous rencontrerons des sections configurant des prisons individuelles pour différents services. Celles-ci incluent généralement unport à bannir et unlogpath à surveiller les tentatives d'accès malveillantes. Par exemple, la prison SSH que nous avons déjà activée dansjail.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 garderjail.conf portable entre différents systèmes d'exploitation ).

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

La valeurfilter 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 traiterons pas ce fichier en profondeur dans ce guide car il est assez complexe et que 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 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 capable de dire quel type de condition le script a été conçu pour se protéger. La plupart de ces filtres ont des sections appropriées (désactivées) dansjail.conf que nous pouvons activer dansjail.local si vous le souhaitez.

Par exemple, supposons que nous servons un site Web en utilisant Nginx et réalisons qu'une partie de notre site protégée par un mot de passe est en train de subir des tentatives de connexion. Nous pouvons dire à Fail2ban d'utiliser le fichiernginx-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ètreenabled pour la prisonnginx-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 servicefail2ban:

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 utilisersystemctl 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 vérifiant les journaux de l'unitéfail2ban depuis le dernier démarrage:

sudo journalctl -b -u fail2ban

Ensuite, utilisezfail2ban-client pour interroger l'état général defail2ban-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 surCtrl-C pour quitter):

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

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

sudo iptables -L

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

sudo iptables -S

Conclusion

Vous devriez maintenant pouvoir configurer certaines stratégies 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 tutoriel surhow fail2ban rules and files work.

Related