Aller au contenu

Sécurité & mTLS

Pourquoi mTLS ?

Le MQTT seul n'authentifie que par mot de passe (souvent faible, partagé, transmis en clair sur un listener non chiffré). Pour une infrastructure critique, chaque client doit prouver son identité par un certificat X.509 signé par une autorité de certification interne.

Le mTLS (TLS mutuel) impose :

  • l'authentification serveur : le client vérifie le certificat du broker ;
  • l'authentification client : le broker vérifie le certificat de chaque client.

Résultat : aucun équipement non certifié ne peut publier ou s'abonner.

PKI interne

IoT-PoC-Root-CA (auto-signée, hors-ligne idéalement)
├── broker.crt        (CN=mosquitto, serverAuth)
├── simulator.crt     (CN=simulator, clientAuth)
├── worker.crt        (CN=worker,     clientAuth)
└── dashboard.crt     (CN=dashboard,  clientAuth)

Chaque certificat est émis pour 825 jours ; la CA pour 10 ans.

Génération

./scripts/generate-certs.sh

Le script produit le dossier certs/ :

Chemin Usage
certs/ca/ca.crt CA publique (montée en lecture seule)
certs/broker/broker.{crt,key} Certificat serveur du broker
certs/clients/<role>.{crt,key} Certificats des clients

PoC uniquement

Les clés privées sont rendues lisibles (0644) pour permettre le montage partagé entre conteneurs. En production, utilisez un certificat par service, une propriété de fichier stricte (UID dédié) et un gestionnaire de secrets (Vault, KMS, SOPS).

Configuration Mosquitto

listener 8883
cafile   /mosquitto/certs/ca/ca.crt
certfile /mosquitto/certs/broker/broker.crt
keyfile  /mosquitto/certs/broker/broker.key

require_certificate true
use_identity_as_username true
allow_anonymous false
  • require_certificate true → refuse toute connexion sans certificat valide.
  • use_identity_as_username true → le CN du certificat devient l'identité MQTT (traçabilité par client).
  • Aucun listener en clair (1883) n'est ouvert.

Bonnes pratiques supplémentaires

  • Renouvellement : automatiser la rotation des certificats (durée courte, notification avant expiration).
  • Révocation : publier une CRL / utiliser OCSP en production.
  • Isolation réseau : le broker ne doit être joignable que par les conteneurs internes (jamais 0.0.0.0).
  • ACL : restreindre les topics par client (acl_file) en production.