miércoles, noviembre 05, 2014

Configurar Latch en OpenWRT sobre una Raspberry Pi

Para comenzar este artículo sobre como proteger un dispositivo de Internet con Latch, donde he disfrutado pegándome con la tecnologías, he decir que OpenWRT, además de ser un sistema operativo basado en Linux y contar con una buena comunidad detrás con constante soporte, ha acabado aplicado y siendo instalado en muchos dispositivos de los que se usan hoy en Internet, como en los routers de algunas marcas tales como TP-LINK, ASUS o Mikrotik, por nombrar solo algunas.

Figura 1: Integración de Latch con OpenWRT

Tras varias revisiones iniciales buscando la mejor estrategia para poner Latch en mi OpenWRT, despejé algunas ideas por no ser demasiado prácticas, como por ejemplo aplicar a capón el plugin Latch para SSH, ya que requeriría de un espacio del que no disponemos en las imágenes que podemos encontrar en el repositorio de OpenWRT. Esta falta de espacio es lógica, ya que estas versiones de OpenWRT no fueron elaboradas pensado en que pudieras compilar programas en los dispositivos de red.

Preparando el dispositivo con OpenWRT

Inicialmente decidí pegarme para conseguir más espacio en el disco ya que la con OpenWRT te facilitan las ToolChain para hacer compilación cruzada e incluso para realizar tu propia imagen de OpenWRT. Sin embargo, hacer esto exigía hacer algún hack con una tarjeta MicroSD que poner en el dispositivo. Así que decidí, que en lugar de realizar cross-compiling era mucho más sencillo y realista añadir unas líneas al script que hizo Alejandro Ramos (@aramosf) para poner Latch en un servidor FTP, como bien me sugirió Sergio de los Santos (@ssantosv). Es más práctico ir a lo sencillo :)

Figura 2: Configuración de OpenWRT en la Raspberry Pi con acceso web vía LUCi

Las pruebas que he realizado con este script fueron sobre una de las últimas imágenes de Barrier Breaker que podéis encontrar en la sección de Descargas de OpenWRT para lo que primeramente, se requiere de un dispositivo, router o AP o un equipo al que le queramos dar funcionalidad una funcionalidad de red como firewall, router, punto de acceso WiFi o sniffer y en el que podamos instalar OpenWRT para terminar de securizarlo después con Latch. Por supuesto, hasta una Raspberry Pi como es en mi caso puede valer para hacer esto. En mi caso, me bajé la versión en .img y mediante un lector de tarjetas, instalé el SO en la MicroSD de la Raspberry Pi.

Configuración de paquetes en OpenWRT

Para conseguir correr el script que nos proteja con Latch el dispositivo necesitamos ciertas utilidades en el sistema. En OpenWRT podemos encontrar el programa BusyBox, con ciertas utilidades básicas de Unix, pero no nos bastan si queremos ejecutar el script que hizo Alejandro Ramos, por lo que tendremos que instalar algunos packages del repositorio para la arquitectura de la imagen que hayamos seleccionado. Esto lo he implementado en el script “reg.sh” para que lo haga automaticamente.

Figura 3: Configuración de paquetes en OpenWRT con el script reg.sh (1)

Si dispones de una imagen con el fichero opkg.conf con las fuentes de repositorio actualizadas debería de funcionar correctamente cuando haga un check de tu opkg list. Para que funcione correctamente es necesario instalar "coreutils-base64” para poder codificar en base64.

Figura 4: Configuración de paquetes en OpenWRT con el script reg.sh (2)

Como se puede ver, también es recomendable actualizar “wget" por si la versión que probáis no está demasiado actualizada que últimamente ha habido fiesta con él, "openssl-util” para habilitar el acceso web por https vía LUCi, pero sobretodo es necesario instalar o actualizar "bash".

Figura 5: Configuración de paquetes en OpenWRT con el script reg.sh (3)
Esto es porque pude apreciar, que en algunos repositorios no están presentes todas las versiones del shell bash parcheado contra Shellshock, aunque ya había tickets para su actualización, así que como consejo, buscad una versión actualizada de bash. Si no la vierais en el repositorio, yo encontré alguna en github.

Una vez tengamos todo esto, si tenéis la app de Latch en el smarthphone, ya podremos generar el código temporal de pareado y proceder a poner un Latch tal y como se hace con todos los servicios protegidos con esta tecnología usando el comando ./reg.sh.

Configurando la Integración con Latch: Pareado

Para comenzar a configurar el script de Latch primero debes ir con tu cuenta de desarrollador a la web de Latch y crear una aplicación que nos servirá para este caso práctico. Una vez tengamos la aplicación creada en la cuenta de desarrollador de Latch, hay que rellenar los campos de “applicationId” y “secretkey” en cada uno de los scripts necesarios. Aparte, puedes modificar el directorio donde quieras ejecutar los scripts de Latch cómodamente.

Figura 6: Configuración de Latch en reg.sh

Configurando la Integración con Latch: Comprobación de estado

El siguiente paso, es rellenar igualmente “applicationId” y “secretkey” en el script de estado status.sh, que será el que utilizaremos para bloquear/desbloquear OpenWRT de accesos Telnet/SSH o HTTP/HTTPS. Para ello seguí las recomendaciones de seguridad de la documentación de la web de OpenWRT, dejando acceso exclusivamente por SSH y deshabitando el acceso web HTTP y habilitando conexión por SSL. Así que las líneas que añadí al script “status.sh” original cuentan con este caso, es decir, en caso de Latch activado, debe expulsar al usuario del router al tratar de acceder y tirar las conexiones https vía reglas iptables

Figura 7: Script status.sh para comprobar el estado del Latch
Desde mis conocimientos, la mejor manera que encontré de aplicar estas funcionalidad fue con la captura del proceso del usuario que trata de acceder por SSH y guardarlo en una variable, para poder expulsarlo y en por otro lado como antes comentaba, usar reglas del firewall iptables para bloquear el tráfico para la conexión por SSL al recurso web. He tratado de contar con todos los estados posibles con este script
Figura 8: Configuración de posibilidades en status.sh (2) 
- Con acceso a Internet y estado bloqueado
- Con acceso a Internet y estado desbloqueado
- Sin acceso a Internet y estado desbloqueado

- Sin acceso a Internet y estado bloqueado: Éste estado es imprescindible ya que de otra manera, dejaría el router inaccesible para quien use el script.
Importante, para que el script de estado se ejecute cada vez que accedáis al router, bien se añade como primera línea el directorio desde el que se ejecutar el script “status.sh” en el fichero .profile, este fichero debería de encontrarse en la carpeta raíz de tu usuario y si no lo puedes crear pero si alguien prefiere que se ejecute cada vez que lance bash, igualmente se añade la línea en el fichero .bashrc en la misma ubicación. 

Figura 9: Prueba de ejecución manual de status.sh

Configurando la Integración con Latch: Despareado

Por la parte del fichero de despareo de la aplicación, no tuve más que modificar el directorio desde el que ejecuto el script unreg.sh, así que no tiene mucha complicación. El código fuente de este script lo puedes ver en la siguiente imagen:

Figura 10: El script de unreg.sh para desparear la cuenta de Latch

Conclusiones

Al final el sistema funciona, así que la aproximación parece que fue la más apropiada. No obstante, si observáis cualquier error o sugerencia, por favor comentadlas en este artículo, que intentaré subsanarlas. Cualquier idea de mejora será bienvenida. Gracias. Si tienes una idea para hacer algo cosa chula con Latch, acuérdate de que hay un concurso de plugins de Latch con el que puedes ganar hasta 10.000 USD.

Autor: Guillermo R. Miralles

4 comentarios:

Alberto dijo...

Saludos, una pregunta...sobre la instalación de openwrt en la raspberry. Que imágen descargaste? Es que he he intentado instalar openwrt en una raspberry y no bootea. si he logrado hacerlo con la imagen oficial noobs de raspberry.

Guilletron dijo...

Hola AlbGT, gracias por preguntar. Te dejo un feedback completo paso a paso ;)

Raspberry Pi (al menos la primera versión, B+) siendo chipset broadcom bcm2835 requiere una versión compilada para dicha arquitectura, ARM. De otra manera no será capaz de ejecutarlo.

Yo probé la versión compatible brcm2708, que la soporta igualmente pero desde entonces, sacaron versiones de las ramas de OpenWRT, las más famosas Barrier_Breaker y Attitude Ajustment.

Cuestiones a tener en cuenta, depende del SO donde cargues la imagen a la tarjeta SD, usas Win32DiskImager en Windows, en MacOS con la utilidad diskutil en modo terminal y en Linux igualmente por comandos.

Importante, las imágenes de OpenWRT vienen acotadas, ya que es una versión de linux originalmente diseñadas para router o access point. Consecuencia, la partición de la imagen, será pequeña por lo que aconsejo, una vez realices el paso previo, redimensionar la partición para que aproveche todo el espacio de tu tarjeta SD.

Esto se puede realizar bien directamente una vez accedas a OpenWRT con resize2f, para ello tendrás que descargar el paquete mediante opkg install. La otra opción, más fácil es que uses la aplicación Gparted booteable vía usb o live cd.

Ten en cuenta, la configuración por defecto con la que vienen estas imágenes configuradas, con dhcp activo, revisa si tienes que aplicar alguna ruta por defecto para otorgarle salida a internet y poco más.

Lo mejor es que te pase estos enlaces que me ayudaron a mi a probar OpenWRT, puedes desde una máquina virtual, un router TP-Link o una Raspberry-Pi por ejemplo. ¡Seguro que te ayudan!


http://www.raspberrypi.org/documentation/installation/installing-images/
(carga de imágenes en tarjetas SD, da igual que sea Raspbian o OpenWRT, es la misma técnica)

https://sites.google.com/site/openwrtraspi/resizing-partitions
(redimensión de partición)

http://wiki.openwrt.org/toh/raspberry_pi
(imágenes y ramas que soportan Raspberry Pi)

https://downloads.openwrt.org
(Repositorio general)

Saludos cordiales / Best regards

Alberto dijo...

Muchas gracias por la respuesta tan completa y detallada. Al final si pude encontrar una versión compatible para la raspberry (brcm2708). Pero lo que sucedía es que habían algunos paquetes del repositiorio de OpenWrt que no eran compatibles con la versión para raspberry como por ejemplo kismet. Finalmente decidí instalar OpenWrt en un TP-Link MR-3020 y fue mucho mas sencillo. Además de que si disponía de todos los paquetes y los he podido instalar simplemente utilizando opkg.

Guille dijo...

Buenas, me alegro que lo consiguieras, actualmente uso OpenWRT en TP-Link, realmente lo único que cambiar, es la arquitectura, pero es igualmente válido, estoy aplicando actualizaciones para que el script siga siendo aplicable a la API de Latch, con algunas mejoras. ¡Cualquier sugerencia es bienvenida! Gracias!

Entrada destacada

10 maneras de sacarle el jugo a tu cuenta de @MyPublicInbox si eres un Perfil Público

Cuando doy una charla a algún amigo, conocido, o a un grupo de personas que quieren conocer MyPublicInbox , siempre se acaban sorprendiendo ...

Entradas populares