Come posso identificare in modo sicuro un dispositivo remoto (auto programmato incorporato) in PHP?

1

C'è un modo affidabile in PHP per identificare un dispositivo che potrebbe essere dietro un router (quindi l'IP non è univoco)?

Background: ho diversi dispositivi embedded (auto programmati e adattabili) che contattano un server web (php + mysql) con aggiornamenti di stato. Questi aggiornamenti sono quindi - se la fonte è confermata - salvati in un database.

  • Come ho capito% di solito è possibile fidarsi di $_SERVER['REMOTE_ADDR'] (eccetto alcune configurazioni di IIS dove potrebbe, in circostanze particolari, restituire erroneamente 127.0.0.1, ma una storia diversa)

  • Comunque, dal momento che utilizzo SSL, l'indirizzo IP in realtà non dovrebbe essere un problema, perché è richiesto un handshake e se l'IP è falso o semplicemente sbagliato, la connessione non dovrebbe essere stabilita

  • Per ora ho bisogno che gli indirizzi IP siano autorizzati da admin, perché un aggiornamento di stato sia accettato

  • Il dispositivo invia inoltre l'indirizzo MAC tramite $_POST per identificare i diversi moduli con identico indirizzo IP (so che questo può essere facilmente falsificato, e al momento sarà considerato attendibile se l'indirizzo IP è attendibile)

Quindi, prima di tutto, non sono sicuro che l'indirizzo IP di per sé sia sufficiente per proteggerlo dagli attacchi dall'esterno

In secondo luogo, se il dispositivo si trova dietro un router, avrà lo stesso indirizzo IP di ogni PC / dispositivo su quella rete. Quindi chiunque potrebbe creare un aggiornamento di stato con un falso indirizzo MAC (semplicemente come variabile post), e dato che l'indirizzo IP è autorizzato, sarà considerato attendibile

Quindi esiste un modo per confermare l'identità di un dispositivo o conosci un modo migliore per farlo?

A parte: Andando dall'altra parte, e avere il polling del server web, i vari dispositivi potrebbero essere un'opzione, ma poiché potrebbero esserci molti dispositivi (> 2000) di cui abbiamo bisogno dell'ultimo stato (modifica) I pensato che fosse inefficiente.

Ho anche sentito di usare un certificato firmato, o multiplo (per clienti diversi), ma non so come farlo, quindi grazie in anticipo per ogni bit di informazione.

Di solito non invio (molte domande), ma questo è davvero difficile per Google - almeno per me!

    
posta Levit 29.07.2013 - 09:39
fonte

2 risposte

2

Punto di vista crittografico: l'unico modo in cui puoi distinguere, dall'esterno, un dispositivo falso da uno originale consiste nel fatto che il dispositivo originale "conosce" un valore che l'utente malintenzionato non conosce .

Questo può essere l'equivalente di una "password" (poiché non vi è alcun essere umano coinvolto, tale password può essere una sequenza di 40 caratteri casuali, cioè qualcosa di abbastanza strong e quindi non percettibile da parte degli attaccanti). Puoi archiviarlo in un'intestazione HTTP personalizzata o nell'intestazione "Autorizzazione" standard, o come valore di alcuni cookie o codificato come parametro nell'URL; tutti questi sono supportati dalla maggior parte dei framework Web, sia su client che su server.

Puoi anche utilizzare certificati X.509 . SSL supporta l'autenticazione del certificato lato client. In tal caso, il valore "segreto" sul dispositivo è una chiave privata asimmetrica (in genere RSA) e devi organizzare (con un PKI ) per il rilascio di un certificato per dispositivo. I certificati sono interessanti se non si desidera che il server conservi una copia dei segreti del dispositivo (o versione con hash di questi), ad es. perché vorresti distribuire nuovi dispositivi senza dover informare il server. Se questo non è un problema con te, il metodo "password" sarà più semplice rispetto ai certificati.

Ad ogni modo, certamente non vuoi mettere lo stesso valore segreto in due dispositivi distinti. Vuoi davvero avere segreti specifici per dispositivo ; altrimenti, qualcuno "apre" uno dei tuoi dispositivi metterà in pericolo l'intero sistema. Con i segreti specifici del dispositivo, puoi disattivare l'autenticazione per alcuni dispositivi sovvertiti noti, dal server, senza influire sugli altri dispositivi.

Senza un valore segreto del dispositivo di qualsiasi tipo, il tuo problema non ha soluzione. Nel Internet Protocol , le macchine sono isolate l'una dall'altra; vedono solo gli indirizzi IP, che non sono "protetti" in alcun modo. L'ambito degli elementi hardware come indirizzi MAC si ferma sul primo router (e possono essere simulati facilmente comunque).

    
risposta data 29.07.2013 - 15:54
fonte
1

if the device is behind a router...anyone there could forge a status update with a fake MAC address

Gli indirizzi MAC non attraversano i router.

have the webserver poll the different devices might be an option

Ingannevoli quando non conosci i loro indirizzi IP / sono dietro i router NAT.

is there any way of confirming the identity of a device

Possibili soluzioni:

1) usa SSL per lo scambio di dati e accetta solo dati da dispositivi che includono un segreto condiviso nella richiesta (GET / POST / Cookies).

2) Utilizza SSL con autenticazione certificato client

3) utilizzare un meccanismo di autenticazione basato su challenge - nota che l'autenticazione del digest HTTP ha una serie di problemi che ne riducono l'efficacia in assenza di SSL - e con SSL, non c'è un grande vantaggio rispetto all'autenticazione HTTP standard

4) convalidare la richiesta con un hash variegato nel tempo (soggetto a replay di attacchi nella finestra temporale, richiede la sincronizzazione dell'orologio), ad esempio

url="http://yourserver.com/beacon?device=me";
var t = new Date();
t=t.getTime();
url+="&t=" + t;
var hash=md5(url+"sharedSecret");
url+="&hash=" + hash;
    
risposta data 29.07.2013 - 12:12
fonte

Leggi altre domande sui tag