Những vấn đề bảo mật giao thức MQTT và giải pháp

nktung

Super Moderator
Thành viên BQT
08/10/2013
400
985 bài viết
Những vấn đề bảo mật giao thức MQTT và giải pháp
Giới thiệu

MQTT là một giao thức chỉ tập trung vào chức năng truyền tải thông điệp nhanh, do vậy khi triển khai cần đưa thêm các tính năng về quyền riêng tư, xác thực và ủy quyền sao cho phù hợp với điều kiện của hệ thống cụ thể.

MQTT.png

Hình. Nguyên lý hoạt động giao thức MQTT

Một số nguy cơ mà hệ thống IoT có thể gặp phải:

  • Các thiết bị có thể bị tác động vật lý trái phép.
  • Dữ liệu lưu trong client và Server (Broker) có thể bị truy cập trái phép.
  • Các giao thức có thể có những điểm yếu (ví dụ: "timing attacks")
  • Bị tấn công từ chối dịch vụ (DoS)
  • Gói tin có thể bị chặn, thay đổi, định tuyến lại hoặc bị xem trộm.
  • Giả mạo các gói tin điều khiển MQTT.
Các giải pháp MQTT thường được triển khai trong các môi trường có nhiều hạn chế, như các thiết bị hiện trường thường lắp đặt phân tán và khó quản lý tập trung, băng thông thấp, nhiễu, …. Trong những trường hợp như vậy, việc triển khai thường sẽ cần cung cấp các cơ chế để:
  • Xác thực người dùng và thiết bị ở hiện trường.
  • Cấp quyền truy cập vào tài nguyên Server
  • Tính toàn vẹn của gói tin điều khiển MQTT
  • Tính riêng tư của gói điều khiển MQTT .
Việc triển khai bảo mật cho MQTT nên lưu ý những điều sau:

Xác thực client trên Server
  • Bản tin MQTT CONNECT chứa các trường usernamepassword để xác thực client. Tuy nhiên cơ chế này dễ bị tấn công kiểu man-in-the-middle hoặc replay. Ngoài ra có thể áp dụng cơ chế xác thực riêng (ví dụ dùng ClientID), hoặc sử dụng giao thức LDAP, OAuth token hoặc tận dụng cơ chế xác thực của hệ điều hành. MQTT phiên bản v5.0 cung cấp cơ chế xác thực nâng cao thay vì dùng username/password. Tuy nhiên để sử dụng cơ chế này thì nó cần phải được hỗ trợ trong cả client và server.
  • Việc sử dụng mạng riêng ảo (VPN) giữa client và server cũng là một cách để xác thực dữ liệu được gửi từ client tin cậy.
  • Nếu sử dụng kết hợp MQTT và TLS thì chứng chỉ TLS được gửi từ client có thể được sử dụng để Server để xác thực Client đó.
  • Ngoài ra có thể xác thực client bằng cách đưa thông tin xác thực vào các bản tin của chương trình ứng dụng chạy giữa client và server.
Tóm lại để xác thực client trên Server có thể sử dụng kết hợp 4 cách nêu trên.

Xác thực Server bởi Client

Giao thức MQTT không phải là giao thức tin cậy đối xứng. Khi sử dụng phương pháp xác thực cơ bản, không có cơ chế nào để Client xác thực Server. Tuy nhiên nếu dùng một số hình thức xác thực mở rộng, sẽ cho phép xác thực lẫn nhau. Đó là:
  • Nếu sử dụng TLS, chứng chỉ TLS được gửi từ Server có thể được sử dụng bởi Client để xác thực Server đó.
  • Nếu sử dụng phương pháp xác thực trong chương trình ứng dụng thì lưu ý rằng MQTT v5 hỗ trợ việc xác thực Server bởi client. Phương pháp này đòi hỏi cả client và Server phải hỗ trợ cùng phiên bản MQTT.
  • Nếu sử dụng VPN, thì có thể xác thực được rằng Server đúng là máy chủ mà client cần kết nối tới.
Trong hình dưới mô tả các bước xác thực chéo giữa client và server sử dụng chứng chỉ TLS

upload_2020-10-10_9-22-5.png


Hình. Các bước xác thực chéo giữa client và server sử dụng chứng chỉ TLS.

Nguồn (https://medium.com/@bhatikar/secure-iot-for-successful-iot-e8059bf63a0f)​

Phân quyền truy cập cho client

Sau khi client đã được xác thực thành công, server cần kiểm tra quyền của client trước khi chấp nhận tạo phiên kết nối từ client đó. Việc xác minh quyền có thể dựa trên thông tin do client cung cấp như username, tên/địa chỉ IP của client hoặc kết quả của cơ chế xác thực.

Đặc biệt, trước khi cấp quyền, cần kiểm tra ClientID vì mỗi client chỉ có duy nhất 1 số ID để định danh, tức không thể có 2 client có cùng số ID.

Sau khi đã xác thực và kiểm tra quyền của client, cần có phương pháp kiểm soát truy cập, gói gọn trong câu: cấp quyền cho client được làm gì, trên topic nào, với QoS bao nhiêu? Việc này có thể được thực hiện bằng danh sách điều khiển truy cập, hoặc dùng bộ lọc topic (MQTT Topic filter)

Tính toàn vẹn của dữ liệu

Để đảm bảo tính toàn vẹn cho các bản tin MQTT, có thể sử dụng các cách thức sau:
  • Đưa giá trị băm vào bản tin của chương trình ứng dụng và gửi đi. Phía nhận sẽ kiểm tra giá trị băm này để so sánh xem gói tin có toàn vẹn hay không?
  • Sử dụng giao thức TLS, trong đó đã cung cấp các thuật toán băm để xác minh tính toàn vẹn của dữ liệu được gửi qua mạng.
  • Sử dụng VPN để kết nối Client và Server có thể cung cấp tính toàn vẹn của dữ liệu bởi vì VPN có các cơ chế bảo đảm tính toàn vẹn của dữ liệu.
Tính bảo mật của dữ liệu
  • Sử dụng giao thức TLS, đã có sẵn cơ chế mã hóa dữ liệu gửi qua mạng. Lưu ý: có các bộ mật mã TLS hợp lệ bao gồm thuật toán mã hóa NULL mà không mã hóa dữ liệu. Để đảm bảo quyền riêng tư, Client và Server nên tránh những bộ mật mã này.
  • Sử dụng cách thức mã hóa trong chương trình ứng dụng. Tuy nhiên thông tin về Topic phải công khai chứ không thể bí mật, bởi vì các subscriber cần biết tên topic để đăng ký.
  • Sử dụng VPN để kết nối clients và servers có thể cung cấp quyền riêng tư của dữ liệu.
Như vậy trong bài trên các bạn đã có cái nhìn tổng quan về những vấn đề bảo mật giao thức MQTT và những gợi ý kỹ thuật để triển khai.
Tham khảo
https://docs.oasis-open.org/mqtt/mqtt/v5.0/mqtt-v5.0.html
https://medium.com/@bhatikar/secure-iot-for-successful-iot-e8059bf63a0f
 
Chỉnh sửa lần cuối:
Mời các bạn tham gia Group WhiteHat để thảo luận và cập nhật tin tức an ninh mạng hàng ngày.
Lưu ý từ WhiteHat: Kiến thức an ninh mạng để phòng chống, không làm điều xấu. Luật pháp liên quan
Bên trên