Cách cài đặt và bảo mật Mosquitto MQTT Messaging Broker trên Ubuntu 18.04
MQTT là một giao thức nhắn tin giữa máy và máy, được thiết kế để cung cấp giao tiếp đăng ký / xuất bản nhẹ cho các thiết bị “Internet of Things”. Nó thường được sử dụng để theo dõi địa lý đội xe, tự động hóa gia đình, mạng cảm biến môi trường và thu thập dữ liệu quy mô tiện ích.Mosquitto là một server MQTT phổ biến (hay nhà broker , theo cách nói của MQTT) có sự hỗ trợ cộng đồng tuyệt vời và dễ cài đặt và cấu hình.
Trong hướng dẫn này, ta sẽ cài đặt Mosquitto và cài đặt nhà broker của ta sử dụng SSL để bảo mật thông tin liên lạc MQTT được bảo vệ bằng password của ta .
Yêu cầu
Trước khi bắt đầu hướng dẫn này, bạn cần :
- Server Ubuntu 18.04 với user không root, hỗ trợ sudo và firewall cơ bản được cài đặt , như chi tiết trong hướng dẫn cài đặt server Ubuntu 18.04 này .
- Tên domain đã trỏ vào server của bạn, theo Cách cài đặt tên server với DigitalOcean . Hướng dẫn này sẽ sử dụng
mqtt.example.com
xuyên suốt. - Chứng chỉ SSL Let's Encrypt có thể tự động gia hạn để sử dụng với domain và Mosquitto của bạn, được tạo bằng công cụ Certbot. Bạn có thể tìm hiểu cách cài đặt điều này trong Cách sử dụng Chế độ độc lập Certbot để Lấy Chứng chỉ SSL Hãy Mã hóa trên Ubuntu 18.04 . Bạn có thể thêm
systemctl restart mosquitto
làmrenew_hook
ở Bước 4. Đảm bảo sử dụng cùng một domain được cấu hình trong bước yêu cầu trước đó.
Bước 1 - Cài đặt Mosquitto
Ubuntu 18.04 có một version Mosquitto khá gần đây trong repository mặc định của nó, vì vậy ta có thể cài đặt nó từ đó.
Đầu tiên, hãy đăng nhập bằng user không phải root của bạn và cập nhật danh sách gói bằng cách sử dụng apt update
:
- sudo apt update
Bây giờ, hãy cài đặt Mosquitto bằng cách sử dụng apt install
:
- sudo apt install mosquitto mosquitto-clients
Theo mặc định, Ubuntu sẽ khởi động dịch vụ Mosquitto sau khi cài đặt. Hãy kiểm tra cấu hình mặc định. Ta sẽ sử dụng một trong những ứng dụng client Mosquitto mà ta vừa cài đặt để đăng ký một chủ đề trên nhà broker của ta .
Chủ đề là các nhãn mà bạn xuất bản tin nhắn và đăng ký. Chúng được sắp xếp như một hệ thống phân cấp, vì vậy bạn có thể có sensors/outside/temp
và sensors/outside/humidity
, chẳng hạn. Cách bạn sắp xếp các chủ đề là tùy thuộc vào bạn và nhu cầu của bạn. Trong suốt hướng dẫn này, ta sẽ sử dụng một chủ đề thử nghiệm đơn giản để kiểm tra các thay đổi cấu hình của ta .
Đăng nhập vào server của bạn lần thứ hai, vì vậy bạn có hai terminal cạnh nhau. Trong terminal mới, sử dụng mosquitto_sub
để đăng ký chủ đề thử nghiệm:
- mosquitto_sub -h localhost -t test
-h
được sử dụng để chỉ định tên server của server MQTT và -t
là tên chủ đề. Bạn sẽ không thấy kết quả nào sau khi nhấn ENTER
vì mosquitto_sub
đang chờ tin nhắn đến. Chuyển trở lại terminal khác của bạn và xuất bản một tin nhắn:
- mosquitto_pub -h localhost -t test -m "hello world"
Các tùy chọn cho mosquitto_pub
cũng giống như mosquitto_sub
, mặc dù lần này ta sử dụng tùy chọn -m
bổ sung để chỉ định thông báo của ta . Nhấn ENTER
, và bạn sẽ thấy hello world bật lên trong terminal khác. Bạn đã gửi tin nhắn MQTT đầu tiên của bạn !
Nhập CTRL+C
trong terminal thứ hai để thoát khỏi mosquitto_sub
, nhưng vẫn mở kết nối với server . Ta sẽ sử dụng lại nó cho một bài kiểm tra khác ở Bước 5.
Tiếp theo, ta sẽ bảo mật cài đặt của bạn bằng xác thực dựa trên password .
Bước 2 - Cấu hình password MQTT
Hãy cấu hình Mosquitto để sử dụng password . Mosquitto bao gồm một tiện ích để tạo một file password đặc biệt được gọi là mosquitto_passwd
. Lệnh này sẽ nhắc bạn nhập password cho tên user được chỉ định và đặt kết quả vào /etc/mosquitto/passwd
.
- sudo mosquitto_passwd -c /etc/mosquitto/passwd sammy
Bây giờ ta sẽ mở một file cấu hình mới cho Mosquitto và yêu cầu nó sử dụng file password này để yêu cầu đăng nhập cho tất cả các kết nối:
- sudo nano /etc/mosquitto/conf.d/default.conf
Thao tác này sẽ mở một file trống. Dán vào phần sau:
allow_anonymous false password_file /etc/mosquitto/passwd
Đảm bảo để lại một dòng mới ở cuối file .
allow_anonymous false
sẽ vô hiệu hóa tất cả các kết nối không được xác thực và dòng password_file
cho Mosquitto biết nơi tìm kiếm thông tin user và password . Lưu và thoát khỏi file .
Bây giờ ta cần khởi động lại Mosquitto và kiểm tra các thay đổi của bạn .
- sudo systemctl restart mosquitto
Cố gắng xuất bản một tin nhắn mà không cần password :
- mosquitto_pub -h localhost -t "test" -m "hello world"
Thư sẽ bị từ chối:
OutputConnection Refused: not authorised. Error: The connection was refused.
Trước khi ta thử lại với password , hãy chuyển sang cửa sổ terminal thứ hai của bạn và đăng ký chủ đề 'thử nghiệm', sử dụng tên user và password lần này:
- mosquitto_sub -h localhost -t test -u "sammy" -P "password"
Nó sẽ kết nối và ngồi, chờ tin nhắn. Bạn có thể để terminal này mở và kết nối trong phần còn lại của hướng dẫn, vì ta sẽ định kỳ gửi các thông báo kiểm tra cho nó.
Bây giờ xuất bản một tin nhắn với terminal khác của bạn, sử dụng tên user và password :
- mosquitto_pub -h localhost -t "test" -m "hello world" -u "sammy" -P "password"
Thông báo sẽ diễn ra như ở Bước 1. Ta đã thêm thành công password bảo vệ vào Mosquitto. Rất tiếc, ta đang gửi password không được mã hóa qua internet. Ta sẽ khắc phục điều đó tiếp theo bằng cách thêm mã hóa SSL vào Mosquitto.
Bước 3 - Cấu hình MQTT SSL
Để bật mã hóa SSL, ta cần cho Mosquitto biết nơi lưu trữ các certificate Let's Encrypt của ta . Mở file cấu hình mà ta đã bắt đầu trước đó:
- sudo nano /etc/mosquitto/conf.d/default.conf
Dán phần sau vào cuối file , để lại hai dòng mà ta đã thêm:
. . . listener 1883 localhost listener 8883 certfile /etc/letsencrypt/live/mqtt.example.com/cert.pem cafile /etc/letsencrypt/live/mqtt.example.com/chain.pem keyfile /etc/letsencrypt/live/mqtt.example.com/privkey.pem
, hãy nhớ để lại một dòng mới ở cuối file .
Ta đang thêm hai khối listener
riêng biệt vào cấu hình. Đầu tiên, trình listener 1883 localhost
, cập nhật trình nghe MQTT mặc định trên cổng 1883
, đó là những gì ta đã kết nối cho đến nay. 1883
là cổng MQTT không được mã hóa tiêu chuẩn. Phần localhost
của dòng hướng dẫn Mosquitto chỉ liên kết cổng này với giao diện localhost, vì vậy nó không thể truy cập được từ bên ngoài. Dù sao thì các yêu cầu bên ngoài cũng đã bị firewall của ta chặn, nhưng rõ ràng là được.
listener 8883
cài đặt trình nghe được mã hóa trên cổng 8883
. Đây là cổng tiêu chuẩn cho MQTT + SSL, thường được gọi là MQTTS. Ba dòng tiếp theo, certfile
, cafile
và keyfile
, tất cả đều trỏ Mosquitto đến các file Let's Encrypt thích hợp để cài đặt các kết nối được mã hóa.
Lưu và thoát khỏi file , sau đó khởi động lại Mosquitto để cập nhật cài đặt:
- sudo systemctl restart mosquitto
Cập nhật firewall để cho phép kết nối đến cổng 8883
.
- sudo ufw allow 8883
OutputRule added Rule added (v6)
Bây giờ ta kiểm tra lại bằng cách sử dụng mosquitto_pub
, với một số tùy chọn khác nhau cho SSL:
- mosquitto_pub -h mqtt.example.com -t test -m "hello again" -p 8883 --capath /etc/ssl/certs/ -u "sammy" -P "password"
Lưu ý ta đang sử dụng tên server đầy đủ thay vì server localhost
. Bởi vì certificate SSL của ta được cấp cho mqtt.example.com
, nếu ta cố gắng kết nối an toàn với localhost
ta sẽ gặp lỗi cho biết tên server không trùng với tên server certificate (mặc dù cả hai đều trỏ đến cùng một server Mosquitto).
--capath /etc/ssl/certs/
SSL cho mosquitto_pub
và cho nó biết nơi tìm certificate root . Chúng thường được cài đặt bởi hệ điều hành của bạn, vì vậy đường dẫn khác nhau đối với Mac OS, Windows, v.v. mosquitto_pub
sử dụng certificate root để xác minh certificate của server Mosquitto đã được tổ chức cấp certificate Let's Encrypt ký đúng cách. Điều quan trọng cần lưu ý là mosquitto_pub
và mosquitto_sub
sẽ không thử kết nối SSL mà không có tùy chọn này (hoặc tùy chọn --cafile
tương tự), ngay cả khi bạn đang kết nối với cổng bảo mật tiêu chuẩn 8883
.
Nếu mọi việc suôn sẻ với quá trình kiểm tra, ta sẽ thấy lời chào xuất hiện trong terminal mosquitto_sub
khác. Điều này nghĩa là server của bạn đã được cài đặt đầy đủ! Nếu bạn muốn mở rộng giao thức MQTT để hoạt động với websockets, bạn có thể làm theo bước cuối cùng.
Bước 4 - Cấu hình MQTT qua Websockets (Tùy chọn)
Để nói MQTT bằng JavaScript từ bên trong các trình duyệt web, giao thức đã được điều chỉnh để hoạt động trên các cổng web tiêu chuẩn. Nếu bạn không cần chức năng này, bạn có thể bỏ qua bước này.
Ta cần thêm một khối listener
nữa vào cấu hình Mosquitto của ta :
- sudo nano /etc/mosquitto/conf.d/default.conf
Ở cuối file , thêm thông tin sau:
. . . listener 8083 protocol websockets certfile /etc/letsencrypt/live/mqtt.example.com/cert.pem cafile /etc/letsencrypt/live/mqtt.example.com/chain.pem keyfile /etc/letsencrypt/live/mqtt.example.com/privkey.pem
, hãy nhớ để lại một dòng mới ở cuối file .
Điều này hầu hết giống với khối trước, ngoại trừ số cổng và dòng protocol websockets
. Không có cổng chuẩn hóa chính thức cho MQTT qua websockets, nhưng 8083
là cổng phổ biến nhất.
Lưu và thoát khỏi file , sau đó khởi động lại Mosquitto.
- sudo systemctl restart mosquitto
Bây giờ, hãy mở cổng 8083
trong firewall .
- sudo ufw allow 8083
Để kiểm tra chức năng này, ta sẽ sử dụng một ứng dụng client MQTT dựa trên trình duyệt. Có một số ít, nhưng Eclipse Paho JavaScript Client rất đơn giản và dễ sử dụng. Mở ứng dụng client Paho trong trình duyệt của bạn . Bạn sẽ thấy như sau:
Điền thông tin kết nối như sau:
- Server phải là domain cho server Mosquitto của bạn,
mqtt.example.com
. - Cổng phải là
8083
. - ClientId có thể được để giá trị mặc định, js-tiện ích-DI1m6 .
- Đường dẫn có thể được để giá trị mặc định, / ws .
- Tên user phải là tên user Mosquitto của bạn; ở đây, ta đã sử dụng sammy .
- Mật khẩu phải là password bạn đã chọn.
Các trường còn lại có thể được để giá trị mặc định của chúng.
Sau khi nhấn Connect , ứng dụng client dựa trên trình duyệt Paho sẽ kết nối với server Mosquitto của bạn.
Để xuất bản một tin nhắn, hãy chuyển đến ngăn Xuất bản Tin nhắn , điền Chủ đề làm bài kiểm tra và nhập bất kỳ tin nhắn nào vào phần Tin nhắn . Tiếp theo, nhấn Xuất bản . Thông báo sẽ hiển thị trong terminal mosquitto_sub
của bạn.
Kết luận
Bây giờ ta đã cài đặt một server MQTT an toàn, được bảo vệ bằng password và được bảo mật bằng SSL. Đây có thể là một nền tảng nhắn tin mạnh mẽ và an toàn cho bất kỳ dự án nào bạn mơ ước. Một số phần mềm và phần cứng phổ biến hoạt động tốt với giao thức MQTT bao gồm:
- OwnTracks , một ứng dụng theo dõi địa lý open-souce mà bạn có thể cài đặt trên điện thoại của bạn . OwnTracks sẽ báo cáo định kỳ thông tin vị trí cho server MQTT của bạn, sau đó bạn có thể lưu trữ và hiển thị trên bản đồ hoặc tạo cảnh báo và kích hoạt phần cứng IoT dựa trên vị trí của bạn.
- Node-RED là một giao diện đồ họa dựa trên trình duyệt để 'kết nối' Internet of Things với nhau. Bạn kéo kết quả của một nút đến đầu vào của nút khác và có thể định tuyến thông tin qua các bộ lọc, giữa các giao thức khác nhau, vào database , v.v. MQTT được hỗ trợ rất tốt bởi Node-RED.
- ESP8266 là một vi điều khiển wifi rẻ tiền với khả năng MQTT. Bạn có thể kết nối để xuất bản dữ liệu nhiệt độ cho một chủ đề hoặc có thể đăng ký một chủ đề về áp suất khí quyển và phát ra tiếng còi khi có bão!
Đây chỉ là một vài ví dụ phổ biến từ hệ sinh thái MQTT. Có nhiều phần cứng và phần mềm hơn nói giao thức. Nếu bạn đã có một nền tảng phần cứng hoặc ngôn ngữ phần mềm yêu thích, nó có thể có khả năng MQTT. Chúc bạn vui vẻ khi nói chuyện với nhau "mọi thứ" của bạn!
Các tin liên quan
Cách cài đặt Git trên Ubuntu 18.04 [Quickstart]2018-07-12
Cách sử dụng Chế độ độc lập của Certbot để truy xuất chứng chỉ SSL Let's Encrypt trên Ubuntu 18.04
2018-07-11
Cách cài đặt WordPress với LEMP trên Ubuntu 18.04
2018-07-11
Cách sử dụng LVM để quản lý thiết bị lưu trữ trên Ubuntu 18.04
2018-07-11
Cách thiết lập đồng bộ hóa thời gian trên Ubuntu 18.04
2018-07-10
Cách cài đặt Hadoop ở chế độ độc lập trên Ubuntu 18.04
2018-07-10
Cách cài đặt và cấu hình GitLab trên Ubuntu 18.04
2018-07-09
Cách cài đặt Git trên Ubuntu 18.04
2018-07-06
Cách cài đặt và cấu hình Postfix trên Ubuntu 18.04
2018-07-06
Cách thiết lập vsftpd cho Thư mục người dùng trên Ubuntu 18.04
2018-07-06