¿Cómo puedo usar 2FA en una red MQTT?

12

¿Cómo puedo usar 2FA (autenticación de dos factores) cuando conecto un nuevo dispositivo al corredor, si es posible?

Debido a que parece más fácil, el segundo factor puede ser una solución de software primero, pero agradecería cualquier idea sobre cómo introducir tokens duros (RFID tal vez).

Tendría sentido si los dispositivos se autenticaran solo en la primera conexión y el servidor recordara a los clientes "antiguos".

La idea puede ser inusual o inadecuada; si es una mala idea, por favor, dame las razones.

Bence Kaulics
fuente
¿Puede decirnos cómo cree que un dispositivo podría hacer 2FA ya que es un dispositivo?
Goufalite
@Goufalite Por ejemplo, cuando instalo un nuevo dispositivo, tengo que proporcionar una clave manualmente (por ejemplo, mediante una etiqueta RFID) que se utilizará durante la autenticación. En cuanto al software 2FA, no sé si podría establecerse algún tipo de servicio en mi hogar desde el cual los nuevos dispositivos pudieran solicitar tokens de software, algo así como un servidor de clave privada.
Bence Kaulics

Respuestas:

8

Necesita un proxy de intermediario o un servidor web ...

En primer lugar, absolutamente necesita un servicio de autenticación en algún lugar conectado a su corredor para realizar el 2FA utilizando temas específicos ( /auth/RFID, ...). A continuación, permitiría al cliente publicar información (ver más abajo).

El primer problema que puedo ver aquí es que cualquier persona suscrita a este tema puede leer la información de ese tema, ¡pero usted puede bloquear los temas !

Luego puede indicar (forzar) a todos sus dispositivos para que publiquen información /proxy/mytopic. Con la función clientId de mqtt, el servicio de autenticación puede verificar si los mensajes enviados desde este tema provienen de un dispositivo autenticado que usó 2FA previamente, y luego publicar su propio mensaje en nombre del dispositivo /proxyout/mytopiccon la identificación del dispositivo en la carga útil.

El problema ahora es buscar dispositivos que puedan recibir mensajes si están autenticados, porque, bueno, MQTT tiene que ver con la publicación masiva. El servicio de autenticación debe tener una lista de dispositivos autenticados y verificar si son elegibles para la recepción. Nuevamente, el cifrado de carga útil y el descifrado del lado del dispositivo ...

Creo que mi solución es muy exagerada sobre las capacidades de MQTT. Por lo tanto, debe usar un socket o un servidor web ...

Goufalite
fuente
@ tim3in perdón por la respuesta tardía. Después de todo esto fue una respuesta dada hace 2,5 años ... tal vez las cosas han cambiado y esto fue solo una propuesta de arquitectura general. ¿Hiciste un POC con tu solución?
Goufalite
Lo he planeado ¿Podrás revisarlo?
tim3in
7

La próxima especificación MQTT v5 agrega soporte para el AUTHpaquete de control, que permite la autenticación de desafío / respuesta. Como MQTT v5 aún no está finalizado, el soporte todavía puede cambiar, pero parece razonable suponer que AUTH permanecerá de una forma u otra y que 2FA podría agregarse al usarlo.

Puede ver los borradores de trabajo actuales de la especificación en la página de documentos del comité OASIS MQTT .

ralight
fuente
5

Según la especificación, el mensaje de conexión puede proporcionar opcionalmente un nombre de usuario y una contraseña. Esto se valida contra una ACL guardada en algún lugar del intermediario. Entonces, ese es su primer factor de autenticación que podría explotar. El mensaje CONNACK del intermediario responderá si se realizó la autenticación.

Para implementar el segundo factor de la autenticación, la mejor manera debería ser enviar un mensaje de conexión personalizado con el otro factor. El mensaje CONNACK en este caso debe referirse al éxito o al fracaso del segundo factor de autenticación. Por lo tanto, el agente y el cliente deben implementar mensajes personalizados además de la especificación.

cogito ergo sum
fuente
4

Para lograr 2FA en la red MQTT, he creado los siguientes servicios de autenticación que están conectados a Broker.

  1. Verificador de ID
  2. Generador de tokens
  3. Verificador de fichas

Cuando el cliente MQTT se conecta al agente a través de SSL / TLS, primero publica su propia ID en el tema device_id , el Verificador de ID verifica que es el cliente auténtico y luego se invoca el generador de tokens que genera un token y publica el token en el tema bloqueado device_token .

El dispositivo cliente obtiene este token y lo publica aún más en un tema generate_token . Tan pronto como el tema se publique en verificar_token, el verificador de tokens compara los valores en el tema dispositivo_token y verificar_token si coincide, agregue la identificación del dispositivo al grupo de dispositivos verificado y permita que el dispositivo publique datos. Esto mejora la seguridad porque los únicos dispositivos verificados se conectan a los temas para publicar datos.

También he usado la opción de configuración MQTT_KEEPALIVE para mantener el cliente activo cuando no se envían o reciben datos para mantener vivo el dispositivo del cliente en el grupo de dispositivos y evitar que se verifique nuevamente una vez que se agrega al grupo de dispositivos. sin embargo, por razones de seguridad, congelo el dispositivo a 2FA cada 24 horas.

tim3in
fuente
3
¿Cómo se asegura que solo el cliente correcto obtenga el token?
Helmar
@Helmar utiliza el ID de cliente único y un tema separado para almacenar el token para cada cliente que está predefinido en el registro del dispositivo. El cliente realmente se suscribe a este tema. Cuando vuelve a publicar el token para verificación, agrega su identificación con los datos del token para que el verificador sepa qué cliente ha publicado este token. clientid puede protegerse utilizando Secure Element en el lado del dispositivo después de registrar la misma identificación en el servidor en la base de datos.
tim3in
@Helmar ¿le gustaría agregar su comentario a esto? Agradecería las opiniones de todos sobre mi solución.
tim3in
2
sí, pero qué es lo que me impide suscribirme a '#' para ver todas las respuestas de token
hardillb
Los temas de @hardillb que tienen respuestas de token están bloqueados como mencionó Goufalite. Entonces, solo el dispositivo previliged puede ver. En la fase de registro, los dispositivos están vinculados a temas específicos y cada dispositivo ha asignado temas separados para las respuestas de token.
tim3in