Protege tu Asterisk de ataques usando fail2ban

7 Jul

En ocasiones anteriores he hecho la mención de fail2ban, una herramienta escrita en Python que analiza logs del sistema y responde en caso de que ciertas condiciones se cumplan, por ejemplo, 5 intentos de contraseña SSH equivocada en un periodo de 10 minutos. Dada la proliferación de ataques a equipos Asterisk para tratar de hacer llamadas de larga distancia, tiene sentido que ocupemos esta herramienta para protegernos de los amantes de lo ajeno.

Ahora bien, ¿cómo configuramos esta herramienta para que nos evite los cargos de miles de dólares en llamadas fantasmas?

Primero, lo instalamos. En Debian podemos usar el mundialmente reconocido apt-get:

apt-get install fail2ban

O, si tenemos Centos, primero asegurémonos de que tengamos EPEL (un repositorio que nos da acceso a mucho software útil) y luego instalamos fail2ban:

rpm -Uvh http://download.fedora.redhat.com/pub/epel/5/i386/epel-release-5-4.noarch.rpm 
yum -y install fail2ban

Fail2Ban se configura en 2 partes básicas:

  • /etc/fail2ban/jail.conf – Define que logs monitorear y que hacer en caso de que una regla se cumpla
  • /etc/fail2ban/filter.d/<filtro> – Definimos las reglas de coincidencia para analizar los logs

Editemos el archivo jail.conf y agreguemos esto hasta abajo:

[asterisk-iptables]
enabled  = true
filter   = asterisk
action   = iptables-allports[name=ASTERISK, protocol=udp, port=5060]
sendmail-whois[name=ASTERISK, dest=micorreo@algunmail.com, sender=fail2ban@example.org]
logpath  = /var/log/asterisk/full
maxretry = 5
findtime = 600
bantime = 10800

Lo que estamos especificando es lo siguiente:

  • La regla (jail) se llama asterisk-iptables
  • El filtro a usar debe existir en /etc/fail2ban/filter.d/asterisk.conf
  • Cuando se active la regla, usaremos la acción iptables-allports, la cual bloquea a nivel de iptables. Nosotros le estamos indicando que cierre el acceso al puerto UDP 5060, y luego que haga uso de la acción sendmail-whois, la cual me enviaria a mi correo electrónico la notificación del bloqueo, además de enviarme información de whois de la IP que se bloqueó.
  • El archivo log a monitorear es el /var/log/asterisk/full (ojo, dependiendo de tu sistema, el log puede ser diferente, ajústalo acorde)
  • Se permiten un máximo de 5 fallos en 10 minutos antes de activar la protección. Es decir, se permiten un máximo de maxretry intentos en findtime segundos
  • Al activarse el bloqueo, se hará por 3 horas o bien, 10800 segundos (bantime)

En esta liga encuentras el manual oficial para el jail.conf.

Ya definido el jail, necesitamos crear el filtro que atrapará los ataques. Esto se define (de acuerdo a lo que especificamos arriba) en el /etc/fail2ban/filter.d/asterisk.conf (los valores con # son comentarios, solo se dejan por referencia)

[INCLUDES]

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

[Definition]

#_daemon = asterisk

# 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>S+)
# Values:  TEXT
#

failregex = Registration from '.*' failed for '<HOST>(:[0-9]{1,5})?' - Wrong password
       Registration from '.*' failed for '<HOST>(:[0-9]{1,5})?' - No matching peer found
       Registration from '.*' failed for '<HOST>(:[0-9]{1,5})?' - Device does not match ACL
       Registration from '.*' failed for '<HOST>(:[0-9]{1,5})?' - Username/auth name mismatch
       Registration from '.*' failed for '<HOST>(:[0-9]{1,5})?' - Peer is not supposed to register
       NOTICE.* <HOST> failed to authenticate as '.*'$
       NOTICE.* .*: No registration for peer '.*' (from <HOST>)
       NOTICE.* .*: Host <HOST> failed MD5 authentication for '.*' (.*)
       VERBOSE.* logger.c: -- .*IP/<HOST>-.* Playing 'ss-noservice' (language '.*')

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

Se observa que estamos tratando de atrapar a los siguientes:

  • Usuarios que ingresan su contraeña SIP incorrectamente
  • Usuarios que intentan usar un usuario SIP que no existe
  • Usuarios que no cumplen con los parámetros permit y deny del sip.conf
  • Usuarios que su auth username no coincide con su username
  • Usuarios que tratan de registrarse con perfiles que son fijos (es decir, que no tienen host=dynamic)
  • Usuarios que no cumplen con los criterios de autenticación
  • Usuarios que marcan hacia números que no existen (esto es común en Elastix/FreePBX cuando deshabilitamos recibir llamdas anónimas)

En esta liga encontramos el manual de los filtros de fail2ban.

Finalmente, solo nos queda activar el servicio. En Debian ya quedó instalado automáticamente, solo tenemos que arrancarlo:

/etc/init.d/fail2ban start

En CentOS, tenemos que habilitar el autoarranque para que inicie al arrancar el equipo:

chkconfig --add fail2ban
chkconfig fail2ban on
/etc/init.d/fail2ban start

Fail2ban es un excelente apoyo contra ataques que dejan registros en logs y no solo nos sirve para Asterisk, también para SMTP, SSH, HTTP o cualquier otra cosa que queramos monitorear. Esto, en conjunción con buenas prácticas de seguridad para Asterisk, nos darán un sistema más confiable y menos propenso a sufrir daños por parte de atacantes.

¡Suerte!

 

Christian Cabrera

Soy ingeniero en comunicaciones con especial interés en el área de voz sobre IP y tecnologías sobre información. He usado Asterisk de manera diaria desde hace más de 18 años. En el 2011 co-fundé Enlaza Comunicaciones, una empresa que se especializa en brindar servicios profesionales de consultoría sobre voz sobre IP basadas en Asterisk, así como servicios de interpretación simultánea y traducción.