Comment installer et configurer Fail2Ban sur CentOS 8 et Fedora 33

Fail2Ban est un utilitaire d’analyse des journaux qui scanne les fichiers journaux de divers processus et interdit les adresses IP qui font trop d’échecs de mot de passe. Lorsqu’une tentative de connexion est repérée, Fail2Ban ajoute une nouvelle règle à iptables pour bloquer l’adresse IP de l’attaquant, de façon temporaire ou permanente. Il peut aussi t’alerter par e-mail pour la même raison.

Il est principalement axé sur la détection des intrusions via SSH mais il peut être configuré pour fonctionner avec n’importe quel service qui utilise des fichiers journaux.

Conditions préalables

  1. Un serveur basé sur Fedora 33 ou CentOS 8 avec un utilisateur non-root ayant les privilèges sudo.

  2. Installe l’éditeur Nano car c’est ce que nous utiliserons.

    $ sudo dnf install nano -y
    

Installer Fail2Ban

Pour installer Fail2Ban sur CentOS 8, tu dois d'abord installer le dépôt Yum EPEL.

$ sudo dnf install epel-release

Fedora 33 est livré avec Fail2Ban.

Exécute la commande suivante pour installer Fail2Ban à la fois sur Fedora 33 et CentOS 8.

$ sudo dnf install fail2ban

Une fois installé, nous devons activer le service.

$ sudo systemctl enable fail2ban

Ensuite, démarre le service fail2ban.

$ sudo systemctl start fail2ban

Tu peux maintenant vérifier l'état du service pour voir s'il fonctionne correctement.

$ sudo systemctl status fail2ban
? fail2ban.service - Fail2Ban Service
     Loaded: loaded (/usr/lib/systemd/system/fail2ban.service; enabled; vendor preset: disabled)
     Active: active (running) since Mon 2020-11-02 21:15:59 UTC; 5s ago
       Docs: man:fail2ban(1)
    Process: 19031 ExecStartPre=/bin/mkdir -p /run/fail2ban (code=exited, status=0/SUCCESS)
   Main PID: 19032 (f2b/server)
      Tasks: 3 (limit: 1125)
     Memory: 11.0M
        CPU: 96ms
     CGroup: /system.slice/fail2ban.service
             ??19032 /usr/bin/python3 -s /usr/bin/fail2ban-server -xf start

Nov 02 21:15:59 howtoforge-tutorial systemd[1]: Starting Fail2Ban Service...
Nov 02 21:15:59 howtoforge-tutorial systemd[1]: Started Fail2Ban Service.
Nov 02 21:15:59 howtoforge-tutorial fail2ban-server[19032]: Server ready

Configurer Fail2Ban

Le service Fail2Ban conserve ses fichiers de configuration dans le répertoire /etc/fail2ban. Tu y trouveras un fichier jail.conf. Ce fichier est généralement écrasé lors des mises à jour des paquets, il ne faut donc pas le modifier.

Au lieu de cela, toutes les configurations doivent être effectuées dans un nouveau fichier que nous appellerons jail.local. Les paramètres de ces 2 fichiers peuvent être remplacés par des fichiers du répertoire /etc/fail2ban/jail.d/.

Les configurations sont appliquées dans l'ordre suivant :

  1. /etc/fail2ban/jail.conf
  2. etc/fail2ban/jail.d/*.conf, Alphabétiquement
  3. /etc/fail2ban/jail.local
  4. /etc/fail2ban/jail.d/*.local, Alphabétiquement

jail.conf contient une section [DEFAULT] suivie de sections pour les services individuels. Toutes ces sections peuvent être remplacées en les définissant dans les fichiers .local.

Configurer jail.local

Nous allons créer un nouveau fichier jail.local.

$ sudo nano /etc/fail2ban/jail.local

Colle le code suivant dans celui-ci.

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

# Override backend=auto in /etc/fail2ban/jail.conf
backend = systemd

[sshd]
enabled = true

Appuie sur Ctrl + X pour fermer l'éditeur et appuie sur Y lorsqu'on te demande d'enregistrer le fichier. Cela définit un nouveau bantime par défaut pour tous les services, change le backend en systemd et active la jail `sshd.

Redémarre Fail2ban pour appliquer les nouvelles modifications.

$ sudo systemctl restart fail2ban

Nous pouvons confirmer les paramètres nouvellement appliqués à l'aide de l'utilitaire fail2ban-client.

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

Nous pouvons également obtenir l'état détaillé de chaque jail de manière spécifique de la manière suivante.

$ sudo fail2ban-client status sshd
Status for the jail: sshd
|- Filter
|  |- Currently failed: 0
|  |- Total failed:     0
|  `- Journal matches:  _SYSTEMD_UNIT=sshd.service + _COMM=sshd
`- Actions
   |- Currently banned: 0
   |- Total banned:     0
   `- Banned IP list:

Plus de paramètres

jail.conf fournit de nombreux autres paramètres qui peuvent être personnalisés à l'aide du fichier /jail.local. Nous allons maintenant passer en revue certains paramètres.

Liste blanche d'IP

Tu peux mettre sur liste blanche/ignorer les IP pour qu'elles ne soient pas bloquées par Fail2ban en utilisant le code suivant.

[DEFAULT]
ignoreip = 127.0.0.1/8 123.45.67.89

Si tu veux mettre les IP en liste blanche uniquement pour certaines prisons, tu peux le faire via fail2ban-client.

$ sudo fail2ban-client set JAIL addignoreip 123.45.67.89

Remplace JAIL dans la commande ci-dessus par le nom de la prison dont tu veux modifier les paramètres.

Temps d'interdiction et nombre de tentatives

Il existe 3 paramètres qui permettent de définir la durée et le nombre de tentatives pour un bannissement.

bantime - est la durée en secondes pendant laquelle une IP est bannie. Pour définir une interdiction permanente, règle cette valeur sur un nombre négatif. La valeur par défaut est de 10 minutes ou 600 secondes.

findtime - est la durée du délai entre les tentatives de connexion avant qu'une interdiction ne soit définie. Cette valeur est toujours un nombre de secondes. Par exemple, si Fail2ban est configuré pour interdire une IP après 5 tentatives de connexion ratées, ces 5 tentatives doivent avoir lieu dans la limite de 10 minutes de bantime.

maxretry - est le nombre de tentatives à partir d'une seule adresse IP avant qu'une interdiction soit imposée. La valeur par défaut est de 3.

Pour personnaliser ces paramètres, colle les lignes suivantes dans le fichier \etc\fail2ban\jail.local sous la section [DEFAULT].

bantime = 3600
findtime = 300
maxretry = 4

Alertes par email

Pour envoyer des alertes par courriel, tu dois d'abord installer un agent de transfert de courrier (MTA). Dans notre cas, nous allons installer sendmail.

$ sudo dnf install sendmail

Pour recevoir l'email, ajoute le code suivant dans le fichier \etc\fail2ban\jail.local sous la section [DEFAULT].

destemail = [email protected]
sendername = Fail2Ban
mta = sendmail
action = %(action_mw)s

destemail fait référence à l'Id de l'email de destination qui est l'id où tu veux recevoir les emails, sendername fait référence au nom de l'expéditeur, nous utilisons donc Fail2Ban pour cela. mta fait référence à l'Agent de Transfert de Mail utilisé qui est ici sendmail. Si tu utilises Postfix, utilise alors la valeur mail pour la variable mta.

action fait référence à l'action par défaut qui a lieu lorsqu'une intrusion est détectée. La valeur par défaut est %(action_)s qui bannit seulement l'utilisateur. %(action_mw)s bannira et enverra un email avec un rapport Whois ; tandis que %(action_mwl)s bannira et enverra un email avec le rapport Whois ainsi que des informations provenant des fichiers journaux pertinents. Ces paramètres peuvent également être modifiés pour chaque prison.

Paramètres pour les prisons individuelles

Comme nous savons déjà que la section [DEFAULT] s'applique à toutes les prisons, il est temps d'examiner certaines prisons spécifiques et leurs paramètres.

Prison SSHD

Nous avons déjà défini [sshd] plus tôt dans notre fichier jail.local. Nous pouvons la personnaliser un peu plus en utilisant le code suivant.

[sshd]

enabled = true
port = ssh
logpath = %(ssh_log)s

Dans ce cas, nous utilisons une variable prédéfinie ssh pour le port qui est le port SSH par défaut. Si tu utilises un port SSH différent, tu dois le modifier. logpath fait référence à l'emplacement du fichier journal à surveiller. %(ssh_log)s utilise une valeur définie dans le fichier de configuration standard de Fail2ban (/etc/fail2ban/paths-common.conf).

Jail de Nginx

Nginx possède plusieurs Jails qui peuvent être utilisés dans Fail2Ban. Par exemple, si une partie de ton site protégée par un mot de passe est attaquée à plusieurs reprises, tu peux utiliser une section [nginx-http-auth] dans le fichier jail.local pour cela.

[nginx-http-auth]
enabled = true

On peut aussi ajouter une section appelée [nginx-botsearch] pour arrêter les requêtes vers des dossiers ou des emplacements qui n'existent pas.

[nginx-badbots]
enabled  = true

Il existe aussi d'autres jails Nginx mais ils ne sont pas préconfigurés avec Fail2Ban. Ils doivent être créés manuellement et la plupart d'entre eux peuvent être basés sur ceux d'Apache avec lesquels Fail2Ban est livré.

Filtres et Failregexs de Fail2Ban

Il existe un autre paramètre dans la configuration de Fail2Ban appelé filtres. Les filtres décident si une ligne du fichier journal indique un échec d'authentification.

La valeur du filtre dans le fichier de configuration est une référence à un fichier situé dans le répertoire /etc/fail2ban/filter.d avec son extension .conf supprimée.

Tu peux voir quels types de filtres sont disponibles en consultant le répertoire.

$ ls /etc/fail2ban/filter.d

Tu y trouveras 2 fichiers journaux pour Nginx ; nginx-badbots.conf et nginx-http-auth.conf.

Ces fichiers de configuration utilisent des expressions régulières (regex) pour analyser les fichiers journaux. Elles sont appelées Failregexs. Tu peux personnaliser ou créer de nouveaux filtres en écrivant tes propres expressions régulières. Nous ne couvrirons pas ces expressions régulières en profondeur car elles sortent du cadre de ce tutoriel.

Surveille les journaux et le pare-feu de Fail2Ban

Tu peux vérifier l'état de Fail2Ban en utilisant systemctl comme indiqué précédemment.

$ sudo systemctl status fail2ban

Pour obtenir un peu plus de détails, tu peux utiliser la commande journalctl.

$ sudo journalctl -b -u fail2ban

Tu peux aussi utiliser fail2ban-client pour demander l'état de fail2ban-server ou d'une prison individuelle.

$ sudo fail2ban-client status
$ sudo fail2ban-client status jail_name

Tu peux aussi interroger le fichier journal de Fail2ban.

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

Tu peux répertorier les règles actuelles configurées pour iptables.

$ sudo iptables -L

Tu peux également répertorier les règles iptables dans un format qui reflète les commandes nécessaires pour activer ces règles.

$ sudo iptables -S

Conclusion

Ceci conclut notre tutoriel sur l'installation et la configuration de Fail2Ban sur un serveur basé sur Fedora 33 ou CentOS 8. Si tu as des questions, n'hésite pas à les poster dans les commentaires ci-dessous.

Vous aimerez aussi...