Servidor de correo – Instalación y configuración Fail2ban (parte 13)

Esta es una entrada dentro de la serie para la instalación de un servidor de correo completo. Índice completo de contenidos pincha aquí.


Fail2ban es una aplicación desarrollada en Python destinada a la prevención de intrusos en un sistema, evitando intentos de acceso por fuerza bruta. Más información en su web oficial pinchando aquí.

Vamos a utilizarlo para proteger los intentos de acceso a Postfix, Dovecot, Rainloop, entre otros.


Instalación

Instalamos Fail2ban con el comando

sudo apt-get install fail2ban

El programa se instala e inicia con protección sobre el puerto 22 por defecto.

Chain INPUT (policy DROP 1 packets, 52 bytes)
 pkts bytes target     prot opt in     out     source               destination
   11   632 f2b-sshd   tcp  --  *      *       0.0.0.0/0            0.0.0.0/0            multiport dports 22

Lo agregamos en el inicio del sistemas:

systemctl enable fail2ban

Configuración

En Debian, por defecto los filtros de Fail2ban se encuentran en /etc/fail2ban/jail.conf y en /etc/fail2ban/jail.d/defaults-debian.conf. Los ajustes en el segundo archivo anularán los correspondientes con el primero.

Con los siguientes comandos podemos ver más información:

cat /etc/fail2ban/jail.conf | less
cat /etc/fail2ban/jail.d/defaults-debian.conf
fail2ban-client status
fail2ban-client status sshd

Por ejemplo:

root@xxx:~# fail2ban-client status

Status

|- Number of jail:      1

`- Jail list:   sshd

root@xxx:~# fail2ban-client status sshd

Status for the jail: sshd

|- Filter

|  |- Currently failed: 8

|  |- Total failed:     39

|  `- File list:        /var/log/auth.log

`- Actions

   |- Currently banned: 3

   |- Total banned:     3

   `- Banned IP list:   206.189.232.29 159.65.185.225 92.42.47.33

Ahora cambiamos la configuración. Editamos el archivo /etc/fail2ban/jail.conf, pero antes hacemos una copia de este

cp jail.conf jail.orig

 y cambiamos la configuración del archivo original:

[DEFAULT]

bantime = 600
...
maxentry = 5

[sshd]

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

Ahora vamos a ver el contenido del archivo /etc/fail2ban/jail.d/defaults-debian.conf que sobreescribirá lo que le indiquemos al anterior:

[sshd]

enabled = true

Como el contenido de los dos archivos anteriores podría cambiar en futuras actualizaciones, debemos de crear un archivo local de configuración para almacenar nuestras propias reglas. De nuevo, las configuraciones en este archivo sobreescribirán la de los dos archivos anteriores. Lo creamos

nano /etc/fail2ban/jail.d/jail-debian.local

con el siguiente contenido, y vamos indicando los servicios a proteger:

[sshd]
port = 22
maxentry = 3

[dovecot]
enabled = true
port = pop3,pop3s,imap,imaps
filter = dovecot
logpath = /var/log/dovecot.log
maxretry  = 3

[postfix]
enabled  = true
port     = smtp,ssmtp
filter   = postfix
logpath  = /var/log/mail.log
maxretry  = 3

[apache]
enabled = true
port    = http,https
filter  = apache-auth
logpath = /var/log/apache*/*error.log
maxretry = 3

Pero Postfix para los clientes de correo usa SASL y no lo está bloqueando con la configuración por defecto, por lo que agregamos la siguientes líneas:

[postfix-sasl]
enabled  = true
#port     = smtp,ssmtp,imap2,imap3,imaps,pop3,pop3s
port     = smtp,ssmtp,submission
filter   = postfix-sasl
# You might consider monitoring /var/log/warn.log instead
# if you are running postfix. See http://bugs.debian.org/507990
logpath  = /var/log/mail.log
maxretry = 3

Y para finalizar agregamos contenido extra al archivo /etc/fail2ban/jail.d/ jail-debian.local, indicando las direcciones IP que no va a filtrar el sistema y el email al que nos enviará notificaciones cuando se bloquea o desbloquea una IP concreta:

[DEFAULT]
ignoreip = 127.0.0.1/8 X.X.X.X/32
destemail = email@email.com
sender = Fail2Ban
action = %(action_mw)s

Reiniciamos Fail2ban y quedaría protegido

systemctl fail2ban restart

Ahora si vemos las reglas del Firewall IPTABLES podemos ver las reglas para Fail2ban, con el siguiente comando:

iptables -L -n -v
pkts bytes target     prot opt in     out     source               destination
   21  2285 f2b-apache  tcp  --  *      *       0.0.0.0/0            0.0.0.0/0            multiport dports 80,443
   55  4731 f2b-postfix-sasl  tcp  --  *      *       0.0.0.0/0            0.0.0.0/0            multiport dports 25,465,587
    0     0 f2b-dovecot  tcp  --  *      *       0.0.0.0/0            0.0.0.0/0            multiport dports 110,995,143,993,4190
   52  4551 f2b-postfix  tcp  --  *      *       0.0.0.0/0            0.0.0.0/0            multiport dports 25,465,587
    0     0 f2b-sshd   tcp  --  *      *       0.0.0.0/0            0.0.0.0/0            multiport dports 22

Rainloop

Ahora vamos a proteger el servicio de Webmail instalado Rainloop.

Editamos la configuración de Rainloop para habilitar el log destinado a Fail2ban. Editamos el archivo /var/www/html/email.tiraquelibras.com/data/_data_/_default_/configs/application.ini y lo configuramos:

…
#time_offset = "0"
time_offset = "2"
…
; Enable auth logging in a separate file (for fail2ban)
auth_logging = On
#auth_logging_filename = "fail2ban/auth-{date:Y-m-d}.txt"
auth_logging_filename = "fail2ban/auth.log"
auth_logging_format = "{date:Y-m-d H:i:s} Auth failed: ip:{request:ip} user:{imap:login} host:{imap:host} port:{imap:port}"

Los registros de log de Rainloop usan el formato GMT y no hay forma de cambiarlo. Por este motivo debemos de agregar dos horas al formato GMT en el campo time_offset y cambiarlo en cada cambio de uso horario (verano – invierno), ya que de lo contrario Fail2Ban no es capaz de identificar el log en tiempo real y lo descartaría.

Creamos el archivo /etc/fail2ban/jail.d/rainloop-auth.conf con el siguiente contenido:

[rainloop-auth]
enabled = true
filter = rainloop-auth
port = http,https
logpath = /var/www/html/correu2.yeloquehay.com/data/_data_/_default_/logs/fail2ban/auth.log
bantime = 600
maxretry = 3

Y el archivo con la expresión regular /etc/fail2ban/filter.d/rainloop-auth.conf:

# Fail2Ban configuration file
#
# Author: eRVee Moskovic
#
# $Revision$
#

[Definition]

# 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.
# Values: TEXT
#

#failregex = Auth failed: ip=<HOST> user=.* host=.* port=.*
failregex = Auth failed\: ip\:<HOST> user\:.* host\:.* port\:.*$

#
ignoreregex =

Recargamos la configuración con el comando:

systemctl reload fail2ban

Desbloquear una IP

Para desbloquear una IP en alguna regla de Fail2ban usamos el comando

sudo fail2ban-client set <nom_filtro> unbanip <IP>

Por ejemplo:

sudo fail2ban-client set postfix-sasl unbanip X.X.X.X

Índice general pincha aquí.