Làm cách nào tôi có thể sử dụng 2FA trong mạng MQTT?


12

Làm cách nào tôi có thể sử dụng 2FA (xác thực hai yếu tố) khi tôi kết nối thiết bị mới với nhà môi giới, nếu điều đó thậm chí có thể?

Bởi vì nó có vẻ dễ dàng hơn, yếu tố thứ hai có thể là một giải pháp phần mềm trước tiên nhưng tôi sẽ hoan nghênh các ý tưởng về cách giới thiệu các mã thông báo cứng (có thể là RFID).

Sẽ có ý nghĩa nếu các thiết bị chỉ xác thực ở kết nối đầu tiên và máy chủ sẽ nhớ các máy khách "cũ".

Ý tưởng có thể bất thường hoặc không phù hợp - nếu đó là một ý tưởng tồi, xin vui lòng cho tôi biết lý do tại sao.


Bạn có thể cho chúng tôi biết bạn nghĩ một thiết bị có thể làm 2FA như thế nào vì nó là một thiết bị không?
Goufalite

@Goufalite Ví dụ: khi tôi cài đặt một thiết bị mới, tôi phải cung cấp khóa theo cách thủ công (ví dụ bằng thẻ RFID) sẽ được sử dụng trong quá trình xác thực. Đối với phần mềm 2FA, tôi không biết liệu một số dịch vụ có thể được thiết lập tại nhà của tôi từ đó các thiết bị mới có thể yêu cầu mã thông báo mềm hay không, giống như một máy chủ khóa riêng.
Bence Kaulics

Câu trả lời:


8

Bạn cần một proxy môi giới, hoặc một máy chủ web ...

Trước hết, bạn hoàn toàn cần một dịch vụ xác thực ở đâu đó được kết nối với nhà môi giới của bạn để thực hiện 2FA bằng các chủ đề cụ thể ( /auth/RFID, ...). Sau đó, nó sẽ cho phép khách hàng xuất bản thông tin (xem bên dưới).

Vấn đề đầu tiên tôi có thể thấy ở đây là bất kỳ ai đăng ký chủ đề này đều có thể đọc thông tin của chủ đề đó, nhưng bạn có thể khóa chủ đề !

Sau đó, bạn có thể nói (buộc) tất cả các thiết bị của mình xuất bản thông tin tới /proxy/mytopic. Với tính năng clientId của mqtt, dịch vụ xác thực có thể kiểm tra xem các tin nhắn được gửi từ chủ đề này có phải từ một thiết bị được xác thực đã sử dụng 2FA trước đó hay không, sau đó xuất bản tin nhắn của chính nó cho thiết bị /proxyout/mytopicvới id của thiết bị trong tải trọng.

Vấn đề bây giờ là kiểm tra các thiết bị có thể nhận tin nhắn nếu chúng được xác thực, bởi vì, tốt, MQTT là tất cả về xuất bản hàng loạt. Dịch vụ xác thực cần có một danh sách các thiết bị được xác thực và kiểm tra xem chúng có đủ điều kiện để nhận không. Một lần nữa, mã hóa tải và giải mã phía thiết bị ...

Tôi nghĩ rằng giải pháp của tôi là quá mức cần thiết đối với khả năng MQTT. Do đó, bạn nên sử dụng ổ cắm hoặc máy chủ web ...


@ tim3in xin lỗi vì phản hồi muộn. Sau tất cả, đây là một câu trả lời được đưa ra 2,5 năm trước ... có lẽ mọi thứ đã thay đổi và đây chỉ là một đề xuất kiến ​​trúc chung. Bạn đã làm một POC với giải pháp của bạn?
Goufalite

Tôi đã lên kế hoạch cho nó. Bạn sẽ có thể xem xét nó?
tim3in

7

Đặc tả MQTT v5 sắp tới bổ sung hỗ trợ cho AUTHgói điều khiển, cho phép xác thực thử thách / phản hồi. Vì MQTT v5 chưa hoàn tất hỗ trợ vẫn có thể thay đổi, nhưng có vẻ hợp lý khi cho rằng AUTH sẽ vẫn ở dạng này hoặc dạng khác và có thể thêm 2FA bằng cách sử dụng nó.

Bạn có thể xem các bản nháp làm việc hiện tại của thông số kỹ thuật tại trang tài liệu của ủy ban OASIS MQTT .


5

Theo thông số kỹ thuật, thông báo kết nối có thể tùy chọn cung cấp tên người dùng và mật khẩu. Điều này được xác nhận đối với một ACL được lưu ở đâu đó trên nhà môi giới. Vì vậy, đó là yếu tố đầu tiên của bạn về xác thực mà bạn có thể khai thác. Thông báo CONNACK từ nhà môi giới sẽ phản hồi nếu xác thực được thực hiện.

Để thực hiện yếu tố thứ hai nếu xác thực, cách tốt nhất là gửi tin nhắn kết nối tùy chỉnh với yếu tố khác. Thông báo CONNACK trong trường hợp này phải đề cập đến thành công hay thất bại của yếu tố xác thực thứ hai. Do đó, nhà môi giới và khách hàng nên thực hiện các thông báo tùy chỉnh hơn và trên đặc điểm kỹ thuật.


4

Để đạt được 2FA trong mạng MQTT, tôi đã tạo các dịch vụ sau để xác thực được kết nối với Nhà môi giới.

  1. Trình xác minh ID
  2. Trình tạo mã thông báo
  3. Trình xác minh mã thông báo

Khi ứng dụng khách MQTT kết nối với nhà môi giới qua SSL / TLS, trước tiên, nó sẽ xuất bản ID riêng của mình sang chủ đề device_id , Trình xác minh ID xác minh rằng đó là máy khách xác thực và sau đó Trình tạo mã thông báo được gọi để tạo mã thông báo và xuất bản mã thông báo trên chủ đề bị khóa device_token .

Thiết bị khách nhận được mã thông báo này và tiếp tục xuất bản nó thành một chủ đề verify_token . Ngay sau khi chủ đề được xuất bản trên verify_token , trình xác minh mã thông báo so sánh các giá trị tại topic device_tokenverify_token nếu nó khớp với id của thiết bị vào nhóm thiết bị đã xác minh và cho phép thiết bị xuất bản dữ liệu. Điều này cải thiện bảo mật vì các thiết bị được xác minh duy nhất được kết nối với các chủ đề để xuất bản dữ liệu.

Tôi cũng đã sử dụng tùy chọn cấu hình MQTT_KEEPALIVE để giữ cho máy khách hoạt động khi không có dữ liệu nào được gửi hoặc nhận để giữ cho thiết bị khách tồn tại trong nhóm thiết bị và ngăn không cho xác minh lại một lần nữa khi nó được thêm vào nhóm thiết bị. tuy nhiên vì mục đích bảo mật, tôi đóng băng thiết bị lên 2FA cứ sau 24 giờ.


3
Làm thế nào để bảo mật rằng chỉ có khách hàng chính xác mới nhận được mã thông báo?
Helmar

@Helmar sử dụng clientID duy nhất và chủ đề riêng biệt để lưu trữ mã thông báo cho từng khách hàng được xác định trước khi đăng ký thiết bị. Các khách hàng thực sự đăng ký chủ đề này. Khi nó xuất bản lại mã thông báo để kiểm tra, nó sẽ thêm id của nó với dữ liệu mã thông báo để người xác minh biết rằng khách hàng nào đã xuất bản mã thông báo này. clientid có thể được bảo vệ bằng Secure Element ở phía thiết bị sau khi đăng ký cùng id tại máy chủ trong cơ sở dữ liệu.
tim3in

@Helmar bạn có muốn thêm bình luận của bạn vào đây không? Tôi sẽ đánh giá cao quan điểm từ mọi người về giải pháp của tôi.
tim3in

2
có, nhưng điều gì ngăn tôi đăng ký '#' để xem tất cả các phản hồi về mã thông báo
hardillb

Các chủ đề @hardillb có phản hồi mã thông báo bị khóa như Goufalite đã đề cập. Vì vậy, chỉ có thiết bị thịnh hành có thể nhìn thấy. Ở giai đoạn đăng ký, các thiết bị được liên kết với các chủ đề cụ thể và mỗi thiết bị đã chỉ định các chủ đề riêng cho phản hồi mã thông báo.
tim3in
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.