Asegurar la integridad de los mensajes de difusión entre nodos de red conocidos

1

Necesito compartir datos entre N nodos de red en una red determinada. Los nodos de la red N son todos míos, pero, aparte de ellos, es posible que cualquier dispositivo se conecte a la misma red.

No hay un nodo maestro, todos los nodos están en el mismo nivel. Cualquiera de los nodos puede generar el mensaje crítico del que deseo proteger la integridad.

La solución que tengo hasta ahora es almacenar un secreto simétrico en todos mis nodos de red, y luego enviar los mensajes (y una marca de tiempo), uno por uno a cada uno de mis nodos de red, junto con un valor HMAC. Esto asegurará que los mensajes no puedan ser replicados o retransmitidos.

¿Hay una mejor manera de usar HMAC? ¿Hay una manera de usar mensajes de difusión? (¿Crear una máscara de red interna y enviar los mensajes como difusión?) Cualquier comentario sobre mi solución sugerida es bienvenido, gracias.

    
pregunta TomF 06.09.2016 - 08:40
fuente

2 respuestas

1

El uso de mensajes de difusión (o multidifusión) se puede utilizar para flujos continuos como 100 actualizaciones de estado por segundo y se distribuye a miles de nodos en tiempo real. También es bueno para la transmisión de vídeo. Ahora, lo cierto es que, en este escenario, algunos paquetes pueden eliminarse y, a menudo, nunca recuperarse, ya que se trata de una comunicación unidireccional.

Otra cosa es que si cada nodo puede enviar un mensaje a cada otro nodo es muy ineficiente. Esto se debe a que para los N nodos tiene N ^ 2 conexiones / flujos para administrar, y por ejemplo, si un nodo tiene problemas, todo se está ralentizando, o si hay muchos nodos, también se está ralentizando, ya que hacer mensajes por cuenta propia no es tan eficiente y confiable como lo es con software maduro y la arquitectura también es ineficiente.

Entonces, la solución más óptima es usar la cola de mensajes, la forma en que implementa nodos adicionales y su función es servir de intermediarios de mensajes. Por lo tanto, cada instancia podría enviarles un mensaje y recibir mensajes de él. De esta manera, puede usar TLS y el nombre de usuario / contraseña para conectarse al servidor de mensajes (y sus nodos pueden asegurarse de que el certificado TLS remoto sea el correcto). Idealmente, también podría crear una VLAN dedicada para esto, de modo que nadie pueda conectarse a ella conectando algo.

Servidores de ejemplo:

También puede usar la base de datos SQL estándar, por ejemplo, MariaDB, PostrgeSQL, SQL Server, Oracle DB, etc. Dado que estas bases de datos tienen niveles de tabla y, a veces, bloqueo de filas y aislamiento de transacciones, son excelentes para la mensajería. Y ahora, si está temiendo que alguien pueda conectarse a la VLAN y hacerse pasar por la base de datos que realmente necesita para poner esto en una VLAN dedicada.

Puede usar cualquier conmutador de Capa 2/3 que pueda actuar como puerta de enlace predeterminada y sea compatible con VLAN.

    
respondido por el Aria 06.09.2016 - 14:06
fuente
0

Para aclarar las explicaciones, supongamos que se trata de algún tipo de almacenamiento distribuido donde un mensaje sería

  

"¿Quién tiene el archivo A? Por favor, envíamelo. "

y el nodo con archivo lo enviaría al remitente. Desea proteger el mensaje para que los dispositivos fuera de su red no puedan recuperar el contenido de su red o alterarlo.

La marca de tiempo no es una solución completa por sí misma, ya que, por definición, habrá una ventana (aunque sea pequeña) en la que se debe aceptar el mensaje. Los otros nodos deben verificar que "ahora" no sea posterior a X tiempo después de su generación, pero X será distinto de cero (para que pueda llegar el mensaje real). [Hay otro tipo de problemas para mantener los relojes sincronizados en una red distribuida, lo que requerirá un margen adicional en el campo]

El mensaje con marca de tiempo sería “Es $ DATE. ¿Quién tiene el archivo A? Por favor, envíamelo. ”Simplemente agregar un HMAC al mensaje no lo protegería realmente.

Dentro de esa pequeña ventana de tiempo, otro nodo también podría enviar

  

"Es $ FECHA. ¿Quién tiene el archivo A? Por favor, envíamelo. "

(copiando el mismo HMAC), así que claramente no es suficiente.

Sin embargo, si está incluyendo quién está en el cálculo, es diferente (podría agregarse implícitamente, o simplemente declararlo en el mensaje): "Es $ DATE. Estoy 10.10.10.10. ¿Quién tiene el archivo A? Por favor, envíelo al 10.10.10.10 en el puerto 9000. "

Aún así, también debes proteger la respuesta para que tu respuesta provenga de un nodo malvado. Por ejemplo, la comunicación en el puerto 9000 podría comenzar con:

  

“Tengo 10.10.10.12 conectando a 10.10.10.10. Tengo el archivo A que pidió a $ DATE. Tiene 123 bytes de largo y tiene SHA256 aabbccdd ... "|| HMAC

Si el nodo no solicitó el archivo A a las $ DATE, o el contenido del archivo no coincide con el hash dado, debería descartar lo que recibió.

Un atacante podría duplicar la solicitud (o la red podría duplicarla), lo que podría hacer que 10.10.10.12 envíe la misma información a 10.10.10.10 muchas veces. Podría filtrarlo según el encabezado de solicitud que se muestra arriba, pero es mejor proporcionar un identificador para diferenciar las respuestas duplicadas, para responder a una consulta repetida (por ejemplo, el nodo de consulta puede leer el mismo archivo continuamente, porque cambiará en breve ).

  

“Esta es la consulta 987654 en $ DATE. Estoy 10.10.10.10. ¿Quién tiene el archivo A? Por favor, envíelo al 10.10.10.10 en el puerto 9000. "|| HMAC

El nodo de consulta simplemente necesitaría recordar las consultas enviadas en el último período de tiempo de 2 * X aproximadamente, y marcar como En curso / Completado según sea necesario. Cualquier respuesta que no coincida con una consulta pendiente podría ser descartada.

(Preferiblemente, el identificador sería aleatorio, aunque el HMAC lo protege de la falsificación de respuestas)

En este punto, la integridad de los mensajes está protegida por el secreto HMAC, y usted está protegido contra las repeticiones, puede enviar las consultas en transmisión con bastante confianza.

Sin embargo, debo tener en cuenta que su red se basa en un secreto compartido entre los nodos. ¿Qué pasaría si uno de ellos estuviera comprometido?

Un enfoque más robusto sería usar claves asimétricas en cada nodo. Básicamente, usted crea claves para cada nodo y una CA local que firma cada uno de ellos. Almacene en los nodos una copia de la clave pública de la CA y una lista de revocación, inicialmente vacía.

Modifique los mensajes anteriores para reemplazar la operación HMAC(message, secret) con SIGN(message) || MyPublicKey , y haga que sus nodos confíen en el mensaje si viene firmado correctamente por una clave firmada por su CA local, y no en la lista de revocaciones.

(Puede ignorar la lista de revocaciones si prefiere reemplazar la CA, y las claves públicas firmadas por ella, en caso de que se haya comprometido una clave)

    
respondido por el Ángel 24.01.2018 - 01:49
fuente

Lea otras preguntas en las etiquetas