GNU/Linux >> Tutoriales Linux >  >> Ubuntu

Cómo instalar y proteger Mosquitto MQTT Messaging Broker en Ubuntu 20.04

Mosquitto es un intermediario de mensajes de código abierto que utiliza el transporte de telemetría de Message Queue Server (MQTT ) Protocolo. El protocolo está diseñado para proporcionar una comunicación ligera al Internet de las cosas (IoT ) dispositivos. Se usa comúnmente para el seguimiento GPS de vehículos, domótica, sensores ambientales y recopilación de datos a gran escala.

El protocolo MQTT se ejecuta sobre el modelo TCP/IP. Al ser liviano, su pequeña huella de código le permite crear aplicaciones para dispositivos con recursos mínimos. Se basa en el modelo de publicación/suscripción. En este modelo, el cliente se conecta al servidor Mosquitto, que actúa como intermediario para enviar información a otros clientes suscritos a un canal.

En este tutorial, instalará Mosquitto y configurará el bróker para usar SSL para proteger las comunicaciones.

Requisitos

  • Un servidor Ubuntu 20.04 con un usuario no root con privilegios sudo.
  • Un nombre de dominio (myqtt.example.com ) apuntó a su servidor.

Paso 1:instalar el servidor y el cliente Mosquitto

Ubuntu se envía con la versión anterior 1.6 de Mosquitto. Para instalar la última versión, agregue el repositorio oficial de Mosquitto.

$ sudo add-apt-repository ppa:mosquitto-dev/mosquitto-ppa

Instale el servidor Mosquitto y el cliente.

$ sudo apt install mosquitto mosquitto-clients

Comprueba el estado del servidor.

$ sudo systemctl status mosquitto
? mosquitto.service - Mosquitto MQTT Broker
     Loaded: loaded (/lib/systemd/system/mosquitto.service; enabled; vendor preset: enabled)
     Active: active (running) since Tue 2022-01-25 09:18:40 UTC; 25s ago
       Docs: man:mosquitto.conf(5)
             man:mosquitto(8)
   Main PID: 119694 (mosquitto)
      Tasks: 1 (limit: 2274)
     Memory: 1.0M
     CGroup: /system.slice/mosquitto.service
             ??119694 /usr/sbin/mosquitto -c /etc/mosquitto/mosquitto.conf

Jan 25 09:18:39 <userid> systemd[1]: Starting Mosquitto MQTT Broker...
Jan 25 09:18:40 <userid> systemd[1]: Started Mosquitto MQTT Broker.

Paso 2:configurar la autenticación de contraseña MQTT

Mosquitto viene con una utilidad para generar un archivo de contraseña llamado mosquitto_passwd . Mosquitto almacena todas las configuraciones en el /etc/mosquitto directorio.

Ejecute el siguiente comando para generar un archivo de contraseña cifrada en /etc/mosquitto/passwd para el nombre de usuario username . Introduzca una contraseña de su elección.

$ sudo mosquitto_passwd -c /etc/mosquitto/passwd username
Password:
Reenter password:

A continuación, cree un default.conf archivo bajo el /etc/mosquitto/conf.d directorio y ábralo para editarlo.

$ sudo nano /etc/mosquitto/conf.d/default.conf

Pegue las siguientes líneas para especificar la ubicación del archivo de contraseña. Si omite el campo de escucha, siempre se conectará de forma anónima, independientemente de la configuración.

listener 1883
password_file /etc/mosquitto/passwd

Guarde el archivo presionando Ctrl + X e ingresando Y cuando se le solicite.

Reinicie el servidor Mosquitto para implementar el cambio.

$ sudo systemctl restart mosquitto

Paso 3:probar el cliente Mosquitto

Dependiendo del caso de uso, puede usar el cliente Mosquitto para enviar y recibir mensajes sobre diferentes temas. Un cliente es un suscriptor o un editor.

El siguiente paso es suscribirse a un tema. En el protocolo MQTT, un tema se refiere a una cadena utilizada por el servidor/intermediario para filtrar mensajes para los clientes conectados. Estos son algunos temas de muestra que puede usar en una aplicación de automatización del hogar.

  • inicio/luces/sala de estar
  • hogar/luces/cocina
  • casa/luces/dormitorio_principal
  • casa/luces/dormitorio_de_ninos

Para suscribirse a un tema, ejecute mosquitto_sub -t comando seguido del tema. Por ejemplo, para suscribirse a home/lights/kitchen tema, ejecute el siguiente comando.

$ mosquitto_sub -u username -P YOUR_PASSWORD -t "home/lights/kitchen"

No cierre la ventana existente. Abra una nueva ventana de terminal para publicar un mensaje en home/lights/kitchen tema usando el siguiente comando.

$ mosquitto_pub -u username -P YOUR_PASSWORD -m "ON" -t "home/lights/kitchen"

Regrese a la primera ventana de terminal y recibirá ON carga útil.

ON

A continuación, envíe el OFF mensaje sobre el mismo tema desde el segundo terminal.

$ mosquitto_pub -u username -P YOUR_PASSWORD -m "OFF" -t "home/lights/kitchen"

El primer terminal mostrará el mensaje recién publicado.

ON

Si intenta enviar un comentario no autenticado, fallará. Por ejemplo, pruebe el siguiente comando.

$ mosquitto_sub -t "home/lights/sitting_room"
Connection error: Connection Refused: not authorised.

No se recomienda, pero debe agregar la siguiente línea a /etc/mosquitto/conf.d/default.conf archivo si desea ejecutar los comandos sin autenticación.

allow_anonymous true

Paso 4:instalar SSL

Para instalar un certificado SSL usando Let's Encrypt, necesitamos descargar la herramienta Certbot. Usaremos el instalador del paquete Snapd para eso.

Instale el instalador de Snap.

$ sudo apt install snapd

Asegúrese de que su versión de Snapd esté actualizada.

$ sudo snap install core 
$ sudo snap refresh core

Instale Certbot.

$ sudo snap install --classic certbot

Use el siguiente comando para asegurarse de que el comando Certbot se ejecute creando un enlace simbólico al /usr/bin directorio.

$ sudo ln -s /snap/bin/certbot /usr/bin/certbot

Genere un certificado SSL.

$ sudo certbot certonly --standalone --agree-tos --no-eff-email --staple-ocsp --preferred-challenges http -m [email protected] -d mqtt.example.com

El comando anterior descargará un certificado en /etc/letsencrypt/live/mqtt.example.com directorio en su servidor.

Generar un grupo Diffie-Hellman certificado.

$ sudo openssl dhparam -out /etc/ssl/certs/dhparam.pem 2048

Cree un directorio raíz web de desafío para la renovación automática de Let's Encrypt.

$ sudo mkdir -p /var/lib/letsencrypt

Cree un trabajo cron para renovar el SSL. Se ejecutará todos los días para verificar el certificado y renovarlo si es necesario. Para eso, primero crea el archivo /etc/cron.daily/certbot-renew y ábralo para editarlo.

$ sudo nano /etc/cron.daily/certbot-renew

Pegue el siguiente código.

#!/bin/sh
certbot renew --cert-name mqtt.example.com --webroot -w /var/lib/letsencrypt/

Guarde el archivo presionando Ctrl + X e ingresando Y cuando se le solicite.

Cambie los permisos en el archivo de tareas para que sea ejecutable.

$ sudo chmod +x /etc/cron.daily/certbot-renew

Paso 5:configurar MQTT SSL

Ahora que tenemos los certificados SSL listos, debemos proporcionarles acceso a Mosquitto. Para esto, necesitamos copiar los certificados a una ubicación desde donde Mosquitto pueda acceder a ellos.

$ sudo cp /etc/letsencrypt/live/mqtt.example.com/fullchain.pem /etc/mosquitto/certs/server.pem
$ sudo cp /etc/letsencrypt/live/mqtt.example.com/privkey.pem /etc/mosquitto/certs/server.key

Cambiar la propiedad del /etc/mosquitto/certs directorio al mosquitto usuario creado durante la instalación.

$ sudo chown mosquitto: /etc/mosquitto/certs

El siguiente paso para habilitar el cifrado SSL para Mosquitto es especificar la ubicación de los certificados SSL. Abra el archivo de configuración para editarlo.

$ sudo nano /etc/mosquitto/conf.d/default.conf

Pegue el siguiente código al final del archivo.

. . .
listener 8883
certfile /etc/mosquitto/certs/server.pem
cafile  /etc/ssl/certs/ISRG_Root_X1.pem
keyfile /etc/mosquitto/certs/server.key
dhparamfile /etc/ssl/certs/dhparam.pem

Guarde el archivo presionando Ctrl + X e ingresando Y Cuando se le solicite. Asegúrese de dejar una nueva línea final al final del archivo.

El listener 8883 parte configura el oyente cifrado. Es el puerto estándar para MQTT + SSL, denominado MQTTS. Las siguientes cuatro líneas especifican la ubicación de los archivos SSL.

Reinicie Mosquitto para actualizar la configuración.

$ sudo systemctl restart mosquitto

Deberá actualizar el firewall para permitir conexiones al puerto 8883.

$ sudo ufw allow 8883

A continuación, debemos probar la funcionalidad usando mosquitto_pub comando.

$ mosquitto_pub -h mqtt.example.com -t "home/lights/kitchen" -m "hello" -p 8883 --capath /etc/ssl/certs/ -u username -P YOUR_PASSWORD

Como puede ver, hemos incluido ciertos parámetros adicionales, incluido el número de puerto y la ruta a los certificados SSL. Siempre que necesite usar SSL, siempre tendrá que especificar el nombre de host completo, es decir, mqtt.example.com en lugar de localhost de lo contrario, daría un error.

También deberá agregar el --capath directiva cada vez. Le dice al cliente Mosquitto que busque los certificados raíz instalados por el sistema operativo.

Paso 6:configurar la renovación de SSL

Certbot renovará automáticamente su certificado antes de que caduque. Pero hay que indicarle que copie los certificados renovados en /etc/mosquitto/certs directorio y reinicie el servicio Mosquitto.

Vamos a hacer eso creando un script de shell. Crea un archivo mosquitto-copy.sh en /etc/letsencrypt/renewal-hooks/deploy directorio.

$ sudo nano /etc/letsencrypt/renewal-hooks/deploy/mosquitto-copy.sh

Pegue el siguiente código en él. Reemplace el valor de MY_DOMAIN variable con su dominio. El ${RENEWED_LINEAGE} la variable apunta a /etc/letsencrypt/live/mqtt.example.com directorio durante la renovación.

# Set which domain this script will be run for
MY_DOMAIN=mqtt.example.com
# Set the directory that the certificates will be copied to.
CERTIFICATE_DIR=/etc/mosquitto/certs

if [ "${RENEWED_DOMAINS}" = "${MY_DOMAIN}" ]; then
	# Copy new certificate to Mosquitto directory
	cp ${RENEWED_LINEAGE}/fullchain.pem ${CERTIFICATE_DIR}/server.pem
	cp ${RENEWED_LINEAGE}/privkey.pem ${CERTIFICATE_DIR}/server.key

	# Set ownership to Mosquitto
	chown mosquitto: ${CERTIFICATE_DIR}/server.pem ${CERTIFICATE_DIR}/server.key

	# Ensure permissions are restrictive
	chmod 0600 ${CERTIFICATE_DIR}/server.pem ${CERTIFICATE_DIR}/server.key

	# Tell Mosquitto to reload certificates and configuration
	pkill -HUP -x mosquitto
fi

Guarde el archivo presionando Ctrl + X e ingresando Y cuando se le solicite.

Haz que el archivo sea ejecutable.

$ sudo chmod +x /etc/letsencrypt/renewal-hooks/deploy/mosquitto-copy.sh

Este script se ejecutará automáticamente en cada renovación exitosa del certificado.

Si está ejecutando Mosquitto y un servidor web como Nginx, debe indicarle a Certbot que detenga el servidor antes de la renovación y lo inicie nuevamente una vez que finalice. Para hacerlo, abra el archivo etc/letsencrypt/renewal/mqtt.example.com.conf .

$ sudo nano /etc/letsencrypt/renewal/mqtt.example.com.conf

Agregue las siguientes líneas al final del archivo. Cambie los comandos según el servidor web que esté utilizando.

pre_hook = systemctl stop nginx
post_hook = systemctl start nginx

Guarde el archivo presionando Ctrl + X e ingresando Y cuando se le solicite.

Ejecute un ensayo de Certbot para verificar.

$ sudo certbot renew --dry-run

Si no ve ningún error, significa que todo está configurado.

Paso 7:Configurar Websockets

Puede configurar Mosquitto para usar el protocolo MQTT desde los navegadores usando Javascript usando la funcionalidad Websockets. Para habilitarlo, abra el archivo de configuración.

$ sudo nano /etc/mosquitto/conf.d/default.conf

Pegue las siguientes líneas al final del archivo.

. . .
listener 8083
protocol websockets
certfile /etc/mosquitto/certs/server.pem
cafile  /etc/ssl/certs/ISRG_Root_X1.pem
keyfile /etc/mosquitto/certs/server.key
dhparamfile /etc/ssl/certs/dhparam.pem

Guarde el archivo presionando Ctrl + X e ingresando Y cuando se le solicite.

Si nota, es el mismo bloque que usamos para habilitar SSL, excepto por los campos de número de puerto y protocolo. 8083 es ​​el puerto más común utilizado por MQTT para hablar mediante WebSockets.

Reinicie el servicio Mosquitto.

$ sudo systemctl restart mosquitto

Abra el puerto 8083.

$ sudo ufw allow 8083

Necesitamos usar un cliente MQTT basado en navegador para probar la funcionalidad de WebSockets. Hay muchos clientes disponibles, pero usaremos el cliente HiveMQ Websocket para nuestro propósito. Inicie el cliente en su navegador y verá lo siguiente.

Como se muestra en la captura de pantalla anterior, complete los campos como se muestra.

  • El host debe ser el dominio de su servidor Mosquitto, mqtt.example.com.
  • El puerto debe ser 8083.
  • El campo ClientID se puede dejar como está.
  • El nombre de usuario debe ser su nombre de usuario de Mosquitto.
  • La contraseña debe ser la contraseña que creó anteriormente.
  • Compruebe el SSL caja.

Presiona el botón Conectar y el cliente HiveMQ se conectará a su servidor Mosquitto.

Una vez conectado, ingresa home/lights/kitchen como tema, ingresa cualquier mensaje y presiona Publicar .

El mensaje aparecerá en tu mosquitto_sub ventana de terminal que confirma la conexión exitosa.

Esto muestra que la implementación de Websockets es exitosa.

Conclusión

Esto concluye nuestra configuración de un servidor MQTT seguro, protegido con contraseña y cifrado con SSL en una máquina basada en Ubuntu 20.04. Si tiene alguna pregunta, publíquela en los comentarios a continuación.


Ubuntu
  1. Cómo instalar y asegurar phpMyAdmin en Ubuntu

  2. Cómo instalar Node.js y NPM en Ubuntu 18.04 y 20.04

  3. Cómo instalar PHP 7.4 y 8.0 en Ubuntu 18.04 o 20.04

  4. Cómo instalar y asegurar Redis en Ubuntu 20.04

  5. Cómo instalar y asegurar Redis en Ubuntu 18.04

Cómo instalar y usar R en Ubuntu

Cómo instalar y usar el comando Exa en Ubuntu 20.04

Cómo instalar Mosquitto MQTT en Ubuntu 20.04 LTS

Cómo instalar y asegurar phpMyAdmin en Ubuntu 14.04

Cómo instalar y proteger Memcached en Ubuntu 18.04

Cómo instalar Signal Messaging en Ubuntu 20.04