Title: Implementing a simple RMI Application over the Internet using and comparing HTTP tunneling, RMI Prox
1Implementing a simple RMI Application over the
Internet (using and comparing HTTP tunneling,
RMI Proxy)
2Plan de l exposé
- Introduction
- Problématique
- HTTP tunneling
- Comment RMI tunnelle des messages
- Stratégie utilisée pour une invocation de méthode
sur un serveur - Naming Services
- Limplémentation dun servlet pour le HTTP
Tunneling - Modifications à apporter au code afin dutiliser
le HTTP Tunneling - Configuration du fichier policy
- Exemple de requête RMI
3Plan de l exposé (2)
- RMI Proxy
- Les objectifs
- Les caractérisitiques
- Le contrôle daccès
- Larchitecture
- Fonctionnement de RMI Proxy
- LAPI côté client et serveur
- Limitations du RMI Proxy
- Les modifications à apportées au client et au
serveur - Les différences entre RMI Proxy et HTTP Tunneling
- Conclusion
4Introduction
- RMI (Remote Method Invocation)
- est un système distribué
- une ou plusieurs applications peuvent sexécuter
sur une ou plusieurs machines - Aucun problème sil ny a aucun firewall entre
les deux parties communiquantes
5Problématique
- 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. - Solutiontechniques de tunneling, RMI Proxy ou
encore dautres peuvent être utilisées.
6HTTP Tunneling
- Principe de baseUtiliser 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. - PrincipeLe 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).
7HTTP Tunneling (2)
- Le HTTP tunneling est divisé en trois parties
- Le Client Envoie une requête au serveur web
- Le servletTransmet la requête à la socket du
serveur RMI en préservant la structure HTTP qui a
été envoyée par le client - Le serveurTransforme automatiquement lenvoi
HTTP en une commande JRMP
8HTTP Tunneling (3)
9Comment 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. - 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.
10Straté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. - é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.
11Straté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). - 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.
12Naming 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. - 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é.
13Naming Services (2)
14Limplé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) - 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 ?forwardport 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. - Sun créa ensuite un servlet qui fournit les mêmes
fonctionnalités que le script CGI.
15Le code du servlet
- Deux classes principales SimplifiedServletHandler
et ServletForwardCommand - SimplifiedServletHandlerCette classe étend
HTTPServlet. Elles reçoit les requêtes et
effectue un validation préliminaire. - ServletForwardCommandCest 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.
16Le code du servlet (2)
- 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() - if (command.equalsIgnoreCase("forward"))
try
LoggingServletForwardCommand.exec
ute(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)
17Le code du servlet (3)
- 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). - ServletForwardCommand transmet le message sans
décoder les données ou comprendre le message - socketOut new DataOutputStream(connectionToLo
calServer.getOutputStream()) socketOut.writeByte
s("POST / HTTP/1.0\r\n") socketOut.writeBytes("C
ontent-length " request.getContentLength()
"\r\n\r\n") socketOut.write(buffer)
socketOut.flush() - OutputStream out response.getOutputStream()out
.write(buffer)out.flush()
18Modifications à 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. - 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(
))
19Configuration du fichier policy
- 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 - permission java.net.SocketPermission
"1024-65535","connect,accept" - 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 - permission java.lang.RuntimePermission
"setFactory"
20Exemple de requête RMI
21Seconde technique
22Les 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. - 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. - Préserver toutes les propriétés de 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.
23Les 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 capable de
- Bloquer laccès aux protocoles non-JRMP
- Contrô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 le transfert de code par le
service du codebase RMI, dans les deux directions
24Le contrôle daccès
- 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 est capable dêtre contre les actions
suivantes - Laccès à certain objet
- Bind, rebind ou unbind certain nom
- Lexécution de certaines méthodes distantes
- Chercher certains noms dans la proxy registry
25Larchitecture
- Composants importants
- 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. - Sous-composants
- La proxy registry
- RMI registry normale qui est soumise aux règles
de contrôles daccès fournis par limplémentation
du serveur RMIProxy - Un 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
26Fonctionnement de RMI 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. - 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.
27RMI 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. - Chacun doit ouvrir un port au trafique RMI,
lequel est ensuite manipulé dun manière
sécurisée par le RMI proxy associé.
28LAPI côté client et serveur
- Le client est derrière plusieurs firewall -gt
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
29Limitations du RMI Proxy
- Activation
- Limplémentation actuelle réécrit les stubs
activables comme des stubs unicast normaux - Stubs cachés
- Neffectue pas darrangement proxying pour les
stubs cachés (Stubs à lintérieur de
MarshalledObjects) - Socket Factories
- Socket factories ne sont actuellement pas
supportées - GetClientHost
- RmoteServer.getClientHost retourne lInetAddress
du RMI Proxy le plus proche et non le vrai client
RMI - RMI/IIOP (Internet Inter-Orb Protocol)
- Ne supporte pas les stubs RMI/IIOP
- Stubs distants indirectes
- Petite modification nécessaire dans la classe
sun.rmi.MarshalOutputStream pour traiter les
stubs distants indirectes
30Les 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. - Exemple de code ProxyNaming.bind( rmi//localh
ost/ 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. - 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
- Exemple Rmi.proxyHostrmi//proxy.clientlan0.cl
ient.com - Configurer le fichier policy du client et du
serveur. - Installer ProxyBoot.jar, ProxyMain.jar et
RMIProxy.policy sur chaque machine proxy.
31Les différences entre RMI Proxy et HTTP Tunneling
32Conclusion
- 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.
33QUESTION?