Fail2ban

9 minute de lecture

Mis à jour :

Comment bloquer des adresses IP un peu trop insistantes ?

Principe

Fail2ban permet de sécuriser les serveurs par l’automatisation de la détection de comportements suspects : erreur lors de la connexion, le nombres de tentative, le temps imparti pour ce connecter, lorsque fail2ban les trouvent il banni l’ip pour un temps déterminé, en somme il les met en prison=jail.

Les jails sont défini par:

  • filter : les filtres définissent les expressions régulières qui doivent correspondre à des motifs présent dans les logs. action : les actions correspondent à des scripts à executer en cas de correspondance avec les motifs recherchés.

Celui-ci se charge de parcourir, et lire (parser) les fichiers de log des applications.

Les developpeurs ont prévu à peu prés l’ensemble des servcies que l’on peut mettre en place.

  • web : Apache, nginx, lighttpd
  • ftp: secureftp, proftp ..
  • mail: qmail, dovecot, courrier
  • base de données: mongodb, mysql
  • webmin
  • etc

Fail2ban s’appuie sur les règles iptables pour connaitre les port autorisés.

Installation

sudo apt install fail2ban

Arborescence

ls -al /etc/fail2ban
total 88
drwxr-xr-x   6 root root  4096 juil. 15 10:13 .
drwxr-xr-x 121 root root 12288 juil. 15 10:12 ..
drwxr-xr-x   2 root root  4096 juil. 15 10:13 action.d
-rw-r--r--   1 root root  2328 déc.   9  2016 fail2ban.conf
drwxr-xr-x   2 root root  4096 avril 17  2017 fail2ban.d
drwxr-xr-x   3 root root  4096 juil. 15 10:13 filter.d
-rw-r--r--   1 root root 21284 déc.   9  2016 jail.conf
drwxr-xr-x   2 root root  4096 juil. 15 10:13 jail.d
-rw-r--r--   1 root root 13799 juil.  8 10:39 jail.local
-rw-r--r--   1 root root  2375 déc.   9  2016 paths-common.conf
-rw-r--r--   1 root root   642 déc.   9  2016 paths-debian.conf
-rw-r--r--   1 root root   975 déc.   9  2016 paths-opensuse.conf

Bug

Attention: si vous avez migré vos serveur de Jessie vers stretch , il y a un bug et vous devriez rencontrer cette erreur.

sudo fail2ban-client start
ERROR  Failed during configuration: While reading from '/etc/fail2ban/jail.local' [line 155]: option 'port' in section 'pam-generic' already exists

Le bug est remonté auprés des développeurs, echange ici.

Et on y trouve cette indication:

Commenting out “port = anyport” lets fail2ban cleanly restart again.

On va faire le ménage…

Menage

  $ sudo -s
  # apt purge fail2ban
  # rm -rf /etc/fail2ban
  # apt install fail2ban
  # exit

Service fail2ban

A savoir que fail2ban a 2 composant:

  • fail2ban-server
  • fail2ban-client

La partie server n’a que peut d’options:

-b                   start in background
-f                   start in foreground
-s <FILE>            socket path
-x                   force execution of the server
-h, --help           display this help message
-V, --version        print the version

La partie client en a un peu lus:

Options:
    -c <DIR>                configuration directory
    -s <FILE>               socket path
    -p <FILE>               pidfile path
    -d                      dump configuration. For debugging
    -i                      interactive mode
    -v                      increase verbosity
    -q                      decrease verbosity
    -x                      force execution of the server (remove socket file)
    -b                      start server in background (default)
    -f                      start server in foreground (note that the client forks once itself)
    -h, --help              display this help message
    -V, --version           print the version

Et beaucoup de commande, ici un petit apperçu:

  • BASIC
Command:
                                             BASIC
    start                                    starts the server and the jails
    reload                                   reloads the configuration
    reload <JAIL>                            reloads the jail <JAIL>
    stop                                     stops all jails and terminate the
                                             server
    status                                   gets the current status of the
                                             server
    ping                                     tests if the server is alive
    help                                     return this output
    version                                  return the server version


  • LOGGING
LOGGING
set loglevel <LEVEL>                     sets logging level to <LEVEL>.
   Levels: CRITICAL, ERROR, WARNING,
   NOTICE, INFO, DEBUG
get loglevel                             gets the logging level
set logtarget <TARGET>                   sets logging target to <TARGET>.
   Can be STDOUT, STDERR, SYSLOG or a
   file
get logtarget                            gets logging target
set syslogsocket auto|<SOCKET>           sets the syslog socket path to
   auto or <SOCKET>. Only used if
   logtarget is SYSLOG
get syslogsocket                         gets syslog socket path
flushlogs                                flushes the logtarget if a file
   and reopens it. For log rotation.

  • DATABASE
  • JAIL Control
  • JAIL Configuration
  • COMMAND ACTION CONFIGURATION
  • GENERAL ACTION CONFIGURATION
  • JAIL INFORMATION
  • COMMAND ACTION INFORMATION
  • GENERAL ACTION INFORMATION

Nous pouvons soit configurer fail2ban par les fichiers de configuration, soit en utilisant fail2ban-client pour configurer fail2ban-server.

Status du service

$ sudo service fail2ban status

sudo service fail2ban status
● fail2ban.service - Fail2Ban Service
   Loaded: loaded (/lib/systemd/system/fail2ban.service; enabled; vendor preset: enabled)
   Active: active (running) since Sun 2018-07-15 11:56:46 CEST; 10min ago
     Docs: man:fail2ban(1)
 Main PID: 14139 (fail2ban-server)
   CGroup: /system.slice/fail2ban.service
           └─14139 /usr/bin/python3 /usr/bin/fail2ban-server -s /var/run/fail2ban/fail2ban.sock -p /var/run/fail2ban/fail2ban.pid -x -b

juil. 15 11:56:45 zalem systemd[1]: Starting Fail2Ban Service...
juil. 15 11:56:45 zalem fail2ban-client[14135]: 2018-07-15 11:56:45,816 fail2ban.server         [14137]: INFO    Starting Fail2ban v0.9.6
juil. 15 11:56:45 zalem fail2ban-client[14135]: 2018-07-15 11:56:45,817 fail2ban.server         [14137]: INFO    Starting in daemon mode
juil. 15 11:56:46 zalem systemd[1]: Started Fail2Ban Service.

Configuration

Nous disposons de plusieurs ficjhiers:

  • /etc/fail2ban/fail2ban.conf
  • /etc/fail2ban/jail.conf
  • /etc/fail2ban/jail.d/defaults-debian.conf

  • fail2ban.conf est la configuration de fial2ban lui même , indiquant :
    • le niveau de log ( loglevel que l’on peut modifier mais pas en mode DEBUG)
    • le fichier de log (logtarget)
    • son socket
    • son pid.file
    • sa db ( fail2ban.sqlite3)
  • jail.conf
    • c’est le fichier de configuration par défauts des jails, il est déconseillé de le modifier directement
    # Changes:  in most of the cases you should not modify this
    #           file, but provide customizations in jail.local file,
    #           or separate .conf files under jail.d/ directory, e.g.:
    #
    # HOW TO ACTIVATE JAILS:
    #
    # YOU SHOULD NOT MODIFY THIS FILE.
    #
    # It will probably be overwritten or improved in a distribution update.
    #
    # Provide customizations in a jail.local file or a jail.d/customisation.local.
    # For example to change the default bantime for all jails and to enable the
    # ssh-iptables jail the following (uncommented) would appear in the .local file.
    # See man 5 jail.conf for details.
    
    

Dans /etc/fail2ban/jail.conf nous avons la configuration des jails par défault, il est également déconseillé de modifier ce fichier directement, qui pourrait être écrasé lors d’une mise à jour.

[DEFAULT]

bantime = 600
...
maxentry = 5

[sshd]

port = ssh
logpath = %(sshd_log)s
backend = %(sshd_backend)s

Il est indiqué que les jails ne sont pas activée.

Dans /etc/fail2ban/defaults-debian.conf nous avons par défault, c’est ici que l’on créé ses jails :

[sshd]
enabled = true

Cependant , on va anticiper une éventuelle mise à jour et créer un fichier /etc/fail2ban/jail.d/jail-debian.conf et on pourra indiquer le port ssh que l’on a modifier.

Aprés plusieurs test, je suis maintenant sur que c’est ce fichier là qui sera lu.

$ sudo vi /etc/fail2ban/jail.d/jail-debian.conf

[sshd]
port = 1022
maxentry = 3

Verification

Nombre de Jail

sudo fail2ban-client status

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

On voit que l’on a 1 jail de configurer.

Selection du Jail

sudo fail2ban-client status sshd
Status for the jail: sshd
|- Filter
|  |- Currently failed:	0
|  |- Total failed:	0
|  `- File list:	/var/log/auth.log
`- Actions
  |- Currently banned:	0
  |- Total banned:	0
  `- Banned IP list:

Le retour de la commande : sudo fail2ban-client status sshd nous indique que le jail s’appuie sur le fichier de log auth.log qui regroupe les demande d’authentification.

On voit les erreurs de connexions, ainsi que les bannis.

Test

J’ai volontairement fait des erreurs de mot de passe en tentant de me connecter, j’ai également tenté de me connecter sur un port fermé , et finalement j’ai tenté de me connecter avec un compte interdit.

Et forcément , ce qui devait arriver, arriva:

$ ssh server_distant
ssh: connect to host 123.456.789.098 port 4807: Connection refused

Je me suis fait ban

Puisque l’IP est maintenant bloquée, il faut passer par un autre réseau…une fois connecté, on vérifie l’état du jail.

sudo fail2ban-client status sshd
[sudo] Mot de passe de ordinatous : 
Status for the jail: sshd
|- Filter
|  |- Currently failed:	0
|  |- Total failed:	5
|  `- File list:	/var/log/auth.log
`- Actions
   |- Currently banned:	0
   |- Total banned:	1
   `- Banned IP list:

fail2ban-client

unbanip

Fail2ban-client nous sert à intéroger fail2ban-server , il permet également de le configurer. Le plus simple au début, c’est de s’approprier les configurations, cela aidera à mieux comprendre la syntaxes des commandes fail2ban-client.

Maintenant que je suis ban , enfin l’adresse ip derrière laquelle je me trouve, il faut que je l’unban.

$ sudo fail2ban-client set <JAIL> unbanip <IP>

Ce qui nous donne ceci:

$ sudo fail2ban-client set sshd unbanip 123.456.789.098

banip

Il est possible bannir une ip manuellement, néanmoins si cette IP n’a jamais tenté quoi que ce soit , f2b en parsant le fichier de log auth.log, le verra et va unban automatiquement l’IP.

$ sudo fail2ban-client set sshd banip 123.456.789.088

Test

sudo fail2ban-client status sshd
Status for the jail: sshd
|- Filter
|  |- Currently failed:	0
|  |- Total failed:	10
|  `- File list:	/var/log/auth.log
`- Actions
   |- Currently banned:	0
   |- Total banned:	2
   `- Banned IP list:

Si oon souhaite bannir , une IP, il faut passer par iptables.