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.