Site icon BLD Web Agency

Fail2ban : Comment protéger un serveur Linux du brute force SSH

Fail2Ban est un outil permettant de bannir un utilisateur en fonction de règles prédéfinies. Il va par exemple bloquer l’IP d’un utilisateur après 3 tentatives de connexion SSH avec un mot de passe incorrect. Mais cet outil va beaucoup plus loin et permet par exemple de parser les logs Nginx ou Apache, d’identifier les IP à l’origine d’erreur 403 et bloquer ces dernières. Mais que se passe t’il une fois que la durée de blocage est écoulée ? Que l’IP en question des retirée du blocage ? Nous allons voir dans cet article comment bien configurer ses Jails de récidive.

Installation de Fail2Ban et mise en service

Dans un premier temps, nous allons installer Fail2ban et procéder à quelques configurations de base :

sudo apt-get install fail2ban
cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.conf.backup

Dans la configuration présentée ci-dessous, nous utiliserons l’action UFW pour bloquer les IP. La configuration de cette action est présente par défaut dans le paquet Fail2ban. Si vous souhaitez mettre en place des jails pour le service FTP, vous aurez besoin de créer un nouveau fichier sous /etc/ufw/applications.d/ftp-server :

[PROFTPd]
title=FTP Server PROFTPd
description=Fully fonctional FTP Server
ports=989,990,21,20/tcp
[VSFTPd]
title=FTP Server VSFTPd
description=Fully fonctional FTP Server
ports=989,990,21,20/tcp 

La commande vous permettant de tester que les nouveaux profils UFW sont créés est la suivante :

❯ ufw app info PROFTPd
Profile: PROFTPd
Title: FTP Server PROFTPd
Description: Fully fonctional FTP Server

Ports:
989,990,21,20/tcp

Maintenant, éditez le fichier jail.conf ou jail.local et ajoutez-y les configurations suivantes :

Fail2ban – Jail SSH

[sshd]
enabled = true
port = ssh
filter = sshd
logpath = /var/log/auth.log
action = ufw[application="OpenSSH"]
findtime = 300
bantime = 3600
maxretry = 3

Fail2ban – Jail Proftpd avec blocage via UFW

[proftpd]
enabled = true
port = ftp,ftp-data,ftps,ftps-data
action = ufw[application="PROFTPd"]
cloudflare-list
bantime = 3600
findtime = 300
maxretry = 3

Fail2ban – Jails récidives avec blocage via UFW et ip route

[recidive]
enabled = true
logpath = /var/log/fail2ban.log
filter = recidive
action = ufw
findtime = 86400 ; 1 day
maxretry = 2
bantime = 43200 ; 12 hours

[recidive2]
enabled = true
filter = recidive
action = route[blocktype="blackhole"]
bantime = 86400 ;1 day
findtime = 604800 ;1 week
logpath = /var/log/fail2ban.log
maxretry = 7

[recidive3]
enabled = true
filter = recidive
action = route[blocktype="blackhole"]
bantime = 604800 ;1 week
findtime = 2592000 ;1 month
logpath = /var/log/fail2ban.log
maxretry = 10

[recidive4]
enabled = true
filter = recidive
action = route[blocktype="blackhole"]
bantime = 2592000 ;1 month
findtime = 15552000 ;6 months
logpath = /var/log/fail2ban.log
maxretry = 20

Filtre Fail2ban pour les jails recidive :

# Fail2Ban filter for repeat bans

[INCLUDES]

# Read common prefixes. If any customizations available -- read them from
# common.local
before = common.conf

[Definition]

_daemon = (?:fail2ban(?:-server|\.actions)\s*)

# The name of the jail that this filter is used for. In jail.conf, name the jail using
# this filter 'recidive', or supply another name with `filter = recidive[_jailname="jail"]`
_jailname = recidive

failregex = ^%(__prefix_line)s(?:\s*fail2ban\.actions\s*%(__pid_re)s?:\s+)?NOTICE\s+\[(?!%(_jailname)s\])(?:.*)\]\s+Ban\s+<HOST>\s*$

datepattern = ^{DATE}

ignoreregex =

journalmatch = _SYSTEMD_UNIT=fail2ban.service PRIORITY=5

# Author: Tom Hendrikx, modifications by Amir Caspi

A ce stade, vous devriez avoir un Fail2Ban fonctionnel avec une configuration minimale vous permettant de protéger le port SSH de votre serveur avec 4 jails de récidives. Pour visualiser l’état de Fail2ban et lister les jails :

❯ fail2ban-client status
Status
|- Number of jail: 5
`- Jail list: recidive, recidive2, recidive3, recidive4, sshd, proftpd

Jails Fail2ban bonus : WordPress (plugin WP-Fail2ban nécessaire) et Nginx forbidden

[wordpress-soft]
enabled = true
filter = wordpress-soft
logpath = /var/log/auth.log
action = ufw[application="Nginx"]
maxretry = 3
findtime = 600
bantime = 3600
port = http,https

[nginx-forbidden]
enabled = true
filter = nginx-forbidden
port = http,https
logpath = /var/log/nginx/*error*.log
action = ufw[application="Nginx"]
findtime = 300
bantime = 21600
maxretry = 4

Au sein de chacune des jails, vous avez la possibilité d’ajouter des IPs autorisées via le paramètre ignoreip comme l’exemple ci-dessous :

[nginx-forbidden]
enabled = true
filter = nginx-forbidden
port = http,https
logpath = /var/log/nginx/*error*.log
action = ufw[application="Nginx"]
findtime = 300
bantime = 21600
maxretry = 4
ignoreip = 2.2.2.2 8.8.8.8 9.9.9.9

Pour vérifier l’état de la Jail SSH par exemple :

❯ fail2ban-client status sshd
Status for the jail: sshd
|- Filter
| |- Currently failed: 1
| |- Total failed: 20
| `- File list: /var/log/auth.log
`- Actions
|- Currently banned: 6
|- Total banned: 6
`- Banned IP list: 190.104.146.136 193.106.191.150 188.34.195.145 159.89.226.10 124.239.168.74 73.126.174.11

Détails de la configuration

Vous avez désormais une configuration pleinement fonctionnelle avec :

Cette configuration a été testée et est totalement fonctionnelle. Elle permet de laisser un peu de répit aux erreurs humaines, tout en étant stricte sur le blocage des nerveux.

Protéger son serveur FTP avec Fail2Ban

Si vous disposez d’un serveur FTP ProFTPD ou vSFTPd des jails sont disponibles et commentées dans le fichier jail.local. Pour activer ces jails, décommentez simplement le bloc souhaité :

# [proftpd]
# enabled = true
# port = ftp,ftp-data,ftps,ftps-data
# action = ufw[application="PROFTPd",blocktype=reject]
# bantime = 3600
# findtime = 300
# maxretry = 3
# [vsftpd]
# enabled = true
# port = ftp,ftp-data,ftps,ftps-data
# logpath = %(vsftpd_log)s
# action = ufw[application="VSFTPd",blocktype=reject]
# bantime = 3600
# findtime = 300
# maxretry = 3

Protéger son serveur Web Nginx avec Fail2Ban

De nombreuses jails pour protéger Nginx sont disponibles. Elles permettent par exemple de réduire le nombre de requêtes en définissant un taux limite, de bloquer les utilisateurs cherchants à exécuter des scripts à votre insu ou de bloquer les bots connus qui essayeraient des patterns pré-définis. Voici les jails :

## Blocage des tentatives de connexion sur Nginx
# [nginx-http-auth]
# enabled = true
# filter = nginx-http-auth
# action = ufw
# port = http,https
# logpath = /var/log/nginx/error.log
# bantime = 3600
# findtime = 300
# maxretry = 3

## Blocage des tentatives d'exploitation de script sur Nginx
# [nginx-noscript]
# enabled = true
# port = http,https
# filter = nginx-noscript
# action = ufw
# logpath = /var/log/nginx/access.log
# bantime = 3600
# findtime = 300
# maxretry = 6

## Blocage de chaînes de requêtes provenant de bots connus / malveillants
# [nginx-badbots]
# enabled = true
# port = http,https
# filter = nginx-badbots
# action = ufw
# logpath = /var/log/nginx/access.log
# bantime = 3600
# findtime = 300
# maxretry = 2

## Limitation du nombre de requêtes 
# [nginx-req-limit]
# enabled = true
# filter = nginx-req-limit
# action = ufw
# action = iptables-multiport[name=ReqLimit, port="http,https", protocol=tcp]
# logpath = /var/log/nginx/*error.log
# findtime = 600
# bantime = 7200
# maxretry = 10

Les possibilités avec Fail2Ban sont infinies, si vous creusez un peu, vous pourrez créer vos propre filtres, vos actions personnalisées et les jails qui vont avec. Si vous vous intéressez à la sécurité, n’hésitez pas à fouiller dans nos articles similaires.

Quitter la version mobile