Open martuan opened 2 years ago
Prueba de uso de usuario/clave para luego probar en server “telemetría.inti.gob.ar”.
Se instalacó Mosquitto en Linux (Ubuntu) 1) Agregar el repositorio oficial de Mosquitto:
$ sudo apt-add-repository ppa:mosquitto-dev/mosquitto-ppa
2) Si la actualización del índice del paquete no comenienza sola, actualízarla.
$ sudo apt-get update
3) Instalación:
$ sudo apt-get install mosquitto
4) Instalar Clientes Mosquitto:
$ sudo apt-get install mosquitto-clients
5) Verificar si Mosquitto está activo:
$ sudo service mosquitto status
6) Accediendo desde otra pc (con Win10) de la misma red, arrojó siguiente error: "Error: No se puede establecer una conexion ya que el equipo de destino denegó expresamente dicha conexión"
Solución: Cuando Mosquitto se ejecuta sin un archivo de configuración, o sin configurar ningún listener, ahora se vinculará a las interfaces de loopback 127.0.0.1 y / o :: 1. Esto significa que solo serán posibles las conexiones desde el host local.
La ejecución del broker con un listener definido se vinculará de forma predeterminada a 0.0.0.0 / :: y, por lo tanto, será accesible desde cualquier interfaz.
Para que Mosquitto pueda escuchar en todas las IPs, ejecutar $ sudo nano /etc/mosquitto/mosquitto.conf
y añadir las líneas: "# Note that this will not allow anonymous access by default." "listener 1883"
7) En intento siguiente de conexión se tiene error: "Connection error: Connection Refused: not authorised."
Solución: Todos los listener tienen el valor predeterminado allow_anonymous false a menos que se establezca explícitamente como verdadero en el archivo de configuración. Al configurar el listener, se debe configurar un método de control de acceso y autenticación, o establecer allow_anonymous como true. Inicialmente se establece al anónimo como TRUE.
Agregar línea en archivo mosquitto.conf: allow_anonymous true
8) Crear archivo de usuario y passwaord para autenticar y deshabilitar la conexión de usuarios anónimos. Crear archivo txt con usuario y clave según formato:
user1:clave1 user2:clave2
Luego encriptar archivo con comando: $sudo mosquitto_passwd -U nombre_de_archivo.txt
Luego agregar y modificar archivo mosquitto.conf las siguientes líneas: allow_anonymous false (modificación) password_file etc/mosquitto/nombre_de_archivo.txt (agregado)
La conexión se logra concretar. Archivos adjuntos: captura de trama (se ve cómo viaja en texto plano los datos).
Métodos para robustecer la protección de datos entre publicador y suscriptor:
ACL (Whitelist/Blacklist: por IP o por MAC)
TLS (encriptación)
Autenticación por usuario y contraseña
Filtrar por longitud del paquete de datos esperado
Filtrar por paquetes de datos enviados de forma sincrónica (en un determinado tiempo esperado; los que no entran en esa ventana serán descartados).
Instalar Broker MQTT Mosquitto en Raspberry Pi
1) Comprobar la versión de SO instalada (en este caso es la Buster):
$ lsb_release -a
2) Acceder al repositorio importando la llave:
$ wget http://repo.mosquitto.org/debian/mosquitto-repo.gpg.key
$ sudo apt-key add mosquitto-repo.gpg.key
$ cd /etc/apt/sources.list.d/
$ sudo wget http://repo.mosquitto.org/debian/mosquitto-buster.list (es el repositorio para la versión instalada de OS en la placa)
3) Actualizar la base de datos:
$ sudo apt-get update
4) Instalar Mosquitto (server y cliente):
$ sudo apt install mosquitto mosquitto-clients
5) Se ejecuta comando para que servicio se inicie sólo cuando arranque la Raspberry:
$ sudo systemctl enable mosquitto
6) Para que funcione correctamente el servicio se realizan las mismas correcciones que las hechas en la instalación de Mosquitto en Ubuntu. Corregir/agregar en el archivo mosquitto.conf (en /etc/mosquitto/):
listener 1883 allow_anonymous false password_file etc/mosquitto/conf.d/usuarios.txt
El archivo usuarios.txt es el que tiene el listado de usuarios y claves de acceso al broker (archivo encriptado y ubicado en /etc/mosquitto/conf.d/).
7) Luego de cada cambio recordar que hay que parar el servicio y volverlo a iniciar. Se puede chequear luego que el servicio esté corriendo:
$ sudo systemctl stop mosquitto
$ sudo systemctl start mosquitto
$ sudo systemctl status mosquitto
Configuración de ACL (listas de control de acceso por usuario y permiso) en Raspberry Pi.
1) Generar archivo "acl" en el directorio conf.d con descripción de permisos por usuario y topics:
user user1 topic write prueba/publicaciones/user1 topic read prueba/publicaciones/user2 topic readwrite prueba/publicaciones/comun
user user2 topic write prueba/publicaciones/user2 topic read prueba/publicaciones/user1 topic readwrite prueba/publicaciones/comun
2) Agregar en el archivo mosquitto.conf (en /etc/mosquitto/):
acl_file /etc/mosquitto/conf.d/acl
3) Reiniciar el servicio mosquitto.
Observación: Al realizar pruebas para ver si está funcionando el acceso controlado por ACL el broker no responde cuando se intenta publicar/suscribir a un topic no autorizado. El broker no devuelve mensaje de error, simplemente no hace nada (siempre que se publique/suscriba con usuarios existentes).
Funciona correctamente la comunicación por ACL. Probado con ESP32 como publicador, Raspberry pi como broker y aplicación "mqtt-explorer" como suscriptor. Rechaza conexiones no autorizadas.
TLS/SSL - Autenticación simple (sólo autentica bróker/servidor)
Hacer que el Raspberry Pi sea Autoridad de Certificación (CA), crear las claves y los certificados. En el bróker MQTT (Mosquitto en Raspberry Pi) ir al directorio /home/pi, crear una carpeta certificados y dentro de ella realizar los siguientes pasos:
1) Crear clave ca.key
openssl genrsa -des3 -out ca.key 2048 Pide clave y confirmación cuando se genera.
2) Crear certificado de seguridad ca.crt. Se usa la llave de CA del paso 1.
openssl req -new -x509 -days 1826 -key ca.key -out ca.crt Se ingresan los siguientes datos (que son obligatorios, el resto quedan en blanco): Country Name: AR Common Name: 10.101.42.55 (IP de la interface WLAN de la Raspberry)
3) Crear clave server.key
openssl genrsa -out server.key 2048 Se crea sin clave.
4) Crear requerimiento de certificado (.csr) para el servidor.
openssl req -new -key server.key -out server.csr Se ingresan los siguientes datos (que son obligatorios, el resto quedan en blanco): Country Name: AR Common Name: rbpi-electronica01-wifi.inti.gob.ar (nombre DNS de la interface WLAN de la Raspberry)
5) Crear y firmar el certificado del servidor server.crt
openssl x509 -req -in server.csr -CA ca.crt -CAkey ca.key -CAcreateserial -out server.crt -days 360
6) Copiar las claves y los certificados creados a las carpetas de Mosquitto: En /etc/mosquitto/ca_certificates ubicar archivo ca.crt En /etc/mosquitto/certs ubicar archivos server.crt y server.key Cambiar permisos a los archivos para que los pueda leer otro además de root $ chmod 644 server.key Cambiar owner al archivo ca.crt (debe ser dueño el usuario “mosquitto”).
7) Copiar el certificado de la CA en el cliente (pc). En c:/certificados ca.crt (el directorio puede ser cualquiera)
8) Editar archivo de configuración de Mosquitto (/etc/mosquitto/mosquitto.conf) en el server/broker y agregar las siguientes líneas:
'# Acceso puerto 8883 cifrado listener 8883 cafile /etc/mosquitto/ca_certificates/ca.crt certfile /etc/mosquitto/certs/server.crt keyfile /etc/mosquitto/certs/server.key
9) Reiniciar servicio Mosquitto en el broker.
Prueba desde cliente pc (también puede ser desde la misma Raspberry) hacia bróker Raspberry. Se publica y se suscribe con los siguientes comandos:
$ mosquitto_sub -h rbpi-electronica01-wifi.inti.gob.ar -t "prueba/comun" -u user1 -P clave1 -p 8883 --cafile ca.crt -d
$ mosquitto_pub -h rbpi-electronica01-wifi.inti.gob.ar -t "prueba/comun" -m "hola" -u user1 -P clave1 -p 8883 --cafile ca.crt -d
y publica y se recibe mensaje correctamente.
En MQTT, la medida más básica es aplicar usuario y clave en el envío/recepción de mensajes. Es una medida que no brinda mayor seguridad ya que el usuario y clave viajan en texto plano. De todas maneras, podemos hacer una prueba para ver cómo funciona. El servidor usado hasta ahora (“broker.hivemq.com”) creo que no tiene posibilidad de validar usuario y clave (no encontré nada en la web). El servidor “test.mosquitto.org” tiene esa posibilidad. Los datos son los siguientes: • Comunicarse al puerto 1884 • Publicar/suscribirse con distintos niveles de usario y clave según acción deseada: rw / readwrite : read/write access to the # topic hierarchy ro / readonly : read only access to the # topic hierarchy wo / writeonly : write only access to the # topic hierarchy
Ejemplo de publicación con usuario “rw”: $ mosquitto_pub -h test.mosquitto.org -p 1884 -t "INTI/Electronica/esp32/sensor_1" -m "mensaje" -u rw -P readwrite
Ejemplo de suscripción usuario “ro”: $ mosquitto_sub -h test.mosquitto.org -p 1884 -t "INTI/Electronica/esp32/sensor_1" -u ro -P readonly
Como segundo paso podríamos probar en el servidor de INTI “telemetría.inti.gob.ar”. Allí hay que configurar un archivo de usuarios y claves en el servidor.
También hay que ver (algunos items son a configurar en broker): -QoS a implementar. -ACLs -TLS/SSL -Last will message -Desahilitar uso de wildcards