Domanda:
Come posso sviluppare in modo sicuro una webapp locale in un bar?
lofidevops
2017-05-17 17:32:47 UTC
view on stackexchange narkive permalink

Quando sviluppo una webapp, diciamo un sito Django, la eseguo localmente e in genere accedo ad essa da http: // localhost.

Pensavo fosse intrinsecamente sicuro perché presumo che sia possibile accedere a localhost solo localmente. Tuttavia, ho scoperto che anche l'esecuzione di un server web locale (Apache, Nginx ...) con un certificato HTTPS autofirmato non aiuta perché non è richiesto che localhost sia locale:

Nei test empirici, abbiamo visto più resolver ... inviare query localhost alla rete ... Di conseguenza, l'accesso a " https: // localhost", ad esempio, su un punto di accesso WiFi ostile ( come i tuoi bar) possono essere intercettati da un utente malintenzionato di rete e reindirizzati a un sito (o un certificato) di loro scelta. (Nella catena di posta elettronica " Eccezione ai requisiti di base, sezione 7.1.4.2.1".)

Se sto sviluppando una webapp, devo eseguirla localmente e accedervi tramite un browser. A volte ho bisogno di farlo in un bar con una connessione Internet. Quale punto di accesso dovrei usare, se non localhost?

Nota

Alcune delle mie applicazioni desktop si espongono anche tramite HTTP su altre porte, ad esempio http: // localhost: 9000. Presumibilmente non dovrei nemmeno accedervi in ​​un bar?

Potresti potenzialmente eseguire una macchina virtuale con una rete condivisa solo con il computer host: dovresti accedere alla tua applicazione tramite indirizzo IP (o configurare un file hosts per abilitare l'accesso basato sul nome), ma non esporrebbe il codicea qualsiasi computer di terze parti, assumendo che la configurazione di rete della VM sia corretta.
Per chiarire, sei preoccupato che altri avvelenino una possibile query DNS a `localhost` e intercettano la tua connessione o sei preoccupato che altri sul tuo wifi accedano al tuo server locale da soli?
@Arminius questa domanda riguarda il primo (il mio accesso sicuro al mio localhost), lascerò quest'ultimo per un altro giorno!
Supponendo che localhost sia scritto nel file hosts, cosa che probabilmente è, non avrai problemi.
Non tutte le piattaforme comuni risolvono localmente "localhost" in 127.0.0.1 o :: 1 per impostazione predefinita?In che modo qualcuno sarebbe vulnerabile?
Potresti semplicemente scegliere di scollegare / disabilitare qualsiasi scheda di rete sul tuo computer durante il test effettivo.Quando devi andare online, assicurati di chiudere prima tutti i server di prova.
@AgentME Sì, lo penseresti.Ma l'email collegata afferma che questo comportamento non è garantito.
Per seguire il commento di @Matthew's sulle VM, offrono funzionalità per il networking sicuro.Ad esempio, VirtualBox ha un'opzione NIC "rete solo host" che crea una LAN virtuale condivisa solo tra host e guest.Non puoi letteralmente accedere a nulla tranne l'altra macchina.
Un problema leggermente diverso, ma devi assicurarti che il tuo server web ascolti solo su 127.0.0.1 e non su 0.0.0.0, altrimenti è accessibile pubblicamente.
Uno spot WiFi pubblico non avrebbe client isolati?
Non puoi semplicemente avere un firewall software in esecuzione che blocchi quella porta da client non locali?
Otto risposte:
Lie Ryan
2017-05-17 18:57:12 UTC
view on stackexchange narkive permalink

È possibile eseguire uno sviluppo sicuro contro localhost a condizione che:

  • la tua macchina sia configurata per risolvere localhost in un indirizzo di loopback (nota, è possibile cambiare il tuo file hosts per risolvere localhost in un indirizzo diverso )
  • la tua macchina è configurata per instradare l'indirizzo di loopback tramite l'interfaccia di loopback (è possibile instradare indirizzi di loopback a un'interfaccia non di loopback)
  • configuri la tua applicazione per ascoltare sull'indirizzo di loopback , non 0.0.0.0 (molti framework web ascoltano su 0.0.0.0 per impostazione predefinita, questo è probabilmente il motivo più comune per esporre inaspettatamente i servizi a una rete non affidabile durante lo sviluppo)
  • se usi un proxy, il tuo browser è configurato per non instradare localhost / loopback attraverso il proxy

In altre parole, una configurazione di rete abbastanza tipica.

Inoltre, fai attenzione che il tuo server di database non sia vincolante a 0.0.0.0, in quanto ciò consentirà a chiunque sulla rete di connettersi direttamente al server del database. Probabilmente è meglio impostare una configurazione del firewall in modo da sapere esattamente su quali porte e indirizzi sono in ascolto i servizi locali.

Il collegamento che hai indicato è nel contesto di una CA pubblicamente attendibile che rilascia certificati con il nome "localhost". Ciò non è sicuro in quel contesto perché il destinatario di tale certificato può utilizzare il certificato per intercettare la comunicazione di qualcuno con alcune configurazioni di rete insolite. Quando hai il pieno controllo sulla configurazione della tua macchina e sai di non avere alcune strane configurazioni sulle tue macchine, l'interfaccia di loopback è sicura.

Sebbene tipico, probabilmente non è l'impostazione predefinita.Potrebbe valere la pena il tempo di OP di portare un'altra macchina e provare ad accedere alla sua app in modi che non vuole che le persone facciano.Test: è piuttosto interessante.
Per la parte proxy, assicurati che il tuo sistema non sia configurato per rilevare automaticamente le impostazioni del proxy, poiché questi forniscono uno script di configurazione del proxy che può consentire alle persone di cambiare localhost
@LieRyan potresti chiarire nella tua risposta se questo significa che http è abbastanza buono, anche per app desktop che hanno un'interfaccia web su localhost, o se https è richiesto / preferito, grazie!
@d3vid: assumendo la tipica configurazione di rete e che la tua macchina non sia già compromessa, https per il servizio localhost è del tutto superfluo.Sebbene, come sollevato da Oli in un'altra risposta, `https: // localhost` potrebbe essere il modo più semplice per forzare HTTPS per i collegamenti relativi allo schema (collegamenti che iniziano con` // `) a risorse esterne, ma potresti anchebasta collegare invece risorse esterne direttamente alla versione HTTPS.
Il consiglio più critico qui è l'associazione solo al loopback, perché questo è l'elemento più comunemente violato qui e quello più inaspettato rispetto allo sviluppo dietro un firewall NAT di livello consumer.
Uno sviluppo interessante (ancora in bozza) https://tools.ietf.org/html/draft-west-let-localhost-be-localhost-06
Sjoerd
2017-05-17 19:17:41 UTC
view on stackexchange narkive permalink

Innanzitutto, puoi utilizzare http://127.0.0.1 per bypassare la ricerca DNS.

In secondo luogo, puoi creare il tuo certificato CA autofirmato, creare un certificato per localhost e connettiti a https: // localhost in modo sicuro. Non è possibile che un utente malintenzionato intercetti quella connessione.

Di conseguenza, l'accesso a " https: // localhost", ad esempio, su un punto di accesso WiFi ostile ( come i tuoi bar) possono essere intercettati da un aggressore di rete e reindirizzati a un sito (o un certificato) di sua scelta.

Questo è vero nel contesto del thread di posta elettronica. Il thread di posta elettronica riguarda se qualcuno possa ottenere un certificato valido per localhost da una CA attendibile . Se fosse possibile, allora sì, qualcun altro potrebbe impersonare https: // localhost. Ma una CA pubblica non è autorizzata a emettere certificati per localhost ( Requisiti di base, sezione 7.1.4.2.1; vedi anche questa discussione sul tracker Let's Encrypt).

Poiché ciò non è possibile, la tua CA privata è l'unica di cui ti fidi che ha emesso un certificato localhost .

Navigare a `localhost` non esegue una ricerca DNS;viene restituito dal file "hosts" della macchina.
@JeremiahMegel: Almeno su Linux, questo è configurabile (tramite `/ etc / nsswitch.conf`).Tuttavia, tutte le distribuzioni Linux che conosco forniscono una configurazione che funziona come descrivi.
Notare che [certificati validi per `localhost` sono stati visti in circolazione] (https://www.eff.org/deeplinks/2011/04/unqualified-names-ssl-observatory).
@JeremiahMegel: Questo non è universalmente vero per i file HOSTS, né è universalmente vero che tutte le macchine hanno un file HOSTS.Per quanto strane queste affermazioni possano sembrare, fai sviluppo di software commerciale (che utilizza localhost, nel nostro caso) per un po 'e vedrai alcune configurazioni del sistema operativo * davvero * strane.
Da molto tempo, MS Windows utilizzerà di default il DNS per cercare localhost.
Ci sono anche problemi con IPv4 vs IPv6 localhost in cui Windows non riesce a trovarsi.
Una curiosità: se vuoi digitare meno, `http: // 127.1 /` funzionerà altrettanto bene.
Dan Smith
2017-05-18 06:00:22 UTC
view on stackexchange narkive permalink

Se fai spesso questo tipo di cose, perché non prendi solo un router da viaggio?

Con un piccolo router da viaggio, puoi configurare la tua rete interna con il proprio SSID, aggiungere la crittografia e imposta una whitelist personalizzata in modo che solo i tuoi indirizzi MAC siano consentiti su di essa.

Se stai parlando di wifi, sono abbastanza sicuro che sia ficcanaso e falsificabile.
@RobertGrant Dipende dalla crittografia utilizzata.I dettagli vanno ben oltre lo scopo di un commento, ma WPA2-PSK con una chiave sicura (complessa) dovrebbe essere sufficientemente sicuro per questo uso.Tuttavia, questa soluzione sembra più ingombrante delle soluzioni basate su software.
È un po 'più complicato rispetto all'utilizzo del software, ma ha anche il potenziale per essere più sicuro per impostazione predefinita.Se d3vid sta usando solo il suo laptop, può anche collegarlo via ethernet.Diventa solo più complesso se vuoi stabilire la tua rete wifi.
@DanSmith è d'accordo: se parli via cavo, allora è più sicuro.Finché hai un lucchetto sul router :-)
z0r
2017-05-18 11:09:27 UTC
view on stackexchange narkive permalink

Se sviluppi in Docker, quando avvii la tua app web (in un contenitore Docker), il contenitore avrà il proprio indirizzo IP che potrebbe non essere accessibile dall'esterno. Ti accederai con un IP speciale, che solo tu puoi vedere, come assegnato da Docker, ad es. http://172.17.0.2:9000.

Se la tua app web è anche accessibile dall'interfaccia di rete fisica del tuo host dipende da come avvii il contenitore. Ad esempio, il comando docker run non si collegherà all'interfaccia host a meno che non utilizzi -p , - P o --expose opzioni.

Altri vantaggi:

  • L'app è altrimenti isolata dal tuo sistema host.
  • L'implementazione su altri sistemi è più riproducibile.
Preferisco eseguire il browser anche nella finestra mobile.Tutto può (e dovrebbe) essere dockerizzato.
Oli
2017-05-18 16:23:17 UTC
view on stackexchange narkive permalink

probabilmente non è un attacco MITM praticabile qui. Supponendo Ubuntu e Django, ci sono due grandi fattori che cospirano contro un aggressore:

  • Gli host predefiniti di Ubuntu e la configurazione DNS risolveranno localhost utilizzando un'impostazione hardcoded. Non eseguirà nemmeno una query DNS. Puoi cambiare questo ... Ma non farlo invece :)

  • Django si lega a 127.0.0.1:8000 per impostazione predefinita. Per mitM completamente te, l'attaccante dovrebbe intercettare il traffico servito da Django ma non ha accesso.

Detto questo, la sicurezza web è complicata. Potrebbero esserci cose che stai facendo che un utente malintenzionato potrebbe sfruttare per avere un qualche effetto su di te.

Le risorse esterne devono essere protette

Molti di noi incorporano terze parti , File ospitati dalla CDN. Jquery, Bootstrap, ecc. Se sono http: // o // (ricorda che il server di sviluppo non utilizza TLS), ciò potrebbe dare a un utente malintenzionato l'opportunità di MITM quei file e inserisci script in tempo reale nelle tue pagine.

Per il bene dello sviluppo locale lontano da una connessione Internet, potrebbe essere meglio su tutti i conti ospitare tutto da solo.

Tecniche di click-jack e iframe

Solo perché non possono accedere al tuo server locale, non significa che non possano dire al tuo browser di accedervi. La sicurezza cross origin (probabilmente) impedirà loro di eseguire operazioni direttamente con esso, ma potrebbero inserirla in un iframe. Questa è una sorta di clickjack inverso.

Per l'utente sembrerebbe semplicemente il tuo sito web. Potrebbero persino acquisire tutti gli URL alla loro estremità e inserirli nel frame. Se fosse un sito web pubblico, potrebbero anche capire cosa stavi facendo clic.

Ma ovviamente stai già utilizzando django-secure , vero? Lo consiglierei. Un'impostazione e inizierai a inviare le intestazioni X-Frame-Options: DENY con ogni richiesta Django. In alternativa c'è un'opzione incorporata in Django che fa lo stesso. Raccomando django-secure perché fa molto di più.

La tua sicurezza su una rete ostile è più di un server web

Probabilmente hai altri demoni in esecuzione, oltre a cose come PostgreSQL che stai usando per lo sviluppo. Potresti eseguire server SSH, server di condivisione di file, ecc. E se sei abituato a un ambiente domestico, potresti aver saltato la giornata con una sicurezza più debole per comodità.

la cosa più semplice da fare è bloccare tutto il traffico in entrata. Supponendo che tu non abbia una configurazione UFW esistente, è semplice come:

  sudo ufw enableudo ufw default deny incomingsudo ufw default allow outgoing  

Ciò manterrà i riavvii. Se torni a casa e vuoi accedere a qualcosa, puoi disattivarlo con sudo ufw disable o modificare l'impostazione predefinita e aprire esplicitamente determinate porte.

Se hai intenzione di andartene una porta SSH esposta, ho scritto un articolo su rafforzamento delle configurazioni SSH. A meno che tu non sia nella mensa della NSA, questo dovrebbe tenere la maggior parte delle persone fuori dal tuo sistema.

ottimi consigli (e grazie per la conferma di Ubuntu)
Karl Bielefeldt
2017-05-19 23:05:21 UTC
view on stackexchange narkive permalink

Il problema che sta descrivendo il forum è in realtà l'opposto di quello che ti preoccupa. Sei preoccupato che qualcun altro sulla rete possa vedere cosa viene servito su localhost. Quel problema è che stai cercando di vedere cosa viene servito su localhost e invece ti viene servita una pagina web dannosa da qualcun altro sulla rete.

Questo problema in realtà non è così difficile da impostare su. È successo per caso qui al lavoro. Produciamo apparecchiature e software di rete, quindi ci sono molte persone con vari livelli di esperienza che mettono le macchine in vari stati di sperimentazione sulla rete. Qualcuno ha accidentalmente impostato "localhost" come nome host, è stato registrato in Active Directory e servito a tutti in DNS.

In un bar, non sarebbe così difficile da notare, perché la tua webapp all'improvviso sarebbe invece un'altra pagina. Se stai utilizzando un certificato TLS, non avrebbe un certificato valido.

Se sei preoccupato per la perdita dei dettagli della tua webapp, blocca semplicemente le porte in entrata pertinenti sul tuo firewall esterno. Su Linux, dovresti fare qualcosa del genere:

  / sbin / iptables -A INPUT -o eth0 -p tcp --dport 80 -j DROP  
befree
2017-05-20 23:35:41 UTC
view on stackexchange narkive permalink

Accedi al tuo sito con http (s): //127.0.0.1/, configura la tua app per ascoltare 127.0.0.1 solo e sei al sicuro. La crittografia non è necessaria in quanto non vi è alcuna possibilità per qualcuno all'esterno di ascoltare: nulla va al di fuori del tuo computer, la tua app sul tuo computer "parla" con il tuo browser sul tuo computer tramite un indirizzo che non può essere utilizzata al di fuori del tuo computer.

Chris
2017-05-20 02:18:59 UTC
view on stackexchange narkive permalink

Puoi codificare, ospitare ed eseguire nel tuo browser nel cloud su https utilizzando l'ide Cloud9, un repository GitHub e Heroku. A meno che non sia installato un keylogger o qualcuno stia guardando il tuo schermo, nessuno in quella stanza può rilevare cosa stai facendo.



Questa domanda e risposta è stata tradotta automaticamente dalla lingua inglese. Il contenuto originale è disponibile su stackexchange, che ringraziamo per la licenza cc by-sa 3.0 con cui è distribuito.
Loading...