Uno degli aspetti spesso trascurati nell’IoT è la sicurezza delle comunicazioni. La prova è che molti degli ultimi attacchi DDOS (Distributed Denial of Service) sono stati portati utilizzando smart devices connessi ad Internet.
Nei precedenti articoli abbiamo visto come configurare mosquitto per ricevere messaggi pubblicati dai client e per inoltrare questi a tutti i sottoscrittori. Oggi vediamo come configurare la sicurezza applicativa del nostro MQTT broker.
Autenticazione
Il primo passo per rendere sicuro il nostro broker è implementare l’autenticazione per i client che si connettono, in modo che soltanto i client autorizzati possano inviare/ricevere dati.
Apriamo il file mosquitto.conf e per prima cosa disabilitiamo l’accesso anonimo mettendo il relativo parametro a false.
Gli utenti autorizzati a collegarsi vengono definiti in un file dedicato. Il nome di tale file è configurato con il parametro password_file (nell’esempio il file con utenti e password si chiama “pwdfile” ed è memorizzato nella cartella di mosquitto):
Utilizziamo il comando mosquitto_passwd.exe per creare il file (-c) e inserire un nuovo utente (“luca”). Il comando ci chiederà di inserire due volte la password dell’utente:
Se vogliamo inserire altri utenti, possiamo lanciare nuovamente il comando senza l’opzione -c:
mosquitto_passwd.exe pwdfile sara
Verifichiamo ora la nuova configurazione: eseguiamo mosquitto indicando di usare il file di configurazione (mosquitto.exe -c mosquitto.conf) e proviamo a pubblicare un messaggio come fatto nei precedenti tutorial:
Come potete verificare, la connessione viene rifiutata perché non siamo autorizzati al collegamento: non abbiamo infatti specificato alcun utente e l’accesso anonimo è stato disattivato.
Provate a lanciare nuovamente il comando specificando utenza e password e vedrete che la pubblicazione avverrà con successo:
mosquitto_pub.exe -u <utente> -P <password> -t home/bedroom/temp -m 19
Autorizzazione
Dopo aver definito chi si può collegare al broker, possiamo ora definire cosa può fare una volta collegato. Anche in questo caso la configurazione delle ACL (access control list) avviene in un file dedicato, il cui nome è configurato con il parametro acl_file:
Il file delle ACL è un file di testo composto da blocchi così formati:
- la prima riga user <nomeutente> che indica l’utente al quale le seguenti ACL si applicano
- una o più righe topic <read|write|readwrite> <nometopic> che indica quali azioni l’utente specificato sopra può svolgere sul topic indicato
Vediamo un esempio di file, in cui definiamo un utente (writeclient) che può inviare messaggi al topic secure/data e un utente (readclient) che può leggere tali messaggi. Entrambi gli utenti poi possono inviare e ricevere messaggi da tutti i topic open/# (per una spiegazione sulle wildcards vedi il mio precedente tutorial):
(le righe che iniziano con # sono dei commenti).
Proviamo ora ad inviare un messaggio utilizzando l’utente readclient, che non ha tale autorizzazione:
Come vedete, il client non riceve alcun messaggio di errore ma nei logs di mosquitto si vede chiaramente che il comando publish è stato negato, coerentemente alle ACL che abbiamo configurato.
Se invece utilizziamo gli utenti corretti per fare l’invio e la sottoscrizione, il messaggio viene correttamente gestito:
Conclusioni
E’ molto importante rendere sicuro il nostro broker, soprattutto se collegato ad una rete pubblica (ad esempio se raggiungibile su Internet). Nel tutorial di oggi abbiamo visto come gestire utenti e permessi con mosquitto.
Ciao Luca,
complimenti per l’ottima esposizione: chiara, lineare e veramente semplice. Mi hai fatto scoprire questa immensa potenzialità offerta da MQTT. Per completare il “pacchetto”, sarebbe bello valutare anche la soluzione in SSL al fine di rendere ancora più sicure le comunicazioni tra borker e devices.
Colgo l’occasione per augurare a te e famiglia buone feste e felice 2017!
Cris
Grazie Cristian! Ho sicuramente in cantiere un articolo relativo all’SSL, solo non con Arduino (troppo poco potente) ma con esp32 o altra piattaforma + evoluta.