Internet of ThingsIoT platformsOwntracks

Bài 4: Bảo mật Máy chủ MQTT

1. Máy chủ MQTT (mosquitto)

máy chủ mosquitto
máy chủ mosquitto

Mosquitto là một MQTT Broker, hay là một máy chủ MQTT. Nó cho phép xuất bản và đăng ký bản tin bằng các câu lệnh mosquitto_pub và mosquitto_pub.

Các ứng dụng Owntracks chạy trên smartphone. Khi smartphone xác định là nó đã di chuyển một khoảng cách đáng kể, Owntracks liên lạc với máy chủ qua 3G hoặc WiFi. Nếu như không có kết nối mạng các tin nhắn sẽ ở xếp hàng chờ trên ứng dụng cho đến khi kết nối được thiết lập. Sau đó tin nhắn sẽ được máy chủ gửi chính xác đến những người dùng khác có quyền xem hoặc muốn xem nó.

Máy chủ ở đây chính là máy chủ Web HTTP hoặc máy chủ MQTT.

Publish và Subscribe trong mqtt server
Publish và Subscribe trong mqtt server

MQTT được gọi là một nhà mô giới và liên hệ được thực hiện với giao thức mở, trọng lượng nhẹ. Hành động gửi vị trí của smartphone được gọi là xuất bản tin nhắn (publish) tới MQTT broker (nhà mô giới MQTT). Trong tin nhắn được gửi đi có đầy đủ các thông tin cần thiết để máy chủ có thể phân phát chính xác đến các điểm cuối. Thông tin cần thiết đó chính là chủ đề của tin nhắn (Topic). Bao gồm tên người dùng và thiết bị của người đó (Ví dụ: owntracks/dung/iphone). Sau đó chờ cho đến lần di chuyển tiếp theo rồi thực hiện lại quá trình publish. Hành động nhận vị trí của smartphone được gọi là đăng kí. Nó sẽ nhận được tin nhắn từ máy chủ sau khi đã đăng ký tên topic.

Máy chủ nhận dữ liệu và sau đó có thể phân phố nó theo ý muốn của bạn. Điều này về cơ bản có nghĩa là nó có thể chuyển vị trí của bạn cho một người bạn hay bất kỳ ai mà bạn muốn.

2. Bảo mật máy chủ MQTT

Như các bạn đã biết, việc bảo mật cho hệ thống là tối quan trọng trong bất kỳ trường hợp nào. Bảo mật còn quyết định sự sống còn của hệ thống. Với sự phát triển chóng mặt của Công Nghệ thì bảo mật càng phải đòi hỏi thật nghiêm ngặt và vững chắc. Cho nên tôi đặc biệt quan tâm đến vấn đề này.

Bảo mật càng nhiều tầng, tạo tường lửa càng nhiều càng khó xâm phạm. Dưới đây tôi xin giới thiệu một trong các lớp bảo mật đó, đó là chặn kết nối đến máy chủ MQTT. Yêu cầu người dùng phải khai báo danh tính và cung cấp cho máy chủ để thực hiện kết nối. Nếu như sai thông tin người dùng thì tuyệt đối không được phép kêt nối.

Việc bảo mật này chỉ gồm hai dòng cấu hình:

Bước 1: bạn sẽ phải tạo ra 1 tệp để lưu username và password

Sau đó nhập Password

Chú ý:

-cấu trúc của câu lệnh như sau: mosquitto_passwd + -c + đường dẫn + username

-c: là lệnh tạo file, nếu lần sau bạn vẫn dùng -c thì file mới sẽ ghi đè lên file cũ. tôi khuyên bạn nên dùng -b cho những lần thêm username sau đó. -b sẽ giúp bạn thêm người dùng mới mà không làm xóa người dùng cũ đi.

khi đó cấu trúc câu lệnh thay đổi như sau:

Bước 2: tạo file config trong thư mục /etc/mosquitto/conf.d

và thêm hai dòng cấu hình ở trên vào.

Tệp cấu hình
Tệp cấu hình

Bây giờ chúng ta cần restart mosquito và kiểm tra kết quả

Chú ý sau khi restart, chạy lệnh mosquitto mà output giống như hình dưới thì tức là chưa thành công!

chưa thành công
chưa thành công

–> Hãy thử restart lại xem sao!

thành công!
thành công!

Kiểm tra kết quả: bằng cách publish một tin nhắn ẩn danh

->output:

Lần này hãy publish một tin nhắn với username và password vừa tạo:

Chú ý: -u là username còn -P là password

Kiểm tra kết quả
Kiểm tra kết quả

Như vậy là chúng ta đã thêm username password vào mqtt thành công!

3. Phân quyền cho người dùng Owntracks bằng ACLs trong MQTT

Có thể coi đây là lớp bảo mật thứ 2 bên phía máy chủ MQTT. Ngoài việc hạn chế quyền truy cập ta còn có thể giới hạn quyền xem tin nhắn hay gửi tin nhắn của người dùng bằng việc phân định quyền pub/sub một chủ đề. Bằng lớp bảo mật này bạn có thể kiểm soát việc xuất bản vị trí của mình. Bạn là admin và bạn chỉ cấp cho những người dùng khác quyền publish và không có quyền subcribe. Ví dụ bạn có thể biết được chồng mình ở vị trí nào trên bản đồ còn anh ta thì lại hoàn toàn không biết bạn ở đâu. Quá dễ hiểu phải không?

Trừ khi bạn máy chủ bạn đang điều hành là một broker mở (nhà mô giới mở). Bạn sẽ muốn hạn chế quyền truy cập vào các chủ đề, chỉ những người dùng được ủy quyền mới có thể xuất bản hoặc đăng ký chúng. Các hạn chế này được cấu hình trên máy chủ MQTT và không cấu hình trên máy khách. Toàn bộ cấu hình được lưu trong danh sách kiểm soát truy cập (ACLs)

Một khi lớp bảo mật này được thiết lập thì mọi quyền truy cập vào hầu hết mọi chủ đề đều sẽ bị  từ chối cho mọi người dùng và ứng dụng khách. Trừ khi được cho phép một cách rõ ràng.

Để kích hoạt nó bạn cần sửa tệp tin cấu hình default.conf trong thư mục /etc/mosquitto/conf.d/

Và thêm dòng sau: act_file /etc/mosquitto/acl

Tạo ra 1 file acl trong thu muc /etc/mosquitto/

Với nội dung:

Sau đó restart mosquitto và kiểm tra kết quả

Kiểm tra kết quả
Kiểm tra kết quả

Ở ví dụ trên tôi đã tạo cho user ‘david’ quyền gửi tin nhắn với topic là test còn user ‘dat’ thì không có quyền gì cả. Như các bạn thấy đấy, tôi publish một tin nhắn là ‘hello’ hay ‘world’ trong topic ‘test’ bằng user ‘david’. Còn user ‘dat’ thì subcribe cũng topic đó. Kết quả là user ‘dat’ không thể nhận được bất kỳ một tin nhắn nào cho dù đã cố gắng lắng nghe.

Tôi chắc chắn là từ đây bạn đã có thể áp dụng nó cho Owntracks bằng việc khai báo cho ACLs một chủ đề cố định. Ví dụ ‘owntracks/david/samsung’.

Câu hỏi đặt ra là nếu có nhiều người dùng nhiều thiết bị thì sao, có phải khai báo từng cái không? Câu trả lời là không. Mọi thứ sẽ được giải quyết.

MQTT có hai loại ký tự đại diện trong việc khai báo topic:

  • Ký tự ‘#’ đại diện cho mọi thứ ở mọi cấp và chỉ có thể sử dụng vào cuối của topic

Ví dụ: topic ‘owntracks/#’ người dùng có thể nhận được mọi thông điệp từ các chủ đề bắt đầu bằng ‘owntracks’. Chẳng hạn như hai topic dưới đây đều thỏa mãn:

‘owntracks/david/samsung’ hay ‘owntracks/family/david/samsung’.

  • Ký tự ‘+’ đại diện cho mọi thứ nhưng chỉ có một cấp. Vì vậy một hoặc nhiều ký tự ‘+’ có thể được sử dụng trong topic

Ví dụ: topic ‘owntracks/+/samsung’ người dùng có thể nhận được mọi thông điệp từ thiết bị samsung cửa mọi người dùng. Như vậy nếu topic là ‘owntracks/david/samsung’ thì thỏa mãn, còn ‘owntracks/david/samsung/J7’ không thỏa mãn.

Kết luận: Vậy là chúng ta đã hoàn thành các bước bảo mật và đảm bảo tính riêng tư của tin nhắn trong máy chủ MQTT. Việc cài đặt các bạn có thể tham khảo tại đây!

Bình luận

Related Articles

Close
Close