Question:
Comment puis-je développer en toute sécurité une application Web locale dans un café?
lofidevops
2017-05-17 17:32:47 UTC
view on stackexchange narkive permalink

Lorsque je développe une application Web, disons un site Django, je l'exécute localement et j'y accède généralement à l'adresse http: // localhost.

Je pensais que c'était intrinsèquement sécurisé car j'ai supposé que localhost ne pouvait être consulté que localement. Cependant, j'ai découvert que même exécuter un serveur Web local (Apache, Nginx ...) avec un certificat HTTPS auto-signé n'aidera pas car localhost n'est pas vraiment obligé d'être local:

Lors de tests empiriques, nous avons vu plusieurs résolveurs ... envoyer des requêtes d'hôte local au réseau ... Par conséquent, accéder à " https: // localhost", par exemple, sur un point d'accès WiFi hostile ( tels que vos cafés) peuvent être interceptés par un attaquant du réseau et redirigés vers un site (ou un certificat) de son choix. (Dans la chaîne d'e-mails " Exception aux exigences de base, section 7.1.4.2.1".)

Si je développe une application Web, je dois l'exécuter localement et accédez-y via un navigateur. Parfois, j'ai besoin de le faire dans un café avec une connexion Internet. Quel point d'accès dois-je utiliser, sinon localhost?

Remarque

Certaines de mes applications de bureau s'exposent également via HTTP sur d'autres ports, par exemple http: // localhost: 9000. Je ne devrais probablement pas non plus y accéder dans un café?

Vous pourriez potentiellement exécuter une machine virtuelle avec un réseau partagé uniquement avec l'ordinateur hôte - vous devrez accéder à votre application par adresse IP (ou configurer un fichier d'hôtes pour activer l'accès basé sur le nom), mais cela n'exposerait pas le codeà n'importe quel ordinateur tiers, en supposant que la configuration du réseau VM est correcte.
Pour clarifier, craignez-vous que d'autres empoisonnent une éventuelle requête DNS vers `localhost` et interceptent votre connexion ou craignez-vous que d'autres personnes sur votre wifi accèdent à votre serveur local par elles-mêmes?
@Arminius cette question concerne la première (mon accès sécurisé à mon localhost), je laisserai ce dernier pour un autre jour!
En supposant que localhost est écrit dans votre fichier hosts, ce qui est probablement le cas, vous n'aurez pas de problème.
Toutes les plates-formes courantes ne résolvent-elles pas localement "localhost" en 127.0.0.1 ou :: 1 par défaut?Comment quelqu'un serait-il vulnérable?
Vous pouvez simplement choisir de déconnecter / désactiver toute carte réseau de votre ordinateur lors du test réel.Lorsque vous devez vous connecter, assurez-vous d'arrêter tous les serveurs de test avant.
@AgentME Oui, vous le pensez.Mais l'e-mail lié fait valoir que ce comportement n'est pas garanti.
Pour suivre le commentaire d'@Matthew's sur les VM, ils offrent des capacités de mise en réseau sécurisée.Par exemple, VirtualBox a une option NIC «réseau hôte uniquement» qui crée un LAN virtuel partagé uniquement entre l'hôte et l'invité.Vous ne pouvez littéralement accéder à rien sauf à l'autre machine.
Un problème légèrement différent, mais vous devez vous assurer que votre serveur Web n'écoute que sur 127.0.0.1 et non 0.0.0.0, sinon il est accessible au public.
Un spot WiFi public n'aurait-il pas des clients isolés?
Ne pouvez-vous pas simplement avoir un pare-feu logiciel en cours d'exécution qui bloque ce port des clients non locaux?
Huit réponses:
Lie Ryan
2017-05-17 18:57:12 UTC
view on stackexchange narkive permalink

Le développement en toute sécurité contre localhost peut être effectué à condition:

  • votre machine est configurée pour résoudre localhost en une adresse de bouclage (notez qu'il est possible de modifier votre fichier hosts pour résoudre localhost en une adresse différente )
  • votre machine est configurée pour acheminer l'adresse de bouclage via l'interface de bouclage (il est possible de router les adresses de bouclage vers une interface sans bouclage)
  • vous configurez votre application pour écouter l'adresse de bouclage , pas 0.0.0.0 (de nombreux frameworks Web écoutent sur 0.0.0.0 par défaut, c'est probablement la raison la plus courante pour exposer de manière inattendue des services à un réseau non approuvé pendant le développement)
  • si vous utilisez un proxy, votre navigateur est configuré pour ne pas acheminer localhost / loopback via le proxy

En d'autres termes, une configuration réseau assez typique.

De plus, veillez à ce que votre serveur de base de données ne soit pas lié à 0.0.0.0, car cela permettra à quiconque sur le réseau de se connecter directement au serveur de base de données. Il est probablement préférable de définir une configuration de pare-feu afin de savoir exactement sur quels ports et adresses les services locaux écoutent.

Le lien que vous avez indiqué se trouve dans le contexte d'une autorité de certification de confiance publique émettant des certificats avec le nom "localhost". Cela n'est pas sûr dans ce contexte car le destinataire d'un tel certificat peut utiliser le certificat pour intercepter la communication d'une personne avec des configurations réseau inhabituelles. Lorsque vous avez un contrôle total sur la configuration de votre propre machine et que vous savez que vous n'avez pas de configurations étranges sur vos machines, l'interface de bouclage est sûre.

Bien que typique, ce n'est probablement pas la valeur par défaut.Cela vaut peut-être la peine pour OP d'apporter une autre machine et d'essayer d'accéder à son application d'une manière dont il ne veut pas que les gens le fassent.Test - c'est plutôt cool.
Pour la partie proxy, assurez-vous que votre système n'est pas configuré pour découvrir automatiquement les paramètres proxy, car ceux-ci renvoient un script de configuration proxy qui peut permettre aux gens de changer d'hôte local
@LieRyan pourriez-vous clarifier dans votre réponse si cela signifie que http est assez bon, y compris pour les applications de bureau qui ont une interface Web chez localhost, ou si https est requis / préféré, merci!
@d3vid: en supposant la configuration réseau typique et que votre machine n'est pas déjà compromise, https pour le service localhost est totalement superflu.Cependant, comme soulevé par Oli dans une autre réponse, `https: // localhost` peut être le moyen le plus simple de forcer HTTPS pour les liens relatifs au schéma (liens commençant par` // `) vers des ressources externes, mais vous pourriez aussi bienliez simplement les ressources externes directement à la version HTTPS.
Le conseil le plus critique ici est la liaison au bouclage uniquement, car c'est l'élément le plus souvent violé ici et le plus inattendu par rapport au développement derrière un pare-feu NAT grand public.
Un développement intéressant (encore en ébauche) 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

Premièrement, vous pouvez utiliser http://127.0.0.1 pour contourner la recherche DNS.

Deuxièmement, vous pouvez créer votre propre certificat CA auto-signé, créer un certificat pour localhost et connectez-vous à https: // localhost en toute sécurité. Il n'y a aucun moyen qu'un attaquant puisse intercepter cette connexion.

En conséquence, accéder à " https: // localhost", par exemple, sur un point d'accès WiFi hostile ( comme vos cafés) peuvent être interceptés par un attaquant du réseau et redirigés vers un site (ou un certificat) de leur choix.

Ceci est vrai dans le contexte du fil de discussion. Le fil de discussion concerne la question de savoir si quelqu'un peut obtenir un certificat valide pour localhost auprès d'une autorité de certification de confiance . Si cela était possible, alors oui, quelqu'un d'autre pourrait se faire passer pour https: // localhost. Mais une autorité de certification publique n'est pas autorisée à émettre des certificats pour localhost ( Exigences de base, section 7.1.4.2.1; voir également cette discussion sur le traqueur Let's Encrypt).

Parce que ce n'est pas possible, votre propre autorité de certification privée est la seule en qui vous avez confiance à avoir émis un certificat localhost .

La navigation vers `localhost` n'effectue pas de recherche DNS;il est renvoyé par le fichier `hosts` de la machine.
@JeremiahMegel: Au moins sous Linux, c'est configurable (via `/ etc / nsswitch.conf`).Cependant, toutes les distributions Linux que je connais contiennent une configuration qui fonctionne comme vous le décrivez.
Notez que [des certificats valides pour `localhost` ont été vus dans la nature] (https://www.eff.org/deeplinks/2011/04/unqualified-names-ssl-observatory).
@JeremiahMegel: Cela n'est ni universellement vrai pour les fichiers HOSTS, ni universellement vrai que toutes les machines ont un fichier HOSTS.Aussi étrange que cela puisse paraître, faites du développement logiciel commercial (qui utilise localhost, dans notre cas) pendant un moment et vous verrez des configurations de système d'exploitation * vraiment * étranges.
Pendant longtemps maintenant, MS Windows utilisera par défaut DNS pour rechercher localhost.
Il y a aussi des problèmes avec IPv4 vs IPv6 localhost où Windows ne peut pas se trouver.
Fait amusant: si vous voulez taper moins, `http: // 127.1 /` fonctionnera tout aussi bien.
Dan Smith
2017-05-18 06:00:22 UTC
view on stackexchange narkive permalink

Si vous faites souvent ce genre de choses, pourquoi ne pas simplement vous procurer un routeur de voyage?

Avec un petit routeur de voyage, vous pouvez configurer votre propre réseau interne avec son propre SSID, ajouter un cryptage et configurez une liste blanche personnalisée afin que seules vos adresses MAC y soient autorisées.

Si vous parlez de wifi, je suis presque sûr que c'est snoop et spoofable.
@RobertGrant Cela dépend du cryptage utilisé.Les détails sont bien au-delà de la portée d'un commentaire, mais WPA2-PSK avec une clé sécurisée (complexe) devrait être suffisamment sécurisé pour cette utilisation.Cependant, cette solution semble plus lourde que les solutions logicielles.
C'est un peu plus compliqué que d'utiliser un logiciel, mais il a également le potentiel d'être plus sécurisé par défaut.Si d3vid n'utilise que son ordinateur portable, il peut également le connecter via Ethernet.Cela ne devient plus complexe que si vous souhaitez établir votre propre réseau wifi.
@DanSmith était d'accord - si vous parlez filaire, c'est plus sûr.Tant que vous avez un cadenas sur le routeur :-)
z0r
2017-05-18 11:09:27 UTC
view on stackexchange narkive permalink

Si vous développez dans Docker, alors lorsque vous démarrez votre application Web (dans un conteneur Docker), le conteneur aura sa propre adresse IP qui peut ne pas être accessible de l'extérieur. Vous y accéderiez avec une adresse IP spéciale, que vous seul pouvez voir, telle qu'attribuée par Docker - par ex. http://172.17.0.2:9000.

Le fait que votre application Web soit également accessible sur l'interface réseau physique de votre hôte dépend de la façon dont vous démarrez le récipient. Par exemple, la commande docker run ne se liera pas à l'interface hôte à moins que vous n'utilisiez -p , - P ou --expose options.

Autres avantages:

  • L'application est par ailleurs isolée de votre système hôte.
  • Le déploiement sur d’autres systèmes est plus reproductible.
Je préfère également exécuter le navigateur dans le menu fixe.Tout peut (et doit) être dockerisé.
Oli
2017-05-18 16:23:17 UTC
view on stackexchange narkive permalink

Il n'y a probablement pas d'attaque MITM viable ici. En supposant Ubuntu et Django, il y a deux grands facteurs qui conspirent contre un attaquant:

  • Les hôtes par défaut d'Ubuntu et la configuration DNS résoudront localhost en utilisant un paramètre codé en dur. Il n'effectuera même pas de requête DNS. Vous pouvez changer cela ... Mais ne le faites pas à la place :)

  • Django se lie à 127.0.0.1:8000 par défaut. Pour vous MitM pleinement, l'attaquant aurait besoin d'intercepter le trafic servi par Django mais il n'y a pas accès.

Cela dit, la sécurité Web est compliquée. Il se peut qu'un attaquant puisse exploiter certaines choses que vous faites pour avoir un effet sur vous.

Les ressources externes doivent être sécurisées

Nous sommes nombreux à intégrer des tiers , Fichiers hébergés sur CDN. Jquery, Bootstrap, etc. S'il s'agit de http: // ou // (rappelez-vous que le serveur de développement n'utilise pas TLS), cela pourrait donner à un attaquant l'occasion de MITM ces fichiers et injecter un script en direct dans vos pages.

Pour le développement local loin d'une connexion Internet, il peut être préférable à tout point de vue d'héberger tout le contenu vous-même.

Techniques de prise de clic et iframe

Ce n'est pas parce qu'ils ne peuvent pas accéder à votre serveur local, qu'ils n'ont pas pu dire à votre navigateur d'y accéder. La sécurité d'origine croisée les empêchera (probablement) de faire des choses directement avec elle, mais ils pourraient la coller dans une iframe. C'est une sorte de détournement de clic.

Pour l'utilisateur, cela ressemblerait à votre site Web. Ils pourraient même capturer toutes les URL à leur extrémité et les transmettre au cadre. S'il s'agissait d'un site Web public, ils pourraient également déterminer sur quoi vous avez cliqué.

Mais bien sûr, vous utilisez déjà django-secure , n'est-ce pas? Je le recommande. Un paramètre et vous commencerez à envoyer des en-têtes X-Frame-Options: DENY avec chaque requête Django. Il existe également une option intégrée à Django qui fait la même chose. Je recommande django-secure car il fait beaucoup plus.

Votre sécurité sur un réseau hostile est plus qu'un serveur Web

Vous avez probablement d'autres démons en cours d'exécution, en plus de choses comme PostgreSQL que vous utilisez pour le développement. Vous utilisez peut-être des serveurs SSH, des serveurs de partage de fichiers, etc., et si vous êtes habitué à un environnement domestique, vous avez peut-être passé la journée avec une sécurité plus faible pour plus de commodité.

Le La chose la plus simple à faire est de bloquer tout le trafic entrant. En supposant que vous n'ayez aucune configuration UFW existante, c'est aussi simple que:

  sudo ufw enabledudo ufw default deny incomingsudo ufw default allow outgoing  

Cela persistera les redémarrages. Si vous rentrez chez vous et que vous voulez accéder à quelque chose, vous pouvez soit le désactiver avec sudo ufw disable soit changer la valeur par défaut et ouvrir certains ports explicitement.

Si vous allez quitter un port SSH exposé, j'ai écrit un article sur le durcissement des configurations SSH. Sauf si vous êtes dans la cantine NSA, cela devrait empêcher la plupart des gens d'entrer dans votre système.

bons conseils (et merci pour la confirmation Ubuntu)
Karl Bielefeldt
2017-05-19 23:05:21 UTC
view on stackexchange narkive permalink

Le problème décrit par le forum est en fait l'opposé de ce qui vous inquiète. Vous craignez que quelqu'un d'autre sur le réseau puisse voir ce qui est servi sur localhost. Ce problème est que vous essayez de voir ce qui est diffusé sur localhost et que vous recevez à la place une page Web malveillante par quelqu'un d'autre sur le réseau.

Ce problème n'est en fait pas si difficile à définir vers le haut. Je l'ai eu par accident ici au travail. Nous fabriquons des équipements et des logiciels de réseau, donc il y a beaucoup de gens avec différents niveaux d'expérience qui mettent des machines dans différents états d'expérimentation sur le réseau. Quelqu'un a accidentellement défini «localhost» comme nom d'hôte, il a été enregistré dans Active Directory et servi à tout le monde dans DNS.

Dans un café, ce ne serait pas si difficile à remarquer, car votre application Web serait soudainement une autre page à la place. Si vous utilisez un certificat TLS, il n'aurait pas de certificat valide.

Si vous craignez que les détails de votre application Web ne fuient, bloquez simplement les ports entrants pertinents sur votre pare-feu externe. Sous Linux, vous feriez quelque chose comme ceci:

  / 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

Accédez à votre site avec http (s): //127.0.0.1/, configurez votre application pour écouter 127.0.0.1 uniquement et vous êtes en sécurité. Le chiffrement n'est pas nécessaire car il n'y a aucune possibilité pour quelqu'un de l'extérieur d'écouter: rien ne sort de votre ordinateur, votre application sur votre ordinateur "parle" avec votre navigateur sur votre ordinateur via une adresse qui ne peut pas être utilisée en dehors de votre ordinateur.

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

Vous pouvez coder, héberger et exécuter dans votre navigateur dans le cloud via https en utilisant Cloud9 ide, un dépôt GitHub et Heroku. À moins qu'un keylogger ne soit installé ou que quelqu'un regarde votre écran, personne dans cette pièce ne peut détecter ce que vous faites.



Ce Q&R a été automatiquement traduit de la langue anglaise.Le contenu original est disponible sur stackexchange, que nous remercions pour la licence cc by-sa 3.0 sous laquelle il est distribué.
Loading...