GNU/Linux >> Linux Esercitazione >  >> Ubuntu

Come installare e proteggere il broker di messaggistica Mosquitto MQTT su Ubuntu 20.04

Mosquitto è un broker di messaggi open source che utilizza il trasporto di telemetria di Accodamento messaggi (MQTT ) Protocollo. Il protocollo è progettato per fornire comunicazioni leggere all'Internet delle cose (IoT ) dispositivi. Viene comunemente utilizzato per il tracciamento GPS di veicoli, la domotica, i sensori ambientali e la raccolta di dati su larga scala.

Il protocollo MQTT viene eseguito sul modello TCP/IP. Essendo leggero, il suo ridotto ingombro di codice consente di creare applicazioni per dispositivi con risorse minime. Si basa sul modello di pubblicazione/sottoscrizione. In questo modello, il client si connette al server Mosquitto, che funge da broker per inviare informazioni ad altri client iscritti a un canale.

In questo tutorial, installerai Mosquitto e configurerai il broker per utilizzare SSL per proteggere le comunicazioni.

Prerequisiti

  • Un server Ubuntu 20.04 con un utente non root con privilegi sudo.
  • Un nome di dominio (myqtt.example.com ) puntato al tuo server.

Passaggio 1:installazione di server e client Mosquitto

Ubuntu viene fornito con la versione precedente 1.6 di Mosquitto. Per installare l'ultima versione, aggiungi il repository ufficiale di Mosquitto.

$ sudo add-apt-repository ppa:mosquitto-dev/mosquitto-ppa

Installa il server Mosquitto e il client.

$ sudo apt install mosquitto mosquitto-clients

Controlla lo stato del server.

$ sudo systemctl status mosquitto? mosquitto.service - Broker Mosquitto MQTT Caricato:caricato (/lib/systemd/system/mosquitto.service; abilitato; preimpostazione del fornitore:abilitato) Attivo:attivo (in esecuzione) da mar 25-01-2022 09:18:40 UTC; 25s fa Documenti:man:mosquitto.conf(5) man:mosquitto(8) PID principale:119694 (mosquitto) Compiti:1 (limite:2274) Memoria:1.0M CGroup:/system.slice/mosquitto.service ??119694 /usr/sbin/mosquitto -c /etc/mosquitto/mosquitto.confJan 25 09:18:39  systemd[1]:Avvio di Mosquitto MQTT Broker...Jan 25 09:18:40  systemd[1 ]:ha avviato Mosquitto MQTT Broker.

Passaggio 2:configurazione dell'autenticazione password MQTT

Mosquitto viene fornito con un'utilità per generare un file di password chiamato mosquitto_passwd . Mosquitto memorizza tutte le configurazioni nel /etc/mosquitto directory.

Esegui il comando seguente per generare un file di password crittografato in /etc/mosquitto/passwd per il nome utente username . Inserisci una password a tua scelta.

$ sudo mosquitto_passwd -c /etc/mosquitto/passwd usernamePassword:Reinserire la password:

Quindi, crea un default.conf file sotto il /etc/mosquitto/conf.d directory e aprirla per la modifica.

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

Incolla le seguenti righe per specificare la posizione del file della password. Se ometti il ​​campo listener, si connetterà sempre in modo anonimo, indipendentemente dalla configurazione.

ascoltatore 1883password_file /etc/mosquitto/passwd

Salva il file premendo Ctrl + X e inserendo Y quando richiesto.

Riavvia il server Mosquitto per implementare la modifica.

$ sudo systemctl riavvia mosquitto

Fase 3:prova il client Mosquitto

A seconda del caso d'uso, puoi utilizzare il client Mosquitto per inviare e ricevere messaggi su argomenti diversi. Un cliente può essere un abbonato o un editore.

Il passaggio successivo è iscriversi a un argomento. Nel protocollo MQTT, un argomento fa riferimento a una stringa utilizzata dal server/broker per filtrare i messaggi per i client connessi. Di seguito sono riportati alcuni argomenti di esempio che puoi utilizzare in un'applicazione domotica.

  • casa/luci/soggiorno
  • casa/luci/cucina
  • casa/luci/camera da letto principale
  • casa/luci/camera_bambini

Per iscriverti a un argomento, esegui mosquitto_sub -t comando seguito dall'argomento. Ad esempio, per iscriversi a home/lights/kitchen topic, esegui il comando seguente.

$ mosquitto_sub -u username -P YOUR_PASSWORD -t "casa/luci/cucina"

Non chiudere la finestra esistente. Apri una nuova finestra del terminale per pubblicare un messaggio nella home/lights/kitchen argomento utilizzando il comando seguente.

$ mosquitto_pub -u nome utente -P YOUR_PASSWORD -m "ON" -t "casa/luci/cucina"

Torna alla prima finestra del terminale e riceverai ON carico utile.

ON

Quindi, invia il OFF messaggio sullo stesso argomento dal secondo terminale.

$ mosquitto_pub -u nome utente -P YOUR_PASSWORD -m "OFF" -t "casa/luci/cucina"

Il primo terminale mostrerà il messaggio appena pubblicato.

ONOFF

Se provi a inviare un commento non autenticato, fallirà. Ad esempio, prova il seguente comando.

$ mosquitto_sub -t "home/lights/sitting_room"Errore di connessione:Connessione rifiutata:non autorizzato.

Non è raccomandato, ma devi aggiungere la seguente riga a /etc/mosquitto/conf.d/default.conf file se vuoi eseguire i comandi senza autenticazione.

allow_anonymous vero

Fase 4 - Installa SSL

Per installare un certificato SSL utilizzando Let's Encrypt, è necessario scaricare lo strumento Certbot. Utilizzeremo il programma di installazione del pacchetto Snapd per questo.

Installa il programma di installazione Snap.

$ sudo apt install snapd

Assicurati che la tua versione di Snapd sia aggiornata.

$ sudo snap install core $ sudo snap refresh core

Installa Certbot.

$ sudo snap install --classic certbot

Utilizzare il comando seguente per assicurarsi che il comando Certbot venga eseguito creando un collegamento simbolico a /usr/bin directory.

$ sudo ln -s /snap/bin/certbot /usr/bin/certbot

Genera un certificato SSL.

$ sudo certbot certonly --standalone --agree-tos --no-eff-email --staple-ocsp --preferred-challenges http -m [email protetta] -d mqtt.example.com

Il comando precedente scaricherà un certificato in /etc/letsencrypt/live/mqtt.example.com directory sul tuo server.

Genera un gruppo Diffie-Hellman certificato.

$ sudo openssl dhparam -out /etc/ssl/certs/dhparam.pem 2048

Crea una directory radice web di sfida per il rinnovo automatico di Let's Encrypt.

$ sudo mkdir -p /var/lib/letsencrypt

Crea un Cron Job per rinnovare l'SSL. Verrà eseguito ogni giorno per controllare il certificato e rinnovarlo se necessario. Per questo, prima crea il file /etc/cron.daily/certbot-renew e aprilo per la modifica.

$ sudo nano /etc/cron.daily/certbot-renew

Incolla il seguente codice.

#!/bin/shcertbot rinnovo --cert-name mqtt.example.com --webroot -w /var/lib/letsencrypt/

Salva il file premendo Ctrl + X e inserendo Y quando richiesto.

Modifica le autorizzazioni sul file dell'attività per renderlo eseguibile.

$ sudo chmod +x /etc/cron.daily/certbot-renew

Passaggio 5 - Configura SSL MQTT

Ora che abbiamo i certificati SSL pronti, dobbiamo fornire a Mosquitto l'accesso ad essi. Per questo, dobbiamo copiare i certificati in una posizione da cui Mosquitto possa accedervi.

$ sudo cp /etc/letsencrypt/live/mqtt.example.com/fullchain.pem /etc/mosquitto/certs/server.pem$ sudo cp /etc/letsencrypt/live/mqtt.example.com/privkey. pem /etc/mosquitto/certs/server.key

Modifica la proprietà del /etc/mosquitto/certs directory alla mosquitto utente creato durante l'installazione.

$ sudo chown mosquitto:/etc/mosquitto/certs

Il passaggio successivo per abilitare la crittografia SSL per Mosquitto è specificare la posizione dei certificati SSL. Apri il file di configurazione per la modifica.

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

Incolla il codice seguente alla fine del file.

. . .listener 8883certfile /etc/mosquitto/certs/server.pemcafile /etc/ssl/certs/ISRG_Root_X1.pemkeyfile /etc/mosquitto/certs/server.keydhparamfile /etc/ssl/certs/dhparam.pem

Salva il file premendo Ctrl + X e inserendo Y quando richiesto. Assicurati di lasciare una nuova riga finale alla fine del file.

Il listener 8883 porzione imposta il listener crittografato. È la porta standard per MQTT + SSL, denominata MQTTS. Le quattro righe successive specificano la posizione dei file SSL.

Riavvia Mosquitto per aggiornare le impostazioni.

$ sudo systemctl riavvia mosquitto

Sarà necessario aggiornare il firewall per consentire le connessioni alla porta 8883.

$ sudo ufw consenti 8883

Successivamente, dobbiamo testare la funzionalità utilizzando mosquitto_pub comando.

$ mosquitto_pub -h mqtt.example.com -t "casa/luci/cucina" -m "ciao" -p 8883 --capath /etc/ssl/certs/ -u username -P YOUR_PASSWORD

Come puoi vedere, abbiamo incluso alcuni parametri aggiuntivi, tra cui il numero di porta e il percorso dei certificati SSL. Ogni volta che devi utilizzare SSL, dovrai sempre specificare il nome host completo, ovvero mqtt.example.com invece di localhost altrimenti darebbe un errore.

Dovrai anche aggiungere il --capath direttiva ogni volta. Dice al client Mosquitto di cercare i certificati radice installati dal sistema operativo.

Passaggio 6:configurazione del rinnovo SSL

Certbot rinnoverà automaticamente il tuo certificato prima della scadenza. Ma è necessario dirgli di copiare i certificati rinnovati in /etc/mosquitto/certs directory e riavvia il servizio Mosquitto.

Lo faremo creando uno script di shell. Crea un file mosquitto-copy.sh nel /etc/letsencrypt/renewal-hooks/deploy directory.

$ sudo nano /etc/letsencrypt/renewal-hooks/deploy/mosquitto-copy.sh

Incolla il codice seguente al suo interno. Sostituisci il valore di MY_DOMAIN variabile con il tuo dominio. Il ${RENEWED_LINEAGE} la variabile punta a /etc/letsencrypt/live/mqtt.example.com directory durante il rinnovo.

# Imposta su quale dominio verrà eseguito questo script forMY_DOMAIN=mqtt.example.com# Imposta la directory in cui verranno copiati i certificati.CERTIFICATE_DIR=/etc/mosquitto/certsif [ "${RENEWED_DOMAINS}" ="${ MIO_DOMINIO}" ]; quindi # Copia il nuovo certificato nella directory Mosquitto cp ${RENEWED_LINEAGE}/fullchain.pem ${CERTIFICATE_DIR}/server.pem cp ${RENEWED_LINEAGE}/privkey.pem ${CERTIFICATE_DIR}/server.key # Imposta la proprietà su Mosquitto chown mosquitto:${CERTIFICATE_DIR}/server.pem ${CERTIFICATE_DIR}/server.key # Assicurati che i permessi siano restrittivi chmod 0600 ${CERTIFICATE_DIR}/server.pem ${CERTIFICATE_DIR}/server.key # Indica a Mosquitto di ricaricare i certificati e la configurazione pkill -HUP -x zanzare

Salva il file premendo Ctrl + X e inserendo Y quando richiesto.

Rendi il file eseguibile.

$ sudo chmod +x /etc/letsencrypt/renewal-hooks/deploy/mosquitto-copy.sh

Questo script verrà eseguito automaticamente ad ogni rinnovo riuscito del certificato.

Se stai utilizzando Mosquitto e un server web come Nginx, devi indicare a Certbot di arrestare il server prima del rinnovo e riavviarlo una volta terminato. Per farlo, apri il file etc/letsencrypt/renewal/mqtt.example.com.conf .

$ sudo nano /etc/letsencrypt/renewal/mqtt.example.com.conf

Aggiungi le seguenti righe alla fine del file. Modifica i comandi in base al server web che stai utilizzando.

pre_hook =systemctl ferma nginxpost_hook =systemctl avvia nginx

Salva il file premendo Ctrl + X e inserendo Y quando richiesto.

Esegui una prova a secco di Certbot per verificare.

$ sudo certbot rinnovo --dry-run

Se non vedi errori, significa che tutto è impostato.

Passaggio 7:configurazione dei Websocket

È possibile configurare Mosquitto per utilizzare il protocollo MQTT dall'interno dei browser utilizzando Javascript utilizzando la funzionalità Websockets. Per abilitarlo, apri il file di configurazione.

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

Incolla le seguenti righe alla fine del file.

. . .listener 8083protocollo websocketscertfile /etc/mosquitto/certs/server.pemcafile /etc/ssl/certs/ISRG_Root_X1.pemkeyfile /etc/mosquitto/certs/server.keydhparamfile /etc/ssl/certs/dhparam.pem

Salva il file premendo Ctrl + X e inserendo Y quando richiesto.

Se noti, è lo stesso blocco che abbiamo usato per abilitare SSL ad eccezione del numero di porta e dei campi del protocollo. 8083 è la porta più comune utilizzata da MQTT per comunicare tramite WebSocket.

Riavvia il servizio Mosquitto.

$ sudo systemctl riavvia mosquitto

Apri la porta 8083.

$ sudo ufw allow 8083

È necessario utilizzare un client MQTT basato su browser per testare la funzionalità WebSocket. Ci sono molti client disponibili, ma utilizzeremo il client Websocket HiveMQ per i nostri scopi. Avvia il client nel tuo browser e vedrai quanto segue.

Come mostrato nella schermata sopra, riempi i campi come mostrato.

  • L'host dovrebbe essere il dominio del tuo server Mosquitto, mqtt.example.com.
  • La porta dovrebbe essere 8083.
  • Il campo ClientID può essere lasciato così com'è.
  • Il nome utente dovrebbe essere il tuo nome utente Mosquitto.
  • La password dovrebbe essere la password che hai creato sopra.
  • Controlla SSL scatola.

Premi il pulsante Connetti e il client HiveMQ sarà connesso al tuo server Mosquitto.

Una volta connesso, inserisci home/lights/kitchen come argomento, inserisci qualsiasi messaggio e premi Pubblica .

Il messaggio apparirà nel tuo mosquitto_sub finestra del terminale che conferma l'avvenuta connessione.

Ciò dimostra che l'implementazione di Websocket è riuscita.

Conclusione

Questo conclude la nostra configurazione di un server MQTT sicuro, protetto da password e crittografato SSL su una macchina basata su Ubuntu 20.04. Se hai domande, pubblicale nei commenti qui sotto.


Ubuntu
  1. Come installare e proteggere phpMyAdmin su Ubuntu

  2. Come installare Node.js e NPM su Ubuntu 18.04 e 20.04

  3. Come installare PHP 7.4 e 8.0 su Ubuntu 18.04 o 20.04

  4. Come installare e proteggere Redis su Ubuntu 20.04

  5. Come installare e proteggere Redis su Ubuntu 18.04

Come installare e utilizzare R su Ubuntu

Come installare e utilizzare il comando Exa su Ubuntu 20.04

Come installare Mosquitto MQTT su Ubuntu 20.04 LTS

Come installare e proteggere phpMyAdmin in Ubuntu 14.04

Come installare e proteggere Memcached su Ubuntu 18.04

Come installare Signal Messaging su Ubuntu 20.04