Menú principal

lunes, 9 de mayo de 2016

Bloquear la WiFi con Latch desde OS X & Raspberry Pi (Parte I de II) #RaspBerryPi #WiFi #OSX #Latch

Uno de los plugins que participaron en el concurso de Latch era Lockifi, un plugin que permitía al usuario habilitar y deshabilitar el acceso WiFi en el router. El objetivo es claro, cuando no vaya a utilizar la WiFi restrinjo el tiempo de exposición y la deshabilitó de forma automática gracias a la autorización con Latch. La idea nos gustó y decidimos migrar este plugin a un sistema OS X. Al principio nuestra idea fue migrar el plugin, por ejemplo a un lenguaje como Ruby, y crear un ítem en el inicio de sesión del usuario para que la aplicación estuviera preguntando automáticamente al iniciar sesión por el estado de Latch.

Tras echarle un poco de tiempo obtuvimos un código en Ruby que realizaba la misma operación que Lockifi para Windows y preparamos el entorno para que autoarrancara. Aquí tenéis el vídeo de Lockifi para que veáis su propuesta. El código de este plugin está disponible en GitHub: Lockifi.

FIgura 1: Plugin Lockifi para Windows

Paso 0: El código

Como se ha mencionado esto es una migración del plugin Lockifi, escrito por Samuel Rodriguez. Migrar el código a otro lenguaje no era tarea difícil y decidí utilizar Ruby. El objetivo era que se ejcutara de forma sencilla en OS X. La versión de OS X utilizada en este artículo ha sido El Capitan. Para llevar a cabo la migración se ha utilizado tres archivos más el SDK de Latch para Ruby. Además, debemos disponer de una cuenta de Latch en el área de desarrolladores, lo cual es gratuito. Deberemos crearnos una app dentro del área de desarrolladores. Como se puede ver en la siguiente imagen creamos una app con el nombre Lockifi OS X.

Figura 2: Creación de App Lockifi OS X en el área de desarrolladores

Nos tenemos que fijar en dos valores de la app que se acaba de crear: el Application ID y el secret. Estos valores serán necesarios para que nuestra aplicación Ruby pueda comunicarse con Latch y nuestra cuenta de usuario. Pulsando el botón con el icono del lápiz se puede editar y visualizar estos dos parámetros.

Figura 3: VIsualización de Application ID y Secret

Los archivos son los siguientes:
  • main.rb. Este fichero se encarga de pedirnos un token para parear nuestra app de Latch con nuestra aplicación Ruby. El resultado que devolverá el main.rb es el Account ID. Este Account ID deberá ser utilizado también por nuestra aplicación Ruby para comunicarse con Latch
  • ssh_latches.rb. Este fichero implementa cuatro métodos que podrán ser utilizados para interactuar con Latch. El método status devolverá el estado de Latch pasándole el Account ID. El método pair nos facilita el pareo y será utilizado por main.rb. Esta clase se basa en el SDK de Latch para implementar sus métodos.
  • ssh.rb. Este fichero implementa la lógica que proponemos para cada X tiempo consultar el estado de Latch y en función de éste habilitar o deshabilitar la WiFi previa conexión al router
Paso 1: main.rb

En primer lugar hay que echar un vistazo al código del main.rb. El objetivo es sencillo, un pequeño programa que nos pida un token y haga el pair con la app de Latch. El resultado será el Account ID, si todo va bien.

Figura 5: Código de main.rb

El programa main necesita del Application ID y el Secret para poder llevar a cabo su acción de parear. El método pair está invocado a través del SDK de Latch. En la imagen se puede ver un pequeño ejemplo de su invocación. Al introducir el token que generamos desde Latch, main nos devolvería el Account ID que necesitaremos utilizar en ssh.rb.

Figura 6: Obtención del Account ID

Paso 2: Lógica de ssh.rb

El archivo ssh.rb implementa toda la lógica necesaria para llevar a cabo el control sobre la WiFi del router. La estrategia o algoritmo es sencilla. Mediante la realización de consultas periódicas al estado de nuestro Latch podremos detectar cuando éste ha cambiado de estado. En el momento que se detecte que se ha cerrado el Latch el fichero ssh.rb lanzará una conexión al router por medio del protocolo SSH y "tumbará" la interfaz. El algoritmo quedaría algo como así:

Mientras true
         Compruebo estado de Latch
         Si Latch está Abierto
                Indico que está abierto
                Levanto la interfaz WiFi del router
        Si no
                Indico que se cerrará 
                Apago interfaz WiFi del router
        Fin Si
Fin Mientras

Como se puede ver es un algoritmo realmente sencillo. Haciendo una pequeña prueba antes de crear una aplicación con Automator y configurarla para que arranque al inicio de sesión del usuario. Cuando abrimos el cerrojo de Latch en Lockifi OS X y visualizamos las peticiones que hace ssh.rb observaremos que nos indica "Open" y la WiFi seguirá operativa.

Figura 7: Lockifi OS X abierto

Para esta prueba hemos mostrado el texto en un terminal bash en OS X. El mensaje es claro, cuando comprueba el estado, cada 20 segundos por ejemplo, y detecta el cerrojo abierto nos indica "Open". Cuando cerramos el cerrojo y la aplicación detecta esto nos indicará "No Open" y llevará a cabo el proceso de deshabilitar la WiFi del router a través de una conexión SSH al dispositivo.

Figura 8: Mensajes que proporciona Lockifi OS X

Antes de pasar al siguiente paso, vamos a hacer hincapié en una zona del código de ssh.rb importante. Cuando se comprueba el estado de Latch y no se encuentra abierto nos iremos por la rama else de nuestro algoritmo. Esta parte es realmente la importante, la que deshabilitará a través del router la posibilidad de conectarnos a nuestra WiFi de casa u oficina.

Observando el código se ve que se crea un objeto SSH cuya configuración para la conexión es la dirección IP del router, el segundo parámetro es el usuario y el tercer parámetro es la contraseña. La conexión por SSH se lanza a través del método exec! y ejecuta un ifconfig para "tumbar" la interfaz WiFi. Hay que tener en cuenta que esto en otros modelos de routers puede cambiar, pero no la estrategia.

Figura 9: Snippet de código de ssh.rb que deshabilita el WiFi del router

Paso 3: Automatizando la ejecución del programa en OS X

Ahora que tenemos el programa funcional decidimos hacerlo autoejecutable al comienzo de la sesión del usuario. De este modo, cuando nuestro OS X inicie sesión podremos comprobar si queremos que la WiFi esté disponible para otros usuarios o no.

Para llevar a cabo esta tarea utilizamos Automator, el cual viene con OS X y permite automatizar tareas y flujos de trabajo de manera muy sencilla. El primer paso es arrancar la herramienta, la cual puede ser fácilmente localizada a través de Spotlight. Una vez arrancada debemos elegir, entre sus opciones, "Ejecutar el Script Shell". Esto nos abrirá un recuadro a la derecha dónde podremos escribir un script de shell, por ejemplo para bash.

Figura 10: Creando script de shell para automatizar con Automator

Es importante invocar, dentro del script de shell, a Ruby con su path completo. Una vez escrito el script se puede probar con el atajo CMD + R. Esto ejecutará el contenido del script. Ahora debemos convertir este script en una app. Para esto, Automator, proporciona la posibilidad de guardarlo directamente como una aplicación, tal y como puede verse en la siguiente imagen.

Figura 11: Creación de aplicación

Una vez creada la aplicación debemos ir a "Preferencias del sistema" -> "Usuarios" y en este apartado seleccionar "Ítems de Inicio". Aquí podremos añadir, fácilmente, la aplicación generada con Automator, tal y como se puede ver en la imagen.

Figura 12: Adición como Ítem de Inicio
Paso 4: Comprobación final

Ahora, solo falta comprobar que al iniciar sesión se está ejecutando nuestra aplicación correctamente. Para esta prueba dejamos el cerrojo abierto e iniciamos sesión en nuestro OS X. Si tenemos habilitado en nuestra aplicación de Latch que nos avise cuando haya un intento de acceso cuando el Latch esté abierto nos llegará una notificación, como la que se muestra a continuación.

Figura 13: Acceso al servicio Lockifi OS X

Para verificar que nuestra aplicación Ruby Lockifi OS X está corriendo, lo mejor es abrir un terminal en nuestro OS X y ejecutar, por ejemplo, ps aux | grep ruby. Debemos observar que la instrucción que introdujimos cuando creamos el script de shell con Automator se encuentra levantada. En este caso se puede ver de forma sencilla y nuestro programa está en ejecución y realizando consultas a Latch para comprobar si tiene que deshabilitar la WiFi o habilitarla.

Figura 14: Comprobación de proceso ssh.rb

En el siguiente artículo realizaremos modificaciones para integrar en casa una Raspberry que levante un punto de acceso WiFi. La Raspberry la conectaremos al router de casa mediante un cable Ethernet. Nuestro programa no se ejecutará en nuestro equipo, si no que se ejecutará en la Raspberry. Cuando desde la Raspberry nuestro programa detecte que se ha bloqueado el acceso a la WiFi "tirará" la interfaz WiFi. Lógicamente, el router de casa tendrá que tener deshabilitado la WiFi para que esto tenga sentido. El esquema es sencillo, los usuarios de casa se conectarán al punto de acceso de la Raspberry y está hará forwarding de paquetes hacia el router, el cual nunca tendrá habilitado la interfaz Wireless. Es un esquema con el que cualquier usuario de casa podría desbloquear y bloquear la WiFi con Latch y lo tienes publicado aquí: Bloquear la WiFi con Latch desde Raspberry Pi.

1 comentario:

  1. Hola, soy Samuel Rodríguez, el creador de Lockifi y hasta hoy no me había dado cuenta de esta implementación de la idea con Ruby. Enhorabuena por ello! Además muy bien explicado y fácil de entender para todos. Un saludo!

    ResponderEliminar

Entrada destacada

Proteger tu cuenta de Google y de Gmail con Latch Cloud TOTP #Latch #Gmail #Google

La semana pasada se liberó la nueva versión de Latch y nuestro compañero Chema Alonso hizo un repaso de todo ello en su artículo Latch...

Otras historias relacionadas

Entradas populares