martes, 6 de agosto de 2013

SRTP y TLS en Elastix Actualizado

Hace un tiempo escribí un artículo sobre SRTP y TLS en Elastix.
La ventaja de Elastix es que cuenta con el soporte necesario para soportar esta funcionalidad.
Lo primero que se debe hacer es editar el archivo "/var/www/html/admin/modules/core/functions.inc.php". Se recomienda hacer una copia del archivo antes de editarlo.

# vim /var/www/html/admin/modules/core/functions.inc.php

Aproximadamente en la línea 3800 se tiene lo siguiente:

array($account,'deny',$db->escapeSimple((isset($_REQUEST['deny']))?$_REQUEST['deny']:''),$flag++),                    array($account,'permit',$db->escapeSimple((isset($_REQUEST['permit']))?$_REQUEST['permit']:''),$flag++),
array($account,'disallow',$db->escapeSimple((isset($_REQUEST['disallow']))?$_REQUEST['disallow']:''),$flag++),
array($account,'allow',$db->escapeSimple((isset($_REQUEST['allow']))?$_REQUEST['allow']:''),$flag++)

Después de esas líneas se agrega lo siguiente:

array($account,'encryption',$db->escapeSimple((isset($_REQUEST['allow']))?$_REQUEST['allow']:''),$flag++),
array($account,'transport',$db->escapeSimple((isset($_REQUEST['allow']))?$_REQUEST['allow']:''),$flag++)

No olvidarse de agregar una coma al final de la línea que dice allow.

Y en la línea 6012 se tiene:

$tmparr['deny'] = array('value' => '0.0.0.0/0.0.0.0', 'level' => 1);
$tmparr['permit'] = array('value' => '0.0.0.0/0.0.0.0', 'level' => 1);

Agregar después de esas líneas lo siguiente:

$tmparr['encryption'] = array('value' => 'no', 'level' => 1);
$tmparr['transport'] = array('value' => 'udp', 'level' => 1);

Con esas dos modificaciones lo que se hace es agregar dentro del formulario html y del archivo sip_additional, que son utilizados para la configuración de extensiones, los campos encryption y transport.

Una vez hechos los cambios aparece lo siguiente:


El siguiente paso es la creación de una autoridad de certificación y los certificados tanto para el servidor como para el cliente. Para esto se utilizará los scripts que vienen dentro de la documentación de asterisk.
Estos scripts están en la carpeta "/usr/share/doc/asterisk-11.4/contrib/scripts"
Para generar el certificado de la CA como del servidor se ejecuta lo siguiente (dentro de la carpeta antes mencionada):

# mkdir certs


./ast_tls_cert -d certs -C mi-elastix.mi-dominio.lan -o mi-elastix.mi-dominio.lan

Para generar el certificado se recomienda hacerlo con el fqdn del servidor que en este caso es mi-elastix.mi-dominio.lan.
Para setear el fqdn en servidor se debe editar el archivo "/etc/hosts", y el archivo "/etc/sysconfig/network".
Los archivos quedarian de la siguiente forma:

# vim /etc/hosts

127.0.0.1      mi-elastix.mi-dominio.lan     mi-elastix       localhost.localdomain  localhost

# vim /etc/sysconfig/network

HOSTNAME=mi-elastix.mi-dominio.lan

Y para no reiniciar el servidor:

# hostname mi-elastix.mi-dominio.lan

Los nombres mi-elastix y mi-dominio deberan ser reemplazados por los valores correspondientes, de acuerdo al nombre de servidor y dominio en el cual funciona el servidor con Elastix.

Es recomendable añadir un A record al DNS interno, para que los hosts dentro de la red lan puedan resolver mi-elastix.mi-dominio.lan a la dirección IP del servidor Elastix.

Una vez generados los certificados tanto para la autoridad de certificación como para el servidor, se copian los siguientes archivos a la carpeta keys de asterisk:

# cp certs/ca.crt /var/lib/asterisk/keys# cp certs/mi-elastix.mi-dominio.lan.pem /var/lib/asterisk/keys

Se deben dar los permisos de lectura o cambiar de propietario a los archivos copiados a la carpeta keys de asterisk, para que asterisk los pueda cargar:

# chown -R asterisk:asterisk /var/lib/asterisk/keys/*

Luego vamos al explorador, ingresamos al Elastix y habilitamos el acceso al FreePBX no embebido, esto se lo hace yendo a la pestaña Security -> Advanced Options -> Enable access to FreePBX -> ON. Luego en una nueva pestaña del explorador se debe poner lo siguiente:

https://ip-del-elastix/admin

Aqui va a solicitar el usuario y contraseña para ingresar.

Una vez adentro de FreePBX no embebido, se debe ir a la sección (ubicada en la esquina superior izquierda) Tools -> Asterisk SIP Settings. Aquí se pueden editar las configuraciones generales para SIP. En la parte final hay una sección que dice Other SIP Settings, ahi ponemos lo siguiente:

tlsenable=yes
tlsbindaddr=0.0.0.0
tlsdontverifyserver=yes
tlscertfile=/var/lib/asterisk/keys/mi-elastix.mi-dominio.lan.pem
tlscafile=/var/lib/asterisk/keys/ca.crt

Y se aplican los cambios.
Para saber si los cambios se aplicaron correctamente se puede ver que asterisk ahora tambien escucha el puerto TCP 5061.

# netstat -atunp | grep asterisk

Para habilitar el soporte TLS para una extensión, en el campo transport se debe cambiar "udp" por "tls".
Para habilitar el SRTP, se cambia el campo encryption "no" por "yes".
Todo esto se hace en la configuración de la extensión haciendo los cambios detallados al comienzo de la entrada.

Por último se debe cambiar la configuración de los terminales.

Para el caso de los teléfonos Yealink, en la configuración de las cuentas Account -> Cuenta 1 -> Basic -> Transport -> TLS. Y en Account -> Cuenta 1 -> Advanced -> Voice Encryption (SRTP) -> On. También se debe cambiar el puerto de registro, en lugar del 5060 el 5061.

Para el caso de softphones, la configuración es similar. En la mayoria de casos se debe especificar que el puerto para el registro, que es el 5061.

En el caso de tener el BRIA, para el cliente Android, la configuración es sencilla. Para el cliente Windows, nos pide cargar un certificado, este certificado debe ser el mismo certificado generado para el servidor. Aqui es donde entra a trabajar el fqdn y el A record en el DNS, que son utilizados por el BRIA para la verificación del certificado.
Lo interesante del BRIA es que permite hacer video-llamada, y se encripta tanto el audio como el video. Lo malo es que se tiene que comprar una licencia para hacer video-llamadas.

Los teléfonos Grandstream soportan TLS y funcionan correctamente. Lo que no funciona correctamente es el SRTP, pero existe una solución, un parche para asterisk, eso significa que hay que recompilar asterisk, agregando el parche. El parche esta hecho para asterisk 1.8.4, por lo que habría que adaptarlo a la última versión disponible de asterisk para Elastix que es la 11.4. Si el tiempo me da, y se presenta la necesidad, estaré intentando parchar Asterisk, sino espero que alguién lo haga y lo comparta con todos.

Si tienen alguna duda, inquietud o corrección que hacer, estaré atento a lo que me digan.

Con esto espero solucionar el molesto asunto de tener que dar permisos para que se bajen el archivo functions.inc.php de los artículos anteriores.

Comenten que tal les parece el artículo.

12 comentarios:

Anónimo dijo...

Son destacables cada uno de tus posts. De parte de Soborno de la comunidad Elastix, se agradece por el tiempo que destinas a ello.

Por otra parte, te comento que pretendo linkear el contenido de tu blog a las preguntas del foro de Elastix que lo ameriten.

Saludos,
Claudio

Rigoberto Flores Segura dijo...

Juan buenas tardes hice lo que comentas en el archivo Functions pero al momento de entrar al elastix en extensiones no aparece lo adicional, tengo elastix 2.4 y asterisk 11.5. Gracias.

Unknown dijo...

Reinicia apache.
/etc/init.d/httpd/restart

Unknown dijo...

Rigoberto Flores Segura ,
si aun tienes el problema te aconsejo:
usar el editor vim; el archivo tiene un formato.. se deben de respetar los espacios y el tab de lo contrario nuca va a funcionar o mostrar en el html de la interfaz de elastix....

Juan Almeida,
le doy un agradecimiento por la información ya que es de vital importancia, me gustaría saber si existe la manera o posibilidad de autenticar un teléfono ip o un softphone, principalmente un móvil pero por su dirección MAC a una cuneta sip...

Unknown dijo...

En este momento no, y tampoco le veo tan util, ya que facilmente se puede clonar la MAC de un dispositivo.
Que te recomiendo hacer:
Usar contraseñas fuertes, un comando que utilizo para generar passwords es `mkpasswd`.
Usar un contexto distinto a "from-internal".
Usar un firewall pero sobre todo configurar correctamente fail2ban. En la siguiente página encontraras una excelente guia para configurar fail2ban: elajonjoli.org
También aumentaría la seguridad configurando las opciones allow y deny de cada extensión, limitando el rango de IPs que pueden registrarse.
Algo que si me interesaría desarrollar es tener un SIP username distinto al número de extensión, eso si que le agregaría un nivel de seguridad a Elastix.

Unknown dijo...

Para la versión de Elastix 2.4 con Asterisk 11.7.0-2 ya se encuentra aplicado el parche para poder hacer uso del SRTP en los teléfonos Grandstream.

Anónimo dijo...

Alguien ah usado SRTP y TLS en teléfonos AAstra 67XX?

Por cierto, muy buen tutorial. Ya me funciona en softphone, ahora solo falta que me funcione en los teléfonos Aastra 67XX y después tengo que ver si los Cisco 79XX.
Saludos

Anónimo dijo...

Hola Juan

Realice todos pasos como lo dijiste pero al configurar mis extensiones en mis telefonos estos no se firman.

espero me puedas contestar y resolver este problema

gracias.

Unknown dijo...

Que marca de teléfonos usas?
Cuales son los errores que te muestra el log?

Anónimo dijo...

Hola Juan

sera que me puedas dar tu correo para poder tener una mejor comunicación te lo agradeceria muchisimo.

Este es el mio
eduardo.fuente@tucur.com.mx

Gracias por responder.
saludos

Unknown dijo...

Mi correo es juanelojga@gmail.com

aprendeconcastro dijo...

en mi caso tengo Zoiper tengo la version Elastix C:\Elastix-2.5.0-STABLE-x86_64 y deseo cifrar las llamadas VoIP agradeceria mucho la ayuda