Sto sviluppando un sistema che consente l'accesso ai dispositivi client dietro il firewall, utilizzando il tunneling delle porte tramite SSH. Ogni client ha un server dedicato basato su Linux, con la porta 80 che viene sottoposta a tunnel verso un server pubblico. In questo modo i client possono avere l'indirizzo IP dinamico e il firewall abilitato, non è necessario il port forwarding sul router.
Ogni client ha la propria porta, ad es.
- Client A - > porta 8888
- Client B - > porta 8889
- Client C - > porta 8890
Possono connettersi da qualsiasi luogo al proprio server web semplicemente chiamando http://mypublicserver.com:[their_assigned_port_no]
Riescoavederealcuniproblemidisicurezza,comunque.
- L'attaccantepuòsemplicementescansionare
link porte (65k di esse) e ottenere il numero di client attualmente connessi - Avere questo, eseguire qualsiasi attacco sulla loro schermata di login, DOS il loro computer, provare ad accedere a PhpMyAdmin, brute-force ecc.
C'è anche una limitazione, dato che non posso assegnare più di ~ 60k client ... Non è un problema al momento perché non mi aspetto di colpire più di 10k di essi. Tuttavia, dover indovinare il numero di porta non è affatto difficile. È anche incline a mistificare, qualcuno potrebbe tentare di accedere con le proprie credenziali a qualcun altro perché ha digitato 8989 anziché 8898.
Come difesa, ho pensato a un valore di stringa aggiuntivo (hash o qualcosa) inviato con la richiesta della pagina di accesso. Se manca o non è corretto, restituisce 404. In questo modo non è possibile accedere alla pagina di accesso se non si conosce il valore della stringa, ma è quasi impossibile ottenere senza che questo sito venga aggiunto ai segnalibri, perché una stringa breve sarebbe più semplice da ricordare, ma anche più facile da decifrare.
Un altro modo (e questo è attualmente il mio preferito) è quello di accedere tramite l'interfaccia web del link . Accedi con il altro gruppo di credenziali che ti reindirizza al link con la chiave di autenticazione (memorizzata nel database di mypublicserver) inviata come dati POST . Dopo che la chiave di accesso è stata invalidata, generata nuova e inviata a mypublicserver dal server web del client.
Ma questo significa anche la necessità di ricordare 2 set di login-password, che probabilmente portano a confusione ( "Perché devo effettuare il login due volte ?!" )
Ho già:
- ha cambiato il percorso predefinito di phpmyadmin
- introdotto il blocco account con più di 10 tentativi di accesso falliti
Cosa ne pensi? Mi sono perso qualcosa di importante? Come posso proteggere quel sistema?