Как я могу использовать 2FA в сети MQTT?


12

Как я могу использовать 2FA (двухфакторную аутентификацию) при подключении нового устройства к брокеру, если это вообще возможно?

Поскольку это кажется более простым, вторым фактором может быть сначала программное решение, но я бы приветствовал идеи о том, как ввести жесткие токены (возможно, RFID).

Было бы целесообразно, чтобы устройства аутентифицировались только при первом подключении, а сервер запомнил «старых» клиентов.

Идея может быть необычной или неподходящей - если это плохая идея, пожалуйста, укажите причины.


Можете ли вы сказать нам, как вы думаете, устройство может сделать 2FA, поскольку это одно устройство?
Гуфалит

@Goufalite Например, когда я устанавливаю новое устройство, я должен предоставить ключ вручную (например, по метке RFID), который будет использоваться во время аутентификации. Что касается программного обеспечения 2FA, я не знаю, можно ли было установить какое-то обслуживание в моем доме, с которого новые устройства могли бы запрашивать программные токены, что-то вроде сервера закрытых ключей.
Бенс Кауликс

Ответы:


8

Вам нужен посредник-посредник или веб-сервер ...

Прежде всего, вам абсолютно необходима служба аутентификации, подключенная к вашему брокеру, для выполнения 2FA с использованием определенных тем ( /auth/RFID, ...). Это позволит клиенту публиковать информацию (см. Ниже).

Первая проблема, которую я вижу здесь, заключается в том, что любой, кто подписан на эту тему, может прочитать информацию по этой теме, но вы можете заблокировать темы !

Затем вы можете указать (заставить) все ваши устройства публиковать информацию /proxy/mytopic. С помощью функции clientId в mqtt служба аутентификации может проверить, отправляются ли сообщения, отправленные из этой темы, с устройства, прошедшего проверку подлинности, который ранее использовал 2FA, а затем опубликовать собственное сообщение от имени устройства /proxyout/mytopicс идентификатором устройства в полезной нагрузке.

Теперь проблема заключается в проверке устройств, которые могут получать сообщения, если они аутентифицированы, потому что, в общем, MQTT - это массовая публикация. Служба аутентификации должна иметь список аутентифицированных устройств и проверить, имеют ли они право на прием. Опять же, шифрование полезной нагрузки и дешифрование на стороне устройства ...

Я думаю, что мое решение сильно превосходит возможности MQTT. Поэтому вы должны использовать сокет или веб-сервер ...


@ tim3in извините за поздний ответ. В конце концов, это был ответ, данный 2,5 года назад ... может быть, все изменилось, и это было просто общее предложение по архитектуре. Вы делали POC со своим решением?
Гуфалит

Я запланировал это. Сможете ли вы просмотреть его?
tim3in

7

Предстоящая спецификация MQTT v5 добавляет поддержку AUTHпакета управления, что позволяет выполнять аутентификацию по запросу / ответу. Поскольку MQTT v5 еще не завершена, поддержка может все еще измениться, но кажется разумным предположить, что AUTH останется в той или иной форме и что 2FA можно добавить с его помощью.

Вы можете увидеть текущие рабочие проекты спецификации на странице документов комитета OASIS MQTT .


5

Согласно спецификации, сообщение о соединении может дополнительно содержать имя пользователя и пароль. Это проверяется на соответствие списку ACL, сохраненному где-то на брокере. Итак, это ваш первый фактор аутентификации, который вы можете использовать. Сообщение CONNACK от брокера ответит, если аутентификация прошла.

Для реализации второго фактора аутентификации лучше всего отправить пользовательское сообщение о соединении с другим фактором. Сообщение CONNACK в этом случае должно ссылаться на успех или неудачу второго фактора аутентификации. Следовательно, брокер и клиент должны реализовывать пользовательские сообщения сверх спецификации.


4

Для достижения 2FA в сети MQTT я создал следующие сервисы для аутентификации, которые подключены к брокеру.

  1. Верификатор личности
  2. Генератор токенов
  3. Проверка токена

Когда клиент MQTT подключается к брокеру по протоколу SSL / TLS, он сначала публикует свой собственный идентификатор в теме device_id , верификатор идентификатора проверяет, является ли он подлинным клиентом, и затем вызывается генератор токенов, который генерирует токен и публикует токен в заблокированной теме device_token .

Клиентское устройство получает этот токен и затем публикует его в теме verify_token . Как только тема опубликована в verify_token, верификатор токенов сравнивает значения в теме device_token и verify_token, если он совпадает, добавляет идентификатор устройства в проверенный пул устройств и позволяет устройству публиковать данные. Это повышает безопасность, потому что только проверенные устройства подключаются к темам для публикации данных.

Я также использовал опцию конфигурации MQTT_KEEPALIVE, чтобы клиент оставался активным, когда данные не отправляются или не принимаются, чтобы сохранить клиентское устройство живым в пуле устройств и предотвратить его повторную проверку после добавления в пул устройств. однако в целях безопасности я перевожу устройство на 2FA каждые 24 часа.


3
Как гарантируется, что только правильный клиент получает токен?
Хельмар

@ Helmar использует уникальный clientID и отдельную тему для хранения токена для каждого клиента, который предопределен при регистрации устройства. Клиент фактически подписывается на эту тему. Когда он повторно публикует токен для проверки, он добавляет свой идентификатор с данными токена, чтобы верификатор знал, какой клиент опубликовал этот токен. clientid может быть защищен с помощью Secure Element на стороне устройства после регистрации того же идентификатора на сервере в базе данных.
Tim3in

@ Хелмар, не могли бы вы добавить свой комментарий к этому? Я был бы признателен всем за мнение о моем решении.
Tim3in

2
да, но что мешает мне подписаться на '#', чтобы увидеть все ответы на токены
hardillb

Темы @hardillb, на которые есть ответы токенов, заблокированы, как упоминал Гуфалит. Таким образом, только устройство может видеть. На этапе регистрации устройства привязываются к определенным темам, и каждому устройству назначены отдельные темы для ответов токенов.
tim3in
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.