¿Cómo puedo desarrollar de forma segura una aplicación web local en una cafetería?

60

Cuando estoy desarrollando una aplicación web, digamos un sitio de Django, lo ejecuto localmente y normalmente accedo a él en enlace .

Pensé que esto era inherentemente seguro porque asumí que solo se puede acceder localmente al host local. Sin embargo, descubrí que incluso ejecutar un servidor web local (Apache, Nginx ...) con un certificado HTTPS autofirmado no ayuda porque localhost no tiene que ser local:

  

En las pruebas empíricas, hemos visto varias soluciones de resolución ... enviar consultas de localhost a la red ... Como resultado de acceder a " enlace ", por ejemplo , en un punto de acceso WiFi hostil (como sus cafeterías) puede ser interceptado por un atacante de red y redirigido a un sitio (o certificado) de su elección. (En la cadena de correo electrónico " Excepción a los requisitos de referencia, sección 7.1.4.2.1 ".)

Si estoy desarrollando una aplicación web, necesito ejecutarla localmente y acceder a ella a través de un navegador. A veces necesito hacer esto en una cafetería con conexión a internet. ¿Qué punto de acceso debo usar, si no localhost?

Nota

Algunas de mis aplicaciones de escritorio también se exponen a través de HTTP en otros puertos, por ejemplo, enlace . ¿Supongo que tampoco debería acceder a los de una cafetería?

    
pregunta d3vid 17.05.2017 - 14:32
fuente

8 respuestas

74

Se puede desarrollar de forma segura contra localhost siempre que:

  • su máquina está configurada para resolver localhost a una dirección de bucle de retorno (nota, es posible cambiar su archivo de hosts para resolver localhost a una dirección diferente)
  • su máquina está configurada para enrutar la dirección de bucle de retorno a través de la interfaz de bucle de retorno (es posible enrutar las direcciones de bucle de retorno a una interfaz sin bucle de retorno)
  • configura su aplicación para escuchar en la dirección de bucle de retorno, no 0.0.0.0 (muchos frameworks web escuchan en 0.0.0.0 de forma predeterminada, esta es probablemente la razón más común para exponer inesperadamente servicios a una red no confiable durante el desarrollo)
  • si usa un proxy, su navegador está configurado para no enrutar localhost / loopback a través del proxy

En otras palabras, una configuración de red bastante típica.

Además, tenga cuidado de que su servidor de base de datos no esté vinculado a 0.0.0.0, ya que esto permitirá que cualquier persona en la red se conecte directamente al servidor de base de datos. Probablemente sea mejor configurar una configuración de firewall para que sepa exactamente qué puertos y direcciones están escuchando los servicios locales.

El enlace que usted señaló está en el contexto de una CA de confianza pública que emite certificados con el nombre "localhost". Esto no es seguro en ese contexto porque el destinatario de dicho certificado puede usar el certificado para interceptar la comunicación de alguien con algunas configuraciones de red inusuales. Cuando tiene control total sobre la configuración de su propia máquina y sabe que no tiene algunas configuraciones extrañas en sus máquinas, la interfaz de bucle invertido es segura.

    
respondido por el Lie Ryan 17.05.2017 - 15:57
fuente
33

Primero, puedes usar enlace para omitir la búsqueda de DNS.

En segundo lugar, puede crear su propio certificado de CA autofirmado, crear un certificado para localhost y conectarse a enlace de forma segura. No hay forma de que un atacante pueda interceptar esa conexión.

  

Como resultado, acceda a " enlace ", por ejemplo, en un acceso WiFi hostil   punto (como sus cafeterías) puede ser interceptado por un atacante de red   y redirigido a un sitio (o un certificado) de su elección.

Esto es cierto en el contexto del hilo de correo electrónico. El hilo del correo electrónico trata sobre si alguien podría obtener un certificado válido para localhost de una CA de confianza . Si esto fuera posible, entonces sí, alguien más podría hacerse pasar por enlace . Pero a una CA pública no le está permitido emitir certificados para localhost ( Requisitos de referencia , sección 7.1.4.2.1; consulte también esta discusión sobre el rastreador Let's Encrypt ).

Debido a que esto no es posible, su propia CA privada es la única en la que confía que emitió un certificado localhost .

    
respondido por el Sjoerd 17.05.2017 - 16:17
fuente
8

Si estás haciendo este tipo de cosas a menudo, ¿por qué no conseguir un enrutador de viaje?

Con un pequeño enrutador de viaje, puede configurar su propia red interna con su propio SSID, agregar cifrado y configurar una lista blanca personalizada para que solo sus direcciones MAC estén permitidas.

    
respondido por el Dan Smith 18.05.2017 - 03:00
fuente
5

Si desarrolla en Docker , cuando inicie su aplicación web (en un contenedor Docker), el contenedor tendrá su propio Dirección IP que puede no ser accesible desde el exterior. Accederá a él con una IP especial, que solo usted puede ver, según lo asignado por Docker, por ejemplo. http://172.17.0.2:9000 .

Si su aplicación web es también accesible en la interfaz de red física de su host depende de cómo inicie el contenedor. Por ejemplo, el comando docker run no se vinculará a la interfaz del host a menos que use -p , -P o --expose opciones .

Otros beneficios:

  • La aplicación está aislada de su sistema host.
  • La implementación en otros sistemas es más reproducible.
respondido por el z0r 18.05.2017 - 08:09
fuente
5

Allí probablemente no es un ataque MITM viable aquí. Suponiendo que Ubuntu y Django, hay dos grandes factores que conspiran contra un atacante:

  • Los hosts predeterminados de Ubuntu y la configuración de dns resolverán localhost usando una configuración codificada. Ni siquiera realizará una consulta de DNS. Puedes cambiar esto ... Pero no lo hagas :)

  • Django se enlaza a 127.0.0.1:8000 de forma predeterminada. Para completar el MitM, el atacante tendría que interceptar el tráfico que atiende Django pero no tiene acceso.

Dicho esto, la seguridad web es complicada. Puede haber cosas que estés haciendo que un atacante pueda explotar para tener algún tipo de efecto en ti.

Los recursos externos deben estar seguros

Muchos de nosotros incorporamos archivos de terceros alojados en CDN. Jquery, Bootstrap, etc. Si estos son http:// o // (recuerde que el servidor dev no usa TLS), eso podría darle a un atacante la oportunidad de MITM esos archivos e inyectar secuencias de comandos en vivo en sus páginas.

Por el bien del desarrollo local alejado de una conexión a Internet, puede ser mejor en todos los aspectos simplemente alojar todas las cosas por ti mismo.

Técnicas de extracción de clic e iframe

El hecho de que no puedan acceder a su servidor de ejecución local, no significa que no puedan decirle a su navegador que acceda a él. La seguridad de origen cruzado (probablemente) les impedirá hacer cosas con ella directamente, pero podrían pegarla en un iframe. Esto es una especie de clickjack inverso.

Para el usuario, esto se vería como su sitio web. Incluso podrían capturar todas las URL al final y enviarlas al marco. Si se tratara de un sitio web público, también podrían resolver en qué estaba haciendo clic.

Pero, por supuesto, ya estás usando django-secure ¿no es así? Yo lo recomendaria Una configuración y comenzarás a enviar X-Frame-Options: DENY headers con cada solicitud de Django. Alternativamente, hay una una opción Django-builtin que hace lo mismo. Recomiendo django-secure porque hace mucho más.

Su seguridad en una red hostil es más que un servidor web

Probablemente tienes otros demonios en ejecución, además de cosas como PostgreSQL que estás usando para el desarrollo. Es posible que esté ejecutando servidores SSH, servidores de intercambio de archivos, etc. y si está acostumbrado a un entorno doméstico, es posible que se haya saltado el día de las piernas con una seguridad más débil para su comodidad.

Lo más fácil de hacer es bloquear todo el tráfico entrante. Suponiendo que no tiene una configuración UFW existente, es tan simple como:

sudo ufw enable
sudo ufw default deny incoming
sudo ufw default allow outgoing

Eso persistirá reinicios. Si llega a casa y desea acceder a algo, puede desactivarlo con sudo ufw disable o cambiar el valor predeterminado y abrir ciertos puertos explícitamente.

Si va a dejar un puerto SSH expuesto, he escrito un artículo sobre endurecimiento de las configuraciones de SSH . A menos que esté en la cantina de la NSA, eso debería mantener a la mayoría de las personas fuera de su sistema.

    
respondido por el Oli 18.05.2017 - 13:23
fuente
2

El problema que describe el foro es en realidad el opuesto a lo que te preocupa. Le preocupa que alguien más en la red pueda ver qué se está sirviendo en localhost. Ese problema es que intenta ver qué se está sirviendo en localhost y, en su lugar, alguien más en la red está recibiendo una página web maliciosa.

Ese problema en realidad no es tan difícil de configurar. He tenido que suceder por accidente aquí en el trabajo. Fabricamos equipos y software de red, por lo que hay muchas personas con diversos niveles de experiencia que ponen a las máquinas en diversos estados de experimentación en la red. Alguien estableció accidentalmente 'localhost' como su nombre de host, se registró en Active Directory y se entregó a todos en DNS.

En una cafetería, eso no sería tan difícil de notar, porque su aplicación web de repente sería otra página. Si está utilizando un certificado TLS, no tendría un certificado válido.

Si le preocupa que se filtren los detalles de su aplicación web, simplemente bloquee los puertos entrantes relevantes en su firewall externo. En Linux, harías algo como esto:

/sbin/iptables -A INPUT -o eth0 -p tcp --dport 80 -j DROP
    
respondido por el Karl Bielefeldt 19.05.2017 - 20:05
fuente
1

Acceda a su sitio con http (s): //127.0.0.1/, configure su aplicación para escuchar 127.0.0.1 solo y estará seguro. El cifrado no es necesario ya que no hay posibilidad de que alguien que está afuera escuche: nada sale de su computadora, su aplicación en su computadora "habla" con su navegador en su computadora a través de una dirección que no puede ser usada fuera de su computadora.

    
respondido por el befree 20.05.2017 - 20:35
fuente
0

Te sugiero que codifiques, alojes y ejecutes en tu navegador en la nube a través de https usando Cloud9 ide, un repositorio de GitHub y Heroku. A menos que haya instalado un keylogger o alguien esté mirando su pantalla, nadie en esa habitación puede detectar lo que está haciendo. Por supuesto, esta configuración incurre en una multa financiera.

PD: De acuerdo con los votos a la baja, hay algo que puedo aprender. Me alegraría escuchar eso. Gracias.

    
respondido por el Chris 19.05.2017 - 23:18
fuente

Lea otras preguntas en las etiquetas