Garantire l'integrità dei messaggi broadcast tra nodi di rete noti

1

Ho bisogno di condividere i dati tra N nodi di rete in una data rete. I nodi di rete N sono tutti miei, ma a parte questi è possibile che qualsiasi dispositivo si connetta alla stessa rete.

Non esiste un nodo principale, tutti i nodi si trovano sullo stesso livello. Ognuno dei nodi può generare il messaggio critico che voglio proteggere l'integrità di

La soluzione che ho finora è di memorizzare un segreto simmetrico in tutti i miei nodi di rete, e quindi inviare i messaggi (e un timestamp), uno per uno a ciascuno dei miei nodi di rete, insieme a un valore HMAC. Ciò assicurerà che i messaggi non possano essere replicati o ritrasmessi.

C'è un modo migliore rispetto all'utilizzo di HMAC? C'è un modo per usare i messaggi broadcast? (Creare una maschera di rete interna e inviare i messaggi come trasmessi?) Qualsiasi commento sulla mia soluzione suggerita è il benvenuto, grazie.

    
posta TomF 06.09.2016 - 08:40
fonte

2 risposte

1

L'uso di messaggi broadcast (o multicast) è utilizzabile per flussi continui come 100 aggiornamenti di stato al secondo e la distribuzione a migliaia di nodi in tempo reale. È anche buono per lo streaming di video. Ora, in questo scenario, alcuni pacchetti possono essere eliminati e spesso non vengono mai ripristinati in quanto è una comunicazione unidirezionale.

Un'altra cosa è che se ogni nodo può inviare messaggi a ogni altro nodo è molto inefficiente. Questo perché per N nodi hai N ^ 2 connessioni / flussi da gestire, e per esempio se un nodo diventa glitch tutto sta rallentando, o se ci sono molti nodi sta rallentando, come fare i messaggi da soli non è efficiente e affidabile come con il software maturo, inoltre l'architettura è inefficiente.

Quindi la soluzione più ottimale è utilizzare la coda messaggi, il modo in cui si distribuiscono nodi aggiuntivi e il loro ruolo è quello di fungere da broker dei messaggi. Quindi ogni istanza sarebbe in grado di inviare messaggi a loro e ricevere messaggi da esso. In questo modo è possibile utilizzare TLS e nome utente / password per connettersi al server dei messaggi (e i nodi possono assicurarsi che il certificato TLS remoto sia quello giusto). Idealmente potresti anche creare una VLAN dedicata per questo, in modo che nessuno possa connettersi collegando qualcosa.

Server di esempio:

È anche possibile utilizzare il database SQL standard, ad esempio MariaDB, PostrgeSQL, SQL Server, Oracle DB ecc. Poiché questi database hanno un blocco a livello di tabella ea volte a livello di riga e l'isolamento delle transazioni sono eccellenti per la messaggistica. E ora, se si teme che qualcuno possa connettersi alla VLAN e porsi come database, è necessario metterlo in una VLAN dedicata.

Puoi utilizzare qualsiasi switch Layer 2/3 che può fungere da gateway predefinito e avere il supporto VLAN.

    
risposta data 06.09.2016 - 14:06
fonte
0

Per rendere più chiare le spiegazioni, supponiamo che si tratti di una sorta di memoria distribuita in cui un messaggio sarebbe

“Who has file A? Please send it to me.”

e il nodo con file lo invierà al mittente. Desideri proteggere il messaggio in modo che i dispositivi esterni alla rete non siano in grado di recuperare i contenuti dalla rete o di modificarli.

Il timestamping non è una soluzione completa da solo poiché, per definizione, ci sarà una finestra (anche se piccola) in cui il messaggio deve essere accettato. Gli altri nodi devono verificare che "ora" non sia successiva all'ora X dopo che è stata generata, ma X deve essere diverso da zero (in modo che il messaggio reale possa arrivare). [C'è un altro tipo di problemi nel mantenere gli orologi sincronizzati su una rete distribuita, che richiederà un margine extra nel campo]

Il messaggio con data e ora sarebbe "È $ DATE. Chi ha il file A? Per favore, mandamelo. "Semplicemente aggiungere un HMAC al messaggio non lo proteggerebbe.

All'interno di quella finestra temporale ridotta, un altro nodo potrebbe anche inviare

“It's $DATE. Who has file A? Please send it to me.”

(copia dello stesso HMAC), quindi non è chiaramente sufficiente.

Tuttavia, se stai includendo chi sei nel calcolo, è diverso (potrebbe essere aggiunto implicitamente o semplicemente indicato nel messaggio): "È $ DATE. Sono il 10.10.10.10. Chi ha il file A? Si prega di inviarlo a 10.10.10.10 alla porta 9000. "

Tuttavia, devi anche proteggere la risposta in modo che la tua risposta provenga effettivamente da un nodo malvagio. Ad esempio, la comunicazione sulla porta 9000 potrebbe iniziare con:

“I am 10.10.10.12 connecting to 10.10.10.10. I do have file A you asked for at $DATE. It is 123 bytes long and has SHA256 aabbccdd…” || HMAC

Se il nodo non ha richiesto il file A a $ DATE, o se il contenuto del file non corrisponde all'hash specificato, dovrebbe eliminare ciò che ha ricevuto.

Un utente malintenzionato potrebbe duplicare la richiesta (o potrebbe essere duplicata dalla rete), rendendo potenzialmente 10.10.10.12 inviare le stesse informazioni a 10.10.10.10 molte volte. Potrebbe filtrarlo in base all'intestazione della richiesta mostrata sopra, ma è meglio fornire un identificatore per differenziare le risposte duplicate, per rispondere a una query ripetuta (ad esempio, il nodo di interrogazione potrebbe leggere continuamente lo stesso file, perché cambierà a breve ).

“This is query 987654 at $DATE. I'm 10.10.10.10. Who has file A? Please send it to 10.10.10.10 at port 9000.” || HMAC

Il nodo di interrogazione dovrebbe semplicemente ricordare le query inviate nell'ultimo periodo di tempo 2 * X approssimativamente e contrassegnare come In corso / Completato secondo necessità. Qualsiasi risposta che non corrisponde a una query in sospeso potrebbe essere scartata.

(Preferibilmente, l'identificatore sarebbe casuale, sebbene l'HMAC ti protegga dallo spoofing della risposta)

A questo punto, l'integrità dei messaggi è protetta dal segreto HMAC e tu sei protetto dai replay, potresti inviare le query in broadcast in modo abbastanza sicuro.

Tuttavia, dovrei notare che la rete si basa su un segreto condiviso tra i nodi. Cosa succederebbe se uno di loro fosse compromesso?

Un approccio più robusto sarebbe utilizzare chiavi asimmetriche su ciascun nodo. Fondamentalmente, si creano le chiavi per ogni nodo e una CA locale che firma ciascuno di essi. Archivia sui nodi una copia della chiave pubblica della CA e un elenco iniziale di revoca-vuoto.

Modifica i messaggi di cui sopra per sostituire l'operazione HMAC(message, secret) con SIGN(message) || MyPublicKey e fai in modo che i tuoi nodi si fidino del messaggio se viene firmato correttamente da una chiave firmata dalla CA locale e non dall'elenco di revoche.

(Puoi ignorare l'elenco di revoche se preferisci sostituire la CA -e le chiavi pubbliche firmate da essa- nel caso in cui una chiave sia stata compromessa)

    
risposta data 24.01.2018 - 01:49
fonte

Leggi altre domande sui tag