Page 1 sur 1

Bloquer l'accès à une API selon l'adresse IP du client

Posté : 23 mars 2010, 17:08
par Systo
Bonjour à tous, je vous présente mes excuses en avance si je ne post pas dans le bon forum.

Le but de ma visite est de savoir si l'un d'entre vous est capable de me dire comment on peut récupérer l'adresse ip d'un client qui vient consommer l'un de mes services web.
A savoir que la connexion se faire via le protocole soap, et que mon service web est écrit en php.

Je ne parle bien sur pas d'un simple $_SERVER['REMOTE_ADDR'] dans une page php, ce serait trop facile ^^ Je parle bien d'un service web, ce dernier est coté serveur. Je n'ai donc pas accès à l'environnement du client. Tout ce que cette variable d'environnement pourrait me renvoyer ne sera jamais que l'adresse ip du serveur sur lequel se trouve mon api (wsdl).

Non ce que je cherche c'est plutôt une méthode pour récupérer l'adresse ip dans le flux soap ou quelque chose de ce genre.Si cela peut aider à comprendre mon problème, mon but final est de bloquer l'accès à mon API en fonction des IP client.


Merci d'avance

Re: Bloquer l'accès à une API selon l'adresse IP du client

Posté : 23 mars 2010, 23:27
par @rthur
Bonjour,

Je ne suis pas sûr d'avoir compris ta question mais avant de te répondre que ce n'est pas possible, je te conseille de récupérer toutes les variables d'environnement (un serialize de $_SERVER par exemple), et que tu regardes si tu as l'information qui t'intéresse.

Ma compréhension du problème est que tu as un demandeur (avec une IP "A.A.A.A"), qui s'adresse à un serveur (qui a une IP "B.B.B.B") et ce même serveur va initier une connexion sur ton serveur (avec une IP "C.C.C.C") pour accéder à un webservice.
Ton souhait est que le serveur "C.C.C.C" puisse obtenir l'IP "A.A.A.A".
Or ce n'est pas possible selon moi puisque le serveur "B" va être un intermédiaire. La seule solution serait que "B" dans sa demande t'informe de l'IP de "A"...

Re: Bloquer l'accès à une API selon l'adresse IP du client

Posté : 24 mars 2010, 04:55
par Dr@ke
Je ne pourrais pas répondre mieux qu'@rthur vu le peu d'informations que l'on a dans ton post.

Je dirais juste qu'au pire il y a le fichier access.log d'Apache.
Et qu'au pire du pire, il y a surement un iptables ou pf quelque part :)

Re: Bloquer l'accès à une API selon l'adresse IP du client

Posté : 24 mars 2010, 08:52
par stopher
Slt ,

Normalement (enfin t'es pas obligé mais bon ) tu utilises une clef pour autoriser un requête à lancer l'exécution du service .
Il y a donc eu enregistrement avant .

Le principe serait de faire une relation entre la clef , et l'ip récupérer à l'enregistrement de celle-ci .
Certes ce ne sera pas forcement la même mais disons que c'est sur la bonne voie .

Ch.

Re: Bloquer l'accès à une API selon l'adresse IP du client

Posté : 24 mars 2010, 10:09
par stopher
Cependant , je viens de tester sur un de mes services TEST soap ,

et la variable $_SERVER[REMOTE_ADDR] est bien renseigné ...

Ch.

Re: Bloquer l'accès à une API selon l'adresse IP du client

Posté : 24 mars 2010, 10:57
par Systo
Alors premièrement merci à tous de vos réponses.
Je vais ensuite enchainer sur une réponse individuelle:


@rthur: Je vais essayer d'expliquer mon problème avec tes termes:
J'ai un demandeur (avec une adresse ip "A.A.A.A") qui va s'adresser à mon serveur (adresse ip "B.B.B.B") via un protocole soap. Et ce dernier va répondre au client ("A.A.A.A").
Mon problème se situe directement au niveau du serveur, récupérer l'adresse ip du client alors que la requête vient d'un protocole soap. J'avais déjà testé mais je l'ai refais car je ne souhaite pas dénigrer le temps que vous avez pris pour moi. Les variables d'environnements $_SERVER ne me renvoie que les données de mon serveur "B.B.B.B" ce qui est logique puisque je les demande sur mon serveur. Donc on peut oublier cette idée.

Dr@ke: je n'avais pas du tout pensé au fichier access.log. Une fois que j'ai lu ton post je me suis dit "Bingo c'est ça qu'il me faut"!! Mais j'ai tout de suite déchanté. Premier problème, il me faut un accès root pour accéder à ce fichier et je ne peux me permettre de donner l'accès root à mon api sur mon serveur. Ce serait beaucoup trop dangereux. Ensuite, si la solution se trouvait la, je ne pouvais pas la laisser inexplorée et donc j'ai poussé un peu dans ce sens. Et la encore il y a eu un problème. Dans ce fichier j'ai bien les connexion à mon api sous forme de ligne text mais imaginons une dizaine de client qui se connectent en même temps, comment savoir quel ip appartient à quel client? Donc encore une fois cette idée est à exclure.
Je vais chercher du coté de l'iptable ;)

stopher: j'avoue ne pas avoir compris ce que tu me proposes. La connexion à mon api (comme la majeur partie des api) ne demande qu'un couple login/mot de passe. Il faut garder à l'esprit que l'accès à cette api se fait via le protocole soap, aucune clef n'est nécessaire. Et l'adresse ip, je cherche à l'obtenir de manière invisible pour client. Ce dernier ne doit me fournir que ses identifiants, sinon ca ne fait que rajouter un second mot de passe au schmilblick ^^
De plus oui je confirme que la variable $_SERVER[REMOTE_ADDR] est bien renseignée, c'est logique je suis sur un serveur. Mais cette variable me renvoie l'ip de "mon" serveur, celui la même ou se trouve mon api or, ce que je souhaite obtenir, c'est l'ip de client qui se connecte à mon serveur via protocole soap.

Je pense avoir répondu à tout le monde. Gardez à l'esprit que mon but est de trouver un moyen d'obtenir l'adresse ip de mon client qui se connecte "via soap", la est toute la difficulté du problème. Pour l'instant je pars sur la fameuse iptable :)

Encore merci à tous de me donner un peu de votre temps!

Re: Bloquer l'accès à une API selon l'adresse IP du client

Posté : 24 mars 2010, 11:18
par stopher
stopher: j'avoue ne pas avoir compris ce que tu me proposes. La connexion à mon api (comme la majeur partie des api) ne demande qu'un couple login/mot de passe. Il faut garder à l'esprit que l'accès à cette api se fait via le protocole soap, aucune clef n'est nécessaire. Et l'adresse ip, je cherche à l'obtenir de manière invisible pour client. Ce dernier ne doit me fournir que ses identifiants, sinon ca ne fait que rajouter un second mot de passe au schmilblick ^^
De plus oui je confirme que la variable $_SERVER[REMOTE_ADDR] est bien renseignée, c'est logique je suis sur un serveur. Mais cette variable me renvoie l'ip de "mon" serveur, celui la même ou se trouve mon api or, ce que je souhaite obtenir, c'est l'ip de client qui se connecte à mon serveur via protocole soap.
Il y a donc une incompréhension de ma part ...

Ton serveur fourni un service web soap , ton but et de récupérer ceux qui l'utilisent ?
Imaginons que je souhaites utiliser ton service , tu vas donc fatalement récupérer l'adresse de mon serveur ? ( c'est pas ce que tu souhaites ? )

Ou tu souhaites remonter encore plus haut , c'est à dire l'adresses IP des internautes qui se connectes sur les serveurs utilisant ton service web ?



Concernant la clef , c'est juste une clef à rajouter à chaque requête SOAP
$params->AWSAccessKeyId = AMAZON_API_KEY;
$params->Request->SearchIndex = 'Books';
$params->Request->Keywords = 'php5 oop';

$amazon = new SoapClient('http://webservices.amazon.com
/AWSECommerceService/AWSECommerceService.wsdl');
$result = $amazon->itemSearch($params);
Je ne sais pas comment fonctionne exactement le service amazone , mais imaginons , l'utilisation de AMAZON_API_KEY qui est propre à chaque utilisateur te permet de savoir qui utilise et surtout d'éviter les requêtes sauvages de comptes non existants .
Bref au final savoir qui l'utilise à quelle fréquence ect ...

Ch.

Re: Bloquer l'accès à une API selon l'adresse IP du client

Posté : 24 mars 2010, 11:37
par Systo
Ou tu souhaites remonter encore plus haut , c'est à dire l'adresses IP des internautes qui se connectes sur les serveurs utilisant ton service web ?
C'est exactement ça, je souhaite récupérer ces adresse ip pour bloquer à certain réseau, l'accès à mon api. Par exemple, une entreprise souhaite que ses employés ne puissent accéder à l'api qu'uniquement depuis leur post de travaille. Et bien elle rentre l'adresse ip de son routeur et le tour est joué. Et avec soap, je ne vois absolument pas comment faire ça. J'ai fait mes recherche du coté d'iptable (le firewall de linux) et ça devient beaucoup trop contraignant. Mon but est d'affecter des droits à mes client. L'utilisation d'iptable reviendrait à bloquer l'ensemble des mes client. Encore une solution qui tombe à l'eau...

Pour ce qui est de la clef amazone, je vois mieux ce que tu voulais dire mais cela ne correspond pas non plus à ce que je veux. Cette clef, c'est le client qui devra la renseigner dans son code pour pour me la transmettre lors de sa connexion à mon api. Or le client ne doit pas être l'instigateur. Je souhaite obtenir son adresse ip de manière totalement transparente à ses yeux. J'ai bien l'impression que ce que je cherche à faire est impossible en php. Si soap ne transmet pas cette information, il doit y avoir une raison.

Ce que je trouve incroyable, c'est que c'est la première fois que je ne trouve pas une solution à mon problème sur google. C'est comme si personne n'avait jamais cherché à faire ça avant moi...

Re: Bloquer l'accès à une API selon l'adresse IP du client

Posté : 24 mars 2010, 11:52
par @rthur
Ce que je trouve incroyable, c'est que c'est la première fois que je ne trouve pas une solution à mon problème sur google. C'est comme si personne n'avait jamais cherché à faire ça avant moi...
En fait, j'ai peur que tu ne poses pas la bonne question... d'où la difficulté à te répondre.

@rthur: Je vais essayer d'expliquer mon problème avec tes termes:
J'ai un demandeur (avec une adresse ip "A.A.A.A") qui va s'adresser à mon serveur (adresse ip "B.B.B.B") via un protocole soap. Et ce dernier va répondre au client ("A.A.A.A").
Mon problème se situe directement au niveau du serveur, récupérer l'adresse ip du client alors que la requête vient d'un protocole soap. J'avais déjà testé mais je l'ai refais car je ne souhaite pas dénigrer le temps que vous avez pris pour moi. Les variables d'environnements $_SERVER ne me renvoie que les données de mon serveur "B.B.B.B" ce qui est logique puisque je les demande sur mon serveur.
Ce n'est absolument pas logique puisque la variable $_SERVER['REMOTE_ADDR'], comme son nom l'indique doit te renvoyer l'adresse IP distante, c'est à dire celle qui fait la demande.


Un webservice SOAP fonctionne avec deux parties:
- Un serveur SOAP : http://fr.php.net/manual/fr/class.soapserver.php
- Un client SOAP : http://fr.php.net/manual/fr/class.soapclient.php

Un utilisateur "A" va donc se connecter à un serveur WEB "B" (qui comporte le site web et l'interface utilisateur) sur lequel est installé le client SOAP.
Et c'est ce même serveur "B" qui va aller interroger le serveur SOAP "C"


Dans tous les cas, seul le serveur "B" peut connaitre l'adresse IP de "A".

Dans ton cas d'utilisation si B et C sont sur le même serveur alors il ne faut pas que tu récupères $_SERVER['REMOTE_ADDR'] au niveau de "C" mais au niveau de "B" c'est à dire le client SOAP.


:arrow: La question est donc : as-tu la main sur le client SOAP?
Si la réponse est non, alors tu ne pourras pas récupérer l'adresse IP de l'utilisateur.

Re: Bloquer l'accès à une API selon l'adresse IP du client

Posté : 24 mars 2010, 12:06
par Systo
Un utilisateur "A" va donc se connecter à un serveur WEB "B" (qui comporte le site web et l'interface utilisateur) sur lequel est installé le client SOAP.
Et c'est ce même serveur "B" qui va aller interroger le serveur SOAP "C"
Il y a bien ce cas mais je propose aussi à mes client de se connecté directement à mon api sans passé par le site. Et donc, le client A ouvre un soap client vers mon wsdl , lui transmet des requêtes et ce dernier lui répond. En sachant que je considère pas le soap comme un serveur (et c'est peut être la qu'on ne se comprend pas) car je n'ai pas la main dessus. Je le considère comme un protocole de transport, comme un pont.


Effectivement, non je n'ai pas l'accès au client soap. Ce qui ne me laisse plus qu'une solution: déplacer mon api sur un serveur dédié et bloquer les ip directement dans le firewall. En effet, c'était ce qui me rebutait un peu, mon api est sur mon serveur principale et donc si je filtrais au niveau de l'iptable, j'allais rencontrer des problèmes. Je vais donc l'isoler et donc je pourrais facilement manipuler les filtres du firwall.

Un grand merci à vous deux @rthur et stopher.

++
Systo

Re: Bloquer l'accès à une API selon l'adresse IP du client

Posté : 24 mars 2010, 12:27
par @rthur
Depuis le serveur SOAP "C", tu peux récupérer l'adresse IP du client SOAP "B" via la variable $_SERVER['REMOTE_ADDR'].