Outils pour utilisateurs

Outils du site


developpement:mqtt:toc

MQTT

Utiliser une image docker avec Eclipse Mosquitto

Outils:

Setup du container

Démarrage rapide:

  1. Créer les répertoires
    1. ./mosquitto/config/mosquitto.conf (Voir l'exemple plus bas)
    2. ./mosquitto/log
    3. ./mosquitto/data
  2. 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:

  1. Créer un fichier de mot de passe: mosquitto_passwd -c /mosquitto/passwd_file user_name
  2. (Optionnel) Ajouter d'autres utilisateurs: mosquitto_passwd -b /mosquitto/passwd_file user_name password
  3. 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:

  1. docker compose up -d
  2. 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 CA
  • ca.csr: CA CSR
  • ca.key: CA clé de certificat
  • mosquitto.crt: Certificat Mosquitto
  • mosquitto.csr: CSR Mosquitto
  • mosquitto.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

Sources

developpement/mqtt/toc.txt · Dernière modification : 2024/03/13 20:11 de sgariepy