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.comxuyê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 thực hiện bộ đệm trình duyệt với module tiêu đề của Nginx trên Ubuntu 16.04
2016-10-31
 

