Table des matières
MQTT
Setup du container
Démarrage rapide:
- Créer les répertoires
./mosquitto/config/mosquitto.conf
(Voir l'exemple plus bas)./mosquitto/log
./mosquitto/data
- Démarrer le container avec:
docker run -it -d --name broker -p 1883:1883 -v ./mosquitto/config/mosquitto.conf:/mosquitto/config/mosquitto.conf -v ./mosquitto/log:/mosquitto/log -v ./mosquitto/data:/mosquitto/data eclipse-mosquitto:2
Exemple basique de configuration (non-sécure):
allow_anonymous true listener 1883 0.0.0.0 persistence true persistence_location /mosquitto/data/ log_dest file /mosquitto/log/mosquitto.log
Authentication par mot de passe
Dans le container, qu'on peut accéder avec docker exec -it broker sh
, faire ce qui suit:
- Créer un fichier de mot de passe:
mosquitto_passwd -c /mosquitto/passwd_file user_name
- (Optionnel) Ajouter d'autres utilisateurs:
mosquitto_passwd -b /mosquitto/passwd_file user_name password
- Dans le fichier
mosquitto.conf
, mettre plutôt:password_file /mosquitto/passwd_file allow_anonymous false
Docker Compose
Dans un fichier docker-compose.yml
:
services: broker: image: eclipse-mosquitto:2 ports: - 1883:1883 volumes: - ./mosquitto/config/mosquitto.conf:/mosquitto/config/mosquitto.conf - ./mosquitto/log/mosquitto.log:/mosquitto/log/mosquitto.log - ./mosquitto/data:/mosquitto/data networks: - brokernetwork networks: brokernetwork: name: brokernetwork driver: bridge
Comandes:
docker compose up -d
docker compose down
Sécurité
Utilisation du TLS/SSL
À ce moment-ci, on veut créer un Certificate Authority (CA) localement et créer le certificat pour Mosquitto soit en TLS.
Disons dans un répertoire racine pour Mosquitto, créer un répertoire certs
et aller dedans.
$ openssl genrsa -des3 -out ca.key 2048 $ openssl req -new -key ca.key -out ca.csr -sha256 $ openssl x509 -req -in ca.csr -signkey ca.key -out ca-root.crt -days 365 -sha256
On crée ensuite la clé pour Mosquitto:
$ openssl genrsa -out mosquitto.key 2048
Pour le Certificate Signing Request (CSR), on peut laisser généralement les champs vides, sauf pour Common Name
qu'on veut mettre localhost
.
$ openssl req -new -key mosquitto.key -out mosquitto.csr -sha256
Et le certificat:
$ openssl x509 -req -in mosquitto.csr -CA ca-root.crt -CAkey ca.key -CAcreateserial -out mosquitto.crt -days 365
Une fois terminé, on devrait se retrouver avec 6 fichiers dans le répertoire certs
:
ca-root.crt
: Certificat racine pour le CAca.csr
: CA CSRca.key
: CA clé de certificatmosquitto.crt
: Certificat Mosquittomosquitto.csr
: CSR Mosquittomosquitto.key
: Clé de certificat Mosquitto
Ajouter la section SSL dans le fichier de configuration mosquitto.conf
:
listener 8883 0.0.0.0 protocol mqtt #SSL cafile /mosquitto/config/certs/ca-root.crt certfile /mosquitto/config/certs/mosquitto.crt keyfile /mosquitto/config/certs/mosquitto.key
Application client
Dans une application cliente, il faut spécifier qu'il s'agit d'un certificat auto-signé et fournir ces certificats.
Fichier de mot de passe
En utilisant Docker et un container Mosquitto, on a pas directement accès à l'utilitaire mosquitto_passwd
. On peut utiliser le container directement pour se faire.
$ docker exec -it mosquitto /bin/bash
Une fois dans l'invite du container de mosquitto, on peut utiliser mosquitto_passwd
sous forme de mosquitto_passwd [-c] <password_file> <username>
. On peut utiliser le flag -c
pour créer le fichier de mots de passe. Le faire une seule fois.
/ # mosquitto_passwd -c password_file johndoe Password: Reenter password: / # mosquitto_passwd password_file janedoe Password: Reenter password:
Une fois les utilisateurs entrés, on peut copier le fichier de mots de passe localement pour en garder une copie:
$ docker cp mosquitto:/password_file ./config
Dans le fichier de configuration de Mosquitto ./config/mosquitto.conf
, il faut alors spécifier le fichier de mot de passes à utiliser:
password_file /mosquitto/config/password_file
Dans le docker-compose.yml
, on copiera ce fichier:
- ./config/password_file:/mosquitto/config/password_file:rw
Fichier ACL
Le fichier ACL (Access Control List) est assez simple. Il va par utilisateur auquel on donne des droits.
#anonymous access topic readwrite /health_status #user based access user admin topic readwrite # user user1 topic readwrite /commands topic read /health_status user user2 topic readwrite /commands topic read /health_status
Encore une fois, il faut ajouter le mapping dans docker-compose.yml.
Et dans le fichier mosquitto.conf, on spécifie le fichier ACL à utiliser:
#ACL acl_file /mosquitto/config/acl_file allow_anonymous true