Thứ hai, 23/01/2017 | 00:00 GMT+7

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

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 sử dụng SSL để bảo mật thông tin liên lạc MQTT được bảo vệ bằng password .

Yêu cầu

Trước khi bắt đầu hướng dẫn này, bạn cần :

  • Server CentOS 7 với user không root, đã bật sudo và đã cài đặt firewall cơ bản. Điều này (và hơn thế nữa) được đề cập trong Danh sách kiểm tra server CentOS 7 mới .
  • Tên domain đã trỏ vào server , 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.
  • Tùy chọn, editor nano . Hướng dẫn này sẽ sử dụng nano xuyên suốt và bạn có thể cài đặt nó bất kỳ lúc nào với sudo yum -y install nano , hoặc thay thế editor yêu thích của bạn.

Bước 1 - Cài đặt Mosquitto

CentOS 7 không có gói mosquitto theo mặc định. Để cài đặt nó, trước tiên ta sẽ cài đặt một repository bổ sung có tên là Extra Packages for Enterprise Linux hoặc EPEL. Kho lưu trữ này có đầy đủ các phần mềm bổ sung có thể cài đặt tốt trên CentOS, Red Hat và các bản phân phối Linux dành cho doanh nghiệp khác.

Đăng nhập bằng user không phải root của bạn và sử dụng trình quản lý gói yum để cài đặt gói epel-release .

  • sudo yum -y install epel-release

Điều này sẽ thêm thông tin về kho EPEL vào hệ thống . Tùy chọn -y tự động trả lời có cho một số dấu nhắc trong suốt quá trình. Bây giờ ta có thể cài đặt gói mosquitto .

  • sudo yum -y install mosquitto

Gói đi kèm với một cấu hình mặc định đơn giản, vì vậy hãy chạy nó để kiểm tra cài đặt .

  • sudo systemctl start mosquitto

Ta cũng cần bật dịch vụ đảm bảo nó khởi động khi ta khởi động lại hệ thống:

  • sudo systemctl enable mosquitto

Bây giờ hãy kiểm tra cấu hình mặc định. Gói mosquitto đi kèm với một số client MQTT dòng lệnh. Ta sẽ sử dụng một trong số chúng để đă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

-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 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ậ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 và chạy Certbot cho Let's Encrypt Certificates

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. Ứng dụng Let's Encrypt chính thức được gọi là Certbot và nó có trong repository lưu trữ EPEL mà ta đã cài đặt ở bước trước.

Cài đặt Certbot với yum .

  • sudo yum -y install 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 truy cập vào cổng đó ngay bây giờ.

Sử dụng firewall-cmd để thêm dịch vụ HTTP.

  • sudo firewall-cmd --permanent --add-service=http

Cập nhật firewall để các thay đổi có hiệu lực.

  • sudo firewall-cmd --reload

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 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 3 - 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 EDITOR=nano crontab -e

EDITOR=nano sẽ mở file crontab trong trình soạn thảo nano . Bỏ nó đi nếu bạn muốn editor vi mặc định.

Đến đây bạn sẽ được hiển thị với crontab mặc định, một file trống. Dán vào dòng sau, 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.

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 4 - 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ẽ thay thế file cấu hình mặc định và yêu cầu Mosquitto sử dụng file password này để yêu cầu đăng nhập cho tất cả các kết nối. Đầu tiên, xóa mosquitto.conf hiện có.

  • sudo rm /etc/mosquitto/mosquitto.conf

Và bây giờ hãy mở một cấu hình trống, mới.

  • sudo nano /etc/mosquitto/mosquitto.conf

Dán vào phần sau.

/etc/mosquitto/mosquitto.conf
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 .

  • 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:

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 5 - 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/mosquitto.conf

Dán phần sau vào cuối file , để lại hai dòng mà ta đã thêm:

/etc/mosquitto/mosquitto.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 .

Trước khi ta khởi động lại Mosquitto để tải cấu hình mới, ta cần sửa một thứ trong file dịch vụ mosquitto mặc định. Đây là file systemd sử dụng để xác định cách chạy mosquitto . Mở nó trong trình soạn thảo yêu thích của bạn.

  • sudo nano /etc/systemd/system/multi-user.target.wants/mosquitto.service

Tìm dòng có nội dung User=mosquitto và xóa nó, sau đó lưu và thoát khỏi file .

Mosquitto sẽ vẫn chạy với quyền user mosquitto , nhưng khi khởi động lần đầu, nó sẽ có quyền root và có thể tải các certificate Let's Encrypt (bị hạn chế quyền truy cập root , vì lý do bảo mật). Sau khi tải các certificate , nó sẽ thả xuống user mosquitto .

Ta cần reload chính systemd , vì vậy nó sẽ thông báo những thay đổi đã thực hiện đối với file dịch vụ.

  • sudo systemctl daemon-reload

Và bây giờ ta có thể 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 firewall-cmd --permanent --add-port=8883/tcp

Và cập nhật firewall .

  • sudo firewall-cmd --reload

Bây giờ ta kiểm tra lại bằng cách sử dụng mosquitto_pub , với một vài tùy chọn khác nhau cho SSL.

  • mosquitto_pub -h mqtt.example.com -t test -m "hello again" -p 8883 --cafile /etc/ssl/certs/ca-bundle.crt -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).

--cafile /etc/ssl/certs/ca-bundle.crt 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_pubmosquitto_sub sẽ không cố gắng kết nối SSL mà không cần tùy chọn này (hoặc tương tự --capath tùy chọn), ngay cả khi bạn đang kết nối vào cổng an toàn tiêu chuẩn của 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 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 6 - 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 .

  • sudo nano /etc/mosquitto/mosquitto.conf

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

/etc/mosquitto/mosquitto.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 firewall-cmd --permanent --add-port=8083/tcp

Và cập nhật firewall lần cuối.

  • sudo firewall-cmd --reload

Để 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' 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!


Tags:

Các tin liên quan

Cách thay đổi thư mục dữ liệu MariaDB thành vị trí mới trên CentOS 7
2016-12-19
Cách cài đặt và cấu hình Ansible trên CentOS 7
2016-12-19
Cách cài đặt MariaDB trên CentOS 7
2016-12-01
Cách thu thập số liệu cơ sở hạ tầng với Packetbeat và ELK trên CentOS 7
2016-11-28
Cách chia sẻ tệp bằng FileRun trên CentOS 7
2016-11-21
Cách cài đặt và cấu hình Grafana để vẽ đồ thị đẹp từ Zabbix trên CentOS 7
2016-11-13
Cách cài đặt và cấu hình ownCloud trên CentOS 7
2016-10-31
Cách triển khai bộ đệm trình duyệt với module tiêu đề của Nginx trên CentOS 7
2016-10-31
Cách sử dụng module bản đồ của Nginx trên CentOS 7
2016-10-31
Cách cài đặt Go 1.7 trên CentOS 7
2016-10-31