Skip to content
Learni
Voir tous les tutoriels
IoT & DevOps

Comment sécuriser Mosquitto broker MQTT en 2026

Read in English

Introduction

En 2026, les architectures IoT exigent des brokers MQTT ultra-sécurisés et scalables. Mosquitto, le broker open-source le plus léger et performant, domine avec son support natif des protocoles MQTT 5.0, persistence persistante et bridges inter-brokers. Ce tutoriel expert vous guide pas à pas pour déployer un Mosquitto production-ready : installation sur Linux, configuration avancée avec authentification par mot de passe, ACL granulaires, chiffrement TLS 1.3, persistence et Docker Compose pour l'orchestration.

Pourquoi c'est crucial ? Dans un monde zero-trust, un broker mal sécurisé expose vos devices à des attaques MITM ou DoS. Nous couvrons des configs complètes, testables immédiatement, avec des pièges experts évités. À la fin, votre broker gérera 100k+ connexions QoS2 sans faillir, prêt pour Kubernetes ou edge computing. (142 mots)

Prérequis

  • Serveur Ubuntu 24.04 LTS ou Debian 12 (4 Go RAM min. pour tests load).
  • Connaissances avancées MQTT (QoS, topics wildcards, retained messages).
  • OpenSSL 3+ installé (sudo apt install openssl).
  • Docker 27+ et Docker Compose 2.29+ pour le déploiement conteneurisé.
  • Outils : mosquitto_pub/sub (installés avec le broker), jq pour JSON parsing.

Installation de Mosquitto

install-mosquitto.sh
#!/bin/bash
sudo apt update
sudo apt install -y software-properties-common
dist="$(lsb_release -cs)"
wget -O - https://repo.eclipse.org/content/repositories/dev_mosquitto/com/eclipse-mosquitto/repo/${dist}-main/public.key | sudo tee /etc/apt/trusted.gpg.d/mosquitto-${dist}.asc > /dev/null
sudo add-apt-repository -y "deb https://repo.eclipse.org/content/repositories/dev_mosquitto/com/eclipse-mosquitto/repo/${dist}-main/ ${dist} main"
sudo apt update
sudo apt install -y mosquitto mosquitto-clients
sudo systemctl stop mosquitto
sudo systemctl disable mosquitto

Ce script installe la dernière version dev de Mosquitto (2.0.18+ en 2026) via le repo officiel Eclipse pour MQTT 5.0 complet. On désactive le service systemd pour une config manuelle. Évitez les paquets distro obsolètes qui manquent de features comme shared subscriptions.

Configuration basique et listener

Maintenant, testons le broker nu. Copiez le code d'installation et exécutez-le. Vérifiez avec mosquitto_sub -h localhost -t test/topic dans un terminal, et publiez via mosquitto_pub -h localhost -t test/topic -m 'Hello MQTT'. Le broker écoute par défaut sur 1883 (non sécurisé).

Configuration Mosquitto basique

/etc/mosquitto/mosquitto.conf
persistence true
persistence_location /var/lib/mosquitto/
log_dest file /var/log/mosquitto/mosquitto.log
log_type all
log_timestamp true
log_timestamp_format %Y-%m-%dT%T%z
max_queued_messages 10000
max_queued_bytes 1048576
allow_anonymous false
listener 1883 localhost
listener 8883
protocol mqtt
max_connections 100000

Cette config active la persistence (messages survivent aux redémarrages), logging détaillé avec timestamps ISO, et deux listeners : 1883 local-only pour tests, 8883 pour MQTT standard. Limitez les queues pour éviter OOM sous load. allow_anonymous false force l'auth dès le départ.

Lancement et test basique

Placez la config dans /etc/mosquitto/mosquitto.conf, créez les dirs sudo mkdir -p /var/lib/mosquitto /var/log/mosquitto, sudo chown -R mosquitto:mosquitto /var/{lib,log}/mosquitto. Lancez : sudo -u mosquitto mosquitto -c /etc/mosquitto/mosquitto.conf. Testez avec pub/sub – erreur auth attendue (bonne !).

Génération du fichier de mots de passe

gen-passwords.sh
#!/bin/bash
sudo mkdir -p /etc/mosquitto/auth
sudo touch /etc/mosquitto/auth/passwordfile
sudo chown mosquitto:mosquitto /etc/mosquitto/auth/passwordfile
sudo -u mosquitto mosquitto_passwd -c /etc/mosquitto/auth/passwordfile admin 'SecurePass2026!'
sudo -u mosquitto mosquitto_passwd /etc/mosquitto/auth/passwordfile iotdevice 'DeviceToken123'
sudo chmod 600 /etc/mosquitto/auth/passwordfile

Génère un fichier hashed avec mosquitto_passwd (SHA512 PBKDF2). Ajoute deux users : admin (gestion) et iotdevice (publish/sub). Permissions strictes 600 pour sécurité. Ne stockez jamais plaintext en prod ; rotatez régulièrement.

Intégration auth par password

Mettez à jour mosquitto.conf avec password_file /etc/mosquitto/auth/passwordfile. Redémarrez : pkill mosquitto ; sudo -u mosquitto mosquitto -c /etc/mosquitto/mosquitto.conf. Test : mosquitto_pub -h localhost -p 1883 -u iotdevice -P 'DeviceToken123' -t sensors/temp -m '23.5'. Succès ! Sans creds, connexion refusée.

Configuration ACL avancée

/etc/mosquitto/auth/aclfile
# ACL pour admin : full access
user admin
pattern readwrite %/

# IoT devices : publish sur sensors/, sub sur $SYS/ et actuators/
user iotdevice
pattern write sensors/+
pattern read $SYS/broker/#
p topic read actuators/#

# Groupe devices : wildcards
pattern write home/+/#
pattern read home/%u/#

# Deny all else
pattern readwrite $SYS

ACL hiérarchique : admin tout accède via %/. iotdevice publie sur sensors/+ (un niveau), lit sysinfo et actuators. %u injecte username pour per-user topics. Testez avec mosquitto_sub -u iotdevice -P 'DeviceToken123' -t 'sensors/invalid' -v – denied ! Ajoutez acl_file /etc/mosquitto/auth/aclfile dans conf.

Application des ACL et tests

Ajoutez acl_file à mosquitto.conf, chown sudo chown mosquitto:mosquitto /etc/mosquitto/auth/aclfile, redémarrez. Tests experts :

  • Admin pub/sub partout : OK.
  • Iotdevice pub sensors/temp : OK ; pub home/bad : denied.
Surveillez /var/log/mosquitto/mosquitto.log pour Access Refused.

Génération certificats TLS auto-signés

gen-tls-certs.sh
#!/bin/bash
sudo mkdir -p /etc/mosquitto/certs
cd /etc/mosquitto/certs
sudo openssl req -newkey rsa:4096 -days 365 -nodes -x509 -keyout mosquitto.key -out mosquitto.crt -subj '/C=FR/ST=Paris/L=Paris/O=Learni/OU=IoT/CN=localhost'
sudo openssl dhparam -out dhparam.pem 4096
sudo chown -R mosquitto:mosquitto /etc/mosquitto/certs
sudo chmod 600 /etc/mosquitto/certs/{mosquitto.key,dhparam.pem}
sudo chmod 644 /etc/mosquitto/certs/mosquitto.crt

Génère un CA auto-signé RSA 4096bits (TLS 1.3 compatible), DH params pour Perfect Forward Secrecy. En prod, utilisez Let's Encrypt ou EJBCA. Permissions critiques : clé privée 600. Vérifiez : openssl x509 -in mosquitto.crt -text -noout.

Activation TLS sur listener 8883

Ajoutez à mosquitto.conf :
``
listener 8883
protocol mqtt
cafile /etc/mosquitto/certs/mosquitto.crt
certfile /etc/mosquitto/certs/mosquitto.crt
keyfile /etc/mosquitto/certs/mosquitto.key
dhparam /etc/mosquitto/certs/dhparam.pem
require_certificate false
use_identity_as_username true
`
Redémarrez. Test TLS :
mosquitto_pub -h localhost -p 8883 --capath /etc/ssl/certs -u iotdevice -P 'DeviceToken123' -t sensors/temp -m '24.0'. Vérifiez logs pour TLS-PSK` ou erreurs cipher.

Configuration bridge vers broker distant

/etc/mosquitto/bridge.conf
connection bridge-to-aws
address aws-iot-endpoint:8883
bridge_hostname mqtt-aws
bridge_username AWS_IOT_USER
bridge_password AWS_IOT_TOKEN
tls_version tlsv1.3
bridge_cafile /etc/mosquitto/certs/aws-ca.crt
bridge_certfile /etc/mosquitto/certs/client.crt
bridge_keyfile /etc/mosquitto/certs/client.key
remote_username mosq-aws
remote_password bridgepass
topic sensors/# out 1 bridge-mqtt-aws/ sensors/ {{"qos":1,"retain":true}}
topic actuators/# in 2 bridge-mqtt-aws/ actuators/

Bridge out/in : forward sensors/# vers AWS IoT (QoS1, retain), sub actuators QoS2. TLS mutual pour sécurité. Incluez via include_dir /etc/mosquitto/conf.d avec sudo ln -s /etc/mosquitto/bridge.conf /etc/mosquitto/conf.d/. Scalez pour clustering.

Déploiement Docker production

Pour HA, utilisez Docker. Générez secrets via docker secret create mosquitto_pw /etc/mosquitto/auth/passwordfile.

Docker Compose pour Mosquitto HA

docker-compose.yml
version: '3.8'
services:
  mosquitto:
    image: eclipse-mosquitto:2.0
    restart: always
    ports:
      - '1883:8883'
      - '8883:8883'
    volumes:
      - ./mosquitto.conf:/mosquitto/config/mosquitto.conf:ro
      - ./auth:/mosquitto/config/auth:ro
      - ./certs:/mosquitto/config/certs:ro
      - mosquitto_data:/mosquitto/data
      - mosquitto_log:/mosquitto/log
    environment:
      - TZ=Europe/Paris
    networks:
      - iot-net
volumes:
  mosquitto_data:
  mosquitto_log:
networks:
  iot-net:
    driver: bridge

Compose prod : volumes persistants, read-only configs, TZ pour logs. Scalez avec replicas en Swarm. Lancez docker compose up -d. Monitorez avec Prometheus via plugin Mosquitto.

Bonnes pratiques

  • Rotatez creds : Script cron mensuel pour mosquitto_passwd + ACL update.
  • Monitoring : Activez $SYS/broker/clients/active + exporter Prometheus.
  • Load testing : Utilisez mqtt-benchmark pour 10k conn/s.
  • Backup : Rsync /var/lib/mosquitto + mosquitto_db_dump.
  • Zero-trust : Mutual TLS + PSK pour devices low-power.

Erreurs courantes à éviter

  • Oublier sudo chown mosquitto sur configs : crash avec 'Permission denied'.
  • ACL sans user prefix : apply global, expose tout.
  • TLS sans DH params : fallback insecure ciphers (log: 'no shared cipher').
  • Pas de max_connections : DoS via exhaustion (défaut 1000 trop bas).

Pour aller plus loin

Plongez dans MQTT 5.0 shared subs avec nos formations Learni IoT. Ressources : Docs Mosquitto, MQTT Explorer pour debug, repo GitHub Eclipse pour plugins C.

Comment sécuriser Mosquitto MQTT en 2026 (Expert) | Learni