Εγκατάσταση και ρύθμιση ασφαλούς MQTT broker με το Mosquitto

Σε παλαιότερο 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.

Σχολιαστε

Αφήστε μια απάντηση

Η ηλ. διεύθυνση σας δεν δημοσιεύεται. Τα υποχρεωτικά πεδία σημειώνονται με *

Συντακτης
Dimitris Valilis
Ενθουσιώδης με την τεχνολογία, gamer και casual μπλόγκερ, απο μικρό παιδί προσπαθώ να ενημερώνομαι για νέες τεχνολογίες και να δοκιμάζω καινούρια πράγματα. Γράφω στο blog για να εκφράσω την άποψή μου, αλλα και για να σημειώσω πράγματα που μελλοντικά θα ψάχνω. Ενθουσιάζομαι με προγραμματιστικά και κατασκευαστικά projects και αφιερώνω τον ελεύθερο μου χρόνο στις 3D-Κατασκευές και τον σχεδιασμο/υλοποίηση και διαχείριση συστημάτων τεχνολογίας υπολογιστών.
Επικοινωνια

: Email
: Facebook
: Instagram

Created and maintained by eassist. All rights reserved.