Curso Asterisk (VII): Seguridad

Desde el capítulo 5 estamos conectados a proveedores VoIP, lo que significa que un atacante malintencionado podría generarnos pérdidas económicas si no tuviéramos bien configurado nuestro Asterisk.

Configurarlo correctamente no parece complicado: das de alta tus extensiones y tus proveedores, y listo. Todo tiene clave, todo parece estar bien. ¿Seguro? Desgraciadamente, la implementación SIP de Asterisk es insegura en su configuración por defecto y necesitaremos saber lo que estamos haciendo para proteger nuestro sistema de usos no autorizados.

Pero que no cunda el pánico, porque si has seguido el curso al pie de la letra, ya has ido aplicando sin saberlo una gran parte de las medidas que detallaremos en el presente capítulo. Aun así presta atención, ya que es necesario conocer ciertos detalles para no meter la pata cuando crees por ti mismo tu configuración, y para poder llevar a cabo otras cosas que hasta ahora no hemos hecho.

 

1. Cambia el puerto por defecto

Estás en tu casa, tienes una IP dinámica, y te sientes seguro. ¿Crees que nadie escaneará tu Asterisk desde el exterior? Te equivocas.

Existe un importante negocio de venta de minutos de voz a través de servidores vulnerables, por lo que el puerto 5060/UDP es ampliamente escaneado en Internet. Si no quieres que tu servidor forme parte de esta red lo mejor es que no lo encuentren, y un primer paso es cambiar el puerto por defecto para pasar un poco más desapercibidos.

Modifica el puerto en la propiedad udpbindaddr de /etc/asterisk/sip.conf, eligiendo un valor por encima de 1024 que no esté en la lista de puertos conocidos. En este ejemplo usaremos el 42187, pero tú debes elegir otro:

A continuación reinicia Asterisk. Después, tendrás que reconfigurar tus clientes y la tabla NAT de tu router para reflejar el cambio de puerto.

Por supuesto, la seguridad basada en el ocultamiento de información no es una buena estrategia de seguridad, pero no nos vamos a quedar aquí. Nuestro objetivo es securizar correctamente Asterisk basándonos en otros mecanismos. Este primer punto simplemente persigue el objetivo de ser más discretos bajo el radar.

 

2. Cambia el User Agent

Nuestro Asterisk tiene la mala costumbre de dar demasiada información. Concretamente indica a cada visitante que se trata de un servidor Asterisk e informa de la versión exacta que estamos utilizando. No hay mayor problema en que indique lo que es, pero es una mala idea que devuelva la versión. Vamos a cambiarlo.

Debemos editar /etc/asterisk/sip.conf y añadir la propiedad useragent en la sección general:

Como siempre, hay que reiniciar Asterisk para que los cambios se apliquen.

 

3. El contexto por defecto siempre es de rechazo

Cuando un usuario no autenticado accede a nuestro Asterisk, se utiliza el contexto definido en la sección [general] para definir las acciones que puede realizar este usuario. Por supuesto no vamos a permitir usuarios anónimos en nuestro sistema, pero debemos asumir que esta situación podría darse ante la aparición de un bug de seguridad o por una mala configuración.

Para minimizar los riesgos y la capacidad de acciones de un atacante anónimo, siempre vamos a definir un contexto en la sección [general] que no permita hacer nada. Es decir, colgará toda llamada incondicionalmente.

De esta manera, un atacante anónimo que consiga pasar por alto la autenticación no podrá realizar llamadas.

 

4. No permitas invitados

Asterisk por defecto permite que usuarios sin autenticar hagan llamadas a través del sistema. ¿Cómo es eso? Mira:

Parámetro Valor por defecto Descripción
allowguest yes Permite que los usuarios anónimos (sin autenticar) realicen llamadas a través del contexto definido en [general]

Para evitarlo tendremos que añadir la siguiente línea a nuestra sección [general]:

Sin esta línea, y sobre todo si tampoco has hecho lo indicado en el paso anterior, cualquiera podrá realizar llamadas a través de tu sistema sin necesidad de disponer de usuario y clave válidos.

 

5. No filtres información de extensiones

Otro problema es la exposición a ataques de fuerza bruta. Encontrado un servidor Asterisk, lo primero es dar con una extensión válida para empezar a probar claves sobre ella. La mayoría de servidores Asterisk tendrán definidas extensiones internas numéricas de tres o cuatro dígitos en total, así que es cuestión de probar el rango de extensiones [100, 9999]. Esto se puede hacer en muy poco tiempo con herramientas específicas, por ejemplo con SIPVicious.

Por defecto, Asterisk devuelve una respuesta diferente en función de si el usuario ha intentado registrarse con una extensión válida, aunque la contraseña enviada sea incorrecta. Esto permite a un atacante encontrar rápidamente nuestras extensiones para, a continuación, comenzar ataques de fuerza bruta sobre ellas.

Debemos configurar nuestro Asterisk de tal forma que siempre ofrezca la misma respuesta independientemente de si la extensión es válida o no. Esto evita problemas de fugas de información (information leakage) a nuestros atacantes.

Parámetro Valor por defecto Descripción
alwaysauthreject no Devolver siempre la misma respuesta independientemente de si el usuario es válido o no.

Debemos añadir la siguiente línea a nuestra sección [general]:

 

6. La configuración NAT siempre en la sección general

Este es otro problema de filtrado de información de extensiones. Para entenderlo tenemos que saber cómo funciona SIP detrás de un NAT.

Cuando un cliente envía una petición a nuestro servidor, dentro del paquete SIP se especifica la IP y puerto a la que el servidor debe enviar la respuesta. El problema es que, si el cliente está detrás de un NAT, la IP y puerto indicados en la cabecera SIP se corresponden con su red interna privada, que no es alcanzable por el servidor. Cuando especificamos en la configuración de Asterisk “nat=force_rport”, estamos indicando al servidor que ignore la dirección de respuesta indicada en la cabecera SIP, y en su lugar utilice la indicada en el datagrama UDP, que está manipulada por el router NAT y apunta correctamente al servidor.

El problema de especificar “nat=force_rport” en cada extensión, como muchos ejemplos sugieren, es que cambia la respuesta del servidor en función de si la extensión existe o no. Un atacante podría ir probando extensiones componiendo un mensaje con un puerto en su cabecera SIP, y otro puerto diferente en su datagrama UDP. En función de en qué puerto reciba la respuesta sabrá si la extensión existe.

Para evitarlo, deberemos especificar la configuración NAT en la sección [general], para que así el servidor tenga un comportamiento uniforme.

Esto es algo que curiosamente no se suele mencionar, y la recomendación en la mayor parte de los ejemplos es especificarlo por extensión. A mi juicio, hacerlo por extensión supone un gran riesgo de seguridad.

 

7. Cuidado con los “insecure”

Nunca tengas un “insecure=very” o “insecure=invite” en la definición de una extensión interna de tu Asterisk. Si lo haces, estás permitiendo que cualquiera pueda hacer llamadas sin autenticarse con contraseña. Es decir, estarías permitiendo realizar llamadas sólo con adivinar una extensión válida. Esto es algo que también se ve en algunos ejemplos disponibles en Internet, así que cuidado con el copy&paste.

El parámetro “insecure=invite” (o “insecure=very”) se utiliza sólo en las conexiones con proveedores, ya que permite que ellos se comuniquen con nosotros sin tener que autenticarse, principalmente para entregarnos llamadas. Esto no supone un riesgo, ya que en este caso, el contexto definido para el proveedor lo que hará será hacer sonar una de nuestras extensiones internas, pero no realizar gasto a través de otro proveedor.

 

8. Limita el número de llamadas simultáneas

Si tu sistema se ve comprometido y un atacante tiene la oportunidad de realizar llamadas a través de tu Asterisk, no interesa que pueda canalizar demasiadas llamadas en paralelo.

Aunque normalmente los proveedores que utilicemos ya tienen una limitación de llamadas por su propia seguridad, es conveniente que nosotros también especifiquemos nuestros propios límites. Esto es tan simple como especificar el siguiente parámetro en cada extensión que hayamos definido:

Podéis especificar un límite razonable para minimizar los daños en caso de que nos veamos comprometidos, sin que ello nos limite nuestro propio uso razonable.

 

9. Revisa el registro de llamadas (CDR)

Esta es una tarea manual, pero es conveniente realizarla de vez en cuando. Asterisk guarda registro de todas las llamadas entrantes y salientes, y conviene echarle un vistazo de vez en cuando en busca de actividad sospechosa.

Los logs de llamadas están en la ruta: /var/log/asterisk/cdr-csv/Master.csv

Si lo prefieres, en el logrotate puedes hacer que se envíe una copia a tu email. Consulta la documentación de logrotate para saber cómo hacerlo.

 

10. Utiliza Fail2Ban

Lo que viene aquí es aplicable a Asterisk 10 o superior.  Las versiones anteriores no disponen de un log específico para seguridad, y Fail2Ban no será capaz de detectar todos los ataques posibles contra nuestra centralita.

Fail2Ban es una herramienta utilizada para detener accesos por fuerza bruta mediante IpTables. Su funcionamiento se basa en el análisis de logs en busca de patrones. Cuando detecta cierto número de intentos en un intervalo de tiempo, bloquea la IP del atacante añadiendo una regla de rechazo en IpTables. Es una herramienta fundamental para proteger cualquier servidor expuesto a Internet.

Primero debemos activar el log de seguridad en la configuración de Asterisk, y cambiar el formato de fecha del log para que Fail2Ban lo pueda interpretar correctamente. Debemos editar el archivo /etc/asterisk/logger.conf para hacer dos cambios:

Tras las modificaciones, recarga la configuración del logger:

Para instalar Fail2Ban en Debian y derivados debemos hacer:

Una vez instalado debemos añadir un filtro específico para el log de seguridad de Asterisk. Crea un nuevo archivo en /etc/fail2ban/filter.d/asterisk.conf con el siguiente contenido:

A continuación, debemos añadir las reglas para Asterisk en la configuración de Fail2Ban. Concretamente vamos a hacer que si un usuario comete 5 fallos en 24 horas, se le baneará de todo el servidor durante otras 24 horas. Esto limita a los atacantes a hacer un máximo de 5 intentos al día.

Añade este contenido al final de /etc/fail2ban/jail.conf

Reinicia el servicio de Fail2Ban para aplicar los cambios y ya estaremos protegidos:

Para conocer el estado de Fail2Ban con nuestra regla de Asterisk y ver cuántos atacantes ha filtrado, haremos lo siguiente:

Además de proteger nuestro Asterisk, Fail2Ban incluye por defecto reglas para diversos servicios, entre ellos SSH. Nuestro servidor estará ahora mucho mejor protegido frente a ataques de fuerza bruta.

 

Bonus Track: Malas Prácticas

  • No declarar “allowguest=no” en [general]
  • No declarar “alwaysauthreject=yes” en [general]
  • Permitir hacer llamadas desde el contexto definido en [general]
  • Definir la configuración NAT por cada peer, y no en [general]
  • Indicar “insecure=very” o “insecure=invite” en extensiones propias

Por cada uno de estos errores que cometas, ¡golpe de remo!

golpe_remo

Índice del Curso Asterisk:

17 pensamientos en “Curso Asterisk (VII): Seguridad

  1. Estimado Axelco,

    Para comentarte que soy noobs en Asterisk vengo leyendo viendo y tratando de entender todo lo relacionado a asterisk, estuve leyendo muchos post sobre Asterisk y la verdad que no entendia mucho.
    Hasta que me tope con tu blog y me aclaro muchas dudas sobre todo y muy bien explicado con ejemplos te felicito de antemano x querer compartir esta informacion importante ya para muchos y te felicito( viva el software libre).

    Pero queria hacerte una pregunta si esta pensado poder ampliar mas este asterisk, me refiero a que quizas podrias tocar el tema de equipos Gateway FXS/FXO y quizas poder hacer un ejemplo de como conectarlo 2 sedes de diferentes operadores de internet, de antemano gracias y felicitaciones por todo lo hecho. lmL

  2. Hola Raúl,

    No lo tenía planificado, pero podría hablar un poco del uso de dispositivos FXS con Asterisk, concretamente del Cisco SPA112, que es el que tengo. Ya hablé un poco de la configuración regional española para este dispositivo, pero no de su integración con Asterisk. Dispositivos FXO no tengo ninguno, así que no podría tratar ese tema.

    Gracias por tus felicitaciones.

    Un saludo.

  3. Hola que tal, antes que nada quiero felicitarte como los demás, no solo por tu dedicación, sino por el tiempo y las molestias en responder comentarios. Aún no termino el manual y me gustaría saber si tienes esta versión en pdf con corrección de problemas es decir, tuve problemitas al correr el comando “./configure” y después de ese en “make menuselect”, busqué en google y afortunadamente encontré solución siguiendo unos pasos. Lamentablemente soy nuevo en linux, aun me considero usuario y aunque ya van varias veces que instalo asterisk, nunca había encontrado manuales tan extensos como el tuyo. Un defecto o virtud (no lo se) que poseo es el que no me gusta quedarme con las dudas, por lo cual a veces no solo me gusta copiar y pegar el código que veo, tu lo has hecho muy bien por que explicas de manera excelente todo, solo me gustaría que agregaras algún apartado para “Problemas comunes” algo donde incluyas requerimientos, actualizaciones y la distro a la que va enfocada. Quizá esto parezca demasiado pero bueno no está de más intentar solicitarte un “extra”, claro si tu tiempo y disposición te lo permite.
    De nuevo quiero felicitarte por este trabajo y, aunque quizá no lo parezca algunos si lo valoramos, saludos y que tu cualidad de compartir el conocimiento no se te acabe.

  4. Hola Miguel,

    Gracias por tus comentarios. Sobre lo que comentas de “Problemas comunes”, ya suelo hablar de ellos dentro de mis artículos, aunque no los centro en una sección aparte.

    La instalación de Asterisk está enfocada a Debian 7, que es el sistema que vengo a utilizar habitualmente. Si lo has intentado instalar en una distribución diferente quizá los requisitos previos varíen, y por eso hayas tenido problemas con el “./configure”. Te faltaría alguna dependencia.

    Un saludo.

  5. Solo escribía para agradecer la información y tu dedicación sobre el tema otros materiales pueden ser algo confusos sobre las configuraciones, te quería preguntar acerca de paging e intercom para realizar llamadas en conferencia te agradecería si me podrías dar alguna guía donde pueda revisar material sobre el tema, de nuevo te reitero las gracias por el tiempo que dedicaste a la guía

  6. No me voy a repetir, aunque sé que agrada cuando se hacen las cosas bien. Sólo quería decirte que con gente tan generosa como tú, que dedica su tiempo a enseñar gratis a los demás, este mundo sería un mundo mejor. Enhorabuena.

  7. Vuestros comentarios me animan a seguir. Muchas gracias a todos.

    Tengo aun planificados otros 6 capítulos abordando cuestiones más técnicas y avanzadas. El curso está un poco parado en estos momentos, pero espero poder publicar el siguiente capítulo a lo largo de este mes.

  8. Espectacular ayuda, super bien documentado!!

    Es un gustazo encontrarte con estos aportes. Un 10 y por que no hay mas.

  9. Axel, a ver si cuando puedas nos dejas el sip.con y extensions.conf, reducido a su minima expresion sin comentarios ni opciones demos, que no sea necesarias y compromentan el servidor asterisk.

    Un saludo y de nuevo GRAN TRABAJO

  10. Hola Axelko

    Excelente tu informacion, estuve buscando y buscando y hasta alfin encuentro algo bueno 😀

    tengo una Elastix 2.4.0-18, estuve verificando tu tutorial, cuando ingreso al sip.conf me aparece estas lineas:

    ;——————————————————————————–;
    ; Do NOT edit this file as it is auto-generated by FreePBX. All modifications to ;
    ; this file must be done via the web gui. There are alternative files to make ;
    ; custom modifications, details at: http://freepbx.org/configuration_files ;
    ;——————————————————————————–;

    quiero estar seguro que puedo eliminarlas sin problema alguno o debo realizar los cambios desde FreePBX como lo indica.

    Gracias antemano

    Saludos

  11. Hola José,

    No conozco FreePBX, pero lo que indica es que ese archivo de configuración se genera automáticamente, supongo que por la herramienta de configuración web de FreePBX. Es probable que el archivo se sobreescriba cada vez que hagas un cambio, así que deberías realizar los ajustes desde la interfaz. Ahí ya no te puedo ayudar, ya que no conozco el producto.

    Un saludo.

  12. Muchas felicidades por tu blog, aparte de muy completo, muy entendible, hace poco por cuestiones de trabajo que comencé a buscar temas acerca de Asterisk, hasta que me topé con tu excelente blog, ahora lo que quiero es configurar mi Asterisk desde cero a ver como me va, por lo pronto apliqué algunos de los temas de seguridad que es lo que me trajo hasta aqui, para ver como me va, ya te estaré platicando más adelante, como me fue, tanto en mi seguridad como en la nueva instalación, nuevamente felicidades y estoy muy agradecida de que compartas tus conocimientos, sobretodo de una forma tan práctica y explícita.

    Saludos.

  13. Gracias por tu comentario, Marilu. Me alegro de que el blog te esté resultando de ayuda. Ánimo con tu instalación, ya verás como es más sencillo que lo que parece.

    Un saludo.

  14. hola, muchas gracias por compartir tu sabiduria

    quiero hacer una pregunta quiero usar freepbx para mi pequeño locutorio, que recomendaciones de seguridad me das, solo lo voy a utilizar en mi red local.

    gracias

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *