Triển khai Mosquitto Broker trên Ubuntu Server 22.04 và tích hợp cơ chế xác thực ủy quyền (Part 1)
👋Hi, mình là Quân. Chắc hẳn, nhiều bạn ở đây đã từng làm các dự án nhỏ trên các mạch vi điêu khiển (như ESP8266, ESP32,...) để đo nhiệt độ, đổ ẩm và gửi dữ liệu tới web, app để hiển thị thông qua giao thức MQTT. Do đó, mình viết bài viết này để giới thiệu chung về giao thức MQTT và chia sẻ cách để tự triển khai một Mqtt Broker dựa trên mosquitto.
📄 MQTT Protocol là gì?
MQTT (Message Queuing Telemetry Transport) là một giao thức nhắn tin nhẹ, được thiết kế để truyền tải các thông điệp giữa các thiết bị với băng thông thấp và độ trễ thấp. MQTT thường được sử dụng trong các ứng dụng Internet of Things (IoT) và các hệ thống nhúng.
MQTT Broker là một thành phần trung tâm trong hệ thống sử dụng giao thức MQTT . Nó đóng vai trò là người trung gian giữa các thiết bị hoặc ứng dụng (client) trong mô hình publish/subscribe. Dưới đây là một số điểm chính về MQTT Broker:
- Quản lý chủ đề (Topic): Broker duy trì một danh sách các chủ đề và các client đã đăng ký vào các chủ đề đó. Khi một thông điệp được gửi đến một chủ đề, broker sẽ chuyển tiếp thông điệp đó đến tất cả các client đã đăng ký vào chủ đề này.
- Chất lượng dịch vụ (QoS): Broker hỗ trợ các mức QoS khác nhau để đảm bảo mức độ tin cậy của việc truyền thông điệp. Các mức QoS bao gồm:
- QoS 0: Thông điệp được gửi một lần và không có xác nhận.
- QoS 1: Thông điệp được gửi ít nhất một lần và yêu cầu xác nhận từ người nhận.
- QoS 2: Thông điệp được gửi chính xác một lần và yêu cầu xác nhận từ người nhận.
- Lưu trữ thông điệp (Retain): Broker có thể lưu trữ thông điệp cuối cùng được gửi đến một chủ đề. Khi một client mới đăng ký vào chủ đề đó, broker sẽ ngay lập tức gửi thông điệp được lưu trữ này đến client mới.
- Bảo mật: MQTT Broker có thể hỗ trợ các cơ chế bảo mật như SSL/TLS để mã hóa dữ liệu truyền tải và xác thực người dùng, đảm bảo rằng chỉ các client được ủy quyền mới có thể kết nối và truyền thông điệp.
Mosquitto Broker là một phần mềm mã nguồn mở, nhẹ và hiệu quả, được thiết kế để hoạt động trên nhiều nền tảng khác nhau và hỗ trợ đầy đủ các tính năng của giao thức MQTT. Mosquitto thường được sử dụng trong các dự án IoT để thu thập và truyền tải dữ liệu từ các cảm biến và thiết bị khác nhau đến một máy chủ trung tâm hoặc giữa các thiết bị với nhau.
💻️ Cài đặt Mosquitto Broker
- Cài đặt các gói yêu cầu:
$ sudo apt-get update
$ sudo apt-get install curl gnupg2 wget git apt-transport-https ca-certificates -y
- Thêm Mosquitto PPA:
$ sudo add-apt-repository ppa:mosquitto-dev/mosquitto-ppa -y
- Cài đặt Mosquitto Broker và Mosquitto Clients
$ sudo apt install mosquitto mosquitto-clients -y
- Kiểm tra trạng thái và version Mosquitto:
$ sudo systemctl status mosquitto
$ mosquitto -v
1722240285: mosquitto version 2.0.15 starting
...
🛠️ Cấu hình Mosquitto
Theo mặc định, Mosquitto được cấu hình cho phép các kết nối anonymous. Để cài đặt bảo mật, bạn làm như sau:
I. tạo file để lưu mật khẩu quản trị MQTT:
1.1. Chạy lệnh cmd để tạo file lưu mật khẩu và thêm người dùng mới :
$ sudo mosquitto_passwd -c /etc/mosquitto/passwd <your_username>
Password: <your_password>
Reenter password: <your_password>
1.2. Đặt quyền sở hữu cho tệp mật khẩu:
$ sudo chown mosquitto:mosquitto /etc/mosquitto/passwd
1.3. Ở đây, mình sẽ tạo một file cấu hình bổ sung:
$ sudo nano /etc/mosquitto/conf.d/default.conf
1.4. Thêm vào file các dòng sau:
listener 1883
allow_anonymous false
password_file /etc/mosquitto/passwd
Trong đó, Mosquitto Broker sẽ lắng nghe các kết nối MQTT ở port 1883, và tệp mật khẩu "/etc/mosquitto/passwd" dùng để xác thực người dùng.
1.5. Liiên kết file cấu hình trên vào mosquitto:
Thêm lệnh sau vào file "/etc/mosquitto/mosquitto.conf"
include_dir /etc/mosquitto/conf.d
Nếu bạn muốn sử dụng các tùy chọn xác thực, TLS khác nhau cho từng cổng Mosquitto, bạn phải đặt
per_listener_settings true
1.6. Kiểm tra cấu hình mosquitto :
⚠️Nếu hệ thống đã chạy dịch vụ "mosquitto.service", hãy dừng dịch vụ bằng lệnh:
$ sudo systemctl stop mosquitto.service
Chạy mosquitto broker bằng tay và xem full log:
$ mosquitto -c /etc/mosquitto/mosquitto.conf -v
1.7. 💪Sau khi kiểm trả cấu hình hoàn tất, Khởi động lại Mosquitto:
$ sudo systemctl restart mosquitto
$ journalctl -u mosquitto -f # hiển thị Log gần nhất
1.8. Kiểm tra Mosquitto với mosquitto-clients
Tạo một cửa sổ CMD và đăng kí topic:
$ mosquitto_sub -u <your_username> -P <your_password> -v -t <your_topic>
Tạo một cửa sổ khác để xuất bản tin nhắn trong topic "hello/topic":
$ mosquitto_pub -u <your_username> -P <your_password> -t <your_topic> -m "hello MQTT"
Nếu bạn chạy Mosquitto trên một port khác, sử dụng thêm tham số -p để cấu hình port:
$ mosquitto_sub -p <your_port> -u admin -P <your_password> -v -t <your_topic>
Kết quả:
II. Sử dụng tệp ACL (Access Control List) để kiểm soát quyền truy cập người dùng vào các chủ đề.
2.1. Tạo một file acl mới:
sudo nano /etc/mosquitto/acls
Về cơ bản một acl sẽ có cấu trúc như sau:
user <username>
topic [read|write|readwrite|deny] <topic>
Do đó, mình sẽ thêm vào file các thông tin sau:
# Cấp cho người dùng admin quyền đọc và ghi mọi chủ đề
user admin
topic readwrite #
# Cấp cho người dùng user 1 quyền đọc và ghi chủ đề "temperature"
user user1
topic readwrite temperature
# Cấp cho người dùng user2 quyền ghi vào mọi chủ đề bắt đầu bằng "actuators/"
user user2
topic write actuators/#
Để biết thêm chi tiết các tùy chọn cấu hình của mosquitto, các bãn hay tham khảo thêm tại đây nhé.
2.2. Liên kết file acls vào mosquitto:
Thêm lệnh sau vào cuối file "/etc/mosquitto/conf.d/default.conf"
acl_file /etc/mosquitto/acls
2.3. Restart mosquitto.service
sudo systemctl restart mosquitto.service
2.4. Tiếp tục thử nghiệm tính năng phân quyền nào
- Thêm thông tin người dùng mới vào file passwd:
sudo mosquitto_passwd /etc/mosquitto/passwd user2
- Kết quả khi user2 gửi một tin nhắn vào chủ đề không được cho phép:
Các bạn lưu ý rằng phía Client hoàn toàn không biết có bị hạn chế quyền truy cập vào một topic nào đó trên Broker không. Vì vậy cách duy nhất để Client phát hiện điều này khi sub và pub với cùng một chủ đề, xem có nhận được tin nhắn hay không.
👉️Bên cạnh đó, để tìm hiểu về các phương thức xác thực và ủy quyền cho mosquitto server, các bạn có thể tham khảo thêm tại đây.
👀Trong số đó, Mosquitto Go Auth là một plugin xác thực và ủy quyền cho Mosquitto MQTT Broker, được viết bằng ngôn ngữ lập trình Go. Plugin này cho phép bạn sử dụng nhiều phương thức xác thực và ủy quyền, đồng thời hỗ trợ nhiều loại cơ sở dữ liệu (MySQL, MongoDB,...) khác nhau để kiểm soát quyền truy cập vào Mosquitto broker.
💡 Tổng kết
Cảm ơn các bạn đã theo dõi bài viết của mình. Phần tiếp theo của bài viết này, mình sẽ hướng dẫn các bạn tích hợp mosquitto-go-auth sử dụng cơ sở dữ liệu MySQL vào Mosquitto Broker. Đồng thời đừa máy chủ MQTT của bạn từ local lên internet. Mời các bạn cùng đón xem tại đây nhé 😀. 🤝Nếu các bạn có bất kì câu hỏi nào hay nhận xét góp ý cho bài viết, đừng ngần ngại để lại bình luận cho mình nhé. Mình rất lắng nghe và sẵn sàng giải đáp các thắc mắc của các bạn.🤝
🔗 Nguồn tham khảo
All rights reserved