Σε παλαιότερο post μου εξήγησα επιγραμματικά την λειτουργία του MQTT πρωτοκόλλου. Με αυτό το guide πάμε ένα βήμα παραπέρα, και δείχνω τα βασικά βήματα για να στήσουμε επιτυχώς έναν ασφαλή MQTT broker χρησιμοποιώντας τον γνωστό mosquitto σε debian 10 buster.
Για να είναι απλούστερο, θεωρώ πως το debian είναι ήδη στημένο και ρυθμισμένο, με εγκατεστημένο και ενεργό firewall.
Για εγκατάσταση του broker σε debian σύστημα αρκεί ενα apt
sudo apt-get install mosquitto
Άνοιξα την πόρτα που χρησιμοποιεί ο mosquitto για τις SSL συνδέσεις του στο firewall:
sudo ufw allow 8883
Για να παίξει ασφαλώς ο broker μου χρησιμοποίησα την let’s encrypt που τόσο αγαπάω, και έφτιαξα ένα domain (test.doomster.eu) που με την χρήση του certbot εξέδωσα πιστοποιητικό (θα το καλύψω καλύτερα σε επόμενο οδηγό). Διαφορετικά και σε περίπτωση που δεν έχουμε δικό μας domain, μπορούμε να χρησιμοποιήσουμε self signed certificates, και να μοιράσουμε τα αρχεία τους στα συστήματα που θα συνδεθούν σαν publishers/subscribers. Αλλά σοβαρά, τα domains ξεκινάνε από τα 0.8€/χρόνο, κόστος ελάχιστο σε σχέση με την ευκολία που προσφέρουν.
Βασικές ρυθμίσεις:
Έπειτα πρέπει να δημιουργήσουμε ένα αρχείο ρύθμισης στο /etc/mosquitto/conf-d/default.conf που να περιέχει τα παρακάτω:

Αναλύω τι έχω γράψει παραπάνω:
allow_anonymous false : Δεν επιτρέπω ανώνυμες συνδέσεις. οποιοσδήποτε subscriber-publisher πρέπει να έχει κωδικό για να συνδεθεί.
password_file /etc/mosquitto/passwd : Το αρχείο στο οποίο περιλαμβάνω τα username/passwords των users που έχουν πρόσβαση
listener 1883 localhost : σε ποια πόρτα θα ακούει για μηνύματα, στο localhost χρησιμοποιούμε την πόρτα 1883 ώστε να υποχρεώσουμε τις localhost συνδέσεις να μην περάσουν από την SSL σύνδεση και φάνε πόρτα αφού το certificate έχει εκδοθεί για χρήση στο domain test.doomster.eu
listener 8883 : Για όλα τα connections εκτός localhost. ασφαλίζεται η πληροφορία μέσω SSL.
certfile/ cafile/ keyfile : το σημείο που βρίσκονται τα κλειδιά του certificate της letsencrypt.acl_file /etc/mosquitto/conf.d/test.acl Το αρχείο που περιέχει την ACL μου για τον broker (αναλύω παρακάτω)
Έπειτα, φτιάχνω έναν κωδικό πρόσβασης για τον χρήστη μου τρέχοντας το παρακάτω :
mosquitto_passwd -U /etc/mosquitto/passwd
Αccess Lists:
Θέτοντας στις ρυθμίσεις μας το “allow_anonymus false” έχουμε γυρίσει το default policy του broker σε deny. Αυτό σημαίνει πως αποτρέπει κάθε ανώνυμη σύνδεση. Αν όμως στους εγγεγραμμένους χρήστες μας θέλουμε να βάλουμε συγκεκριμένα δικαιώματα πρόσβασης το κάνουμε μέσω της access list.
Δημιουργούμε ένα αρχείο access list στο σημείο που έχουμε δηλώσει προηγουμένως στο default.conf ( /etc/mosquitto/conf.d/test.acl ) και εκεί μέσα φτιάχνουμε την access list μας όπως παρακάτω.

Είναι ευκόλως κατανοητό πως στην access list μας δηλώνουμε Όνομα χρήστη, και από κάτω τα topic στα οποία έχει πρόσβαση. Aν δεν υπάρχει το όνομα χρήστη στην accesslist τότε ο χρήστης δεν έχει πρόσβαση σε κάποιο topic, και ας είναι registered user.
Τέλος μένει να κάνουμε ένα enable και start τον broker μας για να παίζει κατα την εκκίνηση του συστήματος.
sudo systemctl enable mosquitto
sudo systemctl start mosquitto
Αν όλα βαίνουν ορθώς μπορείτε να κάνετε δοκιμή χρησιμοποιώντας 2 διαφορετικά terminal. Στο πρώτο θα γίνεις subscriber σε ένα topic (προσοχή στα ACL)
mosquitto_sub -h localhost -p 1888 -t “topic1” -u “dimitris” -P “password”
Στο δεύτερο θα γίνεις publisher και θα ποστάρεις ένα μήνυμα στο topic.
mosquitto_pub -h localhost -p 1888 -t “topic1” -m “hello world” -u “maria” -P “password”
Αν όλα είναι ΟΚ, τότε θα δείς το μήνυμα να εμφανίζεται στον subscriber την στιγμή που πατάς το enter στον publisher.
Σημειώστε πως στο παραπάνω παράδειγμα χρησιμοποίησα την localhost αφού και τα 2 terminal είναι στον ίδιο υπολογιστή. Αν θέλετε να κάνετε δοκιμή απομακρυσμένη, θα πρέπει να χρησιμοποιήσετε τo domain/ip που έχετε στήσει και για port την 8883., που αφορά τις συνδέσεις SSL/TLS.