Tutorial > Come installare e mettere in sicurezza Mosquitto su Ubuntu 20.04

Come installare e mettere in sicurezza Mosquitto su Ubuntu 20.04

Pubblicato il: 02 dicembre 2020

Iot Sviluppo Ubuntu

Introduzione

MQTT, acronimo di Message Queue Telemetry Transport, è un protocollo di comunicazione leggero che si basa sul concetto di publisher/subscriber. Rappresenta un'alternativa alla classica architettura client/server, ampiamente sfruttata in ambito Internet of Things. MQTT spesso viene utilizzato per la ricezione di parametri misurati da sensori installati all’interno di oggetti connessi presenti all'interno di abitazioni, veicoli o altri spazi fisici.

In questo tutorial vedrai come installare sul tuo Cloud Server Ubuntu 20.04 il software Mosquitto, un Broker MQTT ampiamente supportato dalla community, facile da installare e da configurare, e a utilizzarlo per testare lo scambio di messaggi fra Publisher e Subscriber.

Per prima cosa dovrai connetterti al tuo server tramite una connessione SSH. Se non l’hai ancora fatto, ti consigliamo di seguire la nostra guida per connetterti in sicurezza con il protocollo SSH. In caso di server locale puoi passare al punto successivo e aprire il terminale del tuo server.

Installazione di Mosquitto MQTT Broker

A partire dalla versione 18.04 di Ubuntu, Mosquitto è già presente all’interno dei repository ufficiali.

Per procedere con l’installazione digita quindi i seguenti comandi, tramite i quali installerai mosquitto e mosquitto-clients:

sudo apt update -y && sudo apt install mosquitto mosquitto-clients -y

Al termine dell’installazione Mosquitto dovrebbe già essere attivo.

Puoi verificarne lo stato mediante:

sudo systemctl status mosquitto
Stato Mosquitto

Se Mosquitto non dovesse risultare già attivo, puoi attivarlo manualmente digitando:

sudo systemctl start mosquitto

I messaggi transitano attraverso la rete MQTT su dei Topic, ossia dei percorsi identificativi dei messaggi. Spesso questi percorsi sono anche organizzati in maniera gerarchica (es: /home/sensors/temp/kitchen - /home/sensors/temp/bedroom).

Per la tipologia di servizio che questo software offre, potrebbe esserti utile eseguirlo ad ogni avvio del sistema (così da non doverlo avviare tu manualmente qualora il Server dovesse spegnersi per qualche ragione).

sudo systemctl enable mosquitto

Test di invio e ricezione di messaggi

La rete MQTT prevede la presenza di 3 principali componenti fondamentali: Broker - Publisher - Subscriber. Mosquitto stesso funge da Broker, ossia da colui che si occupa di reindirizzare i messaggi tra i mittenti e i destinatari interessati.

Per provare questo tipo di comunicazione, apri 4 diversi terminali:

  • Terminal 1: Publisher
  • Terminal 2: Subscriber su topic “/home/sensors/temp/kitchen”
  • Terminal 3: Subscriber su topic “/home/sensors/temp/bedroom”
  • Terminal 4: Subscriber su topic “/home/sensors/temp/#”

Il Terminal 4, a differenza dei Terminal 2 e 3, si è sottoscritto a tutti i topic che hanno come radice “/home/sensors/temp/” grazie alla presenza della wildcard “#”: in questa maniera riceverà tutti i messaggi pubblicati sui topic che iniziano con la radice indicata.

Il pacchetto “mosquitto-clients” installato in precedenza non è fondamentale per il corretto funzionamento del servizio, bensì serve a istanziare publisher e subscriber per verificare il corretto invio e ricezione di messaggi.

Per sottoscriversi a un topic bisogna rispettare la seguente sintassi:

mosquitto_sub -h address -t topic

N.B. Sostituisci il parametro “address” con l’indirizzo IP del Broker e il parametro “topic” con il topic al quale ti vuoi sottoscrivere. In questo esempio eseguiamo i test direttamente sul nostro Cloud Server (address: localhost).

  • Terminal 2:
    mosquitto_sub -h localhost -t /home/sensors/temp/kitchen 
  • Terminal 3:
     mosquitto_sub -h localhost -t /home/sensors/temp/bedroom 
  • Terminal 4:
     mosquitto_sub -h localhost -t /home/sensors/temp/# 

Una volta eseguiti i diversi comandi mostrati, su quei terminali non apparirà alcun messaggio fino a che non ne verrà inviato uno sui topic indicati.

Sul Terminale 1 prova ad inviare un messaggio sul topic “/home/sensors/temp/kitchen”. La sintassi da rispettare è:

mosquitto_pub -h address -t topic -m “message”

N.B. I parametri “address” e “topic” devono essere sostituiti come descritto in precedenza, mentre “messagge” rappresenta l’effettivo messaggio da voler inviare.

Terminal 1:
mosquitto_pub -h localhost -t /home/sensors/temp/kitchen -m "Kitchen Temperature: 26°C"
Ricezione da Terminal 2 e 4

Il messaggio inviato dal Terminal 1 è stato ricevuto dai Terminal 2 e 4, ma non dal 3.

Analogamente, cambiando il topic con lo stesso del Terminal 3 (/home/sensors/temp/bedroom) questo viene ricevuto dai Terminal 3 e 4, ma non dal 2.

Ricezione da Terminal 3 e 4

Il broker infatti ha indirizzato il messaggio ricevuto ai soli componenti interessati a quei topic.

Configurazione MQTT Password

Arrivato a questo punto il tuo Broker è funzionante e la tua rete MQTT è pronta.

Tuttavia in questo momento chiunque conosca anche solo l’indirizzo IP del Server con il tuo Broker potrebbe inviare messaggi. Per far fronte a questo problema di sicurezza, è possibile indicare un set di utenti, con username e password, abilitati ad inviare i messaggi.

Mosquitto include uno strumento per la criptazione delle password per gli utenti che vuoi aggiungere. Ipotizzando di voler aggiungere l’utente "mark", il comando da eseguire è il seguente:

sudo mosquitto_passwd -c /etc/mosquitto/passwd mark

Ti verrà richiesto di digitare due volte la password da cifrare.

Aggiunta utente “mark”

Questa operazione sovrascrive ogni volta il file “/etc/mosquitto/passwd”.

Se decidessi di inserire più utenti, assicurati quindi di copiare ogni volta il contenuto del file prima di procedere con l’aggiunta di un nuovo utente. Al termine dell’aggiunta del nuovo utente, incolla il contenuto precedentemente copiato su una riga differente del file.

Ora che l’utente è stato creato devi aggiornare il file di configurazione di Mosquitto per fare in modo che solo gli utenti inseriti nel file “/etc/mosquitto/passwd” possano partecipare alla rete MQTT.

Digita quindi:

sudo nano /etc/mosquitto/conf.d/default.conf

All’interno dell’editor di testo appena aperto incolla le seguenti istruzioni:

allow_anonymous false
password_file /etc/mosquitto/passwd

Chiudi quindi l’editor di testo (CTRL + X / Y / Enter) e riavvia Mosquitto tramite:

sudo systemctl restart mosquitto

Se provassi a ripubblicare sul Terminal 1 lo stesso messaggio di prima dovresti ricevere un messaggio di errore in quanto non sei autenticato alla rete.

Connessione rifiutata in quanto non autenticato

Da questo momento è necessario specificare i dati di login, sia per la pubblicazione che per la sottoscrizione ai topic.

Per farlo puoi usare la seguente sintassi:

  • Pubblicazione: mosquitto_pub -h address -t topic -m "message" -u "username" -P "password"
  • Sottoscrizione: mosquitto_sub -h address-t topic-u "usurname" -P "password"

N.B. In base all’operazione che si intende fare, sostituisci “address” e “topic” come specificato già in precedenza, “username” e “password” con i dati di login precedentemente indicati.

Conclusioni

Al termine di questo tutorial Mosquitto Broker risulterà correttamente installato e messo in sicurezza sul tuo Server con Ubuntu 20.04.

Avendo specificato i dati di login per la pubblicazione e sottoscrizione ai diversi topic, assicurati di indicare questi dati in qualsiasi applicazione tu voglia utilizzare per l’invio o ricezione di messaggi.

Nella rete MQTT il broker è il componente fondamentale per lo scambio di messaggi in quanto ciascuna comunicazione transita proprio attraverso tale componente.

Ricorda infine che il Broker inoltre non ha memoria: di conseguenza un Subscriber che si sottoscrive alla rete riceverà solo i messaggi inviati su quel topic a partire da quel momento. Qualora siano stati inviati in precedenza dei messaggi su quei topic essi non verrebbero inviati al nuovo Subscriber in quanto il Broker stesso non ne avrebbe memoria