sábado, 4 de enero de 2014

Pepelux's perl script

Como ya sabéis, he estado montando una FreePBX en una raspberry pi. Una de las cosas que tenía pendientes era pasar un script que Pepelux (Jose Luis Verdeguer, @pepeluxx) montó para la última Rooted (2013) y que analizaba la configuración del sistema. De esta forma, se podía saber si alguna de esas configuraciones era deseable que estuviese por defecto o no. En mi caso, he tenido que comentar dos líneas que son las que hacen referencia al netstat, porque, posiblemente, no existe esa librería para la arquitectura de la rasp.

Este es el estado en el que me he encontrado mi sistema:

Perl Pepelux Script: Estado actual del asterisk
Estado actual del asterisk
Por lo tanto, vamos a ir viendo cómo puedo ajustar los valores en la medida de lo posible.

Lo primero que he hecho ha sido crearme un usuario nuevo:

#useradd -G users -m -N paquitoelchocolatero
#passwd paquitoelchocolatero

Ahora, podremos acceder al sistema utilizando este usuario desde el servcio de ssh. Por si las moscas, asegúrate de que es así. Además, prueba que puedas elevar privilegios. ¿Funciona? Muy bien. En el caso de que no sea así... Ahora no se me ocurre la razón. En caso contrario, ahora serás root. Y, estando con este usuario, vas a tener que abrir con el editor nano el fichero /etc/ssh/sshd_conf

#nano /etc/ssh/sshd_conf

Busca la línea PermitRootLogin y cambia el estado de yes a no. Vamos a reiniciar el servicio, por lo que tus sesiones se van a cerrar:

#/etc/init.d/ssh restart

Ahora, podemos comprobar cómo el usuario root no es capaz de acceder al sistema. En cambio, paquitoelchocolatero sí que podrá entrar. Además, será capaz de elevar privilegios, por lo que podremos volver a ejecutar el script y el aviso sobre PermitRootLogin habrá desaparecido.

Ya puestos a manipular el servicio ssh, vamos a autorizar sólo las conexiones internas. Tendremos que descomentar ListenAddress (en mi caso, para IPv4) y ponerle un valor. Yo he puesto la misma IP que tiene la tarjeta de red. ¡Ojo! Si se hace mal podrías perder la conexión con el dispositivo y para solucionarlo acceder de forma local. Si no tienes una pantalla y un teclado conectados... Malo. Yo reiniciaría otra vez el servicio.

Ahora voy a arreglar el aviso que dice que los logs son propiedad de asterisk. Estos logs se buscan en /var/log/. Por lo tanto, visitando esta ruta, nos encontramos con que la carpeta que hace referencia a asterisk tiene tanto el usuario como el grupo pricipal asterisk. Lo que voy a hacer va a ser lanzar un cambio de dueño y de grupo recursivo para root.

#chown -R root asterisk/
#chgrp  -R root asterisk/

Eso sí,  mucho ojo porque, de momento, con esta forma dejará de dar la alerta de los propietarios de estos ficheros mientras que no reinicies el equipo. Después se vuelven a crear algunos con permisos de Asterisk.

Otro cambio que voy a hacer es eliminar la posibilidad de que se conecten "invitados". Por lo que seguiré el consejo del script y pondré el valor allowguest = no en el fichero /etc/asterisk/sip.conf. Pero, ¡ojo! Te dicen que no lo cambies, por lo que tendrás que hacer las modificaciones a través de la interfaz web. Habrá que ir a Settings --: Asterisk SIP Settings, y buscar Allow SIP Guests. Como de costumbre, habrá que guardar los cambios y aplicarlos con el botón rojo que aparecerá después de guardarlos. Por cierto: si estás con la distribución raspbx tendrás que hacer un cambio en el script:
  1. En mi distribución está buscando en un fichero que no es el que se espera. Habría que cambiar la apertura del fichero sip.conf al sip_general_additional.conf.
Si el script no encuentra el valor allowguest=no devolverá que está puesto a yes. Independientemente de si tiene asignado ese valor o si ni siquiera aparece dicha asignación.

Con respecto al useragent que dice que hay que cambiar, he hecho varias pruebas. Por no hacer más caótico todo esto, vamos a ver si puedo explicarlo rápido. Se puede añadir el parámetro desde la misma sección del Asterisk SIP Settings. Abajo del todo, puedes añadir otros valores. Ahí he puesto el parámetro useragent, con el valor que más me ha gustado. Ahora bien, nos encontraremos con que tenemos el parámetro repetido dos veces en el fichero sip_general_additional.conf. Podrías modificarlo, algo desaconsejado, porque cualquier cambio que apliques con el famoso botón rojo puede echarlo para atrás. No sirve quitar el valor que no deseamos, tarde o temprano, volverá.

Ahora voy a cambiar la configuración del AMI. Según he podido leer, las siglas AMI proceden de Asterisk Manager Interface. La entrada de mi búsqueda de la cual me he leído los dos primeros párrafos es esta. Lo que quería ver es si al desactivarlo, un softphone sigue funcionando, ya que esperaba que éste hiciese de cliente. Pero, editando /etc/asterisk/manager.conf:

FreePBX /etc/asterisk/manager.conf
FreePBX /etc/asterisk/manager.conf
...dicen que FreePBX (que es en lo que se sustenta nuestra distribución) tiene que tenerlo activado, por lo que poner el valor enabled = no no será una opción. Pero sí podremos cambiar las contraseñas por defecto. La primera contraseña la tendrás que cambiar desde Settings --> Advanced Settings. Ahí donde pone Asterisk Manager Password. Te recomiendo que hagas un backup de la instalación/configuración. Me ha dado una serie de problemas. Si cuando guardes el cambio (justo a la derecha del textbox donde introducirás la nueva contraseña), y después de darle al típico botón rojo de "apply changes", te diese algún error gordo indicándote de que no se puede hacer el cambio, como podría ser
WARNING[5297] security_events.c: Required IE '50' for security event type '12' not present
NOTICE[5297] manager.c: 127.0.0.1 failed to authenticate as 'admin'
hay una posible solución. A mi, después de varias pruebas, me ha funcionado lo siguiente:

  1. Cambiar a mano los ficheros /etc/amportal.conf y /etc/asterisk/extensions_additional.conf . 
  2. Busca el campo que tiene la contraseña amp111. Le tendrás que poner el mismo valor que se ha puesto en la interfaz web.
  3. Reiniciar el dispositivo.
  4. Para terminar, volver a la interfaz web y aplicar los cambios. 

Con respecto a la alerta de la versión, tengo malas noticias. Tendría que salir un dato entre paréntesis. Pero no sale nada. Eso es porque el error que nos salta sobre yum es que intenta lanzar un comando de un gestor de instalación de paquetes que no tenemos. Hay varias formas:

  • apt-cache showpkg freepbx : Esta es la que encontré por mi mismo. Pero no me servía muy bien porque tenía que hacer mucho scripting del que tengo muchas lagunas. 
  • apt-show-versions freepbx : Nuestra distribución no cuenta con este, por lo que también lo descarto. Los otros mostrados de apt no me gustaban. No me hace falta saber nada sobre los paquetes remotos.
  • aptitude versions freepbx : Casi: pero ese retorno de carro...
  • dpkg -s freepbx | grep Version | sed -e 's/Version: /''/g' : Este creo que sí que me va a servir. 
    • Obviando el sed: Nos devuelve una sóla línea que empezará por "Version: ".
    • El comando sed se encargará de reemplazar esa misma cadena por otra vacía. Aunque con las expresiones regulares se podría obviar esta última pipe.
Tendremos que editar el script, y en el contenido del método version(). Será el contenido de la función system(), con alguna de las opciones que acabo de describir. Después, habrá que acordarse de cambiar las expresiones regulares que hay dentro del while(). Me gustaría poder decir que he tenido suerte y que he conseguido que me guarde el resultado en el fichero, pero sale vacío si se hace desde perl. Por lo que no he podido ajustar este script a nuestra versión. Pero habiendo ejecutado el comando raspbx-upgrade, y apt-get update y apt-get upgrade, ya debería de estar actualizado.

[update]
Para el tema de la versión, tenemos este otro post.
[/update]

Ahora podríamos ponernos con los permisos para que sólo se pueda acceder al sistema desde la red interna. Ya habíamos solucionado el que se refiere al ssh, puesto que ya estábamos de paso en ese fichero De todas formas, tenemos un warning que más adelante veré cómo solucionar. 
  • Para el servidor web: tendremos que editar /etc/apache2/ports.conf y modificar la línea Listen 80 y ponerle Listen IP_DISPOSITIVO:80. Ejecuta /etc/init.d/apache2 restart.
  • Para el servicio de TFTP, tendremos que configurar dnsmasq. Es el servicio que está corriendo el pueto 69, que es el que utiliza TFTP. Si consigo configurarlo, os aviso.
  • Para Asterisk Manager tendremos que cambiar el valor que tiene bindaddr en el fichero /etc/asterisk/manager.conf por la dirección IP de tu dispositivo la dirección de loopback (para que nos entendamos: 127.0.0.1) o por localhost. Si pones la dirección IP, como por ejemplo, 192.168.1.123, la interfaz web te puede indicar que hay algún problema y no poder realizar algunos cambios. Que a lo mejor no pasa nada, pero a mi me ha dado problemas hasta que he puesto localhost.
  • Para Asterisk, tendremos que ir a Settings --> Advanced SIP Settings, y abajo del todo, pondremos un campo nuevo que se va a llamar dindaddr, cuyo valor será, tal y como hemos ido haciendo con los otros campos, la dirección IP de la interfaz de red. Acuérdate de guardar los cambios y aplicarlos con el botón rojo que te aparecerá una vez se han guardado los cambios.
Ahora mismo, el estado de la centralita, está bastante mejor que antes. Sí. Es muy mejorable. Pero bueno. Menos da una piedra. 

No hay comentarios:

Publicar un comentario