Configuración práctica de Asterisk (15): Protegiendo Asterisk con Fail2ban

Asterisk, al igual que el resto de aplicaciones conectadas a Internet, es atacado constantemente desde el exterior. Estos ataques tienen normalmente como objetivo el realizar llamadas telefónicas a través de nuestro Asterisk y para ello suelen utilizar el contexto default, que es el contexto a donde van todas las llamadas entrantes que provienen desde sistemas con los que no hay un trunk establecido.

Ejemplo de ataques a Asterisk a través de llamadas al contexto “default”

Estos ataques no tienen éxito si dentro del contexto “default” del dialplan se cuelgan todas las llamadas entrantes, sea cual sea el número marcado:En cuanto un servidor de Asterisk está expuesto al exterior, también son frecuentes los ataques que intentan el registro de una extensión en el sistema. Estos ataques son del tipo de “fuerza bruta” y  van probando de forma sistemática con números de extensión utilizados habitualmente (101, 102, 102….200, 201, 202……..300, 301, 302……..400, 401, 402, ……) y con password sencillas, como 1234, 101, 102, 0000, etc. Es necesario por tanto utilizar password lo suficientemente complejas para que no puedan ser encontradas fácilmente por estos ataques de fuerza bruta. Obviamente, si el atacante consigue registrar una “falsa extensión” en el sistema Asterisk atacado, el siguiente paso será intentar hacer llamadas fraudulentas a través de ese Asterisk y saliendo hacia la red de telefonía pública por el enlace establecido con el operador de VoIP. Estos ataques, en el caso de tener éxito, supondrán un claro perjuicio económico para el propietario del sistema Asterisk atacado.

Ataques para el registro de falsas extensiones IP en el sistema

Otra medida de seguridad que se toma habitualmente en los sistemas en producción es el parámetro alwaysauthreject=yes en la sección [general] del fichero sip.conf. De esta manera, ante un intento fraudulento de registro, Asterisk devolverá la misma respuesta tanto si el fallo se ha producido con el número de extensión o si se ha producido con el password, evitando que el atacante pueda identificar números de extensión válidos en el sistema. 

La seguridad en el enlace con el operador de VoIP suele estar asegurada en la mayoría de los casos mediante la combinación de varios procedimientos. En el aula de telefonía del CIFP Tartanga disponemos de un enlace SIP con el operador Sarenet, el cual dispone de las siguientes medidas de seguridad:

  • Petición de un nombre de usuario y una contraseña válidas para poder hacer llamadas salientes a través del trunk o enlace.
  • Filtrado por IP, permitiendo el operador de VoIP establecer el enlace o trunk desde una dirección IP conocida.  
  • Número de canales limitado.
  • Límite en el gasto diario.
    Filtrado por IP, número de canales y límite de gasto diario

Configuración de las direcciones IP permitidas

El conjunto de medidas anteriores debe ser complementado con la existencia de un firewall que bloquee todo tipo de accesos indeseados, ya sea desde determinadas direcciones IP como a través de puertos que no deben estar abiertos. No obstante, este tipo de control no basta para garantizar la seguridad del sistema, ya que los ataques provienen de múltiples direcciones IP que cambian continuamente. En estos casos es recomendable utilizar una herramienta automática de detección y bloqueo de ataques, como Fail2ban.

Fail2ban

Fail2ban escanea los ficheros log de diferentes servicios, entre ellos Asterisk, y examinando el contenido de estos log es capaz de detectar ataques maliciosos, pudiendo a continuación introducir reglas en el cortafuegos (por defecto, iptables) para bloquear el acceso desde esas direcciones IP durante un tiempo determinado. Fail2ban también puede enviar notificaciones por correo electrónico al administrador del sistema cuando detecta ataques maliciosos.  En la siguiente figura se muestra la instalación de Failban sobre un  Ubuntu 16.04.3 LTS:

Instalación de Fail2ban sobre Ubuntu 16.04.3 LTS

Una vez instalado, en el directorio /etc/fail2ban encontramos lo siguiente:

El fichero fail2ban.conf, entre otras cosas, hace referencia a la base de datos donde Fail2ban almacenará la información, que es Sqlite3, y el tiempo asignado para el borrado de las direcciones IP bloqueadas, que por defecto es 86400 segundos (24 horas). Para un uso habitual de Fail2ban, no es necesario realizar ninguna modificación en este fichero.

En el directorio jail.d encontramos un fichero de configuración por defecto para sistemas Debian, donde tan solo se indica que Fail2ban debe vigilar las conexiones SSH.

El fichero jail.conf contiene las configuraciones por defecto de todas las “celdas” o “jails” donde aparecen, entre otros, los siguientes parámetros: 

  • ignoreIP: listado de direcciones IP que son ignoradas por Fail2ban.
  • bantime: el tiempo en segundos durante el cual un host está prohibido. Por defecto este tiempo está establecido en 3600 seg (1h).
  • maxretry: el número de ataques maliciosos permitidos para un determinado host antes de que sea prohibido su acceso. Por defecto está establecido en 5 intentos.
  • findtime: el tiempo durante el cual se contabilizan los intentos de ataque malicioso de un determinado host para alcanzar el valor fijado por maxretry. Por defecto está establecido en 600 segundos (10 minutos).

El fichero jail.conf también contiene las “celdas” o “jails” de cada uno de los servicios que puede vigilar. El “jail” correspondiente a Asterisk es el siguiente:

“jail” del servicio Asterisk

Al instalar Fail2ban no está activado el seguimiento del servicio de Asterisk y es necesario incluir en la sección anterior la línea enabled = true. Puesto que en una actualización de Fail2ban el fichero jail.conf será sobreescrito, se recomienda copiar este fichero en un nuevo fichero llamado jail.local y establecer en el las configuraciones deseadas. 

Fichero “jail.local” para establecer las configuraciones de “jail.conf”

Activación de Fail2ban para el control del servicio Asterisk

Se observa que en el “jail” de Asterisk aparece de nuevo el parámetro maxretry, en este caso con el valor 10. Fail2ban permite que, de forma opcional, cada “jail” en particular tenga su propio valor de “maxretry”, en este caso maxretry = 10, por lo que para el caso particular del servicio Asterisk permitirá hasta 10 “ataques” antes de bloquear la dirección IP de donde provienen dichos ataques.

En el “jail” de Asterisk también aparece el parámetro logpath que indica la ruta al fichero de log que examinará Fail2ban para encontrar posibles ataques al sistema. En el caso de Asterisk es el fichero messages situado en el directorio /var/log/asterisk/.

Por último, en el “jail” de Asterisk aparecen las acciones o action que serán llevadas a cabo cuando el número de ataques desde una dirección IP alcance el valor fijado por maxretry. En el caso de Asterisk están definidas 3 action, que se pasan como parámetros a los ficheros de action correspondientes en cada caso y que están situados en el directorio action.d

Para terminar la activación de Fail2ban con el servicio Asterisk es necesario hacer un reload del fichero jail.local

               fail2ban-client  reload

Una vez hecho el “reload” podemos consultar el estado de control del servicio Asterisk mediante la orden:

              fail2ban-client status asterisk

Y el resultado será similar al mostrado a continuación:

Estado del control de Asterisk

En la captura de pantalla anterior se observa que hay ya tres direcciones IP prohibidas (banned). También se puede apreciar que existen contadores para el número de “fallos” detectados, en este caso, 45 detecciones que cumplen los patrones de disparo de Fail2ban. Podemos comprobar que Fail2ban está funcionando correctamente simplemente introduciendo una contraseña errónea en un softphone situado sobre un smartphone con dirección IP pública 79.146.247.78. En el CLI de Asterisk veremos inmediatamente los 10 intentos rechazados de registro, tras lo cual esa dirección IP será bloqueada por Fail2ban y no aparecerán nuevos intentos fallidos de registro desde esa IP hasta que expire el tiempo de bloqueo.

Intentos fallidos de registro desde la IP 79.146.247.78

Si comprobamos ahora el estado de Asterisk desde Fail2ban veremos que la dirección IP 79.146.247.78 está bloqueada en el cortafuegos (iptables) y, de acuerdo a la configuración existente en jail.local, permanecerá bloqueada durante 3600 seg (1 hora).

Bloqueo por Fail2ban de la dirección IP 79.146.247.78

En cuanto al funcionamiento de Fail2ban, en el directorio filter.d encontramos una serie de filtros para un buen número de aplicaciones que se ejecutan como servicios sobre sistemas operativos Linux, entre ellas Asterisk, la variante de Asterisk en centralitas IP denominada freeswitch, el servidor apache, el servidor ssh, el panel de control directadmin, nagios, el servidor de correo empresarial kerio, el cliente de correo openwebmail y otras muchas más. Cada “jail” llama al filtro cuyo nombre coincide con el nombre del “jail”. En el caso del “jail” de nombre [asterisk] se llamará al filtro asterisk.conf.

Filtros disponibles en Fail2ban

Dentro de cada uno de estos filtros se encuentran las expresiones regulares que se utilizan para comprobar si en el fichero de log examinado aparece alguna de las palabras clave incluidas en dichas expresiones regulares. El fichero de log de Asterisk es el fichero messages situado en el directorio /var/log/asterisk y como se puede observar, en este fichero se encuentran las expresiones regulares para verificar fallos de autentificación en Asterisk.

Fichero de expresiones regulares para el filtro de Asterisk

Si se observa dicho fichero de expresiones regulares, se aprecia que se van a buscar coincidencias en el fichero messages de Asterisk de términos como los siguientes:

  • Wrong password|Username/auth name mismatch|No matching
  • rejected because extension not found in context ‘default
  • failed to authenticate as
  • No registration for peer
  • etc

Estas expresiones aparecen en el fichero de log de Asterisk cada vez que se produce una situación de Notice, Warning o Error, según se configura habitualmente en el fichero logger.conf del propio Asterisk.

Muestra del fichero messages de Asterisk

Aunque con las expresiones regulares aportadas por Fail2ban es suficiente para un control efectivo de los ataques a Asterisk, es posible crear nuevas expresiones regulares para ataques específicos no incluidos en esta configuración básica de Fail2ban.

Por último, en el directorio action.d se encuentran los ficheros con las diferentes acciones que se pueden llevar a cabo cada vez que se verifica el valor maxretry para un determinado servicio bajo vigilancia de Fail2ban. Estas acciones se refieren en su mayoría al bloqueo o desbloqueo de una dirección IP en el firewall y al envío de una notificación por correo electrónico al administrador del sistema.

Ficheros de acciones dentro del directorio action.d

Fail2ban tiene la utilidad desde la línea de comandos fail2ban-client que nos permite llevar a cabo las siguientes funciones:

  • fail2ban-client -h: permite consultar la ayuda con todos los comandos de consola disponibles.
  • fail2ban-client status <jail>: permite consultar el estado de un “jail” en concreto, y conocer las IPs que han sido bloqueadas para dicho servicio.
  • fail2ban-client set <jail> banip <dirección IP>: para introducir de forma manual una dirección IP dentro del grupo de direcciones bloquedas.
  • fail2ban-client set <jail> unbanip <direccion IP>: para desbloquear una determinada dirección IP.

En las siguientes figuras se muestra un ejemplo de desbloqueo manual de una dirección IP que se encuentra bloqueada por Fail2ban:

Dirección IP bloqueada por Fail2ban

Desbloqueo manual de la dirección IP 

Como se ha indicado anteriormente, es posible crear expresiones regulares dentro de Fail2ban. Mediante la utilidad fail2ban-regex es posible evaluar de forma manual el funcionamiento de esas expresiones regulares contra un determinado archivo de log.

Enlaces consultados para la elaboración de esta entrada:

Esta entrada fue publicada en Telefonía IP. Guarda el enlace permanente.

Deja un comentario

Tu dirección de correo electrónico no será publicada.