Mosquitto: Configuración de usuarios y clientes

Aprende cómo configurar de manera sencilla tu servidor MQTT favorito para añadirle un punto de seguridad

Mosquitto: Configuración de usuarios y clientes

Para esta entrada doy por sentado que todos conocemos lo que es el protocolo MQTT y el servidor Mosquitto. Si no los conocéis, echad un vistazo por Internet o pedidme una entrada donde me explaye un poco más sobre ello, que encantado la añado 😊.

El objetivo de esta entrada es explicaros cómo podemos configurar nuestro servidor de Mosquitto fácilmente para que tenga un punto de seguridad en nuestra red, añadiéndole autenticación basada en usuario-contraseña y un control para que sólo determinados clientes puedan hacer uso del bróker.

Fichero de configuración mosquitto.conf

El primer paso será localizar nuestro fichero de configuración. Si estamos utilizando una instalación directa sobre un sistema Linux, usualmente estará localizado bajo /etc/mosquitto/mosquitto.conf. Si lo tenemos desplegado en un contenedor Docker, entonces dependerá del fichero que hayamos mapeado hacia /mosquitto/config. Si usamos uno propio... entonces sabréis dónde estará.

Para este tutorial, partiremos de una imagen Docker que hará uso de un fichero docker-compose.yml como el siguiente:

version: "3.5"

services:
  mosquitto:
    image: eclipse-mosquitto:latest
    hostname: mosquitto
    container_name: "mosquitto"
    restart: unless-stopped
    expose:
      - "1883"
    ports:
      - "1883:1883"
    volumes:
      - ./data:/mosquitto/data
      - ./log:/mosquitto/log
      - ./config:/mosquitto/config
    networks:
      - public

networks:
  public:
    external:
      name: public
Fichero docker-compose.yml para levantar Mosquitto

Como podéis observar, estoy montando la carpeta config bajo el directorio /mosquitto/config. Dentro de dicha carpeta, lo que tendré serán 2 ficheros: mosquitto.conf y passwd. Poco a poco iremos viendo lo que son. Por el momento, bastará con saber que el fichero mosquitto.conf ha de tener el siguiente contenido de partida:

persistent_client_expiration 1d
port 1883
max_connections 1024
log_timestamp true
log_timestamp_format %Y-%m-%dT%H:%M:%S
persistence_location /data

log_dest topic
log_type error
log_type warning
log_type notice
log_type information
Fichero de configuración mosquitto.conf del que partiremos

Añadir control de usuarios

Partiendo del ejemplo anterior, modificaremos nuestro mosquitto.conf para añadirle las siguientes líneas:

password_file /mosquitto/config/passwd
allow_anonymous false
Líneas a añadir a nuestro fichero mosquitto.conf

Con ello, lo que estamos haciendo es decirle a Mosquitto que usará un fichero de contraseñas que se llamará passwd y que será el que use para guardar nuestros usuarios y sus respectivas contraseñas. Además, le estaremos indicando que no vamos a permitir que se nos conecte al bróker ningún usuario anónimo o sin autenticar. Pero... ¿cómo añadimos los usuarios a ese fichero?

Para añadir los usuarios, nos valdremos de una herramienta que trae Mosquitto, la cual es mosquitto_passwd. Esta orden nos va a permitir gestionar nuestros usuarios.

NOTA: Si el servidor de Mosquitto lo tenemos corriendo en un contenedor Docker, para acceder a la terminal bastará con utilizar el comando:
docker exec -i mosquitto sh
y podremos ejecutar los siguientes comandos desde la terminal del contenedor.

Para generar un usuario nuevo, deberemos ejecutar la orden mosquitto_passwd, seguida del fichero donde queremos que persista la información y el nombre del usuario. En cuanto pulsemos Enter, nos pedirá que introduzcamos la contraseña y que la repitamos, tras lo cual podremos ver que aparece una nueva línea en nuestro fichero de usuarios. Un ejemplo de ello sería lo siguiente para un usuario testUser y una contraseña testPass que se almacenará cifrada (recordad que lo estamos ejecutando desde la terminal de un contenedor Docker, de ser directamente en el sistema, el fichero de passwd deberá ser el que hayamos especificado en nuestro mosquitto.conf):

#> mosquitto_passwd /etc/mosquitto/passwd testUser
Password:
Reenter password:

#> cat /etc/mosquitto/passwd
testUser:$6$4UZ5gw5jqFTTRgdx$zsORbEVPSqUqMcwN3KucDOS5b7M/EpKU/PVj12eY4cFjUlml8PhkIRLifx0E3/a5y5/gnitwK6s+3KGLk1s+sg==
#> 
Resultado al añadir un nuevo usuario con mosquitto_passwd

Si, por el contrario, quisiéramos eliminar ese usuario de la lista, bastará con ejecutar el mismo comando con el modificador -D:

#> mosquitto_passwd -D /etc/mosquitto/passwd testUser
Orden para eliminar un usuario del fichero passwd

Con esto, la próxima vez que arranquemos nuestro Mosquitto, veremos que, si no especificamos un usuario y contraseña de los que tenemos en nuestro fichero passwd, no nos será posible conectarnos.

Si quieres ver qué más opciones puedes ejecutar con ese comando, bastará un mosquitto_passwd --help para que puedas verlas todas.

Añadir control de clientes

Por otro lado, podemos añadir una capa más de seguridad si especificamos ciertas reglas cuando un cliente se va a conectar. Así, podemos limitar que sólo los clientes con ID se puedan registrar en el sistema. Volvemos a nuestro fichero mosquitto.conf y añadimos las siguientes líneas:

allow_zero_length_clientid false
auto_id_prefix anonymous-
clientid_prefixes secretprefix-
Líneas a añadir a nuestro fichero mosquitto.conf

Como podéis ver arriba, lo que estamos haciendo es prohibir todas las conexiones cuyo clientid sea nulo o vacío. Además, por si alguno se nos colara, le forzamos a que su ID empiece por anonymous-, de tal manera que cuando listemos los clientes conectados podamos identificarlo rápidamente (esto es un poco redundante, pues ya la primera evita que esto pueda darse). La tercera línea lo que hace es indicarle a Mosquitto que sólo los clientes cuyo ID empiece por secretprefix- podrán conectarse. Si bien esto no es una seguridad extrafuerte, añade una capa de control que hace que, si intentamos conectarnos conociendo un par usuario-contraseña pero desconocemos esto, el servidor nos rechace.

Y con esto esta entrada cumple su objetivo 😊. Dejo para otro caso el tema de añadir TLS  a las comunicaciones de Mosquitto, con certificados y demás. De momento, y si vais a usar un servidor MQTT en vuestra LAN a la que, en principio, sólo tenéis acceso vosotros, con estos pasos es más que suficiente para ir empezando.

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