Cách cài đặt và bảo mật Mosquitto MQTT Messaging Broker trên Ubuntu 20.04

theanh

Administrator
Nhân viên
Mosquitto là một trình môi giới tin nhắn nguồn mở sử dụng Giao thức truyền tải tin nhắn hàng đợi từ xa (MQTT). Giao thức này được thiết kế để cung cấp khả năng giao tiếp nhẹ đến các thiết bị Internet vạn vật (IoT). Giao thức này thường được sử dụng để theo dõi GPS của xe cộ, tự động hóa gia đình, cảm biến môi trường và thu thập dữ liệu quy mô lớn.

Giao thức MQTT chạy trên mô hình TCP/IP. Nhẹ, dấu chân mã nhỏ của giao thức này cho phép bạn tạo ứng dụng cho các thiết bị có tài nguyên tối thiểu. Giao thức này dựa trên mô hình xuất bản/đăng ký. Trong mô hình này, máy khách kết nối với máy chủ Mosquitto, hoạt động như một môi giới để gửi thông tin đến các máy khách khác đã đăng ký kênh.

Trong hướng dẫn này, bạn sẽ cài đặt Mosquitto và thiết lập môi giới để sử dụng SSL nhằm bảo vệ thông tin liên lạc.

Điều kiện tiên quyết​

  • Máy chủ Ubuntu 20.04 với người dùng không phải root có quyền sudo.
  • Tên miền (myqtt.example.com) trỏ đến máy chủ của bạn.

Bước 1 - Cài đặt máy chủ và máy khách Mosquitto​

Ubuntu đi kèm với phiên bản 1.6 cũ hơn của Mosquitto. Để cài đặt phiên bản mới nhất, hãy thêm kho lưu trữ Mosquitto chính thức.
Mã:
$ sudo add-apt-repository ppa:mosquitto-dev/mosquitto-ppa
Cài đặt máy chủ Mosquitto và máy khách.
Mã:
$ sudo apt install mosquitto mosquitto-clients
Kiểm tra trạng thái của máy chủ.
Mã:
$ sudo systemctl status mosquitto? mosquitto.service - Mosquitto MQTT Broker Đã tải: đã tải (/lib/systemd/system/mosquitto.service; đã bật; cài đặt trước của nhà cung cấp: đã bật) Đang hoạt động: đang hoạt động (đang chạy) kể từ Thứ Ba 2022-01-25 09:18:40 UTC; 25 giây trước Tài liệu: man:mosquitto.conf(5) man:mosquitto(8) PID chính: 119694 (mosquitto) Nhiệm vụ: 1 (giới hạn: 2274) Bộ nhớ: 1,0M CGroup: /system.slice/mosquitto.service ??119694 /usr/sbin/mosquitto -c /etc/mosquitto/mosquitto.conf25 tháng 1 09:18:39  systemd[1]: Đang khởi động Mosquitto MQTT Broker...25 tháng 1 09:18:40  systemd[1]: Đã khởi động Mosquitto MQTT Broker.

Bước 2 - Cấu hình Xác thực mật khẩu MQTT​

Mosquitto đi kèm với một tiện ích để tạo tệp mật khẩu có tên là mosquitto_passwd. Mosquitto lưu trữ tất cả các cấu hình trong thư mục /etc/mosquitto.

Chạy lệnh sau để tạo tệp mật khẩu được mã hóa tại /etc/mosquitto/passwd cho tên người dùng username. Nhập mật khẩu theo lựa chọn của bạn.
Mã:
$ sudo mosquitto_passwd -c /etc/mosquitto/passwd usernameMật khẩu:Nhập lại mật khẩu:
Tiếp theo, tạo tệp default.conf trong thư mục /etc/mosquitto/conf.d và mở tệp đó để chỉnh sửa.
Mã:
$ sudo nano /etc/mosquitto/conf.d/default.conf
Dán các dòng sau để chỉ định vị trí của tệp mật khẩu. Nếu bạn bỏ qua trường listener, nó sẽ luôn kết nối ẩn danh, bất kể cấu hình.
Mã:
listener 1883password_file /etc/mosquitto/passwd
Lưu tệp bằng cách nhấn Ctrl + X và nhập Y khi được nhắc.

Khởi động lại máy chủ Mosquitto để triển khai thay đổi.
Mã:
$ sudo systemctl restart mosquitto

Bước 3 - Kiểm tra máy khách Mosquitto​

Tùy thuộc vào trường hợp sử dụng, bạn có thể sử dụng máy khách Mosquitto để gửi và nhận tin nhắn về các chủ đề khác nhau. Máy khách có thể là người đăng ký hoặc người xuất bản.

Bước tiếp theo là đăng ký một chủ đề. Trong giao thức MQTT, chủ đề đề cập đến một chuỗi được máy chủ/người môi giới sử dụng để lọc tin nhắn cho các máy khách được kết nối. Sau đây là một số chủ đề mẫu mà bạn có thể sử dụng trong ứng dụng tự động hóa nhà.
  • home/lights/sitting_room
  • home/lights/kitchen
  • home/lights/master_bedroom
  • home/lights/kids_bedroom
Để đăng ký một chủ đề, hãy chạy lệnh mosquitto_sub -t theo sau là chủ đề. Ví dụ: để đăng ký chủ đề home/lights/kitchen, hãy chạy lệnh sau.
Mã:
$ mosquitto_sub -u username -P YOUR_PASSWORD -t "home/lights/kitchen"
Không đóng cửa sổ hiện tại. Mở một cửa sổ terminal mới để đăng tin nhắn lên chủ đề home/lights/kitchen bằng lệnh sau.
Mã:
$ mosquitto_pub -u username -P YOUR_PASSWORD -m "ON" -t "home/lights/kitchen"
Quay lại cửa sổ terminal đầu tiên và bạn sẽ nhận được tải trọng ON.
Mã:
ON
Tiếp theo, gửi tin nhắn OFF về cùng chủ đề từ terminal thứ hai.
Mã:
$ mosquitto_pub -u username -P YOUR_PASSWORD -m "OFF" -t "home/lights/kitchen"
Terminal đầu tiên sẽ hiển thị tin nhắn mới được xuất bản.
Mã:
ONOFF
Nếu bạn cố gắng gửi bình luận chưa xác thực, bình luận đó sẽ không thành công. Ví dụ, hãy thử lệnh sau.
Mã:
$ mosquitto_sub -t "home/lights/sitting_room"Lỗi kết nối: Kết nối bị từ chối: không được phép.
Không khuyến khích, nhưng bạn cần thêm dòng sau vào tệp /etc/mosquitto/conf.d/default.conf nếu bạn muốn chạy lệnh mà không cần xác thực.
Mã:
allow_anonymous true

Bước 4 - Cài đặt SSL​

Để cài đặt chứng chỉ SSL bằng Let's Encrypt, chúng ta cần tải xuống công cụ Certbot. Chúng tôi sẽ sử dụng trình cài đặt gói Snapd cho mục đích đó.

Cài đặt trình cài đặt Snap.
Mã:
$ sudo apt install snapd
Đảm bảo rằng phiên bản Snapd của bạn được cập nhật.
Mã:
$ sudo snap install core$ sudo snap refresh core
Cài đặt Certbot.
Mã:
$ sudo snap install --classic certbot
Sử dụng lệnh sau để đảm bảo rằng lệnh Certbot chạy bằng cách tạo liên kết tượng trưng đến thư mục /usr/bin.
Mã:
$ sudo ln -s /snap/bin/certbot /usr/bin/certbot
Tạo chứng chỉ SSL.
Mã:
$ sudo certbot certonly --standalone --agree-tos --no-eff-email --staple-ocsp --preferred-challenges http -m [emailprotected] -d mqtt.example.com
Lệnh trên sẽ tải xuống chứng chỉ vào thư mục /etc/letsencrypt/live/mqtt.example.com trên máy chủ của bạn.

Tạo chứng chỉ nhóm Diffie-Hellman.
Mã:
$ sudo openssl dhparam -out /etc/ssl/certs/dhparam.pem 2048
Tạo thư mục gốc web thử thách để tự động gia hạn Let's Encrypt.
Mã:
$ sudo mkdir -p /var/lib/letsencrypt
Tạo Cron Job để gia hạn SSL. Nó sẽ chạy hàng ngày để kiểm tra chứng chỉ và gia hạn nếu cần. Để thực hiện việc đó, trước tiên, hãy tạo tệp /etc/cron.daily/certbot-renew và mở tệp đó để chỉnh sửa.
Mã:
$ sudo nano /etc/cron.daily/certbot-renew
Dán mã sau.
Mã:
#!/bin/shcertbot renew --cert-name mqtt.example.com --webroot -w /var/lib/letsencrypt/
Lưu tệp bằng cách nhấn Ctrl + X và nhập Y khi được nhắc.

Thay đổi quyền trên tệp tác vụ để làm cho tệp đó có thể thực thi được.
Mã:
$ sudo chmod +x /etc/cron.daily/certbot-renew

Bước 5 - Cấu hình MQTT SSL​

Bây giờ chúng ta đã có chứng chỉ SSL, chúng ta cần cấp cho Mosquitto quyền truy cập vào chúng. Để thực hiện việc này, chúng ta cần sao chép các chứng chỉ vào một vị trí mà Mosquitto có thể truy cập chúng.
Mã:
$ sudo cp /etc/letsencrypt/live/mqtt.example.com/fullchain.pem /etc/mosquitto/certs/server.pem$ sudo cp /etc/letsencrypt/live/mqtt.example.com/privkey.pem /etc/mosquitto/certs/server.key
Thay đổi quyền sở hữu thư mục /etc/mosquitto/certs thành người dùng mosquitto được tạo trong quá trình cài đặt.
Mã:
$ sudo chown mosquitto: /etc/mosquitto/certs
Bước tiếp theo để bật mã hóa SSL cho Mosquitto là chỉ định vị trí của các chứng chỉ SSL. Mở tệp cấu hình để chỉnh sửa.
Mã:
$ sudo nano /etc/mosquitto/conf.d/default.conf
Dán mã sau vào cuối tệp.
Mã:
. . .listener 8883certfile /etc/mosquitto/certs/server.pemcafile /etc/ssl/certs/ISRG_Root_X1.pemkeyfile /etc/mosquitto/certs/server.keydhparamfile /etc/ssl/certs/dhparam.pem
Lưu tệp bằng cách nhấn Ctrl + X và nhập Y khi được nhắc. Đảm bảo để lại một dòng mới ở cuối tệp.

Phần listener 8883 thiết lập trình nghe được mã hóa. Đây là cổng chuẩn cho MQTT + SSL, được gọi là MQTTS. Bốn dòng tiếp theo chỉ định vị trí của các tệp SSL.

Khởi động lại Mosquitto để cập nhật cài đặt.
Mã:
$ sudo systemctl restart mosquitto
Bạn sẽ cần cập nhật tường lửa để cho phép kết nối đến cổng 8883.
Mã:
$ sudo ufw allow 8883
Tiếp theo, chúng ta cần kiểm tra chức năng bằng lệnh mosquitto_pub.
Mã:
$ mosquitto_pub -h mqtt.example.com -t "home/lights/kitchen" -m "hello" -p 8883 --capath /etc/ssl/certs/ -u username -P YOUR_PASSWORD
Như bạn thấy, chúng tôi đã bao gồm một số tham số bổ sung, bao gồm số cổng và đường dẫn đến chứng chỉ SSL. Bất cứ khi nào bạn cần sử dụng SSL, bạn sẽ luôn phải chỉ định tên máy chủ đầy đủ, tức là mqtt.example.com thay vì localhost nếu không, nó sẽ báo lỗi.

Bạn cũng sẽ cần thêm chỉ thị --capath mỗi lần. Nó yêu cầu máy khách Mosquitto tìm kiếm các chứng chỉ gốc do hệ điều hành cài đặt.

Bước 6 - Cấu hình gia hạn SSL​

Certbot sẽ tự động gia hạn chứng chỉ của bạn trước khi hết hạn. Nhưng cần phải yêu cầu nó sao chép các chứng chỉ đã gia hạn vào thư mục /etc/mosquitto/certs và khởi động lại dịch vụ Mosquitto.

Chúng ta sẽ thực hiện điều đó bằng cách tạo một tập lệnh shell. Tạo một tệp mosquitto-copy.sh trong thư mục /etc/letsencrypt/renewal-hooks/deploy.
Mã:
$ sudo nano /etc/letsencrypt/renewal-hooks/deploy/mosquitto-copy.sh
Dán mã sau vào đó. Thay thế giá trị của biến MY_DOMAIN bằng tên miền của bạn. Biến ${RENEWED_LINEAGE} trỏ đến thư mục /etc/letsencrypt/live/mqtt.example.com trong quá trình gia hạn.
Mã:
# Đặt tên miền mà tập lệnh này sẽ chạy choMY_DOMAIN=mqtt.example.com# Đặt thư mục mà chứng chỉ sẽ được sao chép vào.CERTIFICATE_DIR=/etc/mosquitto/certsif [ "${RENEWED_DOMAINS}" = "${MY_DOMAIN}" ]; sau đó # Sao chép chứng chỉ mới vào thư mục Mosquitto cp ${RENEWED_LINEAGE}/fullchain.pem ${CERTIFICATE_DIR}/server.pem cp ${RENEWED_LINEAGE}/privkey.pem ${CERTIFICATE_DIR}/server.key # Đặt quyền sở hữu cho Mosquitto chown mosquitto: ${CERTIFICATE_DIR}/server.pem ${CERTIFICATE_DIR}/server.key # Đảm bảo quyền bị hạn chế chmod 0600 ${CERTIFICATE_DIR}/server.pem ${CERTIFICATE_DIR}/server.key # Yêu cầu Mosquitto tải lại chứng chỉ và cấu hình pkill -HUP -x mosquittofi
Lưu tệp bằng cách nhấn Ctrl + X và nhập Y khi được nhắc.

Làm cho tệp có thể thực thi được.
Mã:
$ sudo chmod +x /etc/letsencrypt/renewal-hooks/deploy/mosquitto-copy.sh
Tập lệnh này sẽ tự động chạy sau mỗi lần gia hạn chứng chỉ thành công.

Nếu bạn đang chạy Mosquitto và máy chủ web như Nginx, bạn cần hướng dẫn Certbot dừng máy chủ trước khi gia hạn và khởi động lại sau khi hoàn tất. Để thực hiện việc đó, hãy mở tệp etc/letsencrypt/renewal/mqtt.example.com.conf.
Mã:
$ sudo nano /etc/letsencrypt/renewal/mqtt.example.com.conf
Thêm các dòng sau vào cuối tệp. Thay đổi các lệnh cho phù hợp với máy chủ web bạn đang sử dụng.
Mã:
pre_hook = systemctl stop nginxpost_hook = systemctl start nginx
Lưu tệp bằng cách nhấn Ctrl + X và nhập Y khi được nhắc.

Chạy thử Certbot để xác minh.
Mã:
$ sudo certbot renew --dry-run
Nếu bạn không thấy lỗi, nghĩa là mọi thứ đã được thiết lập.

Bước 7 - Cấu hình Websockets​

Bạn có thể cấu hình Mosquitto để sử dụng giao thức MQTT từ trong trình duyệt bằng Javascript bằng chức năng Websockets. Để bật tính năng này, hãy mở tệp cấu hình.
Mã:
$ sudo nano /etc/mosquitto/conf.d/default.conf
Dán các dòng sau vào cuối tệp.
Mã:
. . .listener 8083protocol websocketscertfile /etc/mosquitto/certs/server.pemcafile /etc/ssl/certs/ISRG_Root_X1.pemkeyfile /etc/mosquitto/certs/server.keydhparamfile /etc/ssl/certs/dhparam.pem
Lưu tệp bằng cách nhấn Ctrl + X và nhập Y khi được nhắc.

Nếu bạn để ý, đây là cùng một khối với khối chúng ta đã sử dụng để bật SSL ngoại trừ trường số cổng và giao thức. 8083 là cổng phổ biến nhất được MQTT sử dụng để giao tiếp bằng WebSockets.

Khởi động lại dịch vụ Mosquitto.
Mã:
$ sudo systemctl restart mosquitto
Mở cổng 8083.
Mã:
$ sudo ufw allow 8083
Chúng ta cần sử dụng một máy khách MQTT dựa trên trình duyệt để kiểm tra chức năng WebSockets. Có rất nhiều máy khách khả dụng, nhưng chúng ta sẽ sử dụng Máy khách HiveMQ Websocket cho mục đích của mình. Khởi chạy máy khách trong trình duyệt của bạn và bạn sẽ thấy thông tin sau.



Như được hiển thị trong ảnh chụp màn hình ở trên, hãy điền vào các trường như được hiển thị.
  • Máy chủ phải là tên miền của máy chủ Mosquitto của bạn, mqtt.example.com.
  • Cổng phải là 8083.
  • Trường ClientID có thể để nguyên.
  • Tên người dùng phải là tên người dùng Mosquitto của bạn.
  • Mật khẩu phải là mật khẩu bạn đã tạo ở trên.
  • Đánh dấu vào ô SSL.
Nhấn nút Kết nối và máy khách HiveMQ sẽ được kết nối với máy chủ Mosquitto của bạn.

Sau khi kết nối, hãy nhập home/lights/kitchen làm chủ đề, nhập bất kỳ thông báo nào và nhấn Xuất bản.



Thông báo sẽ hiển thị trong cửa sổ thiết bị đầu cuối mosquitto_sub của bạn để xác nhận kết nối thành công.



Điều này cho thấy triển khai Websockets là thành công.

Kết luận​

Như vậy là chúng ta đã hoàn thành việc thiết lập máy chủ MQTT an toàn, được bảo vệ bằng mật khẩu và được mã hóa SSL trên máy chạy Ubuntu 20.04. Nếu bạn có bất kỳ câu hỏi nào, hãy đăng chúng trong phần bình luận bên dưới.
 
Back
Bên trên