Cách cài đặt và bảo mật Mosquitto MQTT Messaging Broker trên Ubuntu 16.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, truy xuất certificate SSL từ Let's Encrypt 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 16.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 16.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.
Bước 1 - Cài đặt Mosquitto
Ubuntu 16.04 có một version Mosquitto khá gần đây trong repository mặc định của nó. Đăng nhập bằng user không phải root của bạn và cài đặt Mosquitto bằng apt-get
.
- sudo apt-get 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 SSL bằng Certbot, ứng dụng Let's Encrypt mới.
Bước 2 - Cài đặt Certbot cho Let's Encrypt certificate
Let's Encrypt là một dịch vụ mới cung cấp certificate SSL miễn phí thông qua một API tự động. Có nhiều ứng dụng client có thể nói chuyện với API và Ubuntu bao gồm ứng dụng client chính thức trong repository lưu trữ mặc định của họ, nhưng nó hơi lỗi thời và thiếu một tính năng quan trọng mà ta cần.
Thay vào đó, ta sẽ cài đặt ứng dụng client chính thức từ PPA Ubuntu hoặc Repository cá nhân . Đây là các repository thay thế gói phần mềm mới hơn hoặc ít người biết hơn. Đầu tiên, hãy thêm repository .
- sudo add-apt-repository ppa:certbot/certbot
Bạn cần nhấn ENTER
để chấp nhận. Sau đó, cập nhật danh sách gói để nhận thông tin gói của repository mới.
- sudo apt-get update
Và cuối cùng, cài đặt ứng dụng Let's Encrypt chính thức, được gọi là certbot
.
- sudo apt-get install certbot
Bây giờ ta đã cài đặt certbot
, hãy chạy nó để lấy certificate của ta .
Bước 3 - Chạy Certbot
certbot
cần trả lời một thách thức mật mã do API Let's Encrypt đưa ra để chứng minh rằng ta kiểm soát domain của bạn . Nó sử dụng cổng 80
(HTTP) và / hoặc 443
(HTTPS) để thực hiện điều này. Ta sẽ chỉ sử dụng cổng 80
, vì vậy hãy cho phép lưu lượng đến trên cổng đó ngay bây giờ:
- sudo ufw allow http
OutputRule added
Bây giờ ta có thể chạy Certbot để lấy certificate của bạn . Ta sẽ sử dụng --standalone
tùy chọn để cho Certbot để xử lý các yêu cầu HTTP thách thức ngày của riêng mình, và --standalone-supported-challenges http-01
giới hạn các thông tin liên lạc để cổng 80
. -d
được sử dụng để chỉ định domain bạn muốn có certificate và certonly
yêu cầu Certbot chỉ truy xuất certificate mà không cần thực hiện bất kỳ bước cấu hình nào khác.
- sudo certbot certonly --standalone --standalone-supported-challenges http-01 -d mqtt.example.com
Khi chạy lệnh, bạn sẽ được yêu cầu nhập địa chỉ email và đồng ý với các điều khoản dịch vụ. Sau khi làm như vậy, bạn sẽ thấy một thông báo cho biết quá trình đã thành công và nơi lưu trữ các certificate của bạn.
Ta đã có certificate của ta . Bây giờ ta cần đảm bảo Certbot tự động gia hạn chúng khi chúng sắp hết hạn.
Bước 4 - Cài đặt gia hạn tự động Certbot
Chứng chỉ của Let's Encrypt chỉ có giá trị trong chín mươi ngày. Điều này nhằm khuyến khích user tự động hóa quy trình gia hạn certificate của họ. Ta cần cài đặt một lệnh chạy thường xuyên để kiểm tra các certificate hết hạn và tự động gia hạn chúng.
Để chạy kiểm tra gia hạn hàng ngày, ta sẽ sử dụng cron
, một dịch vụ hệ thống tiêu chuẩn để chạy các công việc định kỳ. Ta yêu cầu cron
phải làm gì bằng cách mở và chỉnh sửa một file có tên là crontab
.
- sudo crontab -e
Bạn sẽ được yêu cầu chọn một editor . Chọn mục yêu thích của bạn và bạn sẽ thấy crontab
mặc định có một số văn bản trợ giúp trong đó. Dán vào dòng sau vào cuối file , sau đó lưu file .
. . . 15 3 * * * certbot renew --noninteractive --post-hook "systemctl restart mosquitto"
Phần 15 3 * * *
của dòng này nghĩa là “chạy lệnh sau vào lúc 3:15 sáng, mỗi ngày”. Lệnh renew
cho Certbot sẽ kiểm tra tất cả các certificate được cài đặt trên hệ thống và cập nhật bất kỳ certificate nào được đặt để hết hạn trong vòng chưa đầy ba mươi ngày. --noninteractive
yêu cầu Certbot không đợi user nhập.
--post-hook "systemctl restart mosquitto"
sẽ khởi động lại Mosquitto để nhận certificate mới, nhưng chỉ khi certificate đã được gia hạn. Tính năng post-hook
này là thứ mà các version cũ hơn của ứng dụng Let's Encrypt thiếu và tại sao ta cài đặt từ PPA thay vì repository mặc định của Ubuntu. Nếu không có nó, ta sẽ phải khởi động lại Mosquitto mỗi ngày, ngay cả khi không có certificate nào thực sự được cập nhật. Mặc dù các client MQTT của bạn nên được cấu hình để tự động kết nối lại, nhưng bạn nên tránh làm gián đoạn chúng hàng ngày mà không có lý do chính đáng.
Bây giờ, việc gia hạn certificate tự động đã hoàn tất, ta sẽ quay lại cấu hình Mosquitto để an toàn hơn.
Bước 5 - 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
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 6 - 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
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
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 7 - 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 Mosqiutto 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
Đ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 được bảo vệ bằng password , an toàn, với certificate SSL tự động gia hạn từ dịch vụ Let's Encrypt. Đây sẽ 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 Puppet 4 trên Ubuntu 16.042016-12-09
Cách sử dụng Vault để bảo vệ dữ liệu nhạy cảm có thể xem được trên Ubuntu 16.04
2016-12-09
Cách cài đặt Discourse trên Ubuntu 16.04
2016-12-02
Cách thiết lập giám sát hiệu suất thời gian thực với Netdata trên Ubuntu 16.04
2016-12-01
Cách sắp xếp công việc theo nhóm với ONLYOFFICE trên Ubuntu 14.04
2016-11-22
Cách triển khai CockroachDB trên Cụm ba node trên Ubuntu 16.04
2016-11-18
Cách thu thập các chỉ số cơ sở hạ tầng với Packetbeat và ELK trên Ubuntu 16.04
2016-11-03
Cách thu thập số liệu cơ sở hạ tầng với Packetbeat và ELK trên Ubuntu 14.04
2016-11-02
Cách thiết lập ứng dụng Node.js để sản xuất trên Ubuntu 16.04
2016-11-01
Cách cài đặt và cấu hình ownCloud trên Ubuntu 16.04
2016-10-31