La présentation est en train de télécharger. S'il vous plaît, attendez

La présentation est en train de télécharger. S'il vous plaît, attendez

Implementing a simple RMI Application over the Internet (using and comparing HTTP tunneling, RMI Proxy)

Présentations similaires


Présentation au sujet: "Implementing a simple RMI Application over the Internet (using and comparing HTTP tunneling, RMI Proxy)"— Transcription de la présentation:

1 Implementing a simple RMI Application over the Internet (using and comparing HTTP tunneling, RMI Proxy)

2 Plan de l exposé Introduction Introduction Problématique Problématique HTTP tunneling HTTP tunneling Comment RMI « tunnelle » des messagesComment RMI « tunnelle » des messages Stratégie utilisée pour une invocation de méthode sur un serveurStratégie utilisée pour une invocation de méthode sur un serveur Naming ServicesNaming Services Limplémentation dun servlet pour le HTTP TunnelingLimplémentation dun servlet pour le HTTP Tunneling Modifications à apporter au code afin dutiliser le HTTP TunnelingModifications à apporter au code afin dutiliser le HTTP Tunneling Configuration du fichier policyConfiguration du fichier policy Exemple de requête RMIExemple de requête RMI

3 Plan de l exposé (2) RMI Proxy RMI Proxy Les objectifsLes objectifs Les caractérisitiquesLes caractérisitiques Le contrôle daccèsLe contrôle daccès LarchitectureLarchitecture Fonctionnement de RMI ProxyFonctionnement de RMI Proxy LAPI côté client et serveurLAPI côté client et serveur Limitations du RMI ProxyLimitations du RMI Proxy Les modifications à apportées au client et au serveurLes modifications à apportées au client et au serveur Les différences entre RMI Proxy et HTTP TunnelingLes différences entre RMI Proxy et HTTP Tunneling Conclusion Conclusion

4 Introduction RMI (Remote Method Invocation) RMI (Remote Method Invocation) est un système distribuéest un système distribué une ou plusieurs applications peuvent sexécuter sur une ou plusieurs machinesune ou plusieurs applications peuvent sexécuter sur une ou plusieurs machines Aucun problème sil ny a aucun firewall entre les deux parties communiquantesAucun problème sil ny a aucun firewall entre les deux parties communiquantes

5 Problématique Le problème principal lorsquun client veut effectuer un appel RMI sur une machine distante est le firewall. Le problème principal lorsquun client veut effectuer un appel RMI sur une machine distante est le firewall. Firewalls interdisent souvent laccès à certains ports spécialisés comme ceux quon désire utiliser lors dun appel RMI. Firewalls interdisent souvent laccès à certains ports spécialisés comme ceux quon désire utiliser lors dun appel RMI. Solution techniques de tunneling, RMI Proxy ou encore dautres peuvent être utilisées. Solution techniques de tunneling, RMI Proxy ou encore dautres peuvent être utilisées.

6 HTTP Tunneling Principe de base Utiliser comme protocole de communication des appelles http à travers le Web Principe de base Utiliser comme protocole de communication des appelles http à travers le Web Évite les firewalls en utilisant le port HTTP (80), celui-ci nest en général pas boqué par le firewall et le firewall ne peut pas prendre de décisions en fonction du contenu des paquets. Évite les firewalls en utilisant le port HTTP (80), celui-ci nest en général pas boqué par le firewall et le firewall ne peut pas prendre de décisions en fonction du contenu des paquets. Principe Le client utilise une couche supplémentaire (marshalling layer) qui encode la requête RMI du client en une requête HTTP valide. Le serveur de lautre coté comprend aussi une couche supplémentaire (layer of demarshalling code), laquelle transforme une requête HTTP en une requête correspondant à celle attendue par le serveur (dans ce cas un requête RMI). Principe Le client utilise une couche supplémentaire (marshalling layer) qui encode la requête RMI du client en une requête HTTP valide. Le serveur de lautre coté comprend aussi une couche supplémentaire (layer of demarshalling code), laquelle transforme une requête HTTP en une requête correspondant à celle attendue par le serveur (dans ce cas un requête RMI).

7 HTTP Tunneling (2) Le HTTP tunneling est divisé en trois parties : Le HTTP tunneling est divisé en trois parties : Le Client Envoie une requête au serveur web Le Client Envoie une requête au serveur web Le servlet Transmet la requête à la socket du serveur RMI en préservant la structure HTTP qui a été envoyée par le client Le servlet Transmet la requête à la socket du serveur RMI en préservant la structure HTTP qui a été envoyée par le client Le serveur Transforme automatiquement lenvoi HTTP en une commande JRMP Le serveur Transforme automatiquement lenvoi HTTP en une commande JRMP

8 HTTP Tunneling (3)

9 Comment RMI « tunnelle » des messages But du mécanisme de RMIs HTTP tunneling : encode un appel de méthode à distance à la façon d une requête POST et ensuite décode la « page web » retournée. But du mécanisme de RMIs HTTP tunneling : encode un appel de méthode à distance à la façon d une requête POST et ensuite décode la « page web » retournée. RMI utilise son propre mode de socket ( RMIHttpToCGISocketFactory() ) quand des connections sont créées. RMI utilise son propre mode de socket ( RMIHttpToCGISocketFactory() ) quand des connections sont créées. Ces sockets tentent dutiliser HTTP tunneling si auparavant elles ont reçu une erreur du serveur. Ces sockets tentent dutiliser HTTP tunneling si auparavant elles ont reçu une erreur du serveur.

10 Stratégie utilisée pour une invocation de méthode sur un serveur Tentent détablir une connexion JRMP (Java Remote Method Invocation) directe vers le serveur. Tentent détablir une connexion JRMP (Java Remote Method Invocation) directe vers le serveur. établir une connexion HTTP directe avec le serveur. Ainsi elles créent une connexion par socket vers le port sur lequel le serveur est en train découter et ensuite communique en encapsulant les méthodes demandées dans des requêtes HTTP. établir une connexion HTTP directe avec le serveur. Ainsi elles créent une connexion par socket vers le port sur lequel le serveur est en train découter et ensuite communique en encapsulant les méthodes demandées dans des requêtes HTTP.

11 Stratégie utilisée pour une invocation de méthode sur un serveur (2) Utilise le firewall comme un serveur proxy (demandant au firewall de transmettre la requête au port approprié du serveur). Le firewall transmettra la requête comme une requête HTTP (le firewall ne va pas traduire la requête en appel RMI).Utilise le firewall comme un serveur proxy (demandant au firewall de transmettre la requête au port approprié du serveur). Le firewall transmettra la requête comme une requête HTTP (le firewall ne va pas traduire la requête en appel RMI). Se connecte sur le port 80 de la machine serveur et lui envoie la requête selon un URL commençant avec /cgi- bin/java-rmi.cgi. Cet URL signifie que la requête doit être transmise vers un programme qui interprète les requêtes HTTP et qui la transmet, comme une requête HTTP, vers le port approprié du serveur.Se connecte sur le port 80 de la machine serveur et lui envoie la requête selon un URL commençant avec /cgi- bin/java-rmi.cgi. Cet URL signifie que la requête doit être transmise vers un programme qui interprète les requêtes HTTP et qui la transmet, comme une requête HTTP, vers le port approprié du serveur. Chaquun de ces points a son sens, la connexion est établie selon les privilèges que le firewall accorde. Chaquun de ces points a son sens, la connexion est établie selon les privilèges que le firewall accorde.

12 Naming Services La machine serveur dans la quatrième option est une abstraction, elle na pas besoin dêtre sur la même machine que lobjet serveur RMI. Permet donc plus de flexibilité au HTTP Tunneling. La machine serveur dans la quatrième option est une abstraction, elle na pas besoin dêtre sur la même machine que lobjet serveur RMI. Permet donc plus de flexibilité au HTTP Tunneling. Pour ce faire nous devons écrire un servlet qui effectue la redirection de la requête RMI vers le serveur RMI, ensuite le serveur web est configuré pour envoyer toutes les requêtes avec lURL approprié. Pour ce faire nous devons écrire un servlet qui effectue la redirection de la requête RMI vers le serveur RMI, ensuite le serveur web est configuré pour envoyer toutes les requêtes avec lURL approprié.

13 Naming Services (2)

14 Limplémentation dun servlet pour le HTTP Tunneling La première implémentation, qui permet de transmettre linvocation de méthodes au serveur RMI, que Sun Microsystems, Inc. Développa était un script CGI (java-rmi.cgi) La première implémentation, qui permet de transmettre linvocation de méthodes au serveur RMI, que Sun Microsystems, Inc. Développa était un script CGI (java-rmi.cgi) Chaque invocation distante de méthodes est envoyée comme une requête HTTP POST Chaque invocation distante de méthodes est envoyée comme une requête HTTP POST LURL complet utilisé est de la forme /cgi-bin/java-rmi.cgi ?forward=[port number] LURL complet utilisé est de la forme /cgi-bin/java-rmi.cgi ?forward=[port number] Le corps du POST contient toutes les données de la requête distante comme un objet sérialisé qui est ensuite convertit en une chaîne de caractères ASCII. Le corps du POST contient toutes les données de la requête distante comme un objet sérialisé qui est ensuite convertit en une chaîne de caractères ASCII. Sun créa ensuite un servlet qui fournit les mêmes fonctionnalités que le script CGI. Sun créa ensuite un servlet qui fournit les mêmes fonctionnalités que le script CGI.

15 Le code du servlet Deux classes principales SimplifiedServletHandler et ServletForwardCommand Deux classes principales SimplifiedServletHandler et ServletForwardCommand SimplifiedServletHandler Cette classe étend HTTPServlet. Elles reçoit les requêtes et effectue un validation préliminaire. SimplifiedServletHandler Cette classe étend HTTPServlet. Elles reçoit les requêtes et effectue un validation préliminaire. ServletForwardCommand Cest une liste de méthodes statiques qui sait comment interpréter un HTTP POST et renvoyer ceci au serveur Rmi qui tourne sur la même machine. ServletForwardCommand Cest une liste de méthodes statiques qui sait comment interpréter un HTTP POST et renvoyer ceci au serveur Rmi qui tourne sur la même machine.

16 Le code du servlet (2) Explication dune partie de code de SimplifiedServletHandler Explication dune partie de code de SimplifiedServletHandler Des testes sont effectués afin de contrôlé la validité de lURL et présence du port, la requête est ensuite transmise à la méthode statique execute()Des testes sont effectués afin de contrôlé la validité de lURL et présence du port, la requête est ensuite transmise à la méthode statique execute() if (command.equalsIgnoreCase("forward")) { try { LoggingServletForwardCommand.execute(req, res, param); } catch (ServletClientException e) { returnClientError(res, "client error: " + e.getMessage()); e.printStackTrace(); } catch (ServletServerException e) { returnServerError(res, "internal server error: " + e.getMessage()); e.printStackTrace(); } } else { returnClientError(res, "invalid command: " + command); }

17 Le code du servlet (3) Explication dune partie du code de ServletForwardCommand Explication dune partie du code de ServletForwardCommand on utilise des sockets pour transmettre le corps du message HTTP au serveur RMI et ensuite des simples « pipes » que le serveur RMI pour retourner des sortis de type HttpServletResponse (response). on utilise des sockets pour transmettre le corps du message HTTP au serveur RMI et ensuite des simples « pipes » que le serveur RMI pour retourner des sortis de type HttpServletResponse (response). ServletForwardCommand transmet le message sans décoder les données ou comprendre le message ServletForwardCommand transmet le message sans décoder les données ou comprendre le message socketOut = new DataOutputStream(connectionToLocalServer.getOutputStream()); socketOut.writeBytes("POST / HTTP/1.0\r\n"); socketOut.writeBytes("Content-length: " + request.getContentLength() + "\r\n\r\n"); socketOut.write(buffer); socketOut.flush(); OutputStream out = response.getOutputStream(); out.write(buffer); out.flush();

18 Modifications à apporter au code afin dutiliser le HTTP Tunneling La socket RMI par défaut tentera automatiquement dutiliser le HTTP tunneling quand les autres connexions auront échouées. La socket RMI par défaut tentera automatiquement dutiliser le HTTP tunneling quand les autres connexions auront échouées. On ne change ni le code du serveur ni le code du client, on ajoute simplement un ligne dans le code du client afin quil puisse utiliser le HTTP tunneling. RMISocketFactory.setSocketFactory(new sun.rmi.transport.proxy.RMIHttpTOCGISocketFactory()) ; On ne change ni le code du serveur ni le code du client, on ajoute simplement un ligne dans le code du client afin quil puisse utiliser le HTTP tunneling. RMISocketFactory.setSocketFactory(new sun.rmi.transport.proxy.RMIHttpTOCGISocketFactory()) ;

19 Configuration du fichier policy Chaque servlet est obligatoirement exécutée sous le contrôle dun gestionnaire de sécurité. Chaque servlet est obligatoirement exécutée sous le contrôle dun gestionnaire de sécurité. Les politiques de sécurité appliquées par la JVM ne permettent pas du téléchargement de code sans permission explicite. Donc dans le fichier policiy du client et du serveur les permissions suivantes doivent être ajoutées : Les politiques de sécurité appliquées par la JVM ne permettent pas du téléchargement de code sans permission explicite. Donc dans le fichier policiy du client et du serveur les permissions suivantes doivent être ajoutées : permission java.net.SocketPermission "*: ","connect,accept";permission java.net.SocketPermission "*: ","connect,accept"; permission java.net.SocketPermission "*:80", "connect";permission java.net.SocketPermission "*:80", "connect"; Chez le client il y a encore une permission de plus affin que celui-ci puisse utiliser la « RMISocketFactory » : Chez le client il y a encore une permission de plus affin que celui-ci puisse utiliser la « RMISocketFactory » : permission java.lang.RuntimePermission "setFactory";permission java.lang.RuntimePermission "setFactory";

20 Exemple de requête RMI

21 Seconde technique RMI Proxy

22 Les objectifs Eliminer les problèmes de sécurités de RMI à travers HTTP pour ladministrateur réseau, via une application firewall qui ne supporte uniquement le protocole RMI/JRMP. Eliminer les problèmes de sécurités de RMI à travers HTTP pour ladministrateur réseau, via une application firewall qui ne supporte uniquement le protocole RMI/JRMP. Réduction des overhead comparé au HTTP tunneling lors du passage à travers un firewall. Réduction des overhead comparé au HTTP tunneling lors du passage à travers un firewall. Permettre un accès contrôlé des appels du coté client derrière un firewall. Permettre un accès contrôlé des appels du coté client derrière un firewall. Préserver toutes les propriétés de RMI Préserver toutes les propriétés de RMI Requérir un minimum de modifications de code chez le client et le serveur RMI Requérir un minimum de modifications de code chez le client et le serveur RMI Reprendre le maximum davantages existants dans les classes java. Reprendre le maximum davantages existants dans les classes java.

23 Les caractéristiques RMI Proxy est une application Java et une API permettant le contrôle de la pénétration dans un firewall en approuvant les clients et les serveurs RMI. RMI Proxy est une application Java et une API permettant le contrôle de la pénétration dans un firewall en approuvant les clients et les serveurs RMI. RMI Proxy est capable de: RMI Proxy est capable de: Bloquer laccès aux protocoles non-JRMPBloquer laccès aux protocoles non-JRMP Contrôler les écritures vers la RMI Proxy Registry selon lidentification de lhôte clientContrôler les écritures vers la RMI Proxy Registry selon lidentification de lhôte client Permettre ou refuser laccès et lexécution de méthodes distantes au client RMI, selon lidentificateur de lhôte client.Permettre ou refuser laccès et lexécution de méthodes distantes au client RMI, selon lidentificateur de lhôte client. Permettre ou refuser le transfert de code par le service du codebase RMI, dans les deux directionsPermettre ou refuser le transfert de code par le service du codebase RMI, dans les deux directions

24 Le contrôle daccès Il est fournit par les fichiers Java policy, lesquels contrôle la communication à travers les firewalls. Il est fournit par les fichiers Java policy, lesquels contrôle la communication à travers les firewalls. Le contrôle daccès seffectue selon ladresse IP ou le nom du client voulant passer le firewall et de laction quil veut effectuer. Classe spécialisée : « FirewallPermission » Le contrôle daccès seffectue selon ladresse IP ou le nom du client voulant passer le firewall et de laction quil veut effectuer. Classe spécialisée : « FirewallPermission » Le contrôle est capable dêtre contre les actions suivantes : Le contrôle est capable dêtre contre les actions suivantes : Laccès à certain objetLaccès à certain objet Bind, rebind ou unbind certain nomBind, rebind ou unbind certain nom Lexécution de certaines méthodes distantesLexécution de certaines méthodes distantes Chercher certains noms dans la proxy registryChercher certains noms dans la proxy registry

25 Larchitecture Composants importants : Composants importants : Le programme RMI Proxy, lequel sexécute dans les machines proxy désignées.Le programme RMI Proxy, lequel sexécute dans les machines proxy désignées. La classe ProxyNaming, une classe Naming modifiée, appelée par les clients et serveurs RMI.La classe ProxyNaming, une classe Naming modifiée, appelée par les clients et serveurs RMI. Sous-composants Sous-composants La proxy registryLa proxy registry RMI registry normale qui est soumise aux règles de contrôles daccès fournis par limplémentation du serveur RMIProxy RMI registry normale qui est soumise aux règles de contrôles daccès fournis par limplémentation du serveur RMIProxy Un protocole RMIUn protocole RMI négocie entre les flux descendants du serveur RMI et les flux montants du client RMI, effectuant la validation du protocole et le contrôle daccès dans le processus négocie entre les flux descendants du serveur RMI et les flux montants du client RMI, effectuant la validation du protocole et le contrôle daccès dans le processus

26 Fonctionnement de RMI Proxy Pour le client RMI, une opération « lookup » sur un objet distant doit être dirigée vers le serveur proxy. Pour le client RMI, une opération « lookup » sur un objet distant doit être dirigée vers le serveur proxy. Si le client est aussi lui-même derrière un firewall, le « lookup » est délégué à son RMI Proxy. Si le client est aussi lui-même derrière un firewall, le « lookup » est délégué à son RMI Proxy. La partie extérieur du proxy du client est capable de communiquer par RMI avec la partie extérieur du proxy serveur. La partie extérieur du proxy du client est capable de communiquer par RMI avec la partie extérieur du proxy serveur. Les proxies RMI servent dintermédiaires entre les entrés vers le serveur et les sorties du client. Les proxies RMI servent dintermédiaires entre les entrés vers le serveur et les sorties du client.

27 RMI Proxy (2) Le RMI proxy Registry et les composants serveur sont installés en association avec chaque firewall qui existe entre le client RMI et le serveur RMI. Le RMI proxy Registry et les composants serveur sont installés en association avec chaque firewall qui existe entre le client RMI et le serveur RMI. Chacun doit ouvrir un port au trafique RMI, lequel est ensuite manipulé dun manière sécurisée par le RMI proxy associé. Chacun doit ouvrir un port au trafique RMI, lequel est ensuite manipulé dun manière sécurisée par le RMI proxy associé.

28 LAPI côté client et serveur Le client est derrière plusieurs firewall -> délègue le lookup au proxy final coté client (grace à la propriété rmi.proxyHost) puis un stub est obtenu. Le client est derrière plusieurs firewall -> délègue le lookup au proxy final coté client (grace à la propriété rmi.proxyHost) puis un stub est obtenu. Le serveur exécute un bind dans la chaîne de registry des proxy en déléguant le bind. Il est donc lié à la registry locale et aux registry de toute la chaîne des proxy Le serveur exécute un bind dans la chaîne de registry des proxy en déléguant le bind. Il est donc lié à la registry locale et aux registry de toute la chaîne des proxy

29 Limitations du RMI Proxy Activation Activation Limplémentation actuelle réécrit les stubs activables comme des stubs unicast normauxLimplémentation actuelle réécrit les stubs activables comme des stubs unicast normaux Stubs cachés Stubs cachés Neffectue pas darrangement proxying pour les stubs cachés (Stubs à lintérieur de MarshalledObjects)Neffectue pas darrangement proxying pour les stubs cachés (Stubs à lintérieur de MarshalledObjects) Socket Factories Socket Factories Socket factories ne sont actuellement pas supportéesSocket factories ne sont actuellement pas supportées GetClientHost GetClientHost RmoteServer.getClientHost retourne lInetAddress du RMI Proxy le plus proche et non le vrai client RMIRmoteServer.getClientHost retourne lInetAddress du RMI Proxy le plus proche et non le vrai client RMI RMI/IIOP (Internet Inter-Orb Protocol) RMI/IIOP (Internet Inter-Orb Protocol) Ne supporte pas les stubs RMI/IIOPNe supporte pas les stubs RMI/IIOP Stubs distants indirectes Stubs distants indirectes Petite modification nécessaire dans la classe sun.rmi.MarshalOutputStream pour traiter les stubs distants indirectesPetite modification nécessaire dans la classe sun.rmi.MarshalOutputStream pour traiter les stubs distants indirectes

30 Les modifications à apportées au client et au serveur Du coté serveur la classe com.rmiproxy.ProxyNaming doit être utilisée à la place de la classe java.rmi.Naming. Du coté serveur la classe com.rmiproxy.ProxyNaming doit être utilisée à la place de la classe java.rmi.Naming. Exemple de code : ProxyNaming.bind(« rmi://localhost/ » + RemoteEcho.class.getName()) ; Exemple de code : ProxyNaming.bind(« rmi://localhost/ » + RemoteEcho.class.getName()) ; Du coté client le même principe doit être utilisé on remplace la classe java.rmi.Naming par la classe com.rmiproxy.ProxyNaming. Du coté client le même principe doit être utilisé on remplace la classe java.rmi.Naming par la classe com.rmiproxy.ProxyNaming. Exemple de code : RemoteEcho echoObject = (RemoteEcho)ProxyNaming.lookup(« rmi://rmi.server.com/ » +RemoteEcho.class.getName()) ; Exemple de code : RemoteEcho echoObject = (RemoteEcho)ProxyNaming.lookup(« rmi://rmi.server.com/ » +RemoteEcho.class.getName()) ; Définir les propriétés du système rmi.proxyHost Définir les propriétés du système rmi.proxyHost Exemple : Rmi.proxyHost=rmi://proxy.clientlan0.client.com Configurer le fichier policy du client et du serveur. Configurer le fichier policy du client et du serveur. Installer ProxyBoot.jar, ProxyMain.jar et RMIProxy.policy sur chaque machine proxy. Installer ProxyBoot.jar, ProxyMain.jar et RMIProxy.policy sur chaque machine proxy.

31 Les différences entre RMI Proxy et HTTP Tunneling Connexion ne se referme pas après chaque requête. Inefficacité de la connexion, il ne peut pas créer un connexion et la laisser ouverte pour pouvoir la réutiliser, il doit créer une nouvelle socket pour chaque requête quil effectue. Fonctionne avec tout type de firewall.Il ne fonctionne pas à travers tous les types de firewall. Les requêtes sont des requêtes RMI sans information supplémentaire. Ces performances sont faibles.Il encode beaucoup dinformations dans chaque message de requête. Il doit créer une nouvelle socket pour chaque requête quil effectue. Plus robuste au changement du firewall.Il nest pas très fiable. Si on modifie le firewall il est possible que le tunneling ne fonctionne plus. RMI ProxyHTTP tunneling

32 Conclusion Le RMI Proxy est certainement une méthode bien meilleur que le HTTP tunneling, car elle ne comporte que des avantages sur cette dernière. Le RMI Proxy est certainement une méthode bien meilleur que le HTTP tunneling, car elle ne comporte que des avantages sur cette dernière.

33 QUESTION?


Télécharger ppt "Implementing a simple RMI Application over the Internet (using and comparing HTTP tunneling, RMI Proxy)"

Présentations similaires


Annonces Google