Thứ ba, 17/01/2017 | 00:00 GMT+7

Cách cài đặt và bảo mật message broker Mosquitto MQTT trên Debian 8


  • wget http://repo.mosquitto.org/debian/mosquitto-repo.gpg.key

Sau đó cài đặt khóa bằng apt-key .

  • sudo apt-key add mosquitto-repo.gpg.key

Điều này cho phép apt-get xác minh tính toàn vẹn của bất kỳ phần mềm nào bạn cài đặt từ repository mới.

Bây giờ hãy cho apt-get nơi tìm phần mềm bằng cách thêm URL repository vào một file trong /etc/apt/sources.list.d/ .

  • sudo nano /etc/apt/sources.list.d/mosquitto.list

Thao tác này sẽ mở ra một file trống mới. Dán dòng sau vào file .

/etc/apt/sources.list.d/mosquitto.list
deb http://repo.mosquitto.org/debian jessie main 

Lưu và đóng khỏi editor , sau đó cập nhật bằng apt-get để lấy thông tin gói mới.

  • sudo apt-get update

Và cuối cùng, cài đặt gói mosquitto và phần mềm client của nó.

  • sudo apt-get install mosquitto mosquitto-clients

Theo mặc định, Debian 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 mà ta vừa cài đặt để đăng ký một chủ đề trên nhà broker .

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/tempsensors/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 .

Đăng nhập vào server 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

Cờ -h 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 ENTERmosquitto_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 . 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ấn 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à Debian đưa ứng dụng client chính thức vào repository 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 từ repository backports của Debian. Đây là repository chính thức cung cấp các version phần mềm chọn lọc mới hơn cho các version Debian đã phát hành. Ta cần thêm repository vào danh sách nguồn APT của bạn , giống như ta đã làm trong bước trước.

Đầu tiên, hãy mở một file mới trong /etc/apt/sources.list.d/ .

  • sudo nano /etc/apt/sources.list.d/backports.list

Dán dòng sau vào file :

/etc/apt/sources.list.d/backports.list
deb http://mirrors.digitalocean.com/debian jessie-backports main 

Lưu file và đóng khỏi editor . Sau đó, cập nhật thông tin gói.

  • sudo apt-get update

Và cuối cùng, hãy cài đặt ứng dụng Let's Encrypt chính thức, được gọi là Certbot, yêu cầu APT sử dụng jessie-backports làm nguồn của nó:

  • sudo apt-get install certbot -t jessie-backports

Bây giờ ta đã cài đặt Certbot, hãy chạy nó để lấy certificate .

Bước 3 - Chạy Certbot

Certbot cần phải 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 đó.

  • sudo ufw allow http
Output
Rule added Rule added (v6) 

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 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 cần 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 . 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 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 cần 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 .

crontab
. . . 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ừ các cổng lùi thay vì repository Debian mặc định. 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 để ta có thể kiểm soát ai có thể xuất bản tin nhắn. 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ờ, hãy tạo 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:

/etc/mosquitto/conf.d/default.conf
allow_anonymous false password_file /etc/mosquitto/passwd 

allow_anonymous false 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 .

Đến đây bạn cần khởi động lại Mosquitto và kiểm tra các thay đổi .

  • sudo systemctl restart mosquitto

Đầu tiên, hãy 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:

Output
Connection 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 . 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:

/etc/mosquitto/conf.d/default.conf
. . . 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 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 , cafilekeyfile , 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
Output
Rule added Rule added (v6) 

Bây giờ hãy 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 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 macOS, 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_pubmosquitto_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 bài kiểm tra, bạn sẽ thấy hello lại hiển thị trong terminal mosquitto_sub khác. Điều này nghĩa là server đã đượ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 .

  • sudo nano /etc/mosquitto/conf.d/default.conf

Ở cuối file , thêm thông tin sau:

/etc/mosquitto/conf.d/default.conf
. . . 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 vài điều trên mạng, nhưng mqtt-admin rất đơn giản và dễ hiểu. Mở mqtt-admin trong trình duyệt của bạn . Bạn sẽ thấy như sau:

màn hình ban đầu của mqtt-admin

Điền thông tin kết nối như sau:

  • Giao thức phải là wss (viết tắt của w eb s ocket s ecure).
  • Server phải là domain cho server Mosquitto của bạn, mqtt.example.com .
  • Cổng phải là 8083 .
  • 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.
  • ClientId có thể được để giá trị mặc định, mqtt-admin .

Sau khi nhấn Lưu Cài đặt , mqtt-admin sẽ kết nối với server Mosquitto của bạn. Trong màn hình tiếp theo, điền Chủ đề làm bài kiểm tra , nhập bất kỳ thông báo nào cho Tải trọng , sau đó nhấn Xuất bản . Thông báo sẽ hiển thị trong terminal mosquitto_sub .

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 với nhau” Internet of Things. 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!


Tags:

Các tin liên quan