Installation et configuration de fail2ban

Présentation de fail2ban

A quoi ça sert ?

Fail2ban sert a analyser des fichiers de logs et créé des règles iptables en fonction des actions que nous aurons définies.

Par exemple fail2ban va analyser le fichier /var/log/auth.log pour rechercher les connexions ayant échouées sur notre serveur.

Les actions sont définies dans un fichier prison (jail.conf)

Installation fail2ban

apt-get install fail2ban

Démarrage du service fail2ban

service fail2ban start

 Configuration de fail2ban

Fonctionnement

Fail2ban founi un grand nombre de d’action qui sont encadrées par des balises.

La définition d’une balise d’encadrement est relativement simple 🙂

  • [Nom de l’action]

Les champs important d’un action :

  • enabled : détermine si l’action doit être activée par le service
    • true ou false
  • port : détermine le port d’écoute de la règle
  • filter : correspond au filtre (regex) défini dans le répertoire /etc/fail2ban/filter.d/
  • logpath : chemin complet du fichier de log à analysé

Les variables par défaut défines dans le fichier jail.conf peuvent être surcharger directement depuis une action. Cela peut être interressant si par exemple on ne veut pas utiliser le maxretry par défaut.

Mise en place des actions

Création du fichier jail.local

Afin de surcharger la configuration par défaut de jail2ban nous allons créer le fichier jail.local.

touch /etc/fail2ban/jail.local

Une fois notre fichier local créé nous pouvons personnaliser notre configuration

Configuration

Comportement par défaut

En modifiant le fichier /etc/fail2ban/jail.conf nous allons définir le comportement par défaut de fail2ban

[DEFAULT]

# "ignoreip" can be an IP address, a CIDR mask or a DNS host. Fail2ban will not
# ban a host which matches an address in this list. Several addresses can be
# defined using space separator.
ignoreip = 127.0.0.1/8

# External command that will take an tagged arguments to ignore, e.g. <ip>,
# and return true if the IP is to be ignored. False otherwise.
#
# ignorecommand = /path/to/command <ip>
ignorecommand =

# "bantime" is the number of seconds that a host is banned.
bantime  = 604800

# A host is banned if it has generated "maxretry" during the last "findtime"
# seconds.
findtime = 300
maxretry = 3

# "backend" specifies the backend used to get files modification.
# Available options are "pyinotify", "gamin", "polling" and "auto".
# This option can be overridden in each jail as well.
#
# pyinotify: requires pyinotify (a file alteration monitor) to be installed.
#            If pyinotify is not installed, Fail2ban will use auto.
# gamin:     requires Gamin (a file alteration monitor) to be installed.
#            If Gamin is not installed, Fail2ban will use auto.
# polling:   uses a polling algorithm which does not require external libraries.
# auto:      will try to use the following backends, in order:
#            pyinotify, gamin, polling.
backend = auto

# "usedns" specifies if jails should trust hostnames in logs,
#   warn when reverse DNS lookups are performed, or ignore all hostnames in logs
#
# yes:   if a hostname is encountered, a reverse DNS lookup will be performed.
# warn:  if a hostname is encountered, a reverse DNS lookup will be performed,
#        but it will be logged as a warning.
# no:    if a hostname is encountered, will not be used for banning,
#        but it will be logged as info.
usedns = warn

#
# Destination email address used solely for the interpolations in
# jail.{conf,local} configuration files.
destemail = L'admin@communaute-omr.fr

#
# Name of the sender for mta actions
sendername = Fail2Ban

# Email address of the sender
sender = UnUser@communaute-omr.fr

Dans ce début de fichier les lignes importantes sont :

  • ignoreip = 127.0.0.1/8
    • Par défaut fail2ban ignore l’ip local. vous pouvez rajouter d’autres ip ou plage d’ip en utilisant la virgule comme séparateur
  • bantime = 600
    • Défini le temps de bannissement des vilaines ip qui nous attaquent. Perso je mets 604800 Sec soit 7 jours.
  • findtime = 600
    • Détermine la durée maximum entre la première tentative et le nombre maximum de tetative de connexion
  • maxretry = 3
    • Corrrespond au nombre maximum de tentatives de connexion
  • destemail = root@localhost
    • Correspond au champs « to : » des mails de notifications
  • sendername = Fail2Ban
    • L’alias du champ « from : » dans le message.
  • sender = fail2ban@localhost
    • Adresse mail du champs « from : » du message

Il n’y a rien de plus a faire pour ce fichier. Nous pouvons maintenant personnaliser le fichier jail.local

Le fichier jail.local

Présentation

C’est le fichier qui nous permettra de personnaliser les actions définies dans le fichier jail.conf.

Il est aussi possible de personnaliser les champs du chapitre précédent dans ce fichier.

En effet, toutes variables ou action définies dans le fichier jail.local seront prioritaires sur celles définie dans le fichier jail.conf.

Personnalisation des actions

Rappel : pour qu’une action soit active, il faut positionner la vairable enabled à « true ».

banir les tentatives de connexion ssh echouées

ci-dessous la regle ssh :

[ssh]

enabled  = true
port     = 22
filter   = sshd
action   = iptables[name=SSH, port=ssh, protocol=tcp]
logpath  = /var/log/auth.log
maxretry = 3

Ici le maxretry est positionné à 3. Si c’est la valeur par défaut dans le fichier jail.conf ce champs est facultatif.

bannir les attaques ddos

[ssh-ddos]

enabled  = true
port     = ssh
filter   = sshd-ddos
logpath  = /var/log/auth.log
maxretry = 3

bannir les attaques sur nginx

http-get-dos

[http-get-dos]

enabled = true
port = http,https
filter = http-get-dos
logpath = /var/log/nginx/access.log
maxretry = 360
findtime = 120
action = iptables[name=HTTP, port=http, protocol=tcp]
mail-whois-lines[name=%(__name__)s, dest=%(destemail)s, logpath=%(logpath)s]
bantime = 600

Tentatives de connexion à un site web

[nginx-auth]
enabled = true
filter = nginx-auth
action = iptables-multiport[name=NoAuthFailures, port="http,https"]
logpath = /var/log/nginx*/*error*.log
maxretry = 6

[nginx-login]
enabled = true
filter = nginx-login
action = iptables-multiport[name=NoLoginFailures, port="http,https"]
logpath = /var/log/nginx*/*access*.log
maxretry = 6
Table des matières
WordPress Appliance - Powered by TurnKey Linux