10
Integración de Latch en Mosquito MQTT Broker 1. ¿Qué es MQTT? MQTT (Message Queuing Telemetry Transport) es un protocolo M2M (machine- to-machine) ligero de mensajes que corre sobre el protocolo TCP/IP. Aunque se originó en el seno de IBM, desde 2013 es gestionado por el consorcio sin ánimo de lucro OASIS. Su versión 3.1.1 ha sido recogido bajo el estándar internacional ISO/IEC 20922:2016. MQTT está basado en la publicación/subscripción de mensajes. Este funcionamiento requiere el uso de un bróker de mensajes, que es el encargado de la distribución de los mensajes a los diferentes clientes basándose en el tema (topic) del mismo. Actualmente, MQTT es el protocolo de conectividad para los dispositivos IoT con mayor difusión. Los brokers exponen una interface de conexión TCP/IP, generalmente en el puerto tcp 1883, el cual ha sido registrado por el IANA para el protocolo MQTT. Los clientes subscriptores, se conectan a ese puerto indicando el topic al que se subscriben y permanecen a la espera de que el broker les mande los mensajes. Los clientes publicadores, publican el mensaje con el topic que especifiquen, conectándose al broker y enviándole el mensaje. Tanto los clientes publicadores como subscriptores son conocidos como agentes (publish agent/subscribe agent); por tanto, un agente que publica puede ser un sensor de luz, y un agente que subscribe puede ser una App de nuestro móvil. El bróker revisará el topic del mensaje y lo reenviará hacia los agentes subscritos a él.

Manual de integración de Latch en Mosquito MQTT Broker

Embed Size (px)

Citation preview

Page 1: Manual de integración de Latch en Mosquito MQTT Broker

Integración de Latch en Mosquito MQTT Broker

1. ¿QuéesMQTT?MQTT(MessageQueuingTelemetryTransport)esunprotocoloM2M(machine-to-machine)ligerodemensajesquecorresobreelprotocoloTCP/IP.AunqueseoriginóenelsenodeIBM,desde2013esgestionadoporelconsorciosinánimodelucroOASIS.Suversión3.1.1hasidorecogidobajoelestándarinternacionalISO/IEC20922:2016.MQTT está basado en la publicación/subscripción de mensajes. Estefuncionamientorequiereelusodeunbrókerdemensajes,queeselencargadodeladistribucióndelosmensajesalosdiferentesclientesbasándoseeneltema(topic)delmismo.Actualmente,MQTTeselprotocolodeconectividadpara losdispositivosIoTconmayordifusión.Los brokers exponen una interface de conexión TCP/IP, generalmente en elpuertotcp1883,elcualhasidoregistradoporelIANAparaelprotocoloMQTT.Losclientessubscriptores,seconectanaesepuertoindicandoeltopicalquesesubscribenypermanecenalaesperadequeelbrokerlesmandelosmensajes.Los clientes publicadores, publican el mensaje con el topic que especifiquen,conectándosealbrokeryenviándoleelmensaje.Tantolosclientespublicadorescomosubscriptoressonconocidoscomoagentes(publishagent/subscribeagent);portanto,unagentequepublicapuedeserunsensordeluz,yunagentequesubscribepuedeserunaAppdenuestromóvil.Elbrókerrevisaráeltopicdelmensajeyloreenviaráhacialosagentessubscritosaél.

Page 2: Manual de integración de Latch en Mosquito MQTT Broker

Integración de Latch en Mosquito MQTT Broker

ExistendiferentesimplementacionesdebrokersMQTT,siendolamásdifundida“Mosquitto”,graciasasulicenciaOpenSource(EPL/EDL).

1.1JerarquíasPublish/SubscribeLa técnica publish/subscribe que usa MQTT, utiliza jerarquías dentro de lostopics. Las jerarquías quedan establecidas mediantes el carácter “/”. Asípodemostenereltopic:casa/piso1/habitacion1.Estetopicgenerarátresramas:casa,casa/piso1,casa/piso1/habitacion1.Los agentes que deseen recibir un mensaje publicado en este topic, podríansubscribirse a cualquiera de las tres ramas. Para poder recibir el mensajeestando subscrito a una de las dos primeras ramas, es necesario añadir elcarácter reservado “#”, que actúa como comodín. De esta forma podemospublicarunmensaje: publish --topic "home/floor1/room2" --message "light on" yserárecibidoporlosagentes: subscribe --topic "home/floor1/room2" subscribe --topic "home/floor1/#" peronoseríarecibidoporelagente: subscribe --topic "home/floor2/#"

2.SeguridadenelbrokerMQTTEl protocoloMQTTdisponedeunosmecanismosde seguridadmuybásicosyaque su fundamento es ser ligero y poder ser implementado en cualquier

Page 3: Manual de integración de Latch en Mosquito MQTT Broker

Integración de Latch en Mosquito MQTT Broker

dispositivoIoT.Porestarazón,laseguridaddescansasobrelasproteccionesquepuedanexistir o sepuedan implementar tanto anivelde red (usodeVPNporejemplo),comolasqueelbrokerpuedaaportar.El broker Mosquitto dispone de diferentes elementos de seguridad para elcontrol en la publicación/subscripción demensajes. Todo ellos son realizadosmedianteelusodeunplugindeautorización/autenticación.Cadaplugindefinesuspropioscontrolesdeseguridad.ElplugindeautenticacióndeMosquitto(auth-plugin)disponedelassiguientesfuncionalidadesdeseguridadimplentadas:

2.1AutenticaciónUsuario/PasswordEsteeselcontrolmássimpleysencillodeconfigurar.Cadaagentequepublicapuede usar la combinación usuario/password y el broker verificará suscredenciales.Para un "publishagent", esta acción se realiza en cadamensaje publicado. Lamisma configuración puede ser realizada en un "subscribeagent", aunque enesta ocasión, el broker únicamente comprobará usuario/password cuando elagenterealizalaconexiónynoencadamensajequeesentregadoalmismo.

2.2ACLs-AccessControlListsCon este mecanismo, se puede obtener un control total sobre las funcionespublish/subscribe,medianteelfiltrodelostopics.LaideaprimariadeunACLesestableceruncontrolsobreuntopicdeterminadoolasramasquedeélpuedancolgarsiusamoscomodines.LasACLspuedenversecomounconjuntodereglas;cuandountopiccoincideporsufiltro,severificaelelementoacontrolar(porejemplo,sieltopicfuepublicadopor un agente usando un usuario específico) y una vez evaluado el control, elbrokerdecidesidescartaelmensajeono.ElformatodeunaentradadeunaACLes: <topic> <elemento de control>

Comosehacomentadoanteriormente,estaconfiguraciónesespecíficadecadabroker.EjemplodeACLsusandoelauth-plugindeMosquitto: home/floor1/room1 john home/floor2/# john, paul Con este ejemplo, un agente usando el usuario paul, no podrá publicar nisubscribirse al topic home/floor1/room1, pero podrá hacerlo sobre cualquiertopicquecuelguedehome/floor2(incluidoesemismotopic).

Page 4: Manual de integración de Latch en Mosquito MQTT Broker

Integración de Latch en Mosquito MQTT Broker

3.PlugindeLatchparaMosquittoEl plugin de Latch para Mosquitto nos permite añadir, de una forma fácil, unsegundo factor de autorización dentro del ecosistema de IoT, realizando laintegración en la plataforma (MQTT Broker), en lugar de en los dispositivos,permitiendo liberar recursos de estos, maximizando la compatibilidad yescalabilidad.Se ha desarrollado en lenguaje Python sobre la base del auth-plugin deMosquitto,por loquepermiteutilizartantoACLsestándar,comoautenticaciónusuario/passwordconLatchcomo2FA.ElplugindeLatchoperadediferentesformas:

§ Sobrelasoperacionespublish/subscribe,permitiendo2FAalpublicarunmensajeoalconectarunsubscriptor.

§ Sobre los topics, permitiendo añadir un 2FA de forma dinámica,

mediantelautilizacióndeInstanciasdeLatch.

3.1EmparejamientoLos usuarios del plugin que se emparejen, serán aquellos con capacidad delatchear las operaciones de publish/subscribe o un topic, dependiendo de laconfiguraciónquesehayarealizado.

Page 5: Manual de integración de Latch en Mosquito MQTT Broker

Integración de Latch en Mosquito MQTT Broker

Por cada "pairing" realizado, obtendremos un Account ID que será elidentificador del usuario en Latch. Este valor, es guardo en el ficherolatch.accounts.Paraqueesteprocesopuedarealizarse,elusuariotienequeestarcreadopreviamente,medianteelusodetools/users_op.pyscript.Elprocesode"pairing"puederealizarsededosformasdiferentes:

§ Mediante el uso del script en python: tools/pair_op.py. Este script nospediráelnombredelusuario,lapasswordyeltokengeneradoporLatchApp.

§ Activando la opción dynamic_pairing en el fichero de configuración

latch.confyrealizandolapublicaciónporpartedecualquieragentesobreel topic: LATCH/pairing=<tokenprovided>

Deigualforma,sepuederealizarelprocesode"unpairing":

§ Medianteelusodelscriptenpython:tools/pair_op.py.

§ Activando la opción de configuración dynamic_pairing en el fichero deconfiguraciónlatch.confyrealizandolapublicaciónporpartedecualquieragente sobre el topic: LATCH/unpairing

El topic LATCH/#es un topic reservado por Latch plugin para la gestión deLatch. La publicación sobre este topic, tiene que ir acompañada de usario ypassword,debidoaqueelpluginrealizaráautomáticamenteelpairing/unpairingconelusuarioindicadoenelpublish.ElcontenidodelmensajepublicadosobreeltopicLATCH/#esdescartado.

3.2PlugindeLatchparaoperacionespublish/subscribeElmodomássencillode"latchear"elbrokerMQTT,esmediantelasoperacionespublishy subscribe.ElplugindeLatchpermite controlarambasoperacionesanivel debroker, haciendoque se verifique la autorización antesde publicar osubscribir.Este proceso es independiente de los controles de seguridad que se hayanconfiguradoanteriormente en el broker.De esta forma,por ejemplo, el brokerMQTT puede verificar el usuario/password primero, y luego usar Latch comosegundofactordeautorizaciónparalaoperaciónquesehayasolicitado(publishosubscribe),siemprequeelagenteestéemparejado.Cuandounagenteemparejadosolicitapublicarunmensaje,cadapublicaciónseautorizaráconLatch.

Page 6: Manual de integración de Latch en Mosquito MQTT Broker

Integración de Latch en Mosquito MQTT Broker

Para los agentes emparejados que se subscriben, se verificará con Latch cadasubscripción,perounavezquehayansidoautorizados,nosevuelveaverificarelestadodelLatch.

3.3PlugindeLatchparalostopicsEstaeslacaracterísticamáspotentedelplugindeLatch,permitiendoestablecerun "latch" para cualquier topic de forma dinámica. De esta forma, cuando unagenteemparejadopublicaunmensajeenun topic ounagenteemparejadosesubscribe a un topic, después de los controles de seguridad ya definidos en elplugin, puede realizarse una segunda verificación contra Latch. En Latch, lacorrespondenciaauntopicesunainstancia.Cuando un agente emparejado publica un mensaje, cada uno de ellos, seautorizará con Latch. Para los agentes emparejados que se subscriben, severificará con Latch cada vez que se subscriban, pero una vez que hayan sidoautorizados,noselesvuelveaverificar.

ElplugindeLatchpermitelacreacióndeestostopic"latcheables"oinstancias,devariasformas:

Page 7: Manual de integración de Latch en Mosquito MQTT Broker

Integración de Latch en Mosquito MQTT Broker

§ Medianteelusodel scriptenPython:tools/instances_op.pyconelque se

puedencrearyborrartopics/instancias.

§ Realizando la publicación por parte de un agente sobre el topic: LATCH/create_instance=<instance_name>El Plugin creará automáticamente la nueva instancia con el nombreindicado y asociada al usuario con el que se realice la publicación. Elcontenidodelmensajepublicadosobreestetopicesdescartado.

§ Dinámicamente, mediante la opción instance_mode=dynamic en el

archivo de configuración latch.conf. Activando esta opción, por cadamensaje publicado se creará una instancia nueva, si no existiera, con elnombre del topic usado y asociada al usuario con el que se realice lapublicación.

4.InstalacióndelPlugindeLatch

4.1FicherosdelPluginElplugindeLatchconstadelossiguientesarchivos:

§ mosquitto_latch.py: plugindeLatchparaMosquitto§ mosquitto_latch_bag.py: libreríadelplugindeLatchparaMosquitto§ latch.conf: archivodeconfiguracióndelplugindeLatch.§ latch.instances: archivoconlasinstanciasdeLatch.§ latch.accounts: archivoconlosaccountIDdeLatch.§ mosquitto.acl: archivoconlasACLs.§ mosquitto.users: archivoconlosusuarios.§ tools/install.py: scriptdeinstalacióndelplugin.§ tools/instances_op.py: scriptparalagestiónestáticadeinstancias.§ tools/pair_op.py: scriptparalagestiónestáticadel"pairing".§ tools/users_op.py: scriptparalagestióndeusuarios.

4.2Pre-instalaciónAntes de la instalación del Plugin, lo primero a realizar será la creación de laaplicación dentro del portal de Latch (https://latch.elevenpaths.com). Laaplicaciónpuedesercreadaconcualquiernombre,ydebetener"2-FactorOTP"y"Locklatchesafterrequest"deshabilitados.Unavezcreadalaaplicación,hayquetomar nota de los valores Application ID y Secret, que serán utilizadosposteriormenteenlaconfiguracióndelplugin.

Page 8: Manual de integración de Latch en Mosquito MQTT Broker

Integración de Latch en Mosquito MQTT Broker

Conelprocesoanteriorfinalizado,hayqueverificarqueelsistemaquecontienenuestrobrokerMQTTtieneel softwarenecesarioparaelplugindeLatch.Paraello,lassiguienteslibreríasseránnecesarias:sudo apt-get install python-dev mosquitto-dev libmosquitto-dev

Además será necesario instalar una librería especial de Python: paho-mqtt.Puedeserinstaladacon:pip install paho-mqtt

De lamisma forma,elplugindeLatchnecesitaunplugindeMosquittoparaeldesarrollo de plugins de seguridad en Python. Puede ser instalado desdehttps://github.com/oribit/mosquitto_pyauth siguiendo las instrucciones allídetalladas.

Page 9: Manual de integración de Latch en Mosquito MQTT Broker

Integración de Latch en Mosquito MQTT Broker

4.3InstalaciónCon los prerrequisitos satisfechos, el Plugin de Latch puede descargarse dehttps://github.com/oribit/latch-pluginPor favor, descargar este repositorio eneldirectorioquesequiereusarparaelplugin.Un vez descargado el plugin ejecutaremos desde el directorio dónde se hayadescargado,python./tools/install.pyqueprocederáalaverificacióneinstalacióndelpluginenel sistema.Este scriptnossolicitará losdatosdeApplicationID ySecretanteriormentemencionadosylosguardarádentrodelficherolatch.conf.El script de instalación realizará una verificación de los pre-requisitos, y acontinuaciónprocederáalacopiadelosarchivosdelPlugineneldirectorioquesehayaespecificado.Los ficheros de configuración y scripts de utilidades (tools), se copiarán en eldirectorio:/etc/mosquitto/plugin/latch.El procesode instalaciónposiblementerequerirá permisos root al ejecutarse (sudo), debido a que el fichero deconfiguracióndeMosquittosueleperteneceraroot.Una vez finalizada la instalación, será necesario crear un usuario con el quepoder empezar a usarLatch. Esto puedo realizarsemediante el script:python./tools/users_op.py Con el usuario creado, se podrá realizar el"emparejamiento"delaaplicacióntalcomoestáexplicadoenlasección3.1.

4.4ConfiguraciónFinalizadalainstalación,elficherodeconfiguracióndelPluginestarásituadoen/etc/mosquitto/plugin/latch/latch.conf:

Page 10: Manual de integración de Latch en Mosquito MQTT Broker

Integración de Latch en Mosquito MQTT Broker

Los camposapp_idy secret_key contendrán losdatos facilitados en el scriptdeinstalación. Los campos publish y subscribe contendrán los IDs creadosautomáticamenteduranteelprocesodeinstalación.

4.5EjecuciónLa ejecución del Plugin se realiza de forma automática con la ejecución delbrokerMQTT.ElscriptdeinstalaciónañadirálassiguienteslíneasalarchivodeconfiguracióndeMosquitto:auth_plugin /usr/lib/mosquitto/auth_plugin_pyauth.so auth_opt_pyauth_module mosquitto_latch auth_opt_latch_conf latch.conf Todos los mensajes generados por el plugin, son redireccionados a la salidaestándarquesehayaconfiguradoenelbroker,por loquesisehaconfiguradounasalidaaunsyslogoaunarchivo,losmensajesdelPluginseránescritosenelmismolugar.Además del uso de la redirección estándar, el Plugin publica sobre el topicLATCH/statuscualquierbloqueoqueserealiceporestarLatchhabilitado,tantoanivelglobal,comoporoperación(publish/subscribe)oportopic.Aestetopicsepuedesubscribircualquieragente.