Defending MQTT Infrastructure
theoryDefending MQTT Infrastructure
Vous avez attaqué MQTT sous toutes ses coutures. Pour rédiger un rapport utile, vous devez maintenant penser comme un défenseur.
Modèle de menace MQTT
- Confidentialité : qui peut s'abonner à quoi ?
- Intégrité : qui peut publier ?
- Disponibilité : flood avec retained, wildcards, Will géants ?
- Authenticité : comment distinguer un device légitime d'un imposteur ?
ACLs strictes
# /etc/mosquitto/acl.conf
# Utilisateur lecture seule pour Home Assistant
user homeassistant
topic read shellies/#
topic read zigbee2mqtt/#
topic write homeassistant/#
# Chaque device a son propre user
pattern readwrite shellies/%u/#
# Personne ne touche $SYS sauf admin
user admin
topic readwrite $SYS/#
topic readwrite #
Le pattern %u lie le nom d'utilisateur au préfixe de topic. Sans cette séparation, un device compromis donne accès à toute la flotte.
TLS mutuel
Un mot de passe statique partagé entre 5000 devices = bombe à retardement. Le mTLS résout : 1. Chaque device a une identité cryptographique unique 2. La révocation devient possible via CRL ou OCSP
listener 8883
cafile /etc/mosquitto/certs/ca.crt
certfile /etc/mosquitto/certs/server.crt
keyfile /etc/mosquitto/certs/server.key
require_certificate true
use_identity_as_username true
crlfile /etc/mosquitto/certs/revoked.crl
Avec use_identity_as_username true, le CN du certificat devient le username.
Limites de ressources
max_inflight_messages 20
max_queued_messages 100
message_size_limit 65536
max_keepalive 300
max_connections 5000
max_packet_size 1048576
Pour MQTT 5, limitez max_topic_alias et Session Expiry Interval accepté.
Monitoring
Indicateurs à surveiller :
- Abonnements à # ou +/+/+ depuis des clients non-admin
- CONNECT avec Session Expiry > seuil
- Will Messages avec retain ou Will Delay long
- Volume anormal par device (baseline)
- Connexions hors plage IP attendue
- Erreurs d'authentification répétées
Mosquitto expose $SYS/broker/.... Couplez avec Prometheus :
mqtt:
server: tcp://broker.lab.local:1883
metrics:
- prom_name: mqtt_temperature
mqtt_name: home/+/temp
type: gauge
Segmentation réseau
- VPN pour les accès opérateur
- Reverse proxy TLS avec auth client cert
- Firewall qui bloque tout sauf 8883 depuis les VLANs IoT
- IoT critique / IoT confort / administration : un broker par zone
Erreurs fréquentes en audit
allow_anonymous truelaissé "temporairement" en prod- Port 1883 ouvert en plus de 8883
- ACL avec wildcard
topic readwrite #pour non-admin - Certificats clients sans expiration
- Mots de passe en clair dans
passwordfile - Pas de rotation après départs employés
bridgeMQTT vers cloud public sans filtrage topics
Un rapport solide ne se contente pas de lister les vulns : il propose le contrôle compensatoire, sa difficulté d'implémentation et son impact opérationnel.