Configuration Fail2ban

De EjnTricks

Cet article présente certains éléments de configuration du service fail2ban.

Warning-icon.png Attention, l'article a été rédigé sur une version ancienne de Fail2ban. Les contenus peuvent être différents. De plus, le nom des "prisons" a été changé au fil des versions. Pour cet article, le nom est préfixé par fail2ban- et sur des versions plus récente cela est f2b-


Hand-icon.png Votre avis

Current user rating: 87/100 (7 votes)

 You need to enable JavaScript to vote


Folder-icon.png Emplacement des fichiers

Les configuration du script se trouve dans le répertoire /etc/fail2ban. Le premier fichier fail2ban.conf permet essentiellement de spécifier les logs du script.

# Fail2Ban configuration file
#
# Author: Cyril Jaquier
#
# $Revision: 629 $
#

[Definition]

# Option:  loglevel
# Notes.:  Set the log level output.
#          1 = ERROR
#          2 = WARN
#          3 = INFO
#          4 = DEBUG
# Values:  NUM  Default:  3
#
loglevel = 3

# Option:  logtarget
# Notes.:  Set the log target. This could be a file, SYSLOG, STDERR or STDOUT.
#          Only one log target can be specified.
# Values:  STDOUT STDERR SYSLOG file  Default:  /var/log/fail2ban.log
#
logtarget = /var/log/fail2ban.log

# Option: socket
# Notes.: Set the socket file. This is used to communicate with the daemon. Do
#         not remove this file when Fail2ban runs. It will not be possible to
#         communicate with the server afterwards.
# Values: FILE  Default:  /var/run/fail2ban/fail2ban.sock
#
socket = /var/run/fail2ban/fail2ban.sock

La configuration du niveau de trace, pour un serveur Ubuntu en version 15.04, s'effectue avec des valeurs plus explicite.

# Fail2Ban main configuration file
#
# Comments: use '#' for comment lines and ';' (following a space) for inline comments
#
# Changes:  in most of the cases you should not modify this
#           file, but provide customizations in fail2ban.local file, e.g.:
#
# [Definition]
# loglevel = DEBUG
#

[Definition]

# Option: loglevel
# Notes.: Set the log level output.
#         CRITICAL
#         ERROR
#         WARNING
#         NOTICE
#         INFO
#         DEBUG
# Values: [ LEVEL ]  Default: ERROR
#
loglevel = INFO

# Option: logtarget
# Notes.: Set the log target. This could be a file, SYSLOG, STDERR or STDOUT.
#         Only one log target can be specified.
#         If you change logtarget from the default value and you are
#         using logrotate -- also adjust or disable rotation in the
#         corresponding configuration file
#         (e.g. /etc/logrotate.d/fail2ban on Debian systems)
# Values: [ STDOUT | STDERR | SYSLOG | FILE ]  Default: STDERR
#
logtarget = /var/log/fail2ban.log

# Option: socket
# Notes.: Set the socket file. This is used to communicate with the daemon. Do
#         not remove this file when Fail2ban runs. It will not be possible to
#         communicate with the server afterwards.
# Values: [ FILE ]  Default: /var/run/fail2ban/fail2ban.sock
#
socket = /var/run/fail2ban/fail2ban.sock

# Option: pidfile
# Notes.: Set the PID file. This is used to store the process ID of the
#         fail2ban server.
# Values: [ FILE ]  Default: /var/run/fail2ban/fail2ban.pid
#
pidfile = /var/run/fail2ban/fail2ban.pid

# Options: dbfile
# Notes.: Set the file for the fail2ban persistent data to be stored.
#         A value of ":memory:" means database is only stored in memory
#         and data is lost when fail2ban is stopped.
#         A value of "None" disables the database.
# Values: [ None :memory: FILE ] Default: /var/lib/fail2ban/fail2ban.sqlite3
dbfile = /var/lib/fail2ban/fail2ban.sqlite3

# Options: dbpurgeage
# Notes.: Sets age at which bans should be purged from the database
# Values: [ SECONDS ] Default: 86400 (24hours)
dbpurgeage = 86400

Comme indiqué dans l'entête du fichier, il ne faut pas modifier le fichier fail2ban.conf, afin de limiter les risques de perte de configuration en cas de mise à jour. Il est préférable de créer un fichier fail2ban.local dans lequel les personnalisations sont mises en place. Dans l'exemple suivant, le niveau de log est placé à DEBUG. Le fichier /etc/fail2ban/fail2ban.local est créé avec le contenu suivant :

[Definition]

# Option: loglevel
# Notes.: Set the log level output.
#         CRITICAL
#         ERROR
#         WARNING
#         NOTICE
#         INFO
#         DEBUG
# Values: [ LEVEL ]  Default: ERROR
#
loglevel = DEBUG


Le fichier jail.conf permet de mettre en place les politiques pour bannir les adresses IP en fonction des protocoles souhaités. L'installation par défaut met à disposition un grand nombre de paramétrage, mais pas nécessaire activé.


Update icon.png Activation changement de configuration

Les changements de configuration ne sont pas prise à chaud. Il est nécessaire de relancer la partie client, ce qui est réalisé avec l'exécutable fail2ban-client et l'argument reload.

#sudo fail2ban-client reload
WARNING 'findtime' not defined in 'ssh'. Using default value
WARNING 'findtime' not defined in 'dropbear'. Using default value
WARNING 'findtime' not defined in 'pam-generic'. Using default value
WARNING 'findtime' not defined in 'xinetd-fail'. Using default value
WARNING 'findtime' not defined in 'ssh-ddos'. Using default value
WARNING 'findtime' not defined in 'apache'. Using default value
WARNING 'findtime' not defined in 'apache-multiport'. Using default value
WARNING 'findtime' not defined in 'apache-noscript'. Using default value
WARNING 'findtime' not defined in 'apache-overflows'. Using default value
WARNING 'findtime' not defined in 'vsftpd'. Using default value
WARNING 'findtime' not defined in 'proftpd'. Using default value
WARNING 'findtime' not defined in 'wuftpd'. Using default value
WARNING 'findtime' not defined in 'postfix'. Using default value
WARNING 'findtime' not defined in 'couriersmtp'. Using default value
WARNING 'findtime' not defined in 'courierauth'. Using default value
WARNING 'findtime' not defined in 'sasl'. Using default value
WARNING 'findtime' not defined in 'named-refused-tcp'. Using default value

Attention, les bannissements dans la définition de Iptables sont alors supprimés, comme le montre le résultat de la commande iptables -L -n.

Chain INPUT (policy ACCEPT)
target     prot opt source               destination
fail2ban-ssh  tcp  --  0.0.0.0/0            0.0.0.0/0           multiport dports 22
DROP       all  --  58.17.163.8          0.0.0.0/0

Chain FORWARD (policy ACCEPT)
target     prot opt source               destination

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination

Chain fail2ban-ssh (1 references)
target     prot opt source               destination
RETURN     all  --  0.0.0.0/0            0.0.0.0/0


Command-icon.png Surveillance initiale

Lors de l'installation, le protocole ssh a été mis sous contrôle par défaut. La section suivante se retrouve dans le fichier de configuration:

[ssh]
enabled  = true
port     = ssh
filter   = sshd
logpath  = /var/log/auth.log
maxretry = 6

Pour des versions plus récentes, il est recommandé de ne pas modifier le fichier jail.conf directement, mais d'utiliser un fichier personnalisé placé dans le répertoire jail.d, et d'y placer les modification de configuration par rapport au standard. Dans le cadre de ce bannissement, il serait recommandé de créer un fichier ssh-custom.local avec le contenu suivant.

[ssh]
enabled  = true

le paramètre logpath permet d'indiquer que c'est le fichier /var/log/auth.log qui va être analysé afin d'identifier les IP à bannir. La valeur du paramètre filter va permettre d'identifier le fichier contenant la politique de recherche des tentative dans le fichier de log. Pour cette implémentation, le fichier sshd.conf dans le sous répertoire filter.d, dont le contenu est:

# Fail2Ban configuration file
#
# Author: Cyril Jaquier
#
# $Revision: 728 $
#

[INCLUDES]

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


[Definition]

_daemon = sshd

# Option:  failregex
# Notes.:  regex to match the password failures messages in the logfile. The
#          host must be matched by a group named "host". The tag "<HOST>" can
#          be used for standard IP/hostname matching and is only an alias for
#          (?:::f{4,6}:)?(?P<host>[\w\-.^_]+)
# Values:  TEXT
#
failregex = ^%(__prefix_line)s(?:error: PAM: )?Authentication failure for .* from <HOST>\s*$
            ^%(__prefix_line)s(?:error: PAM: )?User not known to the underlying authentication module for .* from <HOST>\s*$
            ^%(__prefix_line)sFailed (?:password|publickey) for .* from <HOST>(?: port \d*)?(?: ssh\d*)?$
            ^%(__prefix_line)sROOT LOGIN REFUSED.* FROM <HOST>\s*$
            ^%(__prefix_line)s[iI](?:llegal|nvalid) user .* from <HOST>\s*$
            ^%(__prefix_line)sUser .+ from <HOST> not allowed because not listed in AllowUsers$
            ^%(__prefix_line)sauthentication failure; logname=\S* uid=\S* euid=\S* tty=\S* ruser=\S* rhost=<HOST>(?:\s+user=.*)?\s*$
            ^%(__prefix_line)srefused connect from \S+ \(<HOST>\)\s*$
            ^%(__prefix_line)sAddress <HOST> .* POSSIBLE BREAK-IN ATTEMPT!*\s*$
            ^%(__prefix_line)sUser .+ from <HOST> not allowed because none of user's groups are listed in AllowGroups\s*$

# Option:  ignoreregex
# Notes.:  regex to ignore. If this regex matches, the line is ignored.
# Values:  TEXT
#
ignoreregex =

La valeur du paramètre port est également utilisé pour générer le nom de la section ajoutée dans Iptables. Dans ce cas, le nom de la section est alors fail2ban-ssh:

Chain INPUT (policy ACCEPT)
target     prot opt source               destination
DROP       all  --  58.17.163.8          anywhere
fail2ban-ssh  tcp  --  anywhere             anywhere            multiport dports ssh

Chain FORWARD (policy ACCEPT)
target     prot opt source               destination

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination

Chain fail2ban-ssh (1 references)
target     prot opt source               destination
RETURN     all  --  anywhere             anywhere


Il n'a pas fallu bien longtemps pour qu'une première adresse IP soit prise la main dans le sac comme l'indique la log, par défaut sous /var/log/fail2ban.log:

2012-02-28 00:05:55,959 fail2ban.server : INFO   Changed logging target to /var/log/fail2ban.log for Fail2ban v0.8.5
2012-02-28 00:05:55,961 fail2ban.jail   : INFO   Creating new jail 'ssh'
2012-02-28 00:05:55,962 fail2ban.jail   : INFO   Jail 'ssh' uses poller
2012-02-28 00:05:56,014 fail2ban.filter : INFO   Added logfile = /var/log/auth.log
2012-02-28 00:05:56,015 fail2ban.filter : INFO   Set maxRetry = 6
2012-02-28 00:05:56,016 fail2ban.filter : INFO   Set findtime = 600
2012-02-28 00:05:56,017 fail2ban.actions: INFO   Set banTime = 600
2012-02-28 00:05:56,068 fail2ban.jail   : INFO   Jail 'ssh' started
2012-02-28 01:50:47,261 fail2ban.actions: WARNING [ssh] Ban 221.232.137.202
2012-02-28 02:00:48,059 fail2ban.actions: WARNING [ssh] Unban 221.232.137.202

Mais comme l'indiquent les messages, l'URL n'a été bannie que l'espace de dix minutes. Afin de la bannir de façon permanente, il faut modifier la durée de rétention, ce qui a été réalisé dans les paramètres globaux. Après modification et rechargement des configurations, une nouvelle adresse a été bannie mais sans retour arrière, comme l'indique la log:

2012-02-28 00:05:55,959 fail2ban.server : INFO   Changed logging target to /var/log/fail2ban.log for Fail2ban v0.8.5
2012-02-28 00:05:55,961 fail2ban.jail   : INFO   Creating new jail 'ssh'
2012-02-28 00:05:55,962 fail2ban.jail   : INFO   Jail 'ssh' uses poller
2012-02-28 00:05:56,014 fail2ban.filter : INFO   Added logfile = /var/log/auth.log
2012-02-28 00:05:56,015 fail2ban.filter : INFO   Set maxRetry = 6
2012-02-28 00:05:56,016 fail2ban.filter : INFO   Set findtime = 600
2012-02-28 00:05:56,017 fail2ban.actions: INFO   Set banTime = 600
2012-02-28 00:05:56,068 fail2ban.jail   : INFO   Jail 'ssh' started
2012-02-28 01:50:47,261 fail2ban.actions: WARNING [ssh] Ban 221.232.137.202
2012-02-28 02:00:48,059 fail2ban.actions: WARNING [ssh] Unban 221.232.137.202
2012-02-28 09:26:48,557 fail2ban.jail   : INFO   Jail 'ssh' stopped
2012-02-28 09:26:48,560 fail2ban.server : INFO   Changed logging target to /var/log/fail2ban.log for Fail2ban v0.8.5
2012-02-28 09:26:48,562 fail2ban.jail   : INFO   Creating new jail 'ssh'
2012-02-28 09:26:48,616 fail2ban.jail   : INFO   Jail 'ssh' uses Gamin
2012-02-28 09:26:48,749 fail2ban.filter : INFO   Added logfile = /var/log/auth.log
2012-02-28 09:26:48,751 fail2ban.filter : INFO   Set maxRetry = 6
2012-02-28 09:26:48,753 fail2ban.filter : INFO   Set findtime = 600
2012-02-28 09:26:48,754 fail2ban.actions: INFO   Set banTime = -1
2012-02-28 09:26:48,789 fail2ban.jail   : INFO   Jail 'ssh' started
2012-02-28 10:15:43,437 fail2ban.actions: WARNING [ssh] Ban 220.178.63.27

En regardant le contenu de Iptables, cette IP apparaît dans la zone fail2ban-ssh

Chain INPUT (policy ACCEPT)
target     prot opt source               destination
DROP       all  --  58.17.163.8          anywhere
fail2ban-ssh  tcp  --  anywhere             anywhere            multiport dports ssh

Chain FORWARD (policy ACCEPT)
target     prot opt source               destination

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination

Chain fail2ban-ssh (1 references)
target     prot opt source               destination
DROP       all  --  220.178.63.27        anywhere
DROP       all  --  pr2base.seas.gwu.edu  anywhere
DROP       all  --  80.91.181.43         anywhere
DROP       all  --  NSG-Static-130.243.71.182.airtel.in  anywhere
DROP       all  --  219.140.165.85       anywhere
DROP       all  --  68.233.249.181       anywhere
DROP       all  --  202.103.30.24        anywhere
DROP       all  --  221.232.137.202      anywhere
RETURN     all  --  anywhere             anywhere


Icon-Configuration-Settings.png Politique globale

Chacune des sections peut être configurée, mais des paramètres globaux sont mis à disposition. Ceux-ci ont été modifié notament sur la durée du bannissement. La valeur du paramètre bantime est passée de 600 (10 minutes) à -1.

[DEFAULT]

# "ignoreip" can be an IP address, a CIDR mask or a DNS host
ignoreip = 127.0.0.1/8
bantime  = -1
#bantime  = 600
maxretry = 3