Sep 07

Para desempolvar el blog, les dejo esta receta para configurar Fail2ban para detener ataques al servidor POP/IMAP Dovecot.

Al ver que cada vez eran más constantes en mis logs del servidor de correo estas líneas:

dovecot-auth: pam_succeed_if(dovecot:auth): error retrieving information about user staff
dovecot-auth: pam_succeed_if(dovecot:auth): error retrieving information about user sales
dovecot-auth: pam_succeed_if(dovecot:auth): error retrieving information about user recruit
dovecot-auth: pam_succeed_if(dovecot:auth): error retrieving information about user alias
dovecot-auth: pam_succeed_if(dovecot:auth): error retrieving information about user office
dovecot-auth: pam_succeed_if(dovecot:auth): error retrieving information about user samba
dovecot-auth: pam_succeed_if(dovecot:auth): error retrieving information about user tomcat
dovecot-auth: pam_succeed_if(dovecot:auth): error retrieving information about user webadmin

Decidí buscar alguna aplicación para detener estas amables “auditorías” de mis amigos los juanquers… pero antes un poco de historia:

Utilizo el servidor POP/IMAP Dovecot, que a su vez se conecta a una base de datos para verificar los usuarios virtuales de las cuentas de correo.

Una de las maravillas de contar con IPs fijas es que susceptible de ataques de spammers o script kiddies que siempre buscan la manera de mandar su correo electrónico no deseado o de simplemente joderte :P

Fail2ban es una aplicación hecha en Python que revisa los logs del sistema y bloquea con IPTables a la IP que hace muchos intentos de conectarse con un usuario.

Fail2ban puede monitorear aplicaciones como ssh, apache, vsftp y también servidores como Dovecot.

Dovecot a través de PAM verifica los usuarios y el log se ubica en /var/log/secure

Mi servidor corre CentOS 5 :)

  • Descargamos e instalamos fail2ban:


wget http://url-aqui/fail2ban-version.tar.bz2
tar xvzf fail2ban-version.tar.bz2
cd fail2ban-version
python setup.py install

  • Configuramos fail2ban: archivo /etc/fail2ban/jail.conf

Agregamos nuestras redes locales para que fail2ban no las considere al momento del monitoreo, separadas por un espacio:

ignoreip = 127.0.0.1 192.168.4.0/24

Agregamos lo siguiente para monitorear Dovecot (cambiar direcciones de correo al gusto):

[dovecot]
enabled = true
filter = dovecot
action = iptables-multiport[name=Dovecot, port="110,995,143,993", protocol=tcp]
sendmail-whois[name=Dovecot, dest=your_email@your_domain.com, sender=fail2ban@mail.com]
logpath = /var/log/secure
maxretry = 3

  • Creamos el archivo /etc/fail2ban/filter.d/dovecot.conf

Agregamos:

[Definition]
failregex = pam.*dovecot.*(?:authentication failure).*rhost=(?:::f{4,6}:)?(?P<host>\S*)

Esta expresión regular funciona bien para filtrar este tipo de log

dovecot-auth: pam_succeed_if(dovecot:auth): error retrieving information about user webadmin

  • Probramos la configuración:


[root@mail fail2ban]# fail2ban-regex /var/log/secure /etc/fail2ban/filter.d/dovecot.conf

Obtendremos algo parecido a esto:

Running tests
=============
Use regex file : /etc/fail2ban/filter.d/dovecot.conf
Use log file   : /var/log/secure
Results
=======
Failregex
|- Regular expressions:
|  [1] pam.*dovecot.*(?:authentication failure).*rhost=(?:::f{4,6}:)?(?P<host>\S*)
|
`- Number of matches:
[1] 328 match(es)
Ignoreregex
|- Regular expressions:
|
`- Number of matches:
Summary
=======
Addresses found:
[1]
203.152.223.205 (Sun Aug 09 13:29:31 2009)
203.152.223.205 (Sun Aug 09 13:29:33 2009)
203.152.223.205 (Sun Aug 09 13:29:35 2009)
203.152.223.205 (Sun Aug 09 13:29:37 2009)
203.152.223.205 (Sun Aug 09 13:29:39 2009)
203.152.223.205 (Sun Aug 09 13:29:40 2009)
203.152.223.205 (Sun Aug 09 13:29:41 2009)
Date template hits:
21351 hit(s): Month Day Hour:Minute:Second
0 hit(s): Weekday Month Day Hour:Minute:Second Year
0 hit(s): Weekday Month Day Hour:Minute:Second
0 hit(s): Year/Month/Day Hour:Minute:Second
0 hit(s): Day/Month/Year Hour:Minute:Second
0 hit(s): Day/Month/Year:Hour:Minute:Second
0 hit(s): Year-Month-Day Hour:Minute:Second
0 hit(s): Day-Month-Year Hour:Minute:Second[.Millisecond]
0 hit(s): TAI64N
0 hit(s): Epoch
0 hit(s): ISO 8601
Success, the total number of match is 328

  • Registramos fail2ban como servicio y lo configuramos para que arranque al inicio.

Regresamos al folder ail2ban-version.tar.bz2 y ejecutamos lo siguiente:

cd fail2ban-version
cp files/redhat-initd /etc/init.d/fail2ban (si es RH o CentOS, pero si es debian, también existe un script en el folder ;) )
chkconfig --add fail2ban
chkconfig fail2ban on
service fail2ban start

Listo. Ahora al tercer intento de conexión al servidor de correo :P la IP del juanquer será bloqueada.

4 Responses to “Fail2ban y Dovecot”

  1. Al Says:

    Hola puedes ayudarme a crear una expresion para filtrar esta linea de log:

    dovecot-auth: pam_krb5[4335]: authentication fails for ‘user’ userl@domain.com): Authentication failure (Preauthentication failed)

    Gracias de antemano.

  2. random Says:

    Puedes probar con:
    dovecot-auth: pam_krb5\[[0-9]*\]: authentication fails for*

    O mejor aún: busca una línea parecida a ésta en /var/log/secure:

    Jul 11 05:50:20 mail dovecot-auth: pam_unix(dovecot:auth): authentication failure; logname= uid=0 euid=0 tty=dovecot ruser= rhost=::ffff:203.45.26.143

    Basados en ella podemos usar la regex del post:
    [Definition]
    failregex = pam.*dovecot.*(?:authentication failure).*rhost=(?:::f{4,6}:)?(?P\S*)

    Saludos.

  3. Al Says:

    Gracias random,
    La primera linea filtra bien, pero creo que como no sale en el log la ip por ningun sitio me da este error cuando pruebo el filtro:

    Unable to find a corresponding IP address for ‘user’

    La segunda opcion que me indicas, no aparece en el log secure ni en el maillog.

  4. Al Says:

    Nos vamos acercando.
    Activando el auth_verbose en dovecot, ahora me sale en el log maillog la siguiente linea:

    dovecot: auth(default): pam(user,192.168.1.5): pam_authenticate() failed: Permission denied

    Creo que con esto a lo mejor es mas facil conseguir filtrar.
    Que te parece?.

Leave a Reply

preload preload preload