jueves, 11 de abril de 2013

Usuario para ver CDRs sin permisos de administrador en Elastix

Elastix es un proyecto opensource muy interesante, logrando mediante la integración de varios otros proyectos una solución de comunicaciones unificadas. Si bien su core es Asterisk, también logra funcionalidades extra integrando Hylafax, Openfire, Postfix, entre otros y por supuesto desarrollo interno y de la comunidad hacia este proyecto.

Posee un sistema de reportes muy bueno, si leemos la historia del proyecto su comienzo fue como un sistema de reportería para Asterisk y no como un sistema de comunicaciones unificadas. También maneja un esquema de usuarios/permisos en el cual permite generar distintos grupos con diferentes accesos a cada uno de los features.

Una de las cosas que entiendo le hace falta es poder generar un usuario/grupo para ver los reportes de llamadas sin necesidad de darle permisos de administrador. Si bien se puede crear, este puede ver únicamente los registros de la extensión asignada y no de todas las extensiones.


Por que necesitaría un usuario ver todos los reportes y no ser administrador?

Esta es una pregunta que me la hicieron en algún momento. Es sencillo de explicar con un ejemplo.
Supongamos que instalamos Elastix en una empresa, en la cual uno de los gerentes quiere tener reportes de cuantas llamadas entrantes/salientes tiene cada uno de sus empleados, así como también el detalle puntual de a donde llama cada uno. Como administrador del equipo no me daría confianza darle acceso a la configuración completa del sistema si lo que necesita ver es un simple reporte.

Existe alguna solución alternativa?

Por supuesto que si, es opensource!.

Como lo hago?

Antes que nada unas aclaraciones, esto no es un manual de Elastix, por lo que no verán detalles puntuales de la configuración del mismo.

Como siempre en toda modificación, solo comparto mi experiencia, yo lo probé en versiones 2.2, 2.3 y 2.4 de Elastix. Si van a aplicar modificaciones de código, lo hacen bajo su propio riesgo.

Ahora los pasos necesarios:

  • Crear un grupo de usuarios en Elastix, en mi caso el grupo se llama "Reportes" y asignarle los permisos de acuerdo a las necesidades.
  • Crear un usuario que sea miembro de este grupo pero que no tenga ninguna extensión asignada.

  • Ahora se debe modificar el código de una de las clases PHP.
    • Realizar copia del archivo "/var/www/html/libs/paloSantoACL.class.php" para tenerlo en caso de tener que hacer un rollback.
    • Editar el archivo original "/var/www/html/libs/paloSantoACL.class.php" y buscar la función "isUserAdministratorGroup", aparecerá de la siguiente forma:


    • Modificar la función, agregando un chequeo al array de grupos para ver si el usuario pertenece al grupo que creé anteriormente, cuidado el grupo debe coincidir con el creado anteriormente.

Eso es todo, intentar ingresar al sistema con el usuario creado y verificar los CDRs.

lunes, 8 de abril de 2013

Widescreen en Linux

Desde hace varios años poseo monitores cuya resolución nativa es widescreen, en mi caso 1360x768. En una de mis PCs tengo una tarjeta de video i915 la cual siempre me funciono correctamente, incluso en dicha resolución.
Este equipo es mi PC de LAB, por lo que han pasado infinidad de distros por ella. Pero aquí me he encontrado con algunos problemas, en todas las ultimas distros no me permite seleccionar una resolución de pantalla mayor a 1024x768, obviamente al intentar colocar una resolución 4:3 a un monitor 16:9 se ve realmente mal.

También me sucedió que al actualizar una distro (Debian 6 a Debian 7 (testing)), cuando inicia X me devolvió infinidad de errores, lo gracioso de esto es que en la versión anterior (Debian 6) me reconocía esta resolución desde la instalación sin aplicar ningún workarround.



Como agrego la nueva resolución?

Bueno esto va a depender un poco de la distro que posean en su equipo, en el siguiente ejemplo trabajaremos sobre Debian 7, luego de que me dejara de funcionar tras la actualización.

  • Ejecutar el comando xrandr, con este comando verificamos que realmente la resolución no este configurada, así como también el nombre del dispositivo, en este ejemplo el dispositivo es llamado VGA1.

  • Utilizamos el comando cvt para calcular los valores VESA y así poderlos configurar posteriormente. En este caso calculamos para una resolución de 1360x768.

  • Ahora ya tenemos todos los datos para generar el archivo con la configuración para nuestra nueva resolución. El mismo se debe colocar dentro del directorio xorg.conf.d, la ubicación del mismo va a depender de la distro, pero generalmente se encuentra en "/etc/X11/xorg.conf.d/" o "/usr/share/X11/xorg.conf.d", en algunas distros nuevas no existe este directorio por lo que van a tener que configurarlo en el init de lightdm o gdm dependiendo lo que utilicen.
    En mi caso utilizando Debian 7, genere un archivo con el nombre "00-monitor.conf" dentro del directorio "/usr/share/X11/xorg.conf.d", en el cual configuro los valores de ModeLine y dispositivo que obtuvimos anteriormente.

Luego de generar el archivo reiniciamos la PC y levantará la nueva resolución, podemos verificar nuevamente con un xrandr y al veremos disponible/seleccionada.


lunes, 18 de marzo de 2013

SSH Tunneling


Como ya sabemos SSH es un protocolo de comunicaciones el cual abre un canal encriptado de tipo cliente-servidor lo cual le da un grado de seguridad mayor a otros utilizados con los mismos fines. Generalmente se utiliza para realizar login remoto a sistemas en linea de comandos, como ser sistemas UNIX o bien dispositivos de red (routers, switches, etc).

Este protocolo también puede ser utilizado para transmitir a través de su canal encriptado otro tipo de tráfico, esta metodología es llamada SSH Tunneling.

NOTA: SSH Tunneling solo funciona con tráfico TCP (por definición de protocolo, si no entienden el por que... antes de seguir leyendo el documento leer sobre capa 3 y 4 de modelo OSI, así como también los protocolos que lo constituyen).


Por que utilizar SSH Tunneling? 

Hay varios motivos por los cuales utilizar SSH Tunneling, algunos de ellos son:

  • Tenemos que acceder a un equipo en una red remota, el cual solo soporta acceso inseguro a puerto 80, obviamente no voy a querer exponer el puerto 80 hacia internet y como tengo una IP dinámica no puedo generar una regla que permita únicamente mi tráfico.
  • Un cliente al que le instalé un firewall me dice que no puede navegar en cierto sitio, pero que no sabe que error le dio el sistema ya que apagó la PC y ya va camino a su casa (típico). Tengo que de alguna forma simular estar dentro de su red para ver como es el comportamiento.





Estos casos anteriores los puedo solucionar mediante SSH Tunneling.

Hay dos tipos de túneles SSH (dinámico y estático). El estático es básicamente un port-forwarding dentro de un canal seguro, por lo cual todas las conexiones a un puerto local definido se transmitirán hacia el extremo remoto en otro puerto también definido.

En este documento veremos el dinámico  sobre el cual no es necesario definir un único puerto para trabajar, podremos utilizarlo para transmitir diversa información (http, smtp, etc).

Básicamente podemos encapsular otro protocolo TCP dentro de un canal SSH para simular estar dentro de una red remota.


Como utilizarlo? 

Esto dependerá de nuestro sistema operativo y la aplicación que utilicemos para levantar la conexión SSH al equipo remoto. Básicamente la forma en que funciona el túnel dinámico es simulando un proxy SOCKS en nuestro equipo, por lo cual lo que nosotros transmitimos a través de este SOCKS es lo que va a llegar a este destino.

Por ejemplo: Si queremos encapsular tráfico http/https, debemos configurar en nuestro navegador este proxy (que no será mas que nuestro equipo local / puerto definido). Lo mismo sucederá si queremos encapsular tráfico POP3/SMTP, nuestro cliente de correo deberá soportar un proxy SOCKS y lo debemos configurar.

Como hacemos para levantar este "proxy SOCKS"?

Aquí va a depender de la aplicación que utilicemos para levantar la conexión SSH. A continuación 2 ejemplos dependiendo del sistema operativo que se utilice, son ejemplos por lo que se podría utilizar estas u otras aplicaciones que tengan la misma funcionalidad.


  1. Mi Worstation es basada en Unix y tengo instalado el cliente ssh.

    Se debe ejecutar el siguiente comando:

    ssh –D [puerto_origen] –p [puerto_ssh_remoto] [usuario]@[ip_destino]

    Por ejemplo, para levantar un túnel hacia un servidor SSH que corre en el equipo con IP 1.1.1.1 sobre el puerto 8022 y abrir el puerto local 8081 (el cual será nuestro proxy SOCKS):

    [ping@pong ~]# ssh -D 8081 -p 8022 root@1.1.1.1

    Nos solicitará el correspondiente password y ya tendremos el túnel levantado. En este caso nos logueamos como root, pero podría ser cualquier usuario que tenga permitido SSH.
  2. Mi Workstation corre alguna de las versiones del sistema operativo Window$.

    Aparte de enviarte mi mas sentido pésame. Te puedo recomendar utilizar el cliente SSH PuTTY aunque existen otros con las mismas funciones.

    Para configurar la conexión en PuTTY se configuran los datos de host/puerto remoto, también se debe configurar el túnel, para lo que debemos configurar las siguientes opciones:

    Opción SSH, Tunnels:

    Source Port: (puerto local en el cual funcionará el proxy socks)
    Destination: Dynamic


Ahora ya tenemos el túnel levantado y nuestro proxy SOCKS corriendo, lo que debemos hacer es configurar la aplicación la cual queremos encapsular. Recordar siempre que hay que configurarlo como proxy SOCKS, la IP del proxy es nuestro propio equipo (loopback) y el puerto del proxy es el que definimos al momento de generar la conexión (en nuestro ejemplo anterior 8081.

Un ejemplo de como configurar un navegador de internet (en nuestro caso firefox).