Información blog

Linux, tutoriales, noticias, sistemas, redes y seguridad informática, entre otras cosas.

miércoles, 20 de abril de 2016

Cómo habilitar y deshabilitar un firewall con Asterisk

Hola a todos, hoy quiero veniros con un articulo al que en mi opinión se le puede sacar bastante partido; ya sea a nivel práctico o a simple nivel de curiosidad. Imaginemos que tenemos un servidor con un acceso bastante restringido en el que tenemos que habilitar y deshabilitar un firewall cada dos por tres para tareas de mantenimiento (o simplemente se quieren cambiar algunas reglas que siempre serán las mismas). Esto requiere tener que entrar al servidor físicamente o vía ssh, loguearse, ponerse privilegios de super-usuario, deshabilitar o cambiar el firewall etc... Esto una vez no importa, pero cuando ya la tarea se torna repetitiva esto puede ser un verdadero fastidio... Es cierto que el proceso en sí no tiene que ser necesariamente complicado ¿Pero para qué complicarnos la vida cuando podemos hacer todo pulsando uno o dos botones? Es por eso que hoy os quiero venir con un método muy sencillo basado en Asterisk, que creo que más de uno encontrará interesante.

firewall_asterisk_bash

Aunque en más de una ocasión he hablado sobre esta tecnología; para aquellos que aún no la conozcan les diré que es un programa de software libre que hace las veces de centralita (PBX), capaz de comunicarse por métodos convencionales dentro de este mundillo (como RDSI) o por un método más usado y moderno, llamado voz ip, que haría la comunicación de voz por red (algo parecido a lo que se hace hoy en día con Skype). En este caso nos centraríamos en este último método de comunicación, pues todas las acciones se realizan a nivel de red y aquí sí que podemos ejercer cierto control tanto sobre el software como sobre el servidor. Para ello obviamente necesitaremos instalar Asterisk, pues es una herramienta de terceros que no está instalada por defecto en el sistema, si bien está incluida en los repositorios. Aquí habría que tener en cuenta qué uso se le quiere dar a Asterisk pues si se le quiere dar un uso profesional (es decir, se quieren hacer más cosas aparte de la gestión del firewall), lo más recomendable es descargar los paquetes asterisk y libpri a mano para después compilarlos e instalarlos a mano mediante el famoso make. En este caso en concreto no nos hace falta ser muy escrupulosos, así que optaremos por el método rápido e instalaremos Asterisk directamente desde los repositorios mediante apt-get.

apt-get install asterisk

La instalación es automática y no requerirá confirmación alguna así que no habría que preocuparse. Lo que sí que habría que tener en cuenta es que la instalación creará un nuevo usuario llamado Asterisk, usuario que gestionaría (de forma automática) todas las llamadas realizadas en Asterisk y todas las tareas relacionadas con la comunicación voz ip. El problema es que este usuario no tiene permisos de super-usuario, y en este caso al estar manejando algo tan delicado como el cortafuegos, necesita convertirse en super-usuario; esto es tan sencillo como añadir dicho al fichero /etc/sudoers... Pero en este caso vamos a ponerle a asterisk unos privilegios limitados dentro del colectivo de super-usuario; La línea que habría que añadir a dicho fichero sería:

asterisk ALL=(ALL)NOPASSWD:/sbin/iptables

En este caso en concreto le hemos dicho que Asterisk no requiera pedir contraseña al hacer sudo, pero que únicamente pueda ejecutar iptables. El motivo de esta restricción es simple: Queremos que lo único que pueda hacer asterisk como sudo es el uso de iptables, pues el darle acceso al resto podría ser contraproducente e incluso peligroso. Eso no significa que no pueda hacer nada de lo que podía hacer antes; simplemente hemos hecho que el único permiso "adicional" que tiene es el uso de /sbin/iptables.

Ahora que Asterisk es lo suficientemente "poderoso" necesitamos prepararlo para habilitar y deshabilitar el firewall... Explicar en profundidad el corazón de Asterisk es increíblemente complicado, pues requeriría entender muchos conceptos y realizar muchísimas explicaciones, con lo que vamos a enfocarnos únicamente en dos ficheros en concreto alojados en /etc/asterisk: sip.conf y extensions.conf. El primero representaría los "teléfonos" que se conectarían a Asterisk mediante un protocolo denominado protocolo SIP, mientras que el segundo representaría el comportamiento de estos: es decir qué hacer en caso de que un teléfono X marque unos dígitos determinados. Estos ficheros ya tienen de por sí unas configuraciones por defecto y una serie de líneas y comentarios (líneas que no tienen valor alguno a nivel de funcionalidad) que nos van a suponer una molestia, con lo que en mi opinión lo mejor que se puede hacer es dejarlos vacíos y rellenarlos.

Lo primero que haríamos sería crear un teléfono es sip.conf; dicha creación se basaría en dos partes: La creación de unos parámetros generales, ya la creación de unos parámetros específicos para el teléfono. En este caso voy a poner la configuración del sip.conf para luego explicar los parámetros más relevantes:

  1. [general]
  2. context=default
  3. port=5060
  4. bindport=5060
  5. bindaddr=192.168.1.7
  6. disallow=all
  7. allow=alaw
  8. nat=never
  9. language=es
  10. [1001]
  11. type=friend
  12. host=dynamic
  13. username=1001
  14. secret=100112341001
  15. context=cortafuegos

A modo de recomendación personal, lo mejor es copiar y pegar todo el contenido y modificarlo a nuestro gusto, pues hay varios parámetros que podemos personalizar:


  • port: Puerto de escucha de Asterisk para la comunicación SIP; el puerto de escucha por defecto usado para estas comunicaciones el 5060 y es recomendable no cambiarlo. Obviamente también hay que tener cuidado para que el servidor no bloquee dicho puerto, o que al menos no nos lo bloquee a nosotros.
  • bindport: Cumple la misma función que port, pero es más "estable" que port a nivel interno. Si bien hacen lo mismo, lo mejor es tener incluidos ambos valores: port y bindport.
  • Bindaddr: Aquí podemos decir a qué ip se van a conectar los "teléfonos"; esto es especialmente útil si se tienen varias tarjetas de red o ips virtuales, ya que gracias a ésto especificamos que únicamente se pueden conectar a dicha ip. A nivel de seguridad de es un valor IMPRESCINDIBLE.
  • Username: El nombre de usuario que tiene que usar el "teléfono" para registrarse. Dicho nombre de usuario también sería el número que habría que marcar si quisiésemos llamarle (cosa que en este caso no haría falta hacer, pero que es útil saber).
  • Secret: Contraseña especifica para dicho teléfono para que éste se registre en Asterisk.
  • Context: Otro valor de gran importancia llamado técnicamente como contexto; aquí se dice a qué "sección" de extensions.conf pertenece. No es lo mismo que un teléfono perteneciente a la sección X llame al número 1234 que lo haga uno que perteneciese al contexto Y. En este caso en concreto el teléfono pertenecerá al contexto cortafuegos.

Tenemos preparada la configuración del teléfono, faltaría preparar el comportamiento de éste; Es decir habría que decir qué hará en caso de marcar un número determinado. Esto, tal y como he comentado antes, se hace en extensions.conf, y el contenido de este es llamado técnicamente como dialplan. Aquí se pueden crear verdaderas maravillas a nivel técnico, pero en este caso en concreto vamos a optar por una solución sencilla y centrada única y exclusivamente en el cortafuegos. El contenido de este fichero sería:

  1. [general]
  2. static=yes
  3. writeprotect=no
  4. autofallthrough=yes
  5. clearglobalvars=no
  6. priorityjumping=no
  7. [cortafuegos]
  8. exten => 1,1,NoOp("SE ACTIVA EL CORTAFUEGOS")
  9. exten => 1,n,System(/usr/bin/firewall start)
  10. exten => 1,n,Hangup()
  11. exten => 2,1,NoOp("SE DESACTIVA EL CORTAFUEGOS")
  12. exten => 2,n,System(/usr/bin/firewall stop)
  13. exten => 2,n,Hangup()

Aquí los valores incluidos en general no nos interesan, pues son valores generales, valga la redundancia, que simplemente se ponen para establecer una serie de políticas. Lo que en este caso nos interesaría sería el contexto que va entre los caracteres [ ], llamado cortafuegos; contexto el que decimos qué hacer. En este caso únicamente hacemos que haga algo en caso de marcar los números 1 o 2.  El marcar estas teclas harán tres acciones:

  1. Mostrar un mensaje en Asterisk (interno).
  2. Realizar una acción llamada System, encargada de ejecutar comandos y/o scripts del sistema operativo.
  3. Colgar la "llamada".

La primera y la tercera línea serían iguales, mientras que la segunda, la más importante, ejecutaría el script /usr/bin/firewall, pero dependiendo de qué dígito hayamos marcado mandaría el parámetro start o stop a éste. Obviamente dicho script sería de nuestra invención y haría lo que nosotros deseásemos. Después de modificar los ficheros atrás comentados, habría que aplicar los cambios... Hay varios métodos para aplicar los cambios (algunos más sutiles que otros) pero requieren ciertos conocimientos de Asterisk con lo que optaremos por el método más "clásico" y brusco: Reiniciar el programa:

/etc/init.d/asterisk restart

A nivel de servidor únicamente faltaría una cosa más: La preparación del script que queremos que sea ejecutada por los dígitos 1 y 2 del contexto "cortafuegos"; en este caso /usr/bin/firewall . Esta parte es la más abstracta de todas, pero a modo de demostración podríamos hacer que el script fuese algo como esto:

  1. #!/bin/sh
  2. case "$1" in
  3.         start)
  4.                 #CERRAMOS TODO A EXCEPCION DE LOS PUERTOS JUSTOS Y NECESARIOS
  5.                 sudo /sbin/iptables -A INPUT -p udp --dport 5060 -j ACCEPT
  6.                 sudo /sbin/iptables -A INPUT -s 192.168.1.2 -p tcp --dport 22-j ACCEPT
  7.                 sudo /sbin/iptables -A INPUT -j DROP
  8.         ;;
  9.         stop)
  10.                 #DEJAMOS PASO ABIERTO A TODO
  11.                 sudo /sbin/iptables -F
  12.         ;;
  13. esac
  14. exit 0

Este script es muy simple pero perfectamente válido; si bien obviamente puede modificarse para adaptarse a necesidades algo más "realistas".

Con esto tendríamos la parte del servidor hecha pero... ¿Cómo enviamos esos dígitos al servidor? ¿Realmente es necesario usar un teléfono (que tendría que ser un teléfono ip) únicamente para esto? Gracias a las tecnologías de hoy en día, podemos descargarnos un softphone que hará de teléfono virtual y que hará que no sea necesario usar teléfono físico alguno. Hay varios softphones disponibles hoy en día aunque los más populares serían Ekiga y X-Lite. En este caso optaré por Ekiga, pues la gran ventaja que tiene es que puede usarse tanto en Windows como en Linux y que puede descargarse en la página oficial. También es importante tener en cuenta de que el servidor y el softphone/teléfono ip tienen que estar en la misma red local, ya sea real o virtual; es decir que se tiene que ser capaz de "alcanzar" la ip en la que Asterisk está esperando a que nos conectemos.

Con la herramienta descarga e instalada, únicamente habría que ir a Editar --> Cuentas y dentro de dicha sección habría que ir a Cuentas --> Añadir cuenta SIP (una cuenta que usaría el mismo protocolo que el que hemos usado en el servidor). Ahí habría que poner el nombre de la cuenta, el nombre de usuario y el usuario de autenticación, que constaría del username puesto en sip.conf, el servidor de registro, que sería la ip puesta en el parámetro bindaddr de la configuración general de sip.conf y la contraseña, que sería el parámetro secret de la cuenta. Los valores son muy intuitivos pero he aquí una pequeña ayuda visual:

Ekiga_asterisk

Con estos valores puestos, simplemente habría que aplicarlos y ya tendríamos nuestro softphone activado y operativo; únicamente habría que marcar los dígitos 1 o 2 y darle al botón de llamar para poder disfrutar de esta curiosa, pero útil forma de activar y desactivar un cortafuegos a nuestra conveniencia.

Saludos.

No hay comentarios :

Publicar un comentario