Defending MQTT Infrastructure

theory

Defending 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 true laissé "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
  • bridge MQTT 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.