S'assurer que le traffic reseau d'une application ne fuite pas

a marqué ce sujet comme résolu.

Bonjour,

Pour planter le contexte, je suis charge d’ajouter le support des proxy a une application. Pour tester ce que je fais, j’ai mis en place une image docker squid et ca après avoir fait mon dev & configure l’application (le proxy est dispo sur 172.17.0.1:3128, la carte virutelle c’est docker0), a l’air de marcher \o/. Le soucis ? C’est que vu la tete de l’application (c’est pas legacy, mais tout comme), je pense que j’en ai oublie des endroits.

Pour vérifier ca, je voudrais isoler mon application du monde normal et ne l’autoriser a parler qu’au seul proxy. Et la, je sèche un peu sur la manière de faire, n’étant pas très bon en réseau.

Pour le moment, j’ai vu qu’il existait un système de network namespace dans linux et ca me semblait être une piste intéressante, mais je ne suis pas sur de la marche a suivre. J’avais en tète:

  • Creer un namespace forceProxy
  • Ajouter une carte virtuelle dedans. Mais ou va l’autre ?
  • Router tout vers le proxy.

Est ce que quelqu’un peut m’aiguiller ?

Merci !

Bonjour,

Je tenterai cette isolation en ajoutant deux filtres dans l’iptables du container : l’une qui ACCEPT une connexion OUT avec le container du proxy et une autre qui DROP tout autre destinataire. Il faut par contre penser à donner les droits au container pour modifier ces règles : https://docs.docker.com/compose/compose-file/#cap_add-cap_drop.

+0 -0

J’ai un peu de mal à avoir comment ca marcherait. En quoi ca empecherait l’application de lancer un socket et se connecter autrement que par le proxy ?

Davidbrcz

Ça bloque tout simplement les échanges réseaux sortants (iptables) en appliquant un filtrage directement sur la couche transport et réseau du modèle OSI. Il pourra tenter d’ouvrir un socket mais les paquets échoueront.

+0 -0

En gros, avec iptables, le noyau Linux se positionnera entre le socket et la carte réseau et regardera le contenu du paquet. Si tu l’as configuré de cette manière, le noyau regardera l’adresse de destination du paquet et si ce n’est pas celle du proxy, il décidera de ne pas transmettre le paquet vers la carte réseau et l’échange échouera (le paquet SYN ne passera pas).

Voir par exemple : https://serverfault.com/questions/198966/iptables-blocking-outbound-traffic-except-to-certain-ip-addresses

Attention, il y a bloquer le trafic et bloquer le trafic : un tiers malveillant qui aurait les droits root pourrait chercher à supprimer les règles iptables ou à ouvrir une socket brute qui ne passera pas par la pile IP du noyau, si c’est dans sa possibilité. Mais je crois comprendre que ce n’est pas ta problématique.

Tu peux aussi mettre en place des tests automatisés pour vérifier que le trafic ne fuite pas et mettre en place des règles iptables (à la place ou en plus) sur le système hôte.

+0 -0

Ok, je comprends un peu mieux. Mais si je fais ça, çà va s’appliquer a tous les paquets et tous les programmes non ? Donc typiquement les autres applications qui tournent sur mon PC (Firefox par exemple) mais aussi le contenu sortant du proxy, non ?

Si c’est le cas, ca me parait trop restrictif, il me faudrait ca, mais juste pour mon application.

Il faut limiter ça à l’interface de Docker (docker0). Voir : https://serverfault.com/questions/705192/iptables-rule-set-so-that-a-docker-container-can-access-a-service-on-a-host-ip

Bien entendu, ça reste un contournement à ton problème. La manière propre est de faire passer toutes les requêtes réseaux externes par la même classe (que tu peux personnaliser toi-même) qui obligera les requêtes à passer le proxy, et de supprimer les références à toute autre classe ou bibliothèque susceptible d’effectuer des requêtes HTTP dans ton application. Fais aussi une suite de tests et corrobore en regardant les paquets qui passent dans Wireshark pour s’assurer que tout fonctionne bien.

Bien entendu, ça reste un contournement à ton problème. La manière propre est de faire passer toutes les requêtes réseaux externes par la même classe (que tu peux personnaliser toi-même) qui obligera les requêtes à passer le proxy, et de supprimer les références à toute autre classe ou bibliothèque susceptible d’effectuer des requêtes HTTP dans ton application. Fais aussi une suite de tests et corrobore en regardant les paquets qui passent dans Wireshark pour s’assurer que tout fonctionne bien

Oui, oui, c’est justement pour m’assurer que j’ai rien loupe que je veux mettre ca en place.

L’application tourne dans un instance docker ?
Tu ne veux pas là conteneuriser ?

Sinon, tu es sous Linux ? Tu peux tenter proxychain. Je ne l’utilise pas mais ça devrait pouvoir faire ce que tu veux. J’utilise généralement tsocks mais ça ne marche qu’avec les proxy « socks ».

+0 -0
Connectez-vous pour pouvoir poster un message.
Connexion

Pas encore membre ?

Créez un compte en une minute pour profiter pleinement de toutes les fonctionnalités de Zeste de Savoir. Ici, tout est gratuit et sans publicité.
Créer un compte