Aumenta la seguridad de Mosquitto añadiendo TLS

Si tienes tu broker de Mosquitto expuesto al exterior, lo ideal es que mantengas todas las conexiones cifradas y seguras. En esta entrada te enseño cómo hacerlo.

Aumenta la seguridad de Mosquitto añadiendo TLS
Photo by Aarón Blanco Tejedor / Unsplash

Mosquitto es un broker MQTT de código abierto que se utiliza en muchos proyectos de Internet de las cosas (IoT). Una de las formas de aumentar la seguridad de Mosquitto es configurarlo para que sólo funcione con Transport Layer Security (TLS). TLS es un protocolo de seguridad que permite cifrar la comunicación entre el broker y los clientes MQTT.

En una entrada anterior vimos cómo realizar una configuración básica con usuarios y contraseñas con el fin de asegurar un poco el acceso al mismo.

En este caso, te mostraré cómo configurar Mosquitto para que funcione con TLS. Seguiremos los siguientes pasos:

  1. Generar los certificados y las claves
  2. Configurar Mosquitto para TLS

Paso 1: Generar los certificados y las claves

Lo primero que debes hacer es generar los certificados y las claves necesarios para configurar TLS en Mosquitto. Para hacerlo, sigue estos pasos:

Instala OpenSSL en el sistema (si no lo tienes instalado ya). Puedes instalar OpenSSL ejecutando el siguiente comando en una terminal en sistemas basados en Debian o Ubuntu:

sudo apt install openssl

Crea una autoridad de certificación (CA) que se encargue de firmar los certificados de los clientes y del servidor. Para hacerlo, ejecuta el siguiente comando en una terminal:

openssl req -new -x509 -days 3650 -extensions v3_ca -keyout ca.key -out ca.crt

Este comando crea una nueva autoridad de certificación (CA) que estará vigente durante 3650 días. Deberás responder a varias preguntas sobre el certificado, incluyendo la información de contacto de la entidad que emite el certificado. Asegúrate de que la información que proporciones sea precisa, ya que se incluirá en el certificado. Ademásk necesitarás establecer una contraseña que será necesaria para firmar los certificados posteriormente.

Crea un certificado y una clave para el servidor MQTT que se utilizará para cifrar las comunicaciones. Para hacerlo, ejecuta el siguiente comando en una terminal:

openssl req -newkey rsa:2048 -nodes -keyout server.key -out server.csr

Este comando crea un nuevo certificado y clave para el servidor MQTT. Deberás responder a varias preguntas sobre el certificado, incluyendo la información de contacto de la entidad que emite el certificado. Asegúrate de que la información que proporciones sea precisa, ya que se incluirá en el certificado.

Firma el certificado del servidor con la CA que creaste en el paso 2. Para hacerlo, ejecuta el siguiente comando en una terminal:

openssl x509 -req -in server.csr -CA ca.crt -CAkey ca.key -CAcreateserial -out server.crt -days 3650

Este comando firma el certificado del servidor MQTT con la CA que creaste en el paso 2. El certificado firmado estará vigente durante 3650 días.

Después de seguir estos pasos, deberías tener los archivos necesarios para configurar TLS en Mosquitto. En este ejemplo, los archivos que se necesitan son ca.crt, server.crt y server.key.

Paso 2: Configurar Mosquitto para TLS

Ahora debes configurar Mosquitto para que sólo funcione con TLS. Para hacerlo, sigue estos pasos:

  • Abre el archivo de configuración de Mosquitto /etc/mosquitto/mosquitto.conf  en un editor de texto.
  • Agrega o modifica las siguientes líneas:
per_listener_settings true

# Restringimos las conexiones inseguras a la red local
listener 1883 127.0.0.1

# Habilitar el cifrado TLS
listener 8883 0.0.0.0

allow_zero_length_clientid false
allow_anonymous false
persistent_client_expiration 1h
use_username_as_clientid false
use_identity_as_username true

require_certificate true
cafile /ruta/al/archivo/ca.crt
certfile /ruta/al/archivo/server.crt
keyfile /ruta/al/archivo/server.key
tls_version tlsv1.3
  • Reemplaza /ruta/al/archivo/ con la ruta de los archivos de certificado y clave que generaste en el paso 1. La opción listener indica que Mosquitto debe escuchar en el puerto 8883 (el puerto predeterminado para TLS). Las opciones cafile, certfile y keyfile indican las rutas a los archivos de certificado y clave que generaste. La opción tls_version indica la versión de TLS que se utilizará (en este ejemplo, tlsv1.3).Guarda el archivo de configuración y cierra el editor de texto.
  • Reinicia el servicio de Mosquitto para aplicar la nueva configuración ejecutando el siguiente comando en una terminal:
sudo systemctl restart mosquitto

Después de seguir estos pasos, Mosquitto sólo escuchará conexiones cifradas TLS en el puerto 8883. Las conexiones no cifradas a través del puerto predeterminado (1883) serán rechazadas (sólo funcionarán en la propia red local del servidor o contenedor Docker). Es importante tener en cuenta que, para que los clientes se conecten al broker Mosquitto, deben usar certificados y claves válidos que correspondan a los que configuraste en el paso 1.

Paso 3: Generar los certificados de los clientes

Para que los clientes se conecten al broker Mosquitto a través de TLS, necesitarás certificados y claves válidos para los clientes. Los clientes MQTT necesitan un certificado de cliente y una clave privada que correspondan a los certificados y las claves del servidor Mosquitto.

Para generar certificados y claves para los clientes, puedes seguir los mismos pasos que seguiste para generar los certificados del servidor Mosquitto. Usarás la misma CA y los mismos certificados que para el servidor, aunque también puedes crear una CA distinta y usarla con los diferentes certificados  de cada cliente.

Aquí te presentamos los pasos para generar un certificado y una clave para un cliente MQTT usando la CA de los pasos anteriores:

  • Crea una solicitud de certificado de cliente utilizando el siguiente comando de OpenSSL en una terminal:
openssl req -newkey rsa:2048 -nodes -keyout client.key -out client.csr

Este comando creará una clave privada y una solicitud de certificado de cliente que deberás completar con información sobre el cliente.

  • Firma el certificado de cliente con la CA que generaste en el paso anterior utilizando el siguiente comando de OpenSSL en una terminal:
openssl x509 -req -in client.csr -CA ca.crt -CAkey ca.key -CAcreateserial -out client.crt -days 365

Este comando firma el certificado de cliente con la CA que creaste y lo almacena en el archivo client.crt.

  • Copia los archivos client.crt, client.key y ca.crt a cada dispositivo que se conectará al broker Mosquitto a través de TLS.

Siguiendo estos pasos, deberías poder conectar tus clientes MQTT al broker Mosquitto a través de TLS utilizando certificados y claves firmados por tu propia CA. Recuerda que debes generar un certificado y una clave diferentes para cada cliente MQTT y copiar manualmente los certificados de los clientes en el servidor Mosquitto si estás utilizando certificados autofirmados.

Conclusión

Configurar Mosquitto para que sólo funcione con TLS es una medida de seguridad importante que puede ayudar a proteger los datos y la privacidad de los usuarios. Al seguir estos pasos, podrás configurar Mosquitto para que sólo escuche conexiones cifradas TLS y asegurarte de que los clientes se conecten al broker de manera segura.

Recuerda que, además de configurar Mosquitto para TLS, es importante tomar otras medidas de seguridad para proteger tu broker MQTT y tus dispositivos IoT. Algunas medidas que puedes tomar incluyen:

  • Configurar contraseñas para los clientes MQTT y para el propio broker.
  • Limitar el acceso al broker mediante el uso de cortafuegos y otros mecanismos de protección.
  • Utilizar clientes MQTT seguros que cifren los datos y autentiquen los mensajes.
  • Actualizar regularmente el software del broker y de los dispositivos IoT para corregir vulnerabilidades conocidas.

Siguiendo estas recomendaciones, podrás mejorar la seguridad de tus dispositivos IoT y mantenerlos protegidos frente a posibles ataques.

Si te ha gustado la entrada, o te ha sido útil y quieres ayudarme a pagar los gastos que conlleva el servidor y mantener así el blog libre completamente de anuncios, puedes hacer una donación en Bitcoin en la siguiente dirección:

Donar