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.
Tabla de contenidos
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í.