👋 Giới thiệu
Xin chào các bạn! Mình là Quân. Tiếp nối bài viết trước, hôm nay mình sẽ hướng dẫn các bạn cách tích hợp cơ chế xác thực và ủy quyền cho Mosquitto Broker thông qua plugin mosquitto-go-auth kết hợp với cơ sở dữ liệu MySQL. Trong phần 3 của loạt bài này, mình sẽ giải thích cách đưa Mosquitto Broker lên internet.
🚀 Cài đặt
⚠️ Lưu ý: Đảm bảo rằng bạn đã cài đặt Mosquitto Broker phiên bản 2.0 trở lên.
1. Cài đặt Go:
Để bắt đầu, bạn cần cài đặt Go trên máy chủ của mình:
$ sudo add-apt-repository ppa:longsleep/golang-backports
$ sudo apt update
$ sudo apt install golang-go
Kiểm tra phiên bản Go đã cài:
$ go version
go version go1.22.5 linux/amd64
2. Tải về plugin mosquitto-go-auth:
Tiến hành tải plugin bằng cách sử dụng Git:
$ git clone https://github.com/iegomez/mosquitto-go-auth
$ cd mosquitto-go-auth
3. Xây dựng plugin:
ℹ️ Các tệp mosquitto.h, mosquitto_plugin.h, và mosquitto_broker.h cần có trong thư mục /usr/include. Nếu không có, bạn có thể tải chúng và thông báo đến phần header trong tệp MakeFile:
# Điều chỉnh đường dẫn nếu cần
CFLAGS := -I/usr/include -fPIC
Sau đó, lưu tệp MakeFile và gọi make
để biên dịch tệp go-auth.so.
4. Liên kết tệp go-auth.so với Mosquitto:
Sau khi hoàn tất, bạn cần sao chép tệp go-auth.so vào thư mục /etc/mosquitto/:
$ sudo cp go-auth.so /etc/mosquitto/
Tiếp theo, cần cấu hình file /etc/mosquitto/conf.d/default.conf
để sử dụng plugin này. Nội dung sẽ như sau:
allow_anonymous false
listener 1883 # Cổng kết nối tới Mosquitto Broker
auth_plugin /etc/mosquitto/conf.d/go-auth.so
auth_opt_log_level debug
auth_opt_log_dest file
auth_opt_log_file /var/log/mosquitto/mosquitto.log
auth_opt_backends mysql
auth_opt_mysql_host localhost
auth_opt_mysql_port 3306
auth_opt_mysql_user <tên_người_dùng_MySQL>
auth_opt_mysql_password <mật_khẩu_MySQL>
auth_opt_mysql_dbname go_auth_test
auth_opt_mysql_userquery SELECT password_hash FROM test_user WHERE (username = ?) limit 1
auth_opt_mysql_superquery SELECT COUNT(*) FROM test_user WHERE (username = ?) AND (is_admin = 1)
auth_opt_mysql_aclquery SELECT topic FROM test_acl INNER JOIN test_user ON test_user.id=test_acl.test_user_id WHERE (username = ?) AND (rw = ? OR rw=3)
auth_opt_hasher bcrypt
auth_opt_hasher_cost 10
Giải thích tùy chọn cấu hình:
Tùy chọn | Ý nghĩa |
---|---|
auth_opt_mysql_host | Địa chỉ máy chủ MySQL (mặc định là localhost). |
auth_opt_mysql_port | Cổng kết nối tới MySQL (mặc định là 3306). |
auth_opt_mysql_user | Tên người dùng để kết nối tới MySQL. |
auth_opt_mysql_password | Mật khẩu của người dùng MySQL. |
auth_opt_mysql_dbname | Tên Database dùng để lưu trữ dữ liệu. |
auth_opt_mysql_userquery | Truy vấn để lấy mật khẩu băm của người dùng từ bảng test_user. |
auth_opt_mysql_superquery | Truy vấn để kiểm tra quyền quản trị viên. |
auth_opt_mysql_aclquery | Truy vấn để lấy danh sách chủ đề mà người dùng có quyền truy cập. |
5. Tạo cơ sở dữ liệu MySQL:
Bắt đầu với việc tạo cơ sở dữ liệu mẫu:
CREATE DATABASE go_auth_test;
USE go_auth_test;
Tạo hai bảng: test_user và test_acl:
CREATE TABLE test_user(
id mediumint not null auto_increment,
username varchar(100) not null,
password_hash varchar(200) not null,
is_admin boolean not null,
primary key(id)
);
CREATE TABLE test_acl(
id mediumint not null auto_increment,
test_user_id mediumint not null,
topic varchar(200) not null,
rw int not null,
primary key(id),
foreign key(test_user_id) references test_user(id)
ON DELETE CASCADE
ON UPDATE CASCADE
);
Sau khi tạo bảng, bạn có thể thêm dữ liệu mẫu cho bảng:
INSERT INTO test_user VALUES (NULL, "admin", "mật khẩu đã hashed", 1);
INSERT INTO test_user VALUES (NULL, "user1", "mật khẩu đã hashed", 0);
Thêm quyền truy cập cho chủ đề trong bảng test_acl cho người dùng user1:
INSERT INTO test_acl VALUES (NULL, 2, "read_topic", 1);
INSERT INTO test_acl VALUES (NULL, 2, "write_topic", 2);
INSERT INTO test_acl VALUES (NULL, 2, "read_write_topic", 3);
Sau đó, khởi động lại dịch vụ Mosquitto:
$ sudo systemctl restart mosquitto.service
$ sudo systemctl status mosquitto.service
💡 Tổng kết
Bài viết đã hướng dẫn cách cài đặt bảo mật cho Mosquitto Broker sử dụng plugin mosquitto-go-auth với cơ sở dữ liệu MySQL. Khi người dùng user1 cố gắng truy cập các chủ đề không được phép, họ sẽ nhận thông báo lỗi tương ứng.
Nếu bạn muốn khám phá thêm các tính năng khác của plugin này hoặc cách tích hợp với cơ sở dữ liệu khác như Sqlite3 hay MongoDB, hãy tham khảo tài liệu chi tiết hơn.
Cảm ơn các bạn đã theo dõi bài viết! Nếu có bất kỳ câu hỏi hay đóng góp nào, vui lòng để lại cho mình biết nhé! 😊
source: viblo