Remote Method Invocation (RMI) - web.fe.up.ptweb.fe.up.pt/~pfs/aulas/sd2009/at/78rmi_handout.pdf ·...
Transcript of Remote Method Invocation (RMI) - web.fe.up.ptweb.fe.up.pt/~pfs/aulas/sd2009/at/78rmi_handout.pdf ·...
Remote Method Invocation (RMI)
November 1 2009
Sumaacuterio
RMIConceitoImplementaccedilatildeoExemplos
Java RMICaracteriacutesticasObjectos Remotos e Interfaces RemotasImplementaccedilatildeo de Java RMIArgumentos e serializaccedilatildeoTransferecircncia de coacutedigoLocalizaccedilatildeo de objectos remotosSeguranccedilaTempo de vida dum objecto remotoPassos no desenvolvimento de aplicaccedilotildeesTransferecircncia de coacutedigo
Sumaacuterio
RMIConceitoImplementaccedilatildeoExemplos
Java RMICaracteriacutesticasObjectos Remotos e Interfaces RemotasImplementaccedilatildeo de Java RMIArgumentos e serializaccedilatildeoTransferecircncia de coacutedigoLocalizaccedilatildeo de objectos remotosSeguranccedilaTempo de vida dum objecto remotoPassos no desenvolvimento de aplicaccedilotildeesTransferecircncia de coacutedigo
RMI e RPC
I RPC significou um passo muito grande em direcccedilatildeo agravetransparecircncia de distribuiccedilatildeo na programaccedilatildeo
I a maior parte do coacutedigo que mostra a natureza distribuiacutedada aplicaccedilatildeo pode ser
I gerada automaticamente pex por rpcgenI ldquoisoladardquo da parte restante do coacutedigo
I o coacutedigo (texto) a desenvolver pelo programadorpraticamente natildeo depende da distribuiccedilatildeo e oprogramador pode quase ignoraacute-la
I embora esta praacutetica seja questionaacutevelI Com a adopccedilatildeo generalizada da programaccedilatildeo baseada
em objectos estender RPCs a objectos era inevitaacutevelRMI (Remote Method Invocation) eacute RPC baseada emobjectos
Programaccedilatildeo Distribuiacuteda Baseada em ObjectosI O conceito de objecto eacute especialmente adaptado para
aplicaccedilotildees distribuiacutedasI Um objecto agrega os dados e as operaccedilotildees que operam
sobre esses dadosI Objectos podem residir em diferentes computadores
ligados por uma redeI A interaccedilatildeo entre objectos eacute feita atraveacutes de invocaccedilatildeo
remota de meacutetodos (remote method invocation) ie RPCpara objectos
MetodosDados
Objecto
MetodosDados
Objecto
MetodosDados
Objecto
MetodosDados
Objecto
Computador 2Computador 1
Invocaccedilatildeo Local vs Invocaccedilatildeo Remota
Local MI
Remote MI
process
object
host
I Um caso particular da invocaccedilatildeo remota envolve objectosem processos diferentes do mesmo computador
I Note-se que cada objecto reside apenas num processoie o estado dos objectos natildeo eacute distribuiacutedo
Transparecircncia do Cliente e Proxy-Objects
I A invocaccedilatildeo dum meacutetodo num objecto remoto deveraacute serfeita de modo semelhante agrave invocaccedilatildeo dum meacutetodo numobjecto local
I Com RPCs o truque eacute invocar uma funccedilatildeo local ndash o clientstub ndash a qual se encarrega da comunicaccedilatildeo entreprocessos
I Com RMI o truque eacute invocar o meacutetodo sobre um objectolocal ndash o proxy objectndash o qual natildeo executa o meacutetodo masencarrega-se de o passar ao objecto remoto
Transparecircncia do Lado do Servidor e Skeletons
I A transparecircncia do lado do servidor eacute conseguida comrecurso ao conceito de skeleton
I O skeleton eacute um objecto queI extrai (unmarshals) os argumentos da mensagem recebida
e invoca o meacutetodo apropriado do objecto invocado (local)I constroacutei a mensagem resposta com os resultados da
invocaccedilatildeo do meacutetodo e envia-la
RMI Arquitectura de Implementaccedilatildeo
Server machine
Object
Client machine
Proxy
Sameinterfaceas object
Interface
State
MethodClientinvokesa method
Network
Skeletoninvokessame methodat object
Marshalled invocationis passed across network
Client OS Server OS
Server
Skeleton
Client
I Alternativamente a funcionalidade do skeleton pode serimplementada pela classe do objecto remoto
RMI - Exemplos
CORBA RMI Heterogeneidade eacute a caracteriacutestica distintivaI O objecto e o cliente podem ser implementados
usando linguagens diferentesI Para o efeito CORBA define uma Interface Definition
Language (IDL) funcionalmente anaacuteloga a RPCLI CORBA suporta inclusivamente linguagens
natildeo-baseadas em objectos como C ou Cobol
Java RMI Dependente da linguagem
Sumaacuterio
RMIConceitoImplementaccedilatildeoExemplos
Java RMICaracteriacutesticasObjectos Remotos e Interfaces RemotasImplementaccedilatildeo de Java RMIArgumentos e serializaccedilatildeoTransferecircncia de coacutedigoLocalizaccedilatildeo de objectos remotosSeguranccedilaTempo de vida dum objecto remotoPassos no desenvolvimento de aplicaccedilotildeesTransferecircncia de coacutedigo
Java RMI Caracteriacutesticas (12)
I ldquoIntegradardquo na linguagem JavaI mais faacutecil de usar ndash natildeo haacute necessidade de usar
linguagens de especificaccedilatildeo de interfaces pex InterfaceDefinition Language (IDL) em CORBA
I Invocaccedilatildeo de meacutetodos remotos usa a mesma sintaxe quea invocaccedilatildeo de meacutetodos locais mas
I Distribuiccedilatildeo dos objectos eacute exibida intencionalmenteI a invocaccedilatildeo dum meacutetodo remoto pode assinalar uma
excepccedilatildeo RemoteExceptionI para que os meacutetodos dum objecto possam ser invocados
remotamente a classe correspondente deveraacute implementaruma interface remota
Java RMI Caracteriacutesticas (22)
I Benificia da mobilidade deI coacutedigo (classes)I objectos
entre computadores suportada por JavaI Distributed Garbage Collection
I um objecto ldquodesaparecerdquo automaticamente quando natildeopode ser acedido
Objectos Remotos e Interfaces Remotas
I Objectos remotos satildeo objectos cujos meacutetodos podem serinvocados duma JVM diferente daquela onde residem
I Um objecto remoto tem que implementar uma interfaceremota ie o seu tipo eacute um subtipo da interface Remote
I Permite que o compilador de Java gere o coacutedigonecessaacuterio para realizar a comunicaccedilatildeo entre objectos emJVMs distintas
I A natildeo-localidade dum objecto remoto eacute exposta aosprogramadores dos ldquoclientesrdquo
I Todos os meacutetodos da interface Remote tecircm que assinalarRemoteExceptions
I Um objecto remoto pode incluir meacutetodos natildeo invocaacuteveisremotamente
I Soacute meacutetodos declarados em interfaces remotas podem serinvocados remotamente
Remote Interface Exemplo
I A interface remota dum ldquoservidor de ecordquo pode serimport javarmiRemoteimport javarmiRemoteException
public interface Echo extends Remote String echo(String str) throws RemoteException
I Esta interface suporta um uacutenico meacutetodo remoto echo oqual retorna a string que lhe eacute passada como argumento
I O meacutetodo echo dum objecto que implemente estainterface pode ser invocado remotamente
I Ie pode ser invocado por um objecto a executar numamaacutequina virtual de Java (JVM) diferente
Acesso a Objectos Remotos
I Para usar um objecto remoto um cliente tem queconhecer a interface remota desse objecto
I ie os meacutetodos desse objecto que podem ser invocadosremotamente
I A sintaxe de invocaccedilatildeo de meacutetodos remotos eacute semelhanteagrave de invocaccedilatildeo de meacutetodos locaisEcho montanha = lookup montanhaString ecotry
eco = montanhaecho(lsquolsquoUh Uhrsquorsquo) catch ( RemoteException e)
I Contudo os clientes tecircm que processar excepccedilotildees do tipoRemoteException
Exemplo Implementaccedilatildeo da interface Echo
import javarmiimport javarmiserverUnicastRemoteObject
public class Echo_Impl extends UnicastRemoteObjectimplements Echo
public Echo_Impl() throws RemoteException
super() Actually this is not needed
public String echo(String str) return str
Java RMI e a JVM
I A JVM natildeo conhece objectos remotosI A JVM soacute suporta a invocaccedilatildeo de meacutetodos sobre objectos
locaisI Java RMI eacute uma camada de SW sobre a JVM natildeo faz
parte delaI Java RMI implementa RMI usando os mecanismos do
costumeI stubs do lado do clienteI skeletons do lado do servidor
Java RMI Stubs
I Em Java RMI o stub dum objecto remoto eacute um objectolocal (em relaccedilatildeo ao cliente) que representa esse objectoremoto
I Daiacute a designaccedilatildeo comum de proxy objectI Uma referecircncia remota eacute de facto uma referecircncia para o
stub correspondente O stub dum objecto remotoI implementa a sua interface remotaI conteacutem o seu ldquoendereccedilordquo
I Essencialmente as tarefas executadas pelo stub satildeo1 ldquomarshallingrdquo dos argumentos do meacutetodo2 envio do pedido de execuccedilatildeo do meacutetodo atraveacutes da ldquorederdquo3 recepccedilatildeo da resposta4 ldquounmarshallingrdquo do resultado da invocaccedilatildeo
Java RMI Servers (12)
I Na primeira versatildeo de Java RMI a funcionalidade do ladodo objecto remoto foi repartida por 2 tipos de objectos
I objectos do tipo RemoteServer ndash executam oprocessamento que eacute independente da interface remota
I pex esperar pela recepccedilatildeo de pedidos de invocaccedilatildeoI objectos do tipo skeleton ndash executam o processamento
que depende da interface remotaI unmarshalling dos argumentosI invocaccedilatildeo do meacutetodo do objecto remotoI marshalling dos resultados
Java RMI Servers (22)
I A partir de Java 12 objectos do tipo skeleton deixaram deser necessaacuterios
I objectos do tipo RemoteServer passaram a ser capazesde fazer tambeacutem as tarefas dos skeleton
I Java RMI oferece a classe UnicastRemoteObject aqual estende RemoteServer e oferece funcionalidademiacutenima para aplicaccedilotildees baseadas em RMI
I O objecto termina quando o processo que o criou terminaI Usa TCP na comunicaccedilatildeo com os clientes
Argumentos de Meacutetodos Remotos
I Os argumentos de ou o valor retornado por um meacutetodoremoto podem ser
1 tipos simples Por exemplo boolean char byte shortint long float ou double
2 objectos remotos ie que implementam a interfaceRemote
3 objectos locais serializaacuteveis ie que implementam ainterface Serializable (incluindo Strings e arrays)
I No caso de objectos locais RMI passa uma coacutepia doobjecto
I como o objecto eacute serializaacutevel tal eacute possiacutevelI note-se que Java RMI natildeo ldquoactualizardquo o objecto passado
caso o meacutetodo remoto o tenha modificadoI Atenccedilatildeo Uma referecircncia para um objecto remoto eacute de
facto uma referecircncia para o objecto proxy respectivo
Objectos Remotos vs Objectos Serializaacuteveis
Local objectO1
Copy of O1
Remote objectO2
Localreference L1
New localreference
Remotereference R1
Remoteinvocation withL1 and R1 asparameters
Copy of R1 to O2
Machine A Machine B
Machine C
Client code withRMI to server at C(proxy)
Server code(method implementation)
I Na praacutetica eacute como se objecto remoto O2 fosse passadopor referecircncia enquanto que o objecto local (serializaacutevel)O1 eacute passado por valor
I Semacircnticas diferentes transparecircncia ldquoturvardquo
Serializaccedilatildeo em Java (12)I Java RMI usa o mecanismo de serializaccedilatildeo de Java para
passar os argumentos e o valor retornadoI Em Java serializaccedilatildeo dum objecto consiste na conversatildeo
desse objecto numa sequecircncia de bytes de modo apermitir
I o seu armazenamento no disco para posteriorreincarnaccedilatildeo
I ou a sua migraccedilatildeo para uma outra JVMI A reconstituiccedilatildeo dum objecto a partir da sua
representaccedilatildeo serializada designa-se por deserializaccedilatildeoI Para que um objecto seja serializaacutevel deveraacute implementar
a interface javaioSerializableI A JVM implementa um procedimento de serializaccedilatildeo por
omissatildeo que pode ser usado pela grande maioria dosobjectos
I desde que a definiccedilatildeo da sua classe declare queimplementa a interface javaioSerializable
Serializaccedilatildeo em Java (22)
I Se um objecto tiver campos que satildeo referecircncias paraoutros objectos estes uacuteltimos deveratildeo ser serializaacuteveispara que o primeiro tambeacutem o seja
I para serializar o primeiro objecto haacute que serializar osoutros
I cada objecto soacute eacute serializado uma vez mesmo que sejareferenciado muacuteltiplas vezes
I Por razotildees de eficiecircncia os meacutetodos duma classe natildeo satildeoincluiacutedos na sequecircncia de bytes criada pela serializaccedilatildeo
I a JVM inclui apenas um identificador da classe a que oobjecto pertence
Class Downloading em Java e RMI
Problema Como eacute que um meacutetodo remoto pode invocar omeacutetodo dum objecto natildeo remoto que lhe eacute passado comoargumento
I Os meacutetodos dum objecto natildeo fazem parte da suarepresentaccedilatildeo serializada
Soluccedilatildeo Usando as facilidades de transferecircncia de coacutedigo emJava
I Note-se que esta transferecircncia pode natildeo sernecessaacuteria se a classe estiver disponiacutevel localmente
A capacidade de transferecircncia de classes atraveacutes da redepode tambeacutem ser usada pelo cliente para carregar o proxyobject
I natildeo haacute necessidade de manter todas as classes emtodos os computadores
Localizaccedilatildeo dum Objecto
I O acesso a um objecto remoto eacute feito usando uma referecircnciapara um proxy desse objecto
montanhaecho()
Problema como eacute que se obteacutem uma referecircncia remota ie para oproxy dum objecto remoto
I Tecnicamente atraveacutes do valor de retorno dum meacutetodo
Soluccedilatildeo semelhante ao portmapper de RPC
I Java RMI oferece um serviccedilo de nomes baacutesico ormiregistry
I O rmiregistry eacute um programa e tem que executar noscomputadores que disponibilizam objectos remotos
I O ldquoservidorrdquo regista o objecto com um nome (binds) normiregistry local
I O ldquoclienterdquo solicita uma referecircncia para um objecto remotoao rmiregistry no computador onde o objecto reside
O rmiregistry e a Interface Registry
I O rmiregistry eacute uma aplicaccedilatildeo que implementa ainterface Registryvoid rebind(String name Remote obj)void bind(String name Remote obj)void unbind(String name Remote obj)Remote lookup(String name)String []list()
I Se incorrectamente usado o rmiregistry pode impediro uso de classes ldquoimportadasrdquo
If you do start the rmiregistry and it can find your stubclasses in CLASSPATH it will not remember that theloaded stub class can be loaded from your serverrsquos codebase[] do Tutorial on-line da Sun sobre RMI
A classe Naming
I Permite aceder a objectos que implementam RegistryI Suporta os seguintes meacutetodos
void rebind(String name Remote obj)void bind(String name Remote obj)void unbind(String name Remote obj)Remote lookup(String name)String []list()
ondename eacute um URL sem o meacutetodo de acesso
computerNameportobjectNamesendo computerNameport a ldquolocalizaccedilatildeordquo do
rmiregistryI bind() difere de rebind() na medida em que assinala
uma excepccedilatildeo se name jaacute tiver sido registadoI O rmregistry natildeo eacute um servidor global
I O cliente tem que saber onde se encontra o objecto
Exemplo Registo e Localizaccedilatildeo do ObjectoI O servidor tem que registar o objecto remoto
Echo montanhatry
montanha = new Echo_Impl()Namingrebind(lsquolsquoalpesrsquorsquo montanha)
catch ( RemoteException e)
I O cliente tem que o localizar (em i01co2213)Echo montanhatry
montanha = Naminglookup(lsquolsquoi01co2213alpesrsquorsquo)
catch ( RemoteException e) Naminglookup() is RMI
Arquitectura de Java RMI
RMI Client
Web server
RMIregistry
RMI server
1 register object
3 return object reference
2 lookup object
4 request stub class
5 return stub class
6 remote invocation
7 return result
RMI e Seguranccedila
Problema Java RMI pode exigir a transferecircncia de coacutedigo(classes) de maacutequinas remotas
I este coacutedigo eacute uma potencial ameaccedila agrave seguranccedilaSoluccedilatildeo Usar um Security Manager
I um objecto que controla o acesso aos recursos locais
I Java 10 suportava um modecirclo de seguranccedila do tiposandbox
I Coacutedigo local natildeo tinha restriccedilotildees para aleacutem das impostaspelo SO
I Coacutedigo importado soacute podia aceder aos recursos (limitados)disponiacuteveis na sandbox
I A partir de Java 12 pode-se sujeitar todo o coacutedigoindependentemente de ser ou natildeo local a controlo deacesso sendo este determinado pela security policy emvigor
Poliacutetica de Seguranccedila (Security Policy) e Permissotildees
I A poliacutetica de seguranccedila define as permissotildees de coacutedigocom base na sua origem sendo configuraacutevel quer peloutilizador quer pelo administrador
I Cada permissatildeo especifica o tipo de acesso permitido aum determinado recurso tal como
I Lecircr ou escrever um ficheiro ou directoacuterioI Estabelecer uma conexatildeo para um determinado endereccedilo
IP e portoI Algumas operaccedilotildees sobre a proacutepria JVM requerem
permissotildeesI Substituir o ClassLoaderI Substituir o SecurityManagerI Alterar a poliacutetica de seguranccedila
Permissotildees
I Internamente permissotildees satildeo objectos PexI javaioFilePermission
I Uma permissatildeo tipicamente temNome que identifica o recurso a que se aplicaLista de acccedilotildees que especifica as operaccedilotildees permitidas
permissatildeo nome lista de acccedilotildeesjavaioFilePermission ldquousrlib-rdquo ldquoread executerdquojavanetSocketPermission ldquoabccom54321rdquo ldquoconnectrdquojavasecuritySecurityPermission ldquosetPolicyrdquojavalangRuntimePermission ldquocreateClassLoaderrdquojavalangRuntimePermission ldquosetSecurityManagerrdquo
I Uma poliacutetica de seguranccedila eacute um conjunto de permissotildeesque determinam que operaccedilotildees um segmento de coacutedigopode executar
I Naturalmente a poliacutetica de seguranccedila eacute representada porum objecto (javasecurityPolicy)
Inicializaccedilatildeo do javasecurityPolicy
I Na implementaccedilatildeo referecircncia este objecto pode serinicializado a partir de vaacuterios ficheiros de configuraccedilatildeo Poromissatildeo usa
I Um ficheiro de configuraccedilatildeo para todo o sistema$javahomelibsecurityjavapolicy
I Um ficheiro de configuraccedilatildeo por utilizador~javapolicy
I O ficheiro de configuraccedilatildeo das propriedades de seguranccedilapermite especificar ainda outros ficheiros de configuraccedilatildeo
$javahomelibsecurityjavasecurity
I O ficheiro com a poliacutetica de seguranccedila pode ainda serespecificado quando da invocaccedilatildeo da JVM
java -Djavasecuritypolicy=somefile I Se a propriedade policyallowSystemProperty o
permitir ndash pode ser activada no ficheiro de configuraccedilatildeodas propriedades de seguranccedila
Sintaxe dos Ficheiros de Poliacuteticas
I Consiste numa lista de elementos (entries)keystore eacute opcional (natildeo usaremos pelo menos para
jaacute)grant clausuacutela usada para especificar as permissotildees de
coacutedigo de acordo com algumas propriedades(consideraremos apenas a sua origem)
I Tem o seguinte formato (de facto omite regras)
grant [codebase ltURLgt] permission ltclass_namegt lttargetgt [ ltactiongt]
onde
codebase especifica a origem do coacutedigo
permission especifica uma permissatildeo podendo umelemento grant incluir vaacuterias permissotildees
I Pode ocorrer uma ou mais vezes
Sintaxe dos Ficheiros de Poliacuteticas Exemplos
grant permission javanetSocketPermission 1024-
connectacceptpermission javanetSocketPermission abccom
connectacceptpermission javaioFilePermission
homeannpublic_htmlclasses- readpermission javaioFilePermission
homejonespublic_htmlclasses- read
grant codeBase httppaginasfeuppt~ei77777classes permission javasecurityAllPermission
I policytool eacute uma aplicaccedilatildeo que faz parte do J2SDKque oferece um GUI para auxiliar a ediccedilatildeo de ficheiros depoliacuteticas
Security Manager (12)
I O Security Manager eacute um objecto que garante ocumprimento da poliacutetica de seguranccedila
I Consiste apenas num conjunto de meacutetodos tais comopublic void checkPermission(Permission perm)
throws SecurityException
public void checkCreateClassLoader( )throws SecurityException
I Normalmente um thread soacute pode executar uma operaccedilatildeose todos os meacutetodos activos que invocou tiverempermissatildeo para a executar
I Tipicamente essa decisatildeo eacute baseada na origem do coacutedigoI Estes meacutetodos satildeo invocados por outros objectos quando
executam certas operaccedilotildeesI O Security Manager eacute um Reference Monitor
Security Manager (22)
I O SecurityManager natildeo eacute instalado por omissatildeoI A instalaccedilatildeo do SecurityManager pode ser feita
I Pelo interpretador (JVM)java -Djavasecuritymanager
I Pelo coacutedigoSystemsetSecurityManager(new SecurityManager())
I A poliacutetica imposta pelo SecurityManager pode serconfigurada atraveacutes dos ficheiros de especificaccedilatildeo daSecurityPolicy
I O coacutedigo do sistema invoca os meacutetodos checkXXX doSecurityManager se este estiver instalado
I Estes meacutetodos por sua vez invocam o meacutetodocheckPermission() do AccessController
Access Controller
I A partir de Java 12 ojavasecurityAccessController eacute a classe quede facto garante o cumprimento da poliacutetica de seguranccedila
I Por concepccedilatildeo eacute mais faacutecil flexiacutevel que oSecurityManager e estaacute sempre instalado (soacute static)
I Implementa uma poliacutetica razoavelmente restritiva que podeser usada na maioria dos casos
I Naturalmente pode invocar-se directamente da aplicaccedilatildeoos meacutetodos do AccessControllerFilePermission perm = new FilePermission(tmptestFile read)AccessControllercheckPermission(perm)
I Se a poliacutetica de seguranccedila implementada peloAccessController natildeo focircr adequada pode seradaptada criando subclasses dojavalangSecurityManager
I Estas subclasses devem invocar os meacutetodos doAccessController sempre que tal faccedila sentido
javarmiRMISecurityManager
I javarmiRMISecurityManager eacute uma sua subclassedo javalangSecurityManager
I Implementa exactamente os mesmos meacutetodosI O RMISecurityManager deve ser usado com RMI
sempre que haacute necessidade de transferir coacutedigo dumcomputador remoto
I O RMI class loader recusa-se a carregar qualquer classese natildeo houver um Security Manager
I O RMISecurityManager pode ser instalado de 2 modos
I Atraveacutes do coacutedigoSystemsetSecurityManager(new RMISecurityManager())
I Atraveacutes da linha de comandojava -Djavasecuritymanager=javarmiRMISecurityManager
Arquitectura de Seguranccedila em Java
I O Security Manager natildeo eacute a histoacuteria toda
Classrepository
Classverifier
Loadedclassobject
Java interpreter
Java program
Requestclass
Select appropriate loader
Loader forremoteclasses
Loader forlocal
classes
Classrepository
Remote siteLocal site
Tempo de Vida dum Objecto Remoto
I A vida dum objecto chega ao fim quando deixa de serreferenciado
I sem qualquer referecircncia para o objecto natildeo eacute possiacutevelaceder-lhe
I Para objectos locaisI o garbage collector da JVM automaticamente detecta
quando um objecto deixa de ser referenciado e liberta osrecursos
I quando a JVM termina todos os objectos locais terminamI Para objectos remotos
I as diferentes JVMs executam um algoritmo distribuiacutedo parafazer garbage collection
I quando uma JVM termina objectos remotos por elacriados podem natildeo terminar Por exemplo
I o RMIregistry manteacutem uma referecircncia para todos osobjectos nele registados
Passos no Desenvolvimento com Java RMI1 Concepccedilatildeo e implementaccedilatildeo de servidor e clientes
I Definiccedilatildeo da interface remota ie dos meacutetodos que podemser invocados remotamente
I Implementaccedilatildeo de objectos remotos os quais devemimplementar a interface remota definida
I Implementaccedilatildeo de clientes2 Compilaccedilatildeo do coacutedigo e geraccedilatildeo de stubs
I a compilaccedilatildeo do coacutedigo eacute feita usando javacI os stubs a usar pelo cliente podem ser gerados usando ormic a partir do ficheiro class da implementaccedilatildeo
rmic Echo_Impl
Nota A partir de Java 50 Java RMI suporta a geraccedilatildeodinacircmica de stubs
3 Disponibilizaccedilatildeo do coacutedigo por exemplo num servidorHTTP
I classes que precisem ser carregadas (downloaded)incluindo os stubs devem ser disponibilizadas num servidorHTTP
RMI e Uploaded Code
I Aplicaccedilotildees (clientes ou servidores) que podem transferircoacutedigo deveratildeo instalar um Security Manager import javarmipublic class Echo_Client public static void main(String[] args)
if(argslength = 2) Systemoutprintln(Usage java Echo_Client +
srv_hostname obj_name)return
SystemsetSecurityManager(new RMISecurityManager())try
I Se o coacutedigo do stub pode ser uploaded haacute que inicializar apropriedade javarmiservercodebase na aplicaccedilatildeoservidora pexjava -Djavarmiservercodebase=httpweb~pfsecho_server
I Atenccedilatildeo ao rmiregistry
Arquitectura de Java RMI
RMI Client
Web server
RMIregistry
RMI server
1 register object
3 return object reference
2 lookup object
4 request stub class
5 return stub class
6 remote invocation
7 return result
Sumaacuterio
RMIConceitoImplementaccedilatildeoExemplos
Java RMICaracteriacutesticasObjectos Remotos e Interfaces RemotasImplementaccedilatildeo de Java RMIArgumentos e serializaccedilatildeoTransferecircncia de coacutedigoLocalizaccedilatildeo de objectos remotosSeguranccedilaTempo de vida dum objecto remotoPassos no desenvolvimento de aplicaccedilotildeesTransferecircncia de coacutedigo
Leitura Adicional
I Capiacutetulo 10 de Tanenbaum e van Steen DistributedSystems 2nd Ed
I Secccedilatildeo 101 Architecture excepto Subsecccedilatildeo 1013I Secccedilatildeo 103 Communication excepto Subsecccedilatildeo 1035
I Java RMI Specification da SunI Java Security Overview da Sun Secccedilotildees 1 2 e 8I Security Policy in Java SE 6 da SunI Permissions in Java SE 6 da Sun
- RMI
-
- Conceito
- Implementaccedilatildeo
- Exemplos
-
- Java RMI
-
- Caracteriacutesticas
- Objectos Remotos e Interfaces Remotas
- Implementaccedilatildeo de Java RMI
- Argumentos e serializaccedilatildeo
- Transferecircncia de coacutedigo
- Localizaccedilatildeo de objectos remotos
- Seguranccedila
- Tempo de vida dum objecto remoto
- Passos no desenvolvimento de aplicaccedilotildees
- Transferecircncia de coacutedigo
-
- Leitura Adicional
-
Sumaacuterio
RMIConceitoImplementaccedilatildeoExemplos
Java RMICaracteriacutesticasObjectos Remotos e Interfaces RemotasImplementaccedilatildeo de Java RMIArgumentos e serializaccedilatildeoTransferecircncia de coacutedigoLocalizaccedilatildeo de objectos remotosSeguranccedilaTempo de vida dum objecto remotoPassos no desenvolvimento de aplicaccedilotildeesTransferecircncia de coacutedigo
RMI e RPC
I RPC significou um passo muito grande em direcccedilatildeo agravetransparecircncia de distribuiccedilatildeo na programaccedilatildeo
I a maior parte do coacutedigo que mostra a natureza distribuiacutedada aplicaccedilatildeo pode ser
I gerada automaticamente pex por rpcgenI ldquoisoladardquo da parte restante do coacutedigo
I o coacutedigo (texto) a desenvolver pelo programadorpraticamente natildeo depende da distribuiccedilatildeo e oprogramador pode quase ignoraacute-la
I embora esta praacutetica seja questionaacutevelI Com a adopccedilatildeo generalizada da programaccedilatildeo baseada
em objectos estender RPCs a objectos era inevitaacutevelRMI (Remote Method Invocation) eacute RPC baseada emobjectos
Programaccedilatildeo Distribuiacuteda Baseada em ObjectosI O conceito de objecto eacute especialmente adaptado para
aplicaccedilotildees distribuiacutedasI Um objecto agrega os dados e as operaccedilotildees que operam
sobre esses dadosI Objectos podem residir em diferentes computadores
ligados por uma redeI A interaccedilatildeo entre objectos eacute feita atraveacutes de invocaccedilatildeo
remota de meacutetodos (remote method invocation) ie RPCpara objectos
MetodosDados
Objecto
MetodosDados
Objecto
MetodosDados
Objecto
MetodosDados
Objecto
Computador 2Computador 1
Invocaccedilatildeo Local vs Invocaccedilatildeo Remota
Local MI
Remote MI
process
object
host
I Um caso particular da invocaccedilatildeo remota envolve objectosem processos diferentes do mesmo computador
I Note-se que cada objecto reside apenas num processoie o estado dos objectos natildeo eacute distribuiacutedo
Transparecircncia do Cliente e Proxy-Objects
I A invocaccedilatildeo dum meacutetodo num objecto remoto deveraacute serfeita de modo semelhante agrave invocaccedilatildeo dum meacutetodo numobjecto local
I Com RPCs o truque eacute invocar uma funccedilatildeo local ndash o clientstub ndash a qual se encarrega da comunicaccedilatildeo entreprocessos
I Com RMI o truque eacute invocar o meacutetodo sobre um objectolocal ndash o proxy objectndash o qual natildeo executa o meacutetodo masencarrega-se de o passar ao objecto remoto
Transparecircncia do Lado do Servidor e Skeletons
I A transparecircncia do lado do servidor eacute conseguida comrecurso ao conceito de skeleton
I O skeleton eacute um objecto queI extrai (unmarshals) os argumentos da mensagem recebida
e invoca o meacutetodo apropriado do objecto invocado (local)I constroacutei a mensagem resposta com os resultados da
invocaccedilatildeo do meacutetodo e envia-la
RMI Arquitectura de Implementaccedilatildeo
Server machine
Object
Client machine
Proxy
Sameinterfaceas object
Interface
State
MethodClientinvokesa method
Network
Skeletoninvokessame methodat object
Marshalled invocationis passed across network
Client OS Server OS
Server
Skeleton
Client
I Alternativamente a funcionalidade do skeleton pode serimplementada pela classe do objecto remoto
RMI - Exemplos
CORBA RMI Heterogeneidade eacute a caracteriacutestica distintivaI O objecto e o cliente podem ser implementados
usando linguagens diferentesI Para o efeito CORBA define uma Interface Definition
Language (IDL) funcionalmente anaacuteloga a RPCLI CORBA suporta inclusivamente linguagens
natildeo-baseadas em objectos como C ou Cobol
Java RMI Dependente da linguagem
Sumaacuterio
RMIConceitoImplementaccedilatildeoExemplos
Java RMICaracteriacutesticasObjectos Remotos e Interfaces RemotasImplementaccedilatildeo de Java RMIArgumentos e serializaccedilatildeoTransferecircncia de coacutedigoLocalizaccedilatildeo de objectos remotosSeguranccedilaTempo de vida dum objecto remotoPassos no desenvolvimento de aplicaccedilotildeesTransferecircncia de coacutedigo
Java RMI Caracteriacutesticas (12)
I ldquoIntegradardquo na linguagem JavaI mais faacutecil de usar ndash natildeo haacute necessidade de usar
linguagens de especificaccedilatildeo de interfaces pex InterfaceDefinition Language (IDL) em CORBA
I Invocaccedilatildeo de meacutetodos remotos usa a mesma sintaxe quea invocaccedilatildeo de meacutetodos locais mas
I Distribuiccedilatildeo dos objectos eacute exibida intencionalmenteI a invocaccedilatildeo dum meacutetodo remoto pode assinalar uma
excepccedilatildeo RemoteExceptionI para que os meacutetodos dum objecto possam ser invocados
remotamente a classe correspondente deveraacute implementaruma interface remota
Java RMI Caracteriacutesticas (22)
I Benificia da mobilidade deI coacutedigo (classes)I objectos
entre computadores suportada por JavaI Distributed Garbage Collection
I um objecto ldquodesaparecerdquo automaticamente quando natildeopode ser acedido
Objectos Remotos e Interfaces Remotas
I Objectos remotos satildeo objectos cujos meacutetodos podem serinvocados duma JVM diferente daquela onde residem
I Um objecto remoto tem que implementar uma interfaceremota ie o seu tipo eacute um subtipo da interface Remote
I Permite que o compilador de Java gere o coacutedigonecessaacuterio para realizar a comunicaccedilatildeo entre objectos emJVMs distintas
I A natildeo-localidade dum objecto remoto eacute exposta aosprogramadores dos ldquoclientesrdquo
I Todos os meacutetodos da interface Remote tecircm que assinalarRemoteExceptions
I Um objecto remoto pode incluir meacutetodos natildeo invocaacuteveisremotamente
I Soacute meacutetodos declarados em interfaces remotas podem serinvocados remotamente
Remote Interface Exemplo
I A interface remota dum ldquoservidor de ecordquo pode serimport javarmiRemoteimport javarmiRemoteException
public interface Echo extends Remote String echo(String str) throws RemoteException
I Esta interface suporta um uacutenico meacutetodo remoto echo oqual retorna a string que lhe eacute passada como argumento
I O meacutetodo echo dum objecto que implemente estainterface pode ser invocado remotamente
I Ie pode ser invocado por um objecto a executar numamaacutequina virtual de Java (JVM) diferente
Acesso a Objectos Remotos
I Para usar um objecto remoto um cliente tem queconhecer a interface remota desse objecto
I ie os meacutetodos desse objecto que podem ser invocadosremotamente
I A sintaxe de invocaccedilatildeo de meacutetodos remotos eacute semelhanteagrave de invocaccedilatildeo de meacutetodos locaisEcho montanha = lookup montanhaString ecotry
eco = montanhaecho(lsquolsquoUh Uhrsquorsquo) catch ( RemoteException e)
I Contudo os clientes tecircm que processar excepccedilotildees do tipoRemoteException
Exemplo Implementaccedilatildeo da interface Echo
import javarmiimport javarmiserverUnicastRemoteObject
public class Echo_Impl extends UnicastRemoteObjectimplements Echo
public Echo_Impl() throws RemoteException
super() Actually this is not needed
public String echo(String str) return str
Java RMI e a JVM
I A JVM natildeo conhece objectos remotosI A JVM soacute suporta a invocaccedilatildeo de meacutetodos sobre objectos
locaisI Java RMI eacute uma camada de SW sobre a JVM natildeo faz
parte delaI Java RMI implementa RMI usando os mecanismos do
costumeI stubs do lado do clienteI skeletons do lado do servidor
Java RMI Stubs
I Em Java RMI o stub dum objecto remoto eacute um objectolocal (em relaccedilatildeo ao cliente) que representa esse objectoremoto
I Daiacute a designaccedilatildeo comum de proxy objectI Uma referecircncia remota eacute de facto uma referecircncia para o
stub correspondente O stub dum objecto remotoI implementa a sua interface remotaI conteacutem o seu ldquoendereccedilordquo
I Essencialmente as tarefas executadas pelo stub satildeo1 ldquomarshallingrdquo dos argumentos do meacutetodo2 envio do pedido de execuccedilatildeo do meacutetodo atraveacutes da ldquorederdquo3 recepccedilatildeo da resposta4 ldquounmarshallingrdquo do resultado da invocaccedilatildeo
Java RMI Servers (12)
I Na primeira versatildeo de Java RMI a funcionalidade do ladodo objecto remoto foi repartida por 2 tipos de objectos
I objectos do tipo RemoteServer ndash executam oprocessamento que eacute independente da interface remota
I pex esperar pela recepccedilatildeo de pedidos de invocaccedilatildeoI objectos do tipo skeleton ndash executam o processamento
que depende da interface remotaI unmarshalling dos argumentosI invocaccedilatildeo do meacutetodo do objecto remotoI marshalling dos resultados
Java RMI Servers (22)
I A partir de Java 12 objectos do tipo skeleton deixaram deser necessaacuterios
I objectos do tipo RemoteServer passaram a ser capazesde fazer tambeacutem as tarefas dos skeleton
I Java RMI oferece a classe UnicastRemoteObject aqual estende RemoteServer e oferece funcionalidademiacutenima para aplicaccedilotildees baseadas em RMI
I O objecto termina quando o processo que o criou terminaI Usa TCP na comunicaccedilatildeo com os clientes
Argumentos de Meacutetodos Remotos
I Os argumentos de ou o valor retornado por um meacutetodoremoto podem ser
1 tipos simples Por exemplo boolean char byte shortint long float ou double
2 objectos remotos ie que implementam a interfaceRemote
3 objectos locais serializaacuteveis ie que implementam ainterface Serializable (incluindo Strings e arrays)
I No caso de objectos locais RMI passa uma coacutepia doobjecto
I como o objecto eacute serializaacutevel tal eacute possiacutevelI note-se que Java RMI natildeo ldquoactualizardquo o objecto passado
caso o meacutetodo remoto o tenha modificadoI Atenccedilatildeo Uma referecircncia para um objecto remoto eacute de
facto uma referecircncia para o objecto proxy respectivo
Objectos Remotos vs Objectos Serializaacuteveis
Local objectO1
Copy of O1
Remote objectO2
Localreference L1
New localreference
Remotereference R1
Remoteinvocation withL1 and R1 asparameters
Copy of R1 to O2
Machine A Machine B
Machine C
Client code withRMI to server at C(proxy)
Server code(method implementation)
I Na praacutetica eacute como se objecto remoto O2 fosse passadopor referecircncia enquanto que o objecto local (serializaacutevel)O1 eacute passado por valor
I Semacircnticas diferentes transparecircncia ldquoturvardquo
Serializaccedilatildeo em Java (12)I Java RMI usa o mecanismo de serializaccedilatildeo de Java para
passar os argumentos e o valor retornadoI Em Java serializaccedilatildeo dum objecto consiste na conversatildeo
desse objecto numa sequecircncia de bytes de modo apermitir
I o seu armazenamento no disco para posteriorreincarnaccedilatildeo
I ou a sua migraccedilatildeo para uma outra JVMI A reconstituiccedilatildeo dum objecto a partir da sua
representaccedilatildeo serializada designa-se por deserializaccedilatildeoI Para que um objecto seja serializaacutevel deveraacute implementar
a interface javaioSerializableI A JVM implementa um procedimento de serializaccedilatildeo por
omissatildeo que pode ser usado pela grande maioria dosobjectos
I desde que a definiccedilatildeo da sua classe declare queimplementa a interface javaioSerializable
Serializaccedilatildeo em Java (22)
I Se um objecto tiver campos que satildeo referecircncias paraoutros objectos estes uacuteltimos deveratildeo ser serializaacuteveispara que o primeiro tambeacutem o seja
I para serializar o primeiro objecto haacute que serializar osoutros
I cada objecto soacute eacute serializado uma vez mesmo que sejareferenciado muacuteltiplas vezes
I Por razotildees de eficiecircncia os meacutetodos duma classe natildeo satildeoincluiacutedos na sequecircncia de bytes criada pela serializaccedilatildeo
I a JVM inclui apenas um identificador da classe a que oobjecto pertence
Class Downloading em Java e RMI
Problema Como eacute que um meacutetodo remoto pode invocar omeacutetodo dum objecto natildeo remoto que lhe eacute passado comoargumento
I Os meacutetodos dum objecto natildeo fazem parte da suarepresentaccedilatildeo serializada
Soluccedilatildeo Usando as facilidades de transferecircncia de coacutedigo emJava
I Note-se que esta transferecircncia pode natildeo sernecessaacuteria se a classe estiver disponiacutevel localmente
A capacidade de transferecircncia de classes atraveacutes da redepode tambeacutem ser usada pelo cliente para carregar o proxyobject
I natildeo haacute necessidade de manter todas as classes emtodos os computadores
Localizaccedilatildeo dum Objecto
I O acesso a um objecto remoto eacute feito usando uma referecircnciapara um proxy desse objecto
montanhaecho()
Problema como eacute que se obteacutem uma referecircncia remota ie para oproxy dum objecto remoto
I Tecnicamente atraveacutes do valor de retorno dum meacutetodo
Soluccedilatildeo semelhante ao portmapper de RPC
I Java RMI oferece um serviccedilo de nomes baacutesico ormiregistry
I O rmiregistry eacute um programa e tem que executar noscomputadores que disponibilizam objectos remotos
I O ldquoservidorrdquo regista o objecto com um nome (binds) normiregistry local
I O ldquoclienterdquo solicita uma referecircncia para um objecto remotoao rmiregistry no computador onde o objecto reside
O rmiregistry e a Interface Registry
I O rmiregistry eacute uma aplicaccedilatildeo que implementa ainterface Registryvoid rebind(String name Remote obj)void bind(String name Remote obj)void unbind(String name Remote obj)Remote lookup(String name)String []list()
I Se incorrectamente usado o rmiregistry pode impediro uso de classes ldquoimportadasrdquo
If you do start the rmiregistry and it can find your stubclasses in CLASSPATH it will not remember that theloaded stub class can be loaded from your serverrsquos codebase[] do Tutorial on-line da Sun sobre RMI
A classe Naming
I Permite aceder a objectos que implementam RegistryI Suporta os seguintes meacutetodos
void rebind(String name Remote obj)void bind(String name Remote obj)void unbind(String name Remote obj)Remote lookup(String name)String []list()
ondename eacute um URL sem o meacutetodo de acesso
computerNameportobjectNamesendo computerNameport a ldquolocalizaccedilatildeordquo do
rmiregistryI bind() difere de rebind() na medida em que assinala
uma excepccedilatildeo se name jaacute tiver sido registadoI O rmregistry natildeo eacute um servidor global
I O cliente tem que saber onde se encontra o objecto
Exemplo Registo e Localizaccedilatildeo do ObjectoI O servidor tem que registar o objecto remoto
Echo montanhatry
montanha = new Echo_Impl()Namingrebind(lsquolsquoalpesrsquorsquo montanha)
catch ( RemoteException e)
I O cliente tem que o localizar (em i01co2213)Echo montanhatry
montanha = Naminglookup(lsquolsquoi01co2213alpesrsquorsquo)
catch ( RemoteException e) Naminglookup() is RMI
Arquitectura de Java RMI
RMI Client
Web server
RMIregistry
RMI server
1 register object
3 return object reference
2 lookup object
4 request stub class
5 return stub class
6 remote invocation
7 return result
RMI e Seguranccedila
Problema Java RMI pode exigir a transferecircncia de coacutedigo(classes) de maacutequinas remotas
I este coacutedigo eacute uma potencial ameaccedila agrave seguranccedilaSoluccedilatildeo Usar um Security Manager
I um objecto que controla o acesso aos recursos locais
I Java 10 suportava um modecirclo de seguranccedila do tiposandbox
I Coacutedigo local natildeo tinha restriccedilotildees para aleacutem das impostaspelo SO
I Coacutedigo importado soacute podia aceder aos recursos (limitados)disponiacuteveis na sandbox
I A partir de Java 12 pode-se sujeitar todo o coacutedigoindependentemente de ser ou natildeo local a controlo deacesso sendo este determinado pela security policy emvigor
Poliacutetica de Seguranccedila (Security Policy) e Permissotildees
I A poliacutetica de seguranccedila define as permissotildees de coacutedigocom base na sua origem sendo configuraacutevel quer peloutilizador quer pelo administrador
I Cada permissatildeo especifica o tipo de acesso permitido aum determinado recurso tal como
I Lecircr ou escrever um ficheiro ou directoacuterioI Estabelecer uma conexatildeo para um determinado endereccedilo
IP e portoI Algumas operaccedilotildees sobre a proacutepria JVM requerem
permissotildeesI Substituir o ClassLoaderI Substituir o SecurityManagerI Alterar a poliacutetica de seguranccedila
Permissotildees
I Internamente permissotildees satildeo objectos PexI javaioFilePermission
I Uma permissatildeo tipicamente temNome que identifica o recurso a que se aplicaLista de acccedilotildees que especifica as operaccedilotildees permitidas
permissatildeo nome lista de acccedilotildeesjavaioFilePermission ldquousrlib-rdquo ldquoread executerdquojavanetSocketPermission ldquoabccom54321rdquo ldquoconnectrdquojavasecuritySecurityPermission ldquosetPolicyrdquojavalangRuntimePermission ldquocreateClassLoaderrdquojavalangRuntimePermission ldquosetSecurityManagerrdquo
I Uma poliacutetica de seguranccedila eacute um conjunto de permissotildeesque determinam que operaccedilotildees um segmento de coacutedigopode executar
I Naturalmente a poliacutetica de seguranccedila eacute representada porum objecto (javasecurityPolicy)
Inicializaccedilatildeo do javasecurityPolicy
I Na implementaccedilatildeo referecircncia este objecto pode serinicializado a partir de vaacuterios ficheiros de configuraccedilatildeo Poromissatildeo usa
I Um ficheiro de configuraccedilatildeo para todo o sistema$javahomelibsecurityjavapolicy
I Um ficheiro de configuraccedilatildeo por utilizador~javapolicy
I O ficheiro de configuraccedilatildeo das propriedades de seguranccedilapermite especificar ainda outros ficheiros de configuraccedilatildeo
$javahomelibsecurityjavasecurity
I O ficheiro com a poliacutetica de seguranccedila pode ainda serespecificado quando da invocaccedilatildeo da JVM
java -Djavasecuritypolicy=somefile I Se a propriedade policyallowSystemProperty o
permitir ndash pode ser activada no ficheiro de configuraccedilatildeodas propriedades de seguranccedila
Sintaxe dos Ficheiros de Poliacuteticas
I Consiste numa lista de elementos (entries)keystore eacute opcional (natildeo usaremos pelo menos para
jaacute)grant clausuacutela usada para especificar as permissotildees de
coacutedigo de acordo com algumas propriedades(consideraremos apenas a sua origem)
I Tem o seguinte formato (de facto omite regras)
grant [codebase ltURLgt] permission ltclass_namegt lttargetgt [ ltactiongt]
onde
codebase especifica a origem do coacutedigo
permission especifica uma permissatildeo podendo umelemento grant incluir vaacuterias permissotildees
I Pode ocorrer uma ou mais vezes
Sintaxe dos Ficheiros de Poliacuteticas Exemplos
grant permission javanetSocketPermission 1024-
connectacceptpermission javanetSocketPermission abccom
connectacceptpermission javaioFilePermission
homeannpublic_htmlclasses- readpermission javaioFilePermission
homejonespublic_htmlclasses- read
grant codeBase httppaginasfeuppt~ei77777classes permission javasecurityAllPermission
I policytool eacute uma aplicaccedilatildeo que faz parte do J2SDKque oferece um GUI para auxiliar a ediccedilatildeo de ficheiros depoliacuteticas
Security Manager (12)
I O Security Manager eacute um objecto que garante ocumprimento da poliacutetica de seguranccedila
I Consiste apenas num conjunto de meacutetodos tais comopublic void checkPermission(Permission perm)
throws SecurityException
public void checkCreateClassLoader( )throws SecurityException
I Normalmente um thread soacute pode executar uma operaccedilatildeose todos os meacutetodos activos que invocou tiverempermissatildeo para a executar
I Tipicamente essa decisatildeo eacute baseada na origem do coacutedigoI Estes meacutetodos satildeo invocados por outros objectos quando
executam certas operaccedilotildeesI O Security Manager eacute um Reference Monitor
Security Manager (22)
I O SecurityManager natildeo eacute instalado por omissatildeoI A instalaccedilatildeo do SecurityManager pode ser feita
I Pelo interpretador (JVM)java -Djavasecuritymanager
I Pelo coacutedigoSystemsetSecurityManager(new SecurityManager())
I A poliacutetica imposta pelo SecurityManager pode serconfigurada atraveacutes dos ficheiros de especificaccedilatildeo daSecurityPolicy
I O coacutedigo do sistema invoca os meacutetodos checkXXX doSecurityManager se este estiver instalado
I Estes meacutetodos por sua vez invocam o meacutetodocheckPermission() do AccessController
Access Controller
I A partir de Java 12 ojavasecurityAccessController eacute a classe quede facto garante o cumprimento da poliacutetica de seguranccedila
I Por concepccedilatildeo eacute mais faacutecil flexiacutevel que oSecurityManager e estaacute sempre instalado (soacute static)
I Implementa uma poliacutetica razoavelmente restritiva que podeser usada na maioria dos casos
I Naturalmente pode invocar-se directamente da aplicaccedilatildeoos meacutetodos do AccessControllerFilePermission perm = new FilePermission(tmptestFile read)AccessControllercheckPermission(perm)
I Se a poliacutetica de seguranccedila implementada peloAccessController natildeo focircr adequada pode seradaptada criando subclasses dojavalangSecurityManager
I Estas subclasses devem invocar os meacutetodos doAccessController sempre que tal faccedila sentido
javarmiRMISecurityManager
I javarmiRMISecurityManager eacute uma sua subclassedo javalangSecurityManager
I Implementa exactamente os mesmos meacutetodosI O RMISecurityManager deve ser usado com RMI
sempre que haacute necessidade de transferir coacutedigo dumcomputador remoto
I O RMI class loader recusa-se a carregar qualquer classese natildeo houver um Security Manager
I O RMISecurityManager pode ser instalado de 2 modos
I Atraveacutes do coacutedigoSystemsetSecurityManager(new RMISecurityManager())
I Atraveacutes da linha de comandojava -Djavasecuritymanager=javarmiRMISecurityManager
Arquitectura de Seguranccedila em Java
I O Security Manager natildeo eacute a histoacuteria toda
Classrepository
Classverifier
Loadedclassobject
Java interpreter
Java program
Requestclass
Select appropriate loader
Loader forremoteclasses
Loader forlocal
classes
Classrepository
Remote siteLocal site
Tempo de Vida dum Objecto Remoto
I A vida dum objecto chega ao fim quando deixa de serreferenciado
I sem qualquer referecircncia para o objecto natildeo eacute possiacutevelaceder-lhe
I Para objectos locaisI o garbage collector da JVM automaticamente detecta
quando um objecto deixa de ser referenciado e liberta osrecursos
I quando a JVM termina todos os objectos locais terminamI Para objectos remotos
I as diferentes JVMs executam um algoritmo distribuiacutedo parafazer garbage collection
I quando uma JVM termina objectos remotos por elacriados podem natildeo terminar Por exemplo
I o RMIregistry manteacutem uma referecircncia para todos osobjectos nele registados
Passos no Desenvolvimento com Java RMI1 Concepccedilatildeo e implementaccedilatildeo de servidor e clientes
I Definiccedilatildeo da interface remota ie dos meacutetodos que podemser invocados remotamente
I Implementaccedilatildeo de objectos remotos os quais devemimplementar a interface remota definida
I Implementaccedilatildeo de clientes2 Compilaccedilatildeo do coacutedigo e geraccedilatildeo de stubs
I a compilaccedilatildeo do coacutedigo eacute feita usando javacI os stubs a usar pelo cliente podem ser gerados usando ormic a partir do ficheiro class da implementaccedilatildeo
rmic Echo_Impl
Nota A partir de Java 50 Java RMI suporta a geraccedilatildeodinacircmica de stubs
3 Disponibilizaccedilatildeo do coacutedigo por exemplo num servidorHTTP
I classes que precisem ser carregadas (downloaded)incluindo os stubs devem ser disponibilizadas num servidorHTTP
RMI e Uploaded Code
I Aplicaccedilotildees (clientes ou servidores) que podem transferircoacutedigo deveratildeo instalar um Security Manager import javarmipublic class Echo_Client public static void main(String[] args)
if(argslength = 2) Systemoutprintln(Usage java Echo_Client +
srv_hostname obj_name)return
SystemsetSecurityManager(new RMISecurityManager())try
I Se o coacutedigo do stub pode ser uploaded haacute que inicializar apropriedade javarmiservercodebase na aplicaccedilatildeoservidora pexjava -Djavarmiservercodebase=httpweb~pfsecho_server
I Atenccedilatildeo ao rmiregistry
Arquitectura de Java RMI
RMI Client
Web server
RMIregistry
RMI server
1 register object
3 return object reference
2 lookup object
4 request stub class
5 return stub class
6 remote invocation
7 return result
Sumaacuterio
RMIConceitoImplementaccedilatildeoExemplos
Java RMICaracteriacutesticasObjectos Remotos e Interfaces RemotasImplementaccedilatildeo de Java RMIArgumentos e serializaccedilatildeoTransferecircncia de coacutedigoLocalizaccedilatildeo de objectos remotosSeguranccedilaTempo de vida dum objecto remotoPassos no desenvolvimento de aplicaccedilotildeesTransferecircncia de coacutedigo
Leitura Adicional
I Capiacutetulo 10 de Tanenbaum e van Steen DistributedSystems 2nd Ed
I Secccedilatildeo 101 Architecture excepto Subsecccedilatildeo 1013I Secccedilatildeo 103 Communication excepto Subsecccedilatildeo 1035
I Java RMI Specification da SunI Java Security Overview da Sun Secccedilotildees 1 2 e 8I Security Policy in Java SE 6 da SunI Permissions in Java SE 6 da Sun
- RMI
-
- Conceito
- Implementaccedilatildeo
- Exemplos
-
- Java RMI
-
- Caracteriacutesticas
- Objectos Remotos e Interfaces Remotas
- Implementaccedilatildeo de Java RMI
- Argumentos e serializaccedilatildeo
- Transferecircncia de coacutedigo
- Localizaccedilatildeo de objectos remotos
- Seguranccedila
- Tempo de vida dum objecto remoto
- Passos no desenvolvimento de aplicaccedilotildees
- Transferecircncia de coacutedigo
-
- Leitura Adicional
-
Programaccedilatildeo Distribuiacuteda Baseada em ObjectosI O conceito de objecto eacute especialmente adaptado para
aplicaccedilotildees distribuiacutedasI Um objecto agrega os dados e as operaccedilotildees que operam
sobre esses dadosI Objectos podem residir em diferentes computadores
ligados por uma redeI A interaccedilatildeo entre objectos eacute feita atraveacutes de invocaccedilatildeo
remota de meacutetodos (remote method invocation) ie RPCpara objectos
MetodosDados
Objecto
MetodosDados
Objecto
MetodosDados
Objecto
MetodosDados
Objecto
Computador 2Computador 1
Invocaccedilatildeo Local vs Invocaccedilatildeo Remota
Local MI
Remote MI
process
object
host
I Um caso particular da invocaccedilatildeo remota envolve objectosem processos diferentes do mesmo computador
I Note-se que cada objecto reside apenas num processoie o estado dos objectos natildeo eacute distribuiacutedo
Transparecircncia do Cliente e Proxy-Objects
I A invocaccedilatildeo dum meacutetodo num objecto remoto deveraacute serfeita de modo semelhante agrave invocaccedilatildeo dum meacutetodo numobjecto local
I Com RPCs o truque eacute invocar uma funccedilatildeo local ndash o clientstub ndash a qual se encarrega da comunicaccedilatildeo entreprocessos
I Com RMI o truque eacute invocar o meacutetodo sobre um objectolocal ndash o proxy objectndash o qual natildeo executa o meacutetodo masencarrega-se de o passar ao objecto remoto
Transparecircncia do Lado do Servidor e Skeletons
I A transparecircncia do lado do servidor eacute conseguida comrecurso ao conceito de skeleton
I O skeleton eacute um objecto queI extrai (unmarshals) os argumentos da mensagem recebida
e invoca o meacutetodo apropriado do objecto invocado (local)I constroacutei a mensagem resposta com os resultados da
invocaccedilatildeo do meacutetodo e envia-la
RMI Arquitectura de Implementaccedilatildeo
Server machine
Object
Client machine
Proxy
Sameinterfaceas object
Interface
State
MethodClientinvokesa method
Network
Skeletoninvokessame methodat object
Marshalled invocationis passed across network
Client OS Server OS
Server
Skeleton
Client
I Alternativamente a funcionalidade do skeleton pode serimplementada pela classe do objecto remoto
RMI - Exemplos
CORBA RMI Heterogeneidade eacute a caracteriacutestica distintivaI O objecto e o cliente podem ser implementados
usando linguagens diferentesI Para o efeito CORBA define uma Interface Definition
Language (IDL) funcionalmente anaacuteloga a RPCLI CORBA suporta inclusivamente linguagens
natildeo-baseadas em objectos como C ou Cobol
Java RMI Dependente da linguagem
Sumaacuterio
RMIConceitoImplementaccedilatildeoExemplos
Java RMICaracteriacutesticasObjectos Remotos e Interfaces RemotasImplementaccedilatildeo de Java RMIArgumentos e serializaccedilatildeoTransferecircncia de coacutedigoLocalizaccedilatildeo de objectos remotosSeguranccedilaTempo de vida dum objecto remotoPassos no desenvolvimento de aplicaccedilotildeesTransferecircncia de coacutedigo
Java RMI Caracteriacutesticas (12)
I ldquoIntegradardquo na linguagem JavaI mais faacutecil de usar ndash natildeo haacute necessidade de usar
linguagens de especificaccedilatildeo de interfaces pex InterfaceDefinition Language (IDL) em CORBA
I Invocaccedilatildeo de meacutetodos remotos usa a mesma sintaxe quea invocaccedilatildeo de meacutetodos locais mas
I Distribuiccedilatildeo dos objectos eacute exibida intencionalmenteI a invocaccedilatildeo dum meacutetodo remoto pode assinalar uma
excepccedilatildeo RemoteExceptionI para que os meacutetodos dum objecto possam ser invocados
remotamente a classe correspondente deveraacute implementaruma interface remota
Java RMI Caracteriacutesticas (22)
I Benificia da mobilidade deI coacutedigo (classes)I objectos
entre computadores suportada por JavaI Distributed Garbage Collection
I um objecto ldquodesaparecerdquo automaticamente quando natildeopode ser acedido
Objectos Remotos e Interfaces Remotas
I Objectos remotos satildeo objectos cujos meacutetodos podem serinvocados duma JVM diferente daquela onde residem
I Um objecto remoto tem que implementar uma interfaceremota ie o seu tipo eacute um subtipo da interface Remote
I Permite que o compilador de Java gere o coacutedigonecessaacuterio para realizar a comunicaccedilatildeo entre objectos emJVMs distintas
I A natildeo-localidade dum objecto remoto eacute exposta aosprogramadores dos ldquoclientesrdquo
I Todos os meacutetodos da interface Remote tecircm que assinalarRemoteExceptions
I Um objecto remoto pode incluir meacutetodos natildeo invocaacuteveisremotamente
I Soacute meacutetodos declarados em interfaces remotas podem serinvocados remotamente
Remote Interface Exemplo
I A interface remota dum ldquoservidor de ecordquo pode serimport javarmiRemoteimport javarmiRemoteException
public interface Echo extends Remote String echo(String str) throws RemoteException
I Esta interface suporta um uacutenico meacutetodo remoto echo oqual retorna a string que lhe eacute passada como argumento
I O meacutetodo echo dum objecto que implemente estainterface pode ser invocado remotamente
I Ie pode ser invocado por um objecto a executar numamaacutequina virtual de Java (JVM) diferente
Acesso a Objectos Remotos
I Para usar um objecto remoto um cliente tem queconhecer a interface remota desse objecto
I ie os meacutetodos desse objecto que podem ser invocadosremotamente
I A sintaxe de invocaccedilatildeo de meacutetodos remotos eacute semelhanteagrave de invocaccedilatildeo de meacutetodos locaisEcho montanha = lookup montanhaString ecotry
eco = montanhaecho(lsquolsquoUh Uhrsquorsquo) catch ( RemoteException e)
I Contudo os clientes tecircm que processar excepccedilotildees do tipoRemoteException
Exemplo Implementaccedilatildeo da interface Echo
import javarmiimport javarmiserverUnicastRemoteObject
public class Echo_Impl extends UnicastRemoteObjectimplements Echo
public Echo_Impl() throws RemoteException
super() Actually this is not needed
public String echo(String str) return str
Java RMI e a JVM
I A JVM natildeo conhece objectos remotosI A JVM soacute suporta a invocaccedilatildeo de meacutetodos sobre objectos
locaisI Java RMI eacute uma camada de SW sobre a JVM natildeo faz
parte delaI Java RMI implementa RMI usando os mecanismos do
costumeI stubs do lado do clienteI skeletons do lado do servidor
Java RMI Stubs
I Em Java RMI o stub dum objecto remoto eacute um objectolocal (em relaccedilatildeo ao cliente) que representa esse objectoremoto
I Daiacute a designaccedilatildeo comum de proxy objectI Uma referecircncia remota eacute de facto uma referecircncia para o
stub correspondente O stub dum objecto remotoI implementa a sua interface remotaI conteacutem o seu ldquoendereccedilordquo
I Essencialmente as tarefas executadas pelo stub satildeo1 ldquomarshallingrdquo dos argumentos do meacutetodo2 envio do pedido de execuccedilatildeo do meacutetodo atraveacutes da ldquorederdquo3 recepccedilatildeo da resposta4 ldquounmarshallingrdquo do resultado da invocaccedilatildeo
Java RMI Servers (12)
I Na primeira versatildeo de Java RMI a funcionalidade do ladodo objecto remoto foi repartida por 2 tipos de objectos
I objectos do tipo RemoteServer ndash executam oprocessamento que eacute independente da interface remota
I pex esperar pela recepccedilatildeo de pedidos de invocaccedilatildeoI objectos do tipo skeleton ndash executam o processamento
que depende da interface remotaI unmarshalling dos argumentosI invocaccedilatildeo do meacutetodo do objecto remotoI marshalling dos resultados
Java RMI Servers (22)
I A partir de Java 12 objectos do tipo skeleton deixaram deser necessaacuterios
I objectos do tipo RemoteServer passaram a ser capazesde fazer tambeacutem as tarefas dos skeleton
I Java RMI oferece a classe UnicastRemoteObject aqual estende RemoteServer e oferece funcionalidademiacutenima para aplicaccedilotildees baseadas em RMI
I O objecto termina quando o processo que o criou terminaI Usa TCP na comunicaccedilatildeo com os clientes
Argumentos de Meacutetodos Remotos
I Os argumentos de ou o valor retornado por um meacutetodoremoto podem ser
1 tipos simples Por exemplo boolean char byte shortint long float ou double
2 objectos remotos ie que implementam a interfaceRemote
3 objectos locais serializaacuteveis ie que implementam ainterface Serializable (incluindo Strings e arrays)
I No caso de objectos locais RMI passa uma coacutepia doobjecto
I como o objecto eacute serializaacutevel tal eacute possiacutevelI note-se que Java RMI natildeo ldquoactualizardquo o objecto passado
caso o meacutetodo remoto o tenha modificadoI Atenccedilatildeo Uma referecircncia para um objecto remoto eacute de
facto uma referecircncia para o objecto proxy respectivo
Objectos Remotos vs Objectos Serializaacuteveis
Local objectO1
Copy of O1
Remote objectO2
Localreference L1
New localreference
Remotereference R1
Remoteinvocation withL1 and R1 asparameters
Copy of R1 to O2
Machine A Machine B
Machine C
Client code withRMI to server at C(proxy)
Server code(method implementation)
I Na praacutetica eacute como se objecto remoto O2 fosse passadopor referecircncia enquanto que o objecto local (serializaacutevel)O1 eacute passado por valor
I Semacircnticas diferentes transparecircncia ldquoturvardquo
Serializaccedilatildeo em Java (12)I Java RMI usa o mecanismo de serializaccedilatildeo de Java para
passar os argumentos e o valor retornadoI Em Java serializaccedilatildeo dum objecto consiste na conversatildeo
desse objecto numa sequecircncia de bytes de modo apermitir
I o seu armazenamento no disco para posteriorreincarnaccedilatildeo
I ou a sua migraccedilatildeo para uma outra JVMI A reconstituiccedilatildeo dum objecto a partir da sua
representaccedilatildeo serializada designa-se por deserializaccedilatildeoI Para que um objecto seja serializaacutevel deveraacute implementar
a interface javaioSerializableI A JVM implementa um procedimento de serializaccedilatildeo por
omissatildeo que pode ser usado pela grande maioria dosobjectos
I desde que a definiccedilatildeo da sua classe declare queimplementa a interface javaioSerializable
Serializaccedilatildeo em Java (22)
I Se um objecto tiver campos que satildeo referecircncias paraoutros objectos estes uacuteltimos deveratildeo ser serializaacuteveispara que o primeiro tambeacutem o seja
I para serializar o primeiro objecto haacute que serializar osoutros
I cada objecto soacute eacute serializado uma vez mesmo que sejareferenciado muacuteltiplas vezes
I Por razotildees de eficiecircncia os meacutetodos duma classe natildeo satildeoincluiacutedos na sequecircncia de bytes criada pela serializaccedilatildeo
I a JVM inclui apenas um identificador da classe a que oobjecto pertence
Class Downloading em Java e RMI
Problema Como eacute que um meacutetodo remoto pode invocar omeacutetodo dum objecto natildeo remoto que lhe eacute passado comoargumento
I Os meacutetodos dum objecto natildeo fazem parte da suarepresentaccedilatildeo serializada
Soluccedilatildeo Usando as facilidades de transferecircncia de coacutedigo emJava
I Note-se que esta transferecircncia pode natildeo sernecessaacuteria se a classe estiver disponiacutevel localmente
A capacidade de transferecircncia de classes atraveacutes da redepode tambeacutem ser usada pelo cliente para carregar o proxyobject
I natildeo haacute necessidade de manter todas as classes emtodos os computadores
Localizaccedilatildeo dum Objecto
I O acesso a um objecto remoto eacute feito usando uma referecircnciapara um proxy desse objecto
montanhaecho()
Problema como eacute que se obteacutem uma referecircncia remota ie para oproxy dum objecto remoto
I Tecnicamente atraveacutes do valor de retorno dum meacutetodo
Soluccedilatildeo semelhante ao portmapper de RPC
I Java RMI oferece um serviccedilo de nomes baacutesico ormiregistry
I O rmiregistry eacute um programa e tem que executar noscomputadores que disponibilizam objectos remotos
I O ldquoservidorrdquo regista o objecto com um nome (binds) normiregistry local
I O ldquoclienterdquo solicita uma referecircncia para um objecto remotoao rmiregistry no computador onde o objecto reside
O rmiregistry e a Interface Registry
I O rmiregistry eacute uma aplicaccedilatildeo que implementa ainterface Registryvoid rebind(String name Remote obj)void bind(String name Remote obj)void unbind(String name Remote obj)Remote lookup(String name)String []list()
I Se incorrectamente usado o rmiregistry pode impediro uso de classes ldquoimportadasrdquo
If you do start the rmiregistry and it can find your stubclasses in CLASSPATH it will not remember that theloaded stub class can be loaded from your serverrsquos codebase[] do Tutorial on-line da Sun sobre RMI
A classe Naming
I Permite aceder a objectos que implementam RegistryI Suporta os seguintes meacutetodos
void rebind(String name Remote obj)void bind(String name Remote obj)void unbind(String name Remote obj)Remote lookup(String name)String []list()
ondename eacute um URL sem o meacutetodo de acesso
computerNameportobjectNamesendo computerNameport a ldquolocalizaccedilatildeordquo do
rmiregistryI bind() difere de rebind() na medida em que assinala
uma excepccedilatildeo se name jaacute tiver sido registadoI O rmregistry natildeo eacute um servidor global
I O cliente tem que saber onde se encontra o objecto
Exemplo Registo e Localizaccedilatildeo do ObjectoI O servidor tem que registar o objecto remoto
Echo montanhatry
montanha = new Echo_Impl()Namingrebind(lsquolsquoalpesrsquorsquo montanha)
catch ( RemoteException e)
I O cliente tem que o localizar (em i01co2213)Echo montanhatry
montanha = Naminglookup(lsquolsquoi01co2213alpesrsquorsquo)
catch ( RemoteException e) Naminglookup() is RMI
Arquitectura de Java RMI
RMI Client
Web server
RMIregistry
RMI server
1 register object
3 return object reference
2 lookup object
4 request stub class
5 return stub class
6 remote invocation
7 return result
RMI e Seguranccedila
Problema Java RMI pode exigir a transferecircncia de coacutedigo(classes) de maacutequinas remotas
I este coacutedigo eacute uma potencial ameaccedila agrave seguranccedilaSoluccedilatildeo Usar um Security Manager
I um objecto que controla o acesso aos recursos locais
I Java 10 suportava um modecirclo de seguranccedila do tiposandbox
I Coacutedigo local natildeo tinha restriccedilotildees para aleacutem das impostaspelo SO
I Coacutedigo importado soacute podia aceder aos recursos (limitados)disponiacuteveis na sandbox
I A partir de Java 12 pode-se sujeitar todo o coacutedigoindependentemente de ser ou natildeo local a controlo deacesso sendo este determinado pela security policy emvigor
Poliacutetica de Seguranccedila (Security Policy) e Permissotildees
I A poliacutetica de seguranccedila define as permissotildees de coacutedigocom base na sua origem sendo configuraacutevel quer peloutilizador quer pelo administrador
I Cada permissatildeo especifica o tipo de acesso permitido aum determinado recurso tal como
I Lecircr ou escrever um ficheiro ou directoacuterioI Estabelecer uma conexatildeo para um determinado endereccedilo
IP e portoI Algumas operaccedilotildees sobre a proacutepria JVM requerem
permissotildeesI Substituir o ClassLoaderI Substituir o SecurityManagerI Alterar a poliacutetica de seguranccedila
Permissotildees
I Internamente permissotildees satildeo objectos PexI javaioFilePermission
I Uma permissatildeo tipicamente temNome que identifica o recurso a que se aplicaLista de acccedilotildees que especifica as operaccedilotildees permitidas
permissatildeo nome lista de acccedilotildeesjavaioFilePermission ldquousrlib-rdquo ldquoread executerdquojavanetSocketPermission ldquoabccom54321rdquo ldquoconnectrdquojavasecuritySecurityPermission ldquosetPolicyrdquojavalangRuntimePermission ldquocreateClassLoaderrdquojavalangRuntimePermission ldquosetSecurityManagerrdquo
I Uma poliacutetica de seguranccedila eacute um conjunto de permissotildeesque determinam que operaccedilotildees um segmento de coacutedigopode executar
I Naturalmente a poliacutetica de seguranccedila eacute representada porum objecto (javasecurityPolicy)
Inicializaccedilatildeo do javasecurityPolicy
I Na implementaccedilatildeo referecircncia este objecto pode serinicializado a partir de vaacuterios ficheiros de configuraccedilatildeo Poromissatildeo usa
I Um ficheiro de configuraccedilatildeo para todo o sistema$javahomelibsecurityjavapolicy
I Um ficheiro de configuraccedilatildeo por utilizador~javapolicy
I O ficheiro de configuraccedilatildeo das propriedades de seguranccedilapermite especificar ainda outros ficheiros de configuraccedilatildeo
$javahomelibsecurityjavasecurity
I O ficheiro com a poliacutetica de seguranccedila pode ainda serespecificado quando da invocaccedilatildeo da JVM
java -Djavasecuritypolicy=somefile I Se a propriedade policyallowSystemProperty o
permitir ndash pode ser activada no ficheiro de configuraccedilatildeodas propriedades de seguranccedila
Sintaxe dos Ficheiros de Poliacuteticas
I Consiste numa lista de elementos (entries)keystore eacute opcional (natildeo usaremos pelo menos para
jaacute)grant clausuacutela usada para especificar as permissotildees de
coacutedigo de acordo com algumas propriedades(consideraremos apenas a sua origem)
I Tem o seguinte formato (de facto omite regras)
grant [codebase ltURLgt] permission ltclass_namegt lttargetgt [ ltactiongt]
onde
codebase especifica a origem do coacutedigo
permission especifica uma permissatildeo podendo umelemento grant incluir vaacuterias permissotildees
I Pode ocorrer uma ou mais vezes
Sintaxe dos Ficheiros de Poliacuteticas Exemplos
grant permission javanetSocketPermission 1024-
connectacceptpermission javanetSocketPermission abccom
connectacceptpermission javaioFilePermission
homeannpublic_htmlclasses- readpermission javaioFilePermission
homejonespublic_htmlclasses- read
grant codeBase httppaginasfeuppt~ei77777classes permission javasecurityAllPermission
I policytool eacute uma aplicaccedilatildeo que faz parte do J2SDKque oferece um GUI para auxiliar a ediccedilatildeo de ficheiros depoliacuteticas
Security Manager (12)
I O Security Manager eacute um objecto que garante ocumprimento da poliacutetica de seguranccedila
I Consiste apenas num conjunto de meacutetodos tais comopublic void checkPermission(Permission perm)
throws SecurityException
public void checkCreateClassLoader( )throws SecurityException
I Normalmente um thread soacute pode executar uma operaccedilatildeose todos os meacutetodos activos que invocou tiverempermissatildeo para a executar
I Tipicamente essa decisatildeo eacute baseada na origem do coacutedigoI Estes meacutetodos satildeo invocados por outros objectos quando
executam certas operaccedilotildeesI O Security Manager eacute um Reference Monitor
Security Manager (22)
I O SecurityManager natildeo eacute instalado por omissatildeoI A instalaccedilatildeo do SecurityManager pode ser feita
I Pelo interpretador (JVM)java -Djavasecuritymanager
I Pelo coacutedigoSystemsetSecurityManager(new SecurityManager())
I A poliacutetica imposta pelo SecurityManager pode serconfigurada atraveacutes dos ficheiros de especificaccedilatildeo daSecurityPolicy
I O coacutedigo do sistema invoca os meacutetodos checkXXX doSecurityManager se este estiver instalado
I Estes meacutetodos por sua vez invocam o meacutetodocheckPermission() do AccessController
Access Controller
I A partir de Java 12 ojavasecurityAccessController eacute a classe quede facto garante o cumprimento da poliacutetica de seguranccedila
I Por concepccedilatildeo eacute mais faacutecil flexiacutevel que oSecurityManager e estaacute sempre instalado (soacute static)
I Implementa uma poliacutetica razoavelmente restritiva que podeser usada na maioria dos casos
I Naturalmente pode invocar-se directamente da aplicaccedilatildeoos meacutetodos do AccessControllerFilePermission perm = new FilePermission(tmptestFile read)AccessControllercheckPermission(perm)
I Se a poliacutetica de seguranccedila implementada peloAccessController natildeo focircr adequada pode seradaptada criando subclasses dojavalangSecurityManager
I Estas subclasses devem invocar os meacutetodos doAccessController sempre que tal faccedila sentido
javarmiRMISecurityManager
I javarmiRMISecurityManager eacute uma sua subclassedo javalangSecurityManager
I Implementa exactamente os mesmos meacutetodosI O RMISecurityManager deve ser usado com RMI
sempre que haacute necessidade de transferir coacutedigo dumcomputador remoto
I O RMI class loader recusa-se a carregar qualquer classese natildeo houver um Security Manager
I O RMISecurityManager pode ser instalado de 2 modos
I Atraveacutes do coacutedigoSystemsetSecurityManager(new RMISecurityManager())
I Atraveacutes da linha de comandojava -Djavasecuritymanager=javarmiRMISecurityManager
Arquitectura de Seguranccedila em Java
I O Security Manager natildeo eacute a histoacuteria toda
Classrepository
Classverifier
Loadedclassobject
Java interpreter
Java program
Requestclass
Select appropriate loader
Loader forremoteclasses
Loader forlocal
classes
Classrepository
Remote siteLocal site
Tempo de Vida dum Objecto Remoto
I A vida dum objecto chega ao fim quando deixa de serreferenciado
I sem qualquer referecircncia para o objecto natildeo eacute possiacutevelaceder-lhe
I Para objectos locaisI o garbage collector da JVM automaticamente detecta
quando um objecto deixa de ser referenciado e liberta osrecursos
I quando a JVM termina todos os objectos locais terminamI Para objectos remotos
I as diferentes JVMs executam um algoritmo distribuiacutedo parafazer garbage collection
I quando uma JVM termina objectos remotos por elacriados podem natildeo terminar Por exemplo
I o RMIregistry manteacutem uma referecircncia para todos osobjectos nele registados
Passos no Desenvolvimento com Java RMI1 Concepccedilatildeo e implementaccedilatildeo de servidor e clientes
I Definiccedilatildeo da interface remota ie dos meacutetodos que podemser invocados remotamente
I Implementaccedilatildeo de objectos remotos os quais devemimplementar a interface remota definida
I Implementaccedilatildeo de clientes2 Compilaccedilatildeo do coacutedigo e geraccedilatildeo de stubs
I a compilaccedilatildeo do coacutedigo eacute feita usando javacI os stubs a usar pelo cliente podem ser gerados usando ormic a partir do ficheiro class da implementaccedilatildeo
rmic Echo_Impl
Nota A partir de Java 50 Java RMI suporta a geraccedilatildeodinacircmica de stubs
3 Disponibilizaccedilatildeo do coacutedigo por exemplo num servidorHTTP
I classes que precisem ser carregadas (downloaded)incluindo os stubs devem ser disponibilizadas num servidorHTTP
RMI e Uploaded Code
I Aplicaccedilotildees (clientes ou servidores) que podem transferircoacutedigo deveratildeo instalar um Security Manager import javarmipublic class Echo_Client public static void main(String[] args)
if(argslength = 2) Systemoutprintln(Usage java Echo_Client +
srv_hostname obj_name)return
SystemsetSecurityManager(new RMISecurityManager())try
I Se o coacutedigo do stub pode ser uploaded haacute que inicializar apropriedade javarmiservercodebase na aplicaccedilatildeoservidora pexjava -Djavarmiservercodebase=httpweb~pfsecho_server
I Atenccedilatildeo ao rmiregistry
Arquitectura de Java RMI
RMI Client
Web server
RMIregistry
RMI server
1 register object
3 return object reference
2 lookup object
4 request stub class
5 return stub class
6 remote invocation
7 return result
Sumaacuterio
RMIConceitoImplementaccedilatildeoExemplos
Java RMICaracteriacutesticasObjectos Remotos e Interfaces RemotasImplementaccedilatildeo de Java RMIArgumentos e serializaccedilatildeoTransferecircncia de coacutedigoLocalizaccedilatildeo de objectos remotosSeguranccedilaTempo de vida dum objecto remotoPassos no desenvolvimento de aplicaccedilotildeesTransferecircncia de coacutedigo
Leitura Adicional
I Capiacutetulo 10 de Tanenbaum e van Steen DistributedSystems 2nd Ed
I Secccedilatildeo 101 Architecture excepto Subsecccedilatildeo 1013I Secccedilatildeo 103 Communication excepto Subsecccedilatildeo 1035
I Java RMI Specification da SunI Java Security Overview da Sun Secccedilotildees 1 2 e 8I Security Policy in Java SE 6 da SunI Permissions in Java SE 6 da Sun
- RMI
-
- Conceito
- Implementaccedilatildeo
- Exemplos
-
- Java RMI
-
- Caracteriacutesticas
- Objectos Remotos e Interfaces Remotas
- Implementaccedilatildeo de Java RMI
- Argumentos e serializaccedilatildeo
- Transferecircncia de coacutedigo
- Localizaccedilatildeo de objectos remotos
- Seguranccedila
- Tempo de vida dum objecto remoto
- Passos no desenvolvimento de aplicaccedilotildees
- Transferecircncia de coacutedigo
-
- Leitura Adicional
-
Transparecircncia do Cliente e Proxy-Objects
I A invocaccedilatildeo dum meacutetodo num objecto remoto deveraacute serfeita de modo semelhante agrave invocaccedilatildeo dum meacutetodo numobjecto local
I Com RPCs o truque eacute invocar uma funccedilatildeo local ndash o clientstub ndash a qual se encarrega da comunicaccedilatildeo entreprocessos
I Com RMI o truque eacute invocar o meacutetodo sobre um objectolocal ndash o proxy objectndash o qual natildeo executa o meacutetodo masencarrega-se de o passar ao objecto remoto
Transparecircncia do Lado do Servidor e Skeletons
I A transparecircncia do lado do servidor eacute conseguida comrecurso ao conceito de skeleton
I O skeleton eacute um objecto queI extrai (unmarshals) os argumentos da mensagem recebida
e invoca o meacutetodo apropriado do objecto invocado (local)I constroacutei a mensagem resposta com os resultados da
invocaccedilatildeo do meacutetodo e envia-la
RMI Arquitectura de Implementaccedilatildeo
Server machine
Object
Client machine
Proxy
Sameinterfaceas object
Interface
State
MethodClientinvokesa method
Network
Skeletoninvokessame methodat object
Marshalled invocationis passed across network
Client OS Server OS
Server
Skeleton
Client
I Alternativamente a funcionalidade do skeleton pode serimplementada pela classe do objecto remoto
RMI - Exemplos
CORBA RMI Heterogeneidade eacute a caracteriacutestica distintivaI O objecto e o cliente podem ser implementados
usando linguagens diferentesI Para o efeito CORBA define uma Interface Definition
Language (IDL) funcionalmente anaacuteloga a RPCLI CORBA suporta inclusivamente linguagens
natildeo-baseadas em objectos como C ou Cobol
Java RMI Dependente da linguagem
Sumaacuterio
RMIConceitoImplementaccedilatildeoExemplos
Java RMICaracteriacutesticasObjectos Remotos e Interfaces RemotasImplementaccedilatildeo de Java RMIArgumentos e serializaccedilatildeoTransferecircncia de coacutedigoLocalizaccedilatildeo de objectos remotosSeguranccedilaTempo de vida dum objecto remotoPassos no desenvolvimento de aplicaccedilotildeesTransferecircncia de coacutedigo
Java RMI Caracteriacutesticas (12)
I ldquoIntegradardquo na linguagem JavaI mais faacutecil de usar ndash natildeo haacute necessidade de usar
linguagens de especificaccedilatildeo de interfaces pex InterfaceDefinition Language (IDL) em CORBA
I Invocaccedilatildeo de meacutetodos remotos usa a mesma sintaxe quea invocaccedilatildeo de meacutetodos locais mas
I Distribuiccedilatildeo dos objectos eacute exibida intencionalmenteI a invocaccedilatildeo dum meacutetodo remoto pode assinalar uma
excepccedilatildeo RemoteExceptionI para que os meacutetodos dum objecto possam ser invocados
remotamente a classe correspondente deveraacute implementaruma interface remota
Java RMI Caracteriacutesticas (22)
I Benificia da mobilidade deI coacutedigo (classes)I objectos
entre computadores suportada por JavaI Distributed Garbage Collection
I um objecto ldquodesaparecerdquo automaticamente quando natildeopode ser acedido
Objectos Remotos e Interfaces Remotas
I Objectos remotos satildeo objectos cujos meacutetodos podem serinvocados duma JVM diferente daquela onde residem
I Um objecto remoto tem que implementar uma interfaceremota ie o seu tipo eacute um subtipo da interface Remote
I Permite que o compilador de Java gere o coacutedigonecessaacuterio para realizar a comunicaccedilatildeo entre objectos emJVMs distintas
I A natildeo-localidade dum objecto remoto eacute exposta aosprogramadores dos ldquoclientesrdquo
I Todos os meacutetodos da interface Remote tecircm que assinalarRemoteExceptions
I Um objecto remoto pode incluir meacutetodos natildeo invocaacuteveisremotamente
I Soacute meacutetodos declarados em interfaces remotas podem serinvocados remotamente
Remote Interface Exemplo
I A interface remota dum ldquoservidor de ecordquo pode serimport javarmiRemoteimport javarmiRemoteException
public interface Echo extends Remote String echo(String str) throws RemoteException
I Esta interface suporta um uacutenico meacutetodo remoto echo oqual retorna a string que lhe eacute passada como argumento
I O meacutetodo echo dum objecto que implemente estainterface pode ser invocado remotamente
I Ie pode ser invocado por um objecto a executar numamaacutequina virtual de Java (JVM) diferente
Acesso a Objectos Remotos
I Para usar um objecto remoto um cliente tem queconhecer a interface remota desse objecto
I ie os meacutetodos desse objecto que podem ser invocadosremotamente
I A sintaxe de invocaccedilatildeo de meacutetodos remotos eacute semelhanteagrave de invocaccedilatildeo de meacutetodos locaisEcho montanha = lookup montanhaString ecotry
eco = montanhaecho(lsquolsquoUh Uhrsquorsquo) catch ( RemoteException e)
I Contudo os clientes tecircm que processar excepccedilotildees do tipoRemoteException
Exemplo Implementaccedilatildeo da interface Echo
import javarmiimport javarmiserverUnicastRemoteObject
public class Echo_Impl extends UnicastRemoteObjectimplements Echo
public Echo_Impl() throws RemoteException
super() Actually this is not needed
public String echo(String str) return str
Java RMI e a JVM
I A JVM natildeo conhece objectos remotosI A JVM soacute suporta a invocaccedilatildeo de meacutetodos sobre objectos
locaisI Java RMI eacute uma camada de SW sobre a JVM natildeo faz
parte delaI Java RMI implementa RMI usando os mecanismos do
costumeI stubs do lado do clienteI skeletons do lado do servidor
Java RMI Stubs
I Em Java RMI o stub dum objecto remoto eacute um objectolocal (em relaccedilatildeo ao cliente) que representa esse objectoremoto
I Daiacute a designaccedilatildeo comum de proxy objectI Uma referecircncia remota eacute de facto uma referecircncia para o
stub correspondente O stub dum objecto remotoI implementa a sua interface remotaI conteacutem o seu ldquoendereccedilordquo
I Essencialmente as tarefas executadas pelo stub satildeo1 ldquomarshallingrdquo dos argumentos do meacutetodo2 envio do pedido de execuccedilatildeo do meacutetodo atraveacutes da ldquorederdquo3 recepccedilatildeo da resposta4 ldquounmarshallingrdquo do resultado da invocaccedilatildeo
Java RMI Servers (12)
I Na primeira versatildeo de Java RMI a funcionalidade do ladodo objecto remoto foi repartida por 2 tipos de objectos
I objectos do tipo RemoteServer ndash executam oprocessamento que eacute independente da interface remota
I pex esperar pela recepccedilatildeo de pedidos de invocaccedilatildeoI objectos do tipo skeleton ndash executam o processamento
que depende da interface remotaI unmarshalling dos argumentosI invocaccedilatildeo do meacutetodo do objecto remotoI marshalling dos resultados
Java RMI Servers (22)
I A partir de Java 12 objectos do tipo skeleton deixaram deser necessaacuterios
I objectos do tipo RemoteServer passaram a ser capazesde fazer tambeacutem as tarefas dos skeleton
I Java RMI oferece a classe UnicastRemoteObject aqual estende RemoteServer e oferece funcionalidademiacutenima para aplicaccedilotildees baseadas em RMI
I O objecto termina quando o processo que o criou terminaI Usa TCP na comunicaccedilatildeo com os clientes
Argumentos de Meacutetodos Remotos
I Os argumentos de ou o valor retornado por um meacutetodoremoto podem ser
1 tipos simples Por exemplo boolean char byte shortint long float ou double
2 objectos remotos ie que implementam a interfaceRemote
3 objectos locais serializaacuteveis ie que implementam ainterface Serializable (incluindo Strings e arrays)
I No caso de objectos locais RMI passa uma coacutepia doobjecto
I como o objecto eacute serializaacutevel tal eacute possiacutevelI note-se que Java RMI natildeo ldquoactualizardquo o objecto passado
caso o meacutetodo remoto o tenha modificadoI Atenccedilatildeo Uma referecircncia para um objecto remoto eacute de
facto uma referecircncia para o objecto proxy respectivo
Objectos Remotos vs Objectos Serializaacuteveis
Local objectO1
Copy of O1
Remote objectO2
Localreference L1
New localreference
Remotereference R1
Remoteinvocation withL1 and R1 asparameters
Copy of R1 to O2
Machine A Machine B
Machine C
Client code withRMI to server at C(proxy)
Server code(method implementation)
I Na praacutetica eacute como se objecto remoto O2 fosse passadopor referecircncia enquanto que o objecto local (serializaacutevel)O1 eacute passado por valor
I Semacircnticas diferentes transparecircncia ldquoturvardquo
Serializaccedilatildeo em Java (12)I Java RMI usa o mecanismo de serializaccedilatildeo de Java para
passar os argumentos e o valor retornadoI Em Java serializaccedilatildeo dum objecto consiste na conversatildeo
desse objecto numa sequecircncia de bytes de modo apermitir
I o seu armazenamento no disco para posteriorreincarnaccedilatildeo
I ou a sua migraccedilatildeo para uma outra JVMI A reconstituiccedilatildeo dum objecto a partir da sua
representaccedilatildeo serializada designa-se por deserializaccedilatildeoI Para que um objecto seja serializaacutevel deveraacute implementar
a interface javaioSerializableI A JVM implementa um procedimento de serializaccedilatildeo por
omissatildeo que pode ser usado pela grande maioria dosobjectos
I desde que a definiccedilatildeo da sua classe declare queimplementa a interface javaioSerializable
Serializaccedilatildeo em Java (22)
I Se um objecto tiver campos que satildeo referecircncias paraoutros objectos estes uacuteltimos deveratildeo ser serializaacuteveispara que o primeiro tambeacutem o seja
I para serializar o primeiro objecto haacute que serializar osoutros
I cada objecto soacute eacute serializado uma vez mesmo que sejareferenciado muacuteltiplas vezes
I Por razotildees de eficiecircncia os meacutetodos duma classe natildeo satildeoincluiacutedos na sequecircncia de bytes criada pela serializaccedilatildeo
I a JVM inclui apenas um identificador da classe a que oobjecto pertence
Class Downloading em Java e RMI
Problema Como eacute que um meacutetodo remoto pode invocar omeacutetodo dum objecto natildeo remoto que lhe eacute passado comoargumento
I Os meacutetodos dum objecto natildeo fazem parte da suarepresentaccedilatildeo serializada
Soluccedilatildeo Usando as facilidades de transferecircncia de coacutedigo emJava
I Note-se que esta transferecircncia pode natildeo sernecessaacuteria se a classe estiver disponiacutevel localmente
A capacidade de transferecircncia de classes atraveacutes da redepode tambeacutem ser usada pelo cliente para carregar o proxyobject
I natildeo haacute necessidade de manter todas as classes emtodos os computadores
Localizaccedilatildeo dum Objecto
I O acesso a um objecto remoto eacute feito usando uma referecircnciapara um proxy desse objecto
montanhaecho()
Problema como eacute que se obteacutem uma referecircncia remota ie para oproxy dum objecto remoto
I Tecnicamente atraveacutes do valor de retorno dum meacutetodo
Soluccedilatildeo semelhante ao portmapper de RPC
I Java RMI oferece um serviccedilo de nomes baacutesico ormiregistry
I O rmiregistry eacute um programa e tem que executar noscomputadores que disponibilizam objectos remotos
I O ldquoservidorrdquo regista o objecto com um nome (binds) normiregistry local
I O ldquoclienterdquo solicita uma referecircncia para um objecto remotoao rmiregistry no computador onde o objecto reside
O rmiregistry e a Interface Registry
I O rmiregistry eacute uma aplicaccedilatildeo que implementa ainterface Registryvoid rebind(String name Remote obj)void bind(String name Remote obj)void unbind(String name Remote obj)Remote lookup(String name)String []list()
I Se incorrectamente usado o rmiregistry pode impediro uso de classes ldquoimportadasrdquo
If you do start the rmiregistry and it can find your stubclasses in CLASSPATH it will not remember that theloaded stub class can be loaded from your serverrsquos codebase[] do Tutorial on-line da Sun sobre RMI
A classe Naming
I Permite aceder a objectos que implementam RegistryI Suporta os seguintes meacutetodos
void rebind(String name Remote obj)void bind(String name Remote obj)void unbind(String name Remote obj)Remote lookup(String name)String []list()
ondename eacute um URL sem o meacutetodo de acesso
computerNameportobjectNamesendo computerNameport a ldquolocalizaccedilatildeordquo do
rmiregistryI bind() difere de rebind() na medida em que assinala
uma excepccedilatildeo se name jaacute tiver sido registadoI O rmregistry natildeo eacute um servidor global
I O cliente tem que saber onde se encontra o objecto
Exemplo Registo e Localizaccedilatildeo do ObjectoI O servidor tem que registar o objecto remoto
Echo montanhatry
montanha = new Echo_Impl()Namingrebind(lsquolsquoalpesrsquorsquo montanha)
catch ( RemoteException e)
I O cliente tem que o localizar (em i01co2213)Echo montanhatry
montanha = Naminglookup(lsquolsquoi01co2213alpesrsquorsquo)
catch ( RemoteException e) Naminglookup() is RMI
Arquitectura de Java RMI
RMI Client
Web server
RMIregistry
RMI server
1 register object
3 return object reference
2 lookup object
4 request stub class
5 return stub class
6 remote invocation
7 return result
RMI e Seguranccedila
Problema Java RMI pode exigir a transferecircncia de coacutedigo(classes) de maacutequinas remotas
I este coacutedigo eacute uma potencial ameaccedila agrave seguranccedilaSoluccedilatildeo Usar um Security Manager
I um objecto que controla o acesso aos recursos locais
I Java 10 suportava um modecirclo de seguranccedila do tiposandbox
I Coacutedigo local natildeo tinha restriccedilotildees para aleacutem das impostaspelo SO
I Coacutedigo importado soacute podia aceder aos recursos (limitados)disponiacuteveis na sandbox
I A partir de Java 12 pode-se sujeitar todo o coacutedigoindependentemente de ser ou natildeo local a controlo deacesso sendo este determinado pela security policy emvigor
Poliacutetica de Seguranccedila (Security Policy) e Permissotildees
I A poliacutetica de seguranccedila define as permissotildees de coacutedigocom base na sua origem sendo configuraacutevel quer peloutilizador quer pelo administrador
I Cada permissatildeo especifica o tipo de acesso permitido aum determinado recurso tal como
I Lecircr ou escrever um ficheiro ou directoacuterioI Estabelecer uma conexatildeo para um determinado endereccedilo
IP e portoI Algumas operaccedilotildees sobre a proacutepria JVM requerem
permissotildeesI Substituir o ClassLoaderI Substituir o SecurityManagerI Alterar a poliacutetica de seguranccedila
Permissotildees
I Internamente permissotildees satildeo objectos PexI javaioFilePermission
I Uma permissatildeo tipicamente temNome que identifica o recurso a que se aplicaLista de acccedilotildees que especifica as operaccedilotildees permitidas
permissatildeo nome lista de acccedilotildeesjavaioFilePermission ldquousrlib-rdquo ldquoread executerdquojavanetSocketPermission ldquoabccom54321rdquo ldquoconnectrdquojavasecuritySecurityPermission ldquosetPolicyrdquojavalangRuntimePermission ldquocreateClassLoaderrdquojavalangRuntimePermission ldquosetSecurityManagerrdquo
I Uma poliacutetica de seguranccedila eacute um conjunto de permissotildeesque determinam que operaccedilotildees um segmento de coacutedigopode executar
I Naturalmente a poliacutetica de seguranccedila eacute representada porum objecto (javasecurityPolicy)
Inicializaccedilatildeo do javasecurityPolicy
I Na implementaccedilatildeo referecircncia este objecto pode serinicializado a partir de vaacuterios ficheiros de configuraccedilatildeo Poromissatildeo usa
I Um ficheiro de configuraccedilatildeo para todo o sistema$javahomelibsecurityjavapolicy
I Um ficheiro de configuraccedilatildeo por utilizador~javapolicy
I O ficheiro de configuraccedilatildeo das propriedades de seguranccedilapermite especificar ainda outros ficheiros de configuraccedilatildeo
$javahomelibsecurityjavasecurity
I O ficheiro com a poliacutetica de seguranccedila pode ainda serespecificado quando da invocaccedilatildeo da JVM
java -Djavasecuritypolicy=somefile I Se a propriedade policyallowSystemProperty o
permitir ndash pode ser activada no ficheiro de configuraccedilatildeodas propriedades de seguranccedila
Sintaxe dos Ficheiros de Poliacuteticas
I Consiste numa lista de elementos (entries)keystore eacute opcional (natildeo usaremos pelo menos para
jaacute)grant clausuacutela usada para especificar as permissotildees de
coacutedigo de acordo com algumas propriedades(consideraremos apenas a sua origem)
I Tem o seguinte formato (de facto omite regras)
grant [codebase ltURLgt] permission ltclass_namegt lttargetgt [ ltactiongt]
onde
codebase especifica a origem do coacutedigo
permission especifica uma permissatildeo podendo umelemento grant incluir vaacuterias permissotildees
I Pode ocorrer uma ou mais vezes
Sintaxe dos Ficheiros de Poliacuteticas Exemplos
grant permission javanetSocketPermission 1024-
connectacceptpermission javanetSocketPermission abccom
connectacceptpermission javaioFilePermission
homeannpublic_htmlclasses- readpermission javaioFilePermission
homejonespublic_htmlclasses- read
grant codeBase httppaginasfeuppt~ei77777classes permission javasecurityAllPermission
I policytool eacute uma aplicaccedilatildeo que faz parte do J2SDKque oferece um GUI para auxiliar a ediccedilatildeo de ficheiros depoliacuteticas
Security Manager (12)
I O Security Manager eacute um objecto que garante ocumprimento da poliacutetica de seguranccedila
I Consiste apenas num conjunto de meacutetodos tais comopublic void checkPermission(Permission perm)
throws SecurityException
public void checkCreateClassLoader( )throws SecurityException
I Normalmente um thread soacute pode executar uma operaccedilatildeose todos os meacutetodos activos que invocou tiverempermissatildeo para a executar
I Tipicamente essa decisatildeo eacute baseada na origem do coacutedigoI Estes meacutetodos satildeo invocados por outros objectos quando
executam certas operaccedilotildeesI O Security Manager eacute um Reference Monitor
Security Manager (22)
I O SecurityManager natildeo eacute instalado por omissatildeoI A instalaccedilatildeo do SecurityManager pode ser feita
I Pelo interpretador (JVM)java -Djavasecuritymanager
I Pelo coacutedigoSystemsetSecurityManager(new SecurityManager())
I A poliacutetica imposta pelo SecurityManager pode serconfigurada atraveacutes dos ficheiros de especificaccedilatildeo daSecurityPolicy
I O coacutedigo do sistema invoca os meacutetodos checkXXX doSecurityManager se este estiver instalado
I Estes meacutetodos por sua vez invocam o meacutetodocheckPermission() do AccessController
Access Controller
I A partir de Java 12 ojavasecurityAccessController eacute a classe quede facto garante o cumprimento da poliacutetica de seguranccedila
I Por concepccedilatildeo eacute mais faacutecil flexiacutevel que oSecurityManager e estaacute sempre instalado (soacute static)
I Implementa uma poliacutetica razoavelmente restritiva que podeser usada na maioria dos casos
I Naturalmente pode invocar-se directamente da aplicaccedilatildeoos meacutetodos do AccessControllerFilePermission perm = new FilePermission(tmptestFile read)AccessControllercheckPermission(perm)
I Se a poliacutetica de seguranccedila implementada peloAccessController natildeo focircr adequada pode seradaptada criando subclasses dojavalangSecurityManager
I Estas subclasses devem invocar os meacutetodos doAccessController sempre que tal faccedila sentido
javarmiRMISecurityManager
I javarmiRMISecurityManager eacute uma sua subclassedo javalangSecurityManager
I Implementa exactamente os mesmos meacutetodosI O RMISecurityManager deve ser usado com RMI
sempre que haacute necessidade de transferir coacutedigo dumcomputador remoto
I O RMI class loader recusa-se a carregar qualquer classese natildeo houver um Security Manager
I O RMISecurityManager pode ser instalado de 2 modos
I Atraveacutes do coacutedigoSystemsetSecurityManager(new RMISecurityManager())
I Atraveacutes da linha de comandojava -Djavasecuritymanager=javarmiRMISecurityManager
Arquitectura de Seguranccedila em Java
I O Security Manager natildeo eacute a histoacuteria toda
Classrepository
Classverifier
Loadedclassobject
Java interpreter
Java program
Requestclass
Select appropriate loader
Loader forremoteclasses
Loader forlocal
classes
Classrepository
Remote siteLocal site
Tempo de Vida dum Objecto Remoto
I A vida dum objecto chega ao fim quando deixa de serreferenciado
I sem qualquer referecircncia para o objecto natildeo eacute possiacutevelaceder-lhe
I Para objectos locaisI o garbage collector da JVM automaticamente detecta
quando um objecto deixa de ser referenciado e liberta osrecursos
I quando a JVM termina todos os objectos locais terminamI Para objectos remotos
I as diferentes JVMs executam um algoritmo distribuiacutedo parafazer garbage collection
I quando uma JVM termina objectos remotos por elacriados podem natildeo terminar Por exemplo
I o RMIregistry manteacutem uma referecircncia para todos osobjectos nele registados
Passos no Desenvolvimento com Java RMI1 Concepccedilatildeo e implementaccedilatildeo de servidor e clientes
I Definiccedilatildeo da interface remota ie dos meacutetodos que podemser invocados remotamente
I Implementaccedilatildeo de objectos remotos os quais devemimplementar a interface remota definida
I Implementaccedilatildeo de clientes2 Compilaccedilatildeo do coacutedigo e geraccedilatildeo de stubs
I a compilaccedilatildeo do coacutedigo eacute feita usando javacI os stubs a usar pelo cliente podem ser gerados usando ormic a partir do ficheiro class da implementaccedilatildeo
rmic Echo_Impl
Nota A partir de Java 50 Java RMI suporta a geraccedilatildeodinacircmica de stubs
3 Disponibilizaccedilatildeo do coacutedigo por exemplo num servidorHTTP
I classes que precisem ser carregadas (downloaded)incluindo os stubs devem ser disponibilizadas num servidorHTTP
RMI e Uploaded Code
I Aplicaccedilotildees (clientes ou servidores) que podem transferircoacutedigo deveratildeo instalar um Security Manager import javarmipublic class Echo_Client public static void main(String[] args)
if(argslength = 2) Systemoutprintln(Usage java Echo_Client +
srv_hostname obj_name)return
SystemsetSecurityManager(new RMISecurityManager())try
I Se o coacutedigo do stub pode ser uploaded haacute que inicializar apropriedade javarmiservercodebase na aplicaccedilatildeoservidora pexjava -Djavarmiservercodebase=httpweb~pfsecho_server
I Atenccedilatildeo ao rmiregistry
Arquitectura de Java RMI
RMI Client
Web server
RMIregistry
RMI server
1 register object
3 return object reference
2 lookup object
4 request stub class
5 return stub class
6 remote invocation
7 return result
Sumaacuterio
RMIConceitoImplementaccedilatildeoExemplos
Java RMICaracteriacutesticasObjectos Remotos e Interfaces RemotasImplementaccedilatildeo de Java RMIArgumentos e serializaccedilatildeoTransferecircncia de coacutedigoLocalizaccedilatildeo de objectos remotosSeguranccedilaTempo de vida dum objecto remotoPassos no desenvolvimento de aplicaccedilotildeesTransferecircncia de coacutedigo
Leitura Adicional
I Capiacutetulo 10 de Tanenbaum e van Steen DistributedSystems 2nd Ed
I Secccedilatildeo 101 Architecture excepto Subsecccedilatildeo 1013I Secccedilatildeo 103 Communication excepto Subsecccedilatildeo 1035
I Java RMI Specification da SunI Java Security Overview da Sun Secccedilotildees 1 2 e 8I Security Policy in Java SE 6 da SunI Permissions in Java SE 6 da Sun
- RMI
-
- Conceito
- Implementaccedilatildeo
- Exemplos
-
- Java RMI
-
- Caracteriacutesticas
- Objectos Remotos e Interfaces Remotas
- Implementaccedilatildeo de Java RMI
- Argumentos e serializaccedilatildeo
- Transferecircncia de coacutedigo
- Localizaccedilatildeo de objectos remotos
- Seguranccedila
- Tempo de vida dum objecto remoto
- Passos no desenvolvimento de aplicaccedilotildees
- Transferecircncia de coacutedigo
-
- Leitura Adicional
-
RMI Arquitectura de Implementaccedilatildeo
Server machine
Object
Client machine
Proxy
Sameinterfaceas object
Interface
State
MethodClientinvokesa method
Network
Skeletoninvokessame methodat object
Marshalled invocationis passed across network
Client OS Server OS
Server
Skeleton
Client
I Alternativamente a funcionalidade do skeleton pode serimplementada pela classe do objecto remoto
RMI - Exemplos
CORBA RMI Heterogeneidade eacute a caracteriacutestica distintivaI O objecto e o cliente podem ser implementados
usando linguagens diferentesI Para o efeito CORBA define uma Interface Definition
Language (IDL) funcionalmente anaacuteloga a RPCLI CORBA suporta inclusivamente linguagens
natildeo-baseadas em objectos como C ou Cobol
Java RMI Dependente da linguagem
Sumaacuterio
RMIConceitoImplementaccedilatildeoExemplos
Java RMICaracteriacutesticasObjectos Remotos e Interfaces RemotasImplementaccedilatildeo de Java RMIArgumentos e serializaccedilatildeoTransferecircncia de coacutedigoLocalizaccedilatildeo de objectos remotosSeguranccedilaTempo de vida dum objecto remotoPassos no desenvolvimento de aplicaccedilotildeesTransferecircncia de coacutedigo
Java RMI Caracteriacutesticas (12)
I ldquoIntegradardquo na linguagem JavaI mais faacutecil de usar ndash natildeo haacute necessidade de usar
linguagens de especificaccedilatildeo de interfaces pex InterfaceDefinition Language (IDL) em CORBA
I Invocaccedilatildeo de meacutetodos remotos usa a mesma sintaxe quea invocaccedilatildeo de meacutetodos locais mas
I Distribuiccedilatildeo dos objectos eacute exibida intencionalmenteI a invocaccedilatildeo dum meacutetodo remoto pode assinalar uma
excepccedilatildeo RemoteExceptionI para que os meacutetodos dum objecto possam ser invocados
remotamente a classe correspondente deveraacute implementaruma interface remota
Java RMI Caracteriacutesticas (22)
I Benificia da mobilidade deI coacutedigo (classes)I objectos
entre computadores suportada por JavaI Distributed Garbage Collection
I um objecto ldquodesaparecerdquo automaticamente quando natildeopode ser acedido
Objectos Remotos e Interfaces Remotas
I Objectos remotos satildeo objectos cujos meacutetodos podem serinvocados duma JVM diferente daquela onde residem
I Um objecto remoto tem que implementar uma interfaceremota ie o seu tipo eacute um subtipo da interface Remote
I Permite que o compilador de Java gere o coacutedigonecessaacuterio para realizar a comunicaccedilatildeo entre objectos emJVMs distintas
I A natildeo-localidade dum objecto remoto eacute exposta aosprogramadores dos ldquoclientesrdquo
I Todos os meacutetodos da interface Remote tecircm que assinalarRemoteExceptions
I Um objecto remoto pode incluir meacutetodos natildeo invocaacuteveisremotamente
I Soacute meacutetodos declarados em interfaces remotas podem serinvocados remotamente
Remote Interface Exemplo
I A interface remota dum ldquoservidor de ecordquo pode serimport javarmiRemoteimport javarmiRemoteException
public interface Echo extends Remote String echo(String str) throws RemoteException
I Esta interface suporta um uacutenico meacutetodo remoto echo oqual retorna a string que lhe eacute passada como argumento
I O meacutetodo echo dum objecto que implemente estainterface pode ser invocado remotamente
I Ie pode ser invocado por um objecto a executar numamaacutequina virtual de Java (JVM) diferente
Acesso a Objectos Remotos
I Para usar um objecto remoto um cliente tem queconhecer a interface remota desse objecto
I ie os meacutetodos desse objecto que podem ser invocadosremotamente
I A sintaxe de invocaccedilatildeo de meacutetodos remotos eacute semelhanteagrave de invocaccedilatildeo de meacutetodos locaisEcho montanha = lookup montanhaString ecotry
eco = montanhaecho(lsquolsquoUh Uhrsquorsquo) catch ( RemoteException e)
I Contudo os clientes tecircm que processar excepccedilotildees do tipoRemoteException
Exemplo Implementaccedilatildeo da interface Echo
import javarmiimport javarmiserverUnicastRemoteObject
public class Echo_Impl extends UnicastRemoteObjectimplements Echo
public Echo_Impl() throws RemoteException
super() Actually this is not needed
public String echo(String str) return str
Java RMI e a JVM
I A JVM natildeo conhece objectos remotosI A JVM soacute suporta a invocaccedilatildeo de meacutetodos sobre objectos
locaisI Java RMI eacute uma camada de SW sobre a JVM natildeo faz
parte delaI Java RMI implementa RMI usando os mecanismos do
costumeI stubs do lado do clienteI skeletons do lado do servidor
Java RMI Stubs
I Em Java RMI o stub dum objecto remoto eacute um objectolocal (em relaccedilatildeo ao cliente) que representa esse objectoremoto
I Daiacute a designaccedilatildeo comum de proxy objectI Uma referecircncia remota eacute de facto uma referecircncia para o
stub correspondente O stub dum objecto remotoI implementa a sua interface remotaI conteacutem o seu ldquoendereccedilordquo
I Essencialmente as tarefas executadas pelo stub satildeo1 ldquomarshallingrdquo dos argumentos do meacutetodo2 envio do pedido de execuccedilatildeo do meacutetodo atraveacutes da ldquorederdquo3 recepccedilatildeo da resposta4 ldquounmarshallingrdquo do resultado da invocaccedilatildeo
Java RMI Servers (12)
I Na primeira versatildeo de Java RMI a funcionalidade do ladodo objecto remoto foi repartida por 2 tipos de objectos
I objectos do tipo RemoteServer ndash executam oprocessamento que eacute independente da interface remota
I pex esperar pela recepccedilatildeo de pedidos de invocaccedilatildeoI objectos do tipo skeleton ndash executam o processamento
que depende da interface remotaI unmarshalling dos argumentosI invocaccedilatildeo do meacutetodo do objecto remotoI marshalling dos resultados
Java RMI Servers (22)
I A partir de Java 12 objectos do tipo skeleton deixaram deser necessaacuterios
I objectos do tipo RemoteServer passaram a ser capazesde fazer tambeacutem as tarefas dos skeleton
I Java RMI oferece a classe UnicastRemoteObject aqual estende RemoteServer e oferece funcionalidademiacutenima para aplicaccedilotildees baseadas em RMI
I O objecto termina quando o processo que o criou terminaI Usa TCP na comunicaccedilatildeo com os clientes
Argumentos de Meacutetodos Remotos
I Os argumentos de ou o valor retornado por um meacutetodoremoto podem ser
1 tipos simples Por exemplo boolean char byte shortint long float ou double
2 objectos remotos ie que implementam a interfaceRemote
3 objectos locais serializaacuteveis ie que implementam ainterface Serializable (incluindo Strings e arrays)
I No caso de objectos locais RMI passa uma coacutepia doobjecto
I como o objecto eacute serializaacutevel tal eacute possiacutevelI note-se que Java RMI natildeo ldquoactualizardquo o objecto passado
caso o meacutetodo remoto o tenha modificadoI Atenccedilatildeo Uma referecircncia para um objecto remoto eacute de
facto uma referecircncia para o objecto proxy respectivo
Objectos Remotos vs Objectos Serializaacuteveis
Local objectO1
Copy of O1
Remote objectO2
Localreference L1
New localreference
Remotereference R1
Remoteinvocation withL1 and R1 asparameters
Copy of R1 to O2
Machine A Machine B
Machine C
Client code withRMI to server at C(proxy)
Server code(method implementation)
I Na praacutetica eacute como se objecto remoto O2 fosse passadopor referecircncia enquanto que o objecto local (serializaacutevel)O1 eacute passado por valor
I Semacircnticas diferentes transparecircncia ldquoturvardquo
Serializaccedilatildeo em Java (12)I Java RMI usa o mecanismo de serializaccedilatildeo de Java para
passar os argumentos e o valor retornadoI Em Java serializaccedilatildeo dum objecto consiste na conversatildeo
desse objecto numa sequecircncia de bytes de modo apermitir
I o seu armazenamento no disco para posteriorreincarnaccedilatildeo
I ou a sua migraccedilatildeo para uma outra JVMI A reconstituiccedilatildeo dum objecto a partir da sua
representaccedilatildeo serializada designa-se por deserializaccedilatildeoI Para que um objecto seja serializaacutevel deveraacute implementar
a interface javaioSerializableI A JVM implementa um procedimento de serializaccedilatildeo por
omissatildeo que pode ser usado pela grande maioria dosobjectos
I desde que a definiccedilatildeo da sua classe declare queimplementa a interface javaioSerializable
Serializaccedilatildeo em Java (22)
I Se um objecto tiver campos que satildeo referecircncias paraoutros objectos estes uacuteltimos deveratildeo ser serializaacuteveispara que o primeiro tambeacutem o seja
I para serializar o primeiro objecto haacute que serializar osoutros
I cada objecto soacute eacute serializado uma vez mesmo que sejareferenciado muacuteltiplas vezes
I Por razotildees de eficiecircncia os meacutetodos duma classe natildeo satildeoincluiacutedos na sequecircncia de bytes criada pela serializaccedilatildeo
I a JVM inclui apenas um identificador da classe a que oobjecto pertence
Class Downloading em Java e RMI
Problema Como eacute que um meacutetodo remoto pode invocar omeacutetodo dum objecto natildeo remoto que lhe eacute passado comoargumento
I Os meacutetodos dum objecto natildeo fazem parte da suarepresentaccedilatildeo serializada
Soluccedilatildeo Usando as facilidades de transferecircncia de coacutedigo emJava
I Note-se que esta transferecircncia pode natildeo sernecessaacuteria se a classe estiver disponiacutevel localmente
A capacidade de transferecircncia de classes atraveacutes da redepode tambeacutem ser usada pelo cliente para carregar o proxyobject
I natildeo haacute necessidade de manter todas as classes emtodos os computadores
Localizaccedilatildeo dum Objecto
I O acesso a um objecto remoto eacute feito usando uma referecircnciapara um proxy desse objecto
montanhaecho()
Problema como eacute que se obteacutem uma referecircncia remota ie para oproxy dum objecto remoto
I Tecnicamente atraveacutes do valor de retorno dum meacutetodo
Soluccedilatildeo semelhante ao portmapper de RPC
I Java RMI oferece um serviccedilo de nomes baacutesico ormiregistry
I O rmiregistry eacute um programa e tem que executar noscomputadores que disponibilizam objectos remotos
I O ldquoservidorrdquo regista o objecto com um nome (binds) normiregistry local
I O ldquoclienterdquo solicita uma referecircncia para um objecto remotoao rmiregistry no computador onde o objecto reside
O rmiregistry e a Interface Registry
I O rmiregistry eacute uma aplicaccedilatildeo que implementa ainterface Registryvoid rebind(String name Remote obj)void bind(String name Remote obj)void unbind(String name Remote obj)Remote lookup(String name)String []list()
I Se incorrectamente usado o rmiregistry pode impediro uso de classes ldquoimportadasrdquo
If you do start the rmiregistry and it can find your stubclasses in CLASSPATH it will not remember that theloaded stub class can be loaded from your serverrsquos codebase[] do Tutorial on-line da Sun sobre RMI
A classe Naming
I Permite aceder a objectos que implementam RegistryI Suporta os seguintes meacutetodos
void rebind(String name Remote obj)void bind(String name Remote obj)void unbind(String name Remote obj)Remote lookup(String name)String []list()
ondename eacute um URL sem o meacutetodo de acesso
computerNameportobjectNamesendo computerNameport a ldquolocalizaccedilatildeordquo do
rmiregistryI bind() difere de rebind() na medida em que assinala
uma excepccedilatildeo se name jaacute tiver sido registadoI O rmregistry natildeo eacute um servidor global
I O cliente tem que saber onde se encontra o objecto
Exemplo Registo e Localizaccedilatildeo do ObjectoI O servidor tem que registar o objecto remoto
Echo montanhatry
montanha = new Echo_Impl()Namingrebind(lsquolsquoalpesrsquorsquo montanha)
catch ( RemoteException e)
I O cliente tem que o localizar (em i01co2213)Echo montanhatry
montanha = Naminglookup(lsquolsquoi01co2213alpesrsquorsquo)
catch ( RemoteException e) Naminglookup() is RMI
Arquitectura de Java RMI
RMI Client
Web server
RMIregistry
RMI server
1 register object
3 return object reference
2 lookup object
4 request stub class
5 return stub class
6 remote invocation
7 return result
RMI e Seguranccedila
Problema Java RMI pode exigir a transferecircncia de coacutedigo(classes) de maacutequinas remotas
I este coacutedigo eacute uma potencial ameaccedila agrave seguranccedilaSoluccedilatildeo Usar um Security Manager
I um objecto que controla o acesso aos recursos locais
I Java 10 suportava um modecirclo de seguranccedila do tiposandbox
I Coacutedigo local natildeo tinha restriccedilotildees para aleacutem das impostaspelo SO
I Coacutedigo importado soacute podia aceder aos recursos (limitados)disponiacuteveis na sandbox
I A partir de Java 12 pode-se sujeitar todo o coacutedigoindependentemente de ser ou natildeo local a controlo deacesso sendo este determinado pela security policy emvigor
Poliacutetica de Seguranccedila (Security Policy) e Permissotildees
I A poliacutetica de seguranccedila define as permissotildees de coacutedigocom base na sua origem sendo configuraacutevel quer peloutilizador quer pelo administrador
I Cada permissatildeo especifica o tipo de acesso permitido aum determinado recurso tal como
I Lecircr ou escrever um ficheiro ou directoacuterioI Estabelecer uma conexatildeo para um determinado endereccedilo
IP e portoI Algumas operaccedilotildees sobre a proacutepria JVM requerem
permissotildeesI Substituir o ClassLoaderI Substituir o SecurityManagerI Alterar a poliacutetica de seguranccedila
Permissotildees
I Internamente permissotildees satildeo objectos PexI javaioFilePermission
I Uma permissatildeo tipicamente temNome que identifica o recurso a que se aplicaLista de acccedilotildees que especifica as operaccedilotildees permitidas
permissatildeo nome lista de acccedilotildeesjavaioFilePermission ldquousrlib-rdquo ldquoread executerdquojavanetSocketPermission ldquoabccom54321rdquo ldquoconnectrdquojavasecuritySecurityPermission ldquosetPolicyrdquojavalangRuntimePermission ldquocreateClassLoaderrdquojavalangRuntimePermission ldquosetSecurityManagerrdquo
I Uma poliacutetica de seguranccedila eacute um conjunto de permissotildeesque determinam que operaccedilotildees um segmento de coacutedigopode executar
I Naturalmente a poliacutetica de seguranccedila eacute representada porum objecto (javasecurityPolicy)
Inicializaccedilatildeo do javasecurityPolicy
I Na implementaccedilatildeo referecircncia este objecto pode serinicializado a partir de vaacuterios ficheiros de configuraccedilatildeo Poromissatildeo usa
I Um ficheiro de configuraccedilatildeo para todo o sistema$javahomelibsecurityjavapolicy
I Um ficheiro de configuraccedilatildeo por utilizador~javapolicy
I O ficheiro de configuraccedilatildeo das propriedades de seguranccedilapermite especificar ainda outros ficheiros de configuraccedilatildeo
$javahomelibsecurityjavasecurity
I O ficheiro com a poliacutetica de seguranccedila pode ainda serespecificado quando da invocaccedilatildeo da JVM
java -Djavasecuritypolicy=somefile I Se a propriedade policyallowSystemProperty o
permitir ndash pode ser activada no ficheiro de configuraccedilatildeodas propriedades de seguranccedila
Sintaxe dos Ficheiros de Poliacuteticas
I Consiste numa lista de elementos (entries)keystore eacute opcional (natildeo usaremos pelo menos para
jaacute)grant clausuacutela usada para especificar as permissotildees de
coacutedigo de acordo com algumas propriedades(consideraremos apenas a sua origem)
I Tem o seguinte formato (de facto omite regras)
grant [codebase ltURLgt] permission ltclass_namegt lttargetgt [ ltactiongt]
onde
codebase especifica a origem do coacutedigo
permission especifica uma permissatildeo podendo umelemento grant incluir vaacuterias permissotildees
I Pode ocorrer uma ou mais vezes
Sintaxe dos Ficheiros de Poliacuteticas Exemplos
grant permission javanetSocketPermission 1024-
connectacceptpermission javanetSocketPermission abccom
connectacceptpermission javaioFilePermission
homeannpublic_htmlclasses- readpermission javaioFilePermission
homejonespublic_htmlclasses- read
grant codeBase httppaginasfeuppt~ei77777classes permission javasecurityAllPermission
I policytool eacute uma aplicaccedilatildeo que faz parte do J2SDKque oferece um GUI para auxiliar a ediccedilatildeo de ficheiros depoliacuteticas
Security Manager (12)
I O Security Manager eacute um objecto que garante ocumprimento da poliacutetica de seguranccedila
I Consiste apenas num conjunto de meacutetodos tais comopublic void checkPermission(Permission perm)
throws SecurityException
public void checkCreateClassLoader( )throws SecurityException
I Normalmente um thread soacute pode executar uma operaccedilatildeose todos os meacutetodos activos que invocou tiverempermissatildeo para a executar
I Tipicamente essa decisatildeo eacute baseada na origem do coacutedigoI Estes meacutetodos satildeo invocados por outros objectos quando
executam certas operaccedilotildeesI O Security Manager eacute um Reference Monitor
Security Manager (22)
I O SecurityManager natildeo eacute instalado por omissatildeoI A instalaccedilatildeo do SecurityManager pode ser feita
I Pelo interpretador (JVM)java -Djavasecuritymanager
I Pelo coacutedigoSystemsetSecurityManager(new SecurityManager())
I A poliacutetica imposta pelo SecurityManager pode serconfigurada atraveacutes dos ficheiros de especificaccedilatildeo daSecurityPolicy
I O coacutedigo do sistema invoca os meacutetodos checkXXX doSecurityManager se este estiver instalado
I Estes meacutetodos por sua vez invocam o meacutetodocheckPermission() do AccessController
Access Controller
I A partir de Java 12 ojavasecurityAccessController eacute a classe quede facto garante o cumprimento da poliacutetica de seguranccedila
I Por concepccedilatildeo eacute mais faacutecil flexiacutevel que oSecurityManager e estaacute sempre instalado (soacute static)
I Implementa uma poliacutetica razoavelmente restritiva que podeser usada na maioria dos casos
I Naturalmente pode invocar-se directamente da aplicaccedilatildeoos meacutetodos do AccessControllerFilePermission perm = new FilePermission(tmptestFile read)AccessControllercheckPermission(perm)
I Se a poliacutetica de seguranccedila implementada peloAccessController natildeo focircr adequada pode seradaptada criando subclasses dojavalangSecurityManager
I Estas subclasses devem invocar os meacutetodos doAccessController sempre que tal faccedila sentido
javarmiRMISecurityManager
I javarmiRMISecurityManager eacute uma sua subclassedo javalangSecurityManager
I Implementa exactamente os mesmos meacutetodosI O RMISecurityManager deve ser usado com RMI
sempre que haacute necessidade de transferir coacutedigo dumcomputador remoto
I O RMI class loader recusa-se a carregar qualquer classese natildeo houver um Security Manager
I O RMISecurityManager pode ser instalado de 2 modos
I Atraveacutes do coacutedigoSystemsetSecurityManager(new RMISecurityManager())
I Atraveacutes da linha de comandojava -Djavasecuritymanager=javarmiRMISecurityManager
Arquitectura de Seguranccedila em Java
I O Security Manager natildeo eacute a histoacuteria toda
Classrepository
Classverifier
Loadedclassobject
Java interpreter
Java program
Requestclass
Select appropriate loader
Loader forremoteclasses
Loader forlocal
classes
Classrepository
Remote siteLocal site
Tempo de Vida dum Objecto Remoto
I A vida dum objecto chega ao fim quando deixa de serreferenciado
I sem qualquer referecircncia para o objecto natildeo eacute possiacutevelaceder-lhe
I Para objectos locaisI o garbage collector da JVM automaticamente detecta
quando um objecto deixa de ser referenciado e liberta osrecursos
I quando a JVM termina todos os objectos locais terminamI Para objectos remotos
I as diferentes JVMs executam um algoritmo distribuiacutedo parafazer garbage collection
I quando uma JVM termina objectos remotos por elacriados podem natildeo terminar Por exemplo
I o RMIregistry manteacutem uma referecircncia para todos osobjectos nele registados
Passos no Desenvolvimento com Java RMI1 Concepccedilatildeo e implementaccedilatildeo de servidor e clientes
I Definiccedilatildeo da interface remota ie dos meacutetodos que podemser invocados remotamente
I Implementaccedilatildeo de objectos remotos os quais devemimplementar a interface remota definida
I Implementaccedilatildeo de clientes2 Compilaccedilatildeo do coacutedigo e geraccedilatildeo de stubs
I a compilaccedilatildeo do coacutedigo eacute feita usando javacI os stubs a usar pelo cliente podem ser gerados usando ormic a partir do ficheiro class da implementaccedilatildeo
rmic Echo_Impl
Nota A partir de Java 50 Java RMI suporta a geraccedilatildeodinacircmica de stubs
3 Disponibilizaccedilatildeo do coacutedigo por exemplo num servidorHTTP
I classes que precisem ser carregadas (downloaded)incluindo os stubs devem ser disponibilizadas num servidorHTTP
RMI e Uploaded Code
I Aplicaccedilotildees (clientes ou servidores) que podem transferircoacutedigo deveratildeo instalar um Security Manager import javarmipublic class Echo_Client public static void main(String[] args)
if(argslength = 2) Systemoutprintln(Usage java Echo_Client +
srv_hostname obj_name)return
SystemsetSecurityManager(new RMISecurityManager())try
I Se o coacutedigo do stub pode ser uploaded haacute que inicializar apropriedade javarmiservercodebase na aplicaccedilatildeoservidora pexjava -Djavarmiservercodebase=httpweb~pfsecho_server
I Atenccedilatildeo ao rmiregistry
Arquitectura de Java RMI
RMI Client
Web server
RMIregistry
RMI server
1 register object
3 return object reference
2 lookup object
4 request stub class
5 return stub class
6 remote invocation
7 return result
Sumaacuterio
RMIConceitoImplementaccedilatildeoExemplos
Java RMICaracteriacutesticasObjectos Remotos e Interfaces RemotasImplementaccedilatildeo de Java RMIArgumentos e serializaccedilatildeoTransferecircncia de coacutedigoLocalizaccedilatildeo de objectos remotosSeguranccedilaTempo de vida dum objecto remotoPassos no desenvolvimento de aplicaccedilotildeesTransferecircncia de coacutedigo
Leitura Adicional
I Capiacutetulo 10 de Tanenbaum e van Steen DistributedSystems 2nd Ed
I Secccedilatildeo 101 Architecture excepto Subsecccedilatildeo 1013I Secccedilatildeo 103 Communication excepto Subsecccedilatildeo 1035
I Java RMI Specification da SunI Java Security Overview da Sun Secccedilotildees 1 2 e 8I Security Policy in Java SE 6 da SunI Permissions in Java SE 6 da Sun
- RMI
-
- Conceito
- Implementaccedilatildeo
- Exemplos
-
- Java RMI
-
- Caracteriacutesticas
- Objectos Remotos e Interfaces Remotas
- Implementaccedilatildeo de Java RMI
- Argumentos e serializaccedilatildeo
- Transferecircncia de coacutedigo
- Localizaccedilatildeo de objectos remotos
- Seguranccedila
- Tempo de vida dum objecto remoto
- Passos no desenvolvimento de aplicaccedilotildees
- Transferecircncia de coacutedigo
-
- Leitura Adicional
-
Sumaacuterio
RMIConceitoImplementaccedilatildeoExemplos
Java RMICaracteriacutesticasObjectos Remotos e Interfaces RemotasImplementaccedilatildeo de Java RMIArgumentos e serializaccedilatildeoTransferecircncia de coacutedigoLocalizaccedilatildeo de objectos remotosSeguranccedilaTempo de vida dum objecto remotoPassos no desenvolvimento de aplicaccedilotildeesTransferecircncia de coacutedigo
Java RMI Caracteriacutesticas (12)
I ldquoIntegradardquo na linguagem JavaI mais faacutecil de usar ndash natildeo haacute necessidade de usar
linguagens de especificaccedilatildeo de interfaces pex InterfaceDefinition Language (IDL) em CORBA
I Invocaccedilatildeo de meacutetodos remotos usa a mesma sintaxe quea invocaccedilatildeo de meacutetodos locais mas
I Distribuiccedilatildeo dos objectos eacute exibida intencionalmenteI a invocaccedilatildeo dum meacutetodo remoto pode assinalar uma
excepccedilatildeo RemoteExceptionI para que os meacutetodos dum objecto possam ser invocados
remotamente a classe correspondente deveraacute implementaruma interface remota
Java RMI Caracteriacutesticas (22)
I Benificia da mobilidade deI coacutedigo (classes)I objectos
entre computadores suportada por JavaI Distributed Garbage Collection
I um objecto ldquodesaparecerdquo automaticamente quando natildeopode ser acedido
Objectos Remotos e Interfaces Remotas
I Objectos remotos satildeo objectos cujos meacutetodos podem serinvocados duma JVM diferente daquela onde residem
I Um objecto remoto tem que implementar uma interfaceremota ie o seu tipo eacute um subtipo da interface Remote
I Permite que o compilador de Java gere o coacutedigonecessaacuterio para realizar a comunicaccedilatildeo entre objectos emJVMs distintas
I A natildeo-localidade dum objecto remoto eacute exposta aosprogramadores dos ldquoclientesrdquo
I Todos os meacutetodos da interface Remote tecircm que assinalarRemoteExceptions
I Um objecto remoto pode incluir meacutetodos natildeo invocaacuteveisremotamente
I Soacute meacutetodos declarados em interfaces remotas podem serinvocados remotamente
Remote Interface Exemplo
I A interface remota dum ldquoservidor de ecordquo pode serimport javarmiRemoteimport javarmiRemoteException
public interface Echo extends Remote String echo(String str) throws RemoteException
I Esta interface suporta um uacutenico meacutetodo remoto echo oqual retorna a string que lhe eacute passada como argumento
I O meacutetodo echo dum objecto que implemente estainterface pode ser invocado remotamente
I Ie pode ser invocado por um objecto a executar numamaacutequina virtual de Java (JVM) diferente
Acesso a Objectos Remotos
I Para usar um objecto remoto um cliente tem queconhecer a interface remota desse objecto
I ie os meacutetodos desse objecto que podem ser invocadosremotamente
I A sintaxe de invocaccedilatildeo de meacutetodos remotos eacute semelhanteagrave de invocaccedilatildeo de meacutetodos locaisEcho montanha = lookup montanhaString ecotry
eco = montanhaecho(lsquolsquoUh Uhrsquorsquo) catch ( RemoteException e)
I Contudo os clientes tecircm que processar excepccedilotildees do tipoRemoteException
Exemplo Implementaccedilatildeo da interface Echo
import javarmiimport javarmiserverUnicastRemoteObject
public class Echo_Impl extends UnicastRemoteObjectimplements Echo
public Echo_Impl() throws RemoteException
super() Actually this is not needed
public String echo(String str) return str
Java RMI e a JVM
I A JVM natildeo conhece objectos remotosI A JVM soacute suporta a invocaccedilatildeo de meacutetodos sobre objectos
locaisI Java RMI eacute uma camada de SW sobre a JVM natildeo faz
parte delaI Java RMI implementa RMI usando os mecanismos do
costumeI stubs do lado do clienteI skeletons do lado do servidor
Java RMI Stubs
I Em Java RMI o stub dum objecto remoto eacute um objectolocal (em relaccedilatildeo ao cliente) que representa esse objectoremoto
I Daiacute a designaccedilatildeo comum de proxy objectI Uma referecircncia remota eacute de facto uma referecircncia para o
stub correspondente O stub dum objecto remotoI implementa a sua interface remotaI conteacutem o seu ldquoendereccedilordquo
I Essencialmente as tarefas executadas pelo stub satildeo1 ldquomarshallingrdquo dos argumentos do meacutetodo2 envio do pedido de execuccedilatildeo do meacutetodo atraveacutes da ldquorederdquo3 recepccedilatildeo da resposta4 ldquounmarshallingrdquo do resultado da invocaccedilatildeo
Java RMI Servers (12)
I Na primeira versatildeo de Java RMI a funcionalidade do ladodo objecto remoto foi repartida por 2 tipos de objectos
I objectos do tipo RemoteServer ndash executam oprocessamento que eacute independente da interface remota
I pex esperar pela recepccedilatildeo de pedidos de invocaccedilatildeoI objectos do tipo skeleton ndash executam o processamento
que depende da interface remotaI unmarshalling dos argumentosI invocaccedilatildeo do meacutetodo do objecto remotoI marshalling dos resultados
Java RMI Servers (22)
I A partir de Java 12 objectos do tipo skeleton deixaram deser necessaacuterios
I objectos do tipo RemoteServer passaram a ser capazesde fazer tambeacutem as tarefas dos skeleton
I Java RMI oferece a classe UnicastRemoteObject aqual estende RemoteServer e oferece funcionalidademiacutenima para aplicaccedilotildees baseadas em RMI
I O objecto termina quando o processo que o criou terminaI Usa TCP na comunicaccedilatildeo com os clientes
Argumentos de Meacutetodos Remotos
I Os argumentos de ou o valor retornado por um meacutetodoremoto podem ser
1 tipos simples Por exemplo boolean char byte shortint long float ou double
2 objectos remotos ie que implementam a interfaceRemote
3 objectos locais serializaacuteveis ie que implementam ainterface Serializable (incluindo Strings e arrays)
I No caso de objectos locais RMI passa uma coacutepia doobjecto
I como o objecto eacute serializaacutevel tal eacute possiacutevelI note-se que Java RMI natildeo ldquoactualizardquo o objecto passado
caso o meacutetodo remoto o tenha modificadoI Atenccedilatildeo Uma referecircncia para um objecto remoto eacute de
facto uma referecircncia para o objecto proxy respectivo
Objectos Remotos vs Objectos Serializaacuteveis
Local objectO1
Copy of O1
Remote objectO2
Localreference L1
New localreference
Remotereference R1
Remoteinvocation withL1 and R1 asparameters
Copy of R1 to O2
Machine A Machine B
Machine C
Client code withRMI to server at C(proxy)
Server code(method implementation)
I Na praacutetica eacute como se objecto remoto O2 fosse passadopor referecircncia enquanto que o objecto local (serializaacutevel)O1 eacute passado por valor
I Semacircnticas diferentes transparecircncia ldquoturvardquo
Serializaccedilatildeo em Java (12)I Java RMI usa o mecanismo de serializaccedilatildeo de Java para
passar os argumentos e o valor retornadoI Em Java serializaccedilatildeo dum objecto consiste na conversatildeo
desse objecto numa sequecircncia de bytes de modo apermitir
I o seu armazenamento no disco para posteriorreincarnaccedilatildeo
I ou a sua migraccedilatildeo para uma outra JVMI A reconstituiccedilatildeo dum objecto a partir da sua
representaccedilatildeo serializada designa-se por deserializaccedilatildeoI Para que um objecto seja serializaacutevel deveraacute implementar
a interface javaioSerializableI A JVM implementa um procedimento de serializaccedilatildeo por
omissatildeo que pode ser usado pela grande maioria dosobjectos
I desde que a definiccedilatildeo da sua classe declare queimplementa a interface javaioSerializable
Serializaccedilatildeo em Java (22)
I Se um objecto tiver campos que satildeo referecircncias paraoutros objectos estes uacuteltimos deveratildeo ser serializaacuteveispara que o primeiro tambeacutem o seja
I para serializar o primeiro objecto haacute que serializar osoutros
I cada objecto soacute eacute serializado uma vez mesmo que sejareferenciado muacuteltiplas vezes
I Por razotildees de eficiecircncia os meacutetodos duma classe natildeo satildeoincluiacutedos na sequecircncia de bytes criada pela serializaccedilatildeo
I a JVM inclui apenas um identificador da classe a que oobjecto pertence
Class Downloading em Java e RMI
Problema Como eacute que um meacutetodo remoto pode invocar omeacutetodo dum objecto natildeo remoto que lhe eacute passado comoargumento
I Os meacutetodos dum objecto natildeo fazem parte da suarepresentaccedilatildeo serializada
Soluccedilatildeo Usando as facilidades de transferecircncia de coacutedigo emJava
I Note-se que esta transferecircncia pode natildeo sernecessaacuteria se a classe estiver disponiacutevel localmente
A capacidade de transferecircncia de classes atraveacutes da redepode tambeacutem ser usada pelo cliente para carregar o proxyobject
I natildeo haacute necessidade de manter todas as classes emtodos os computadores
Localizaccedilatildeo dum Objecto
I O acesso a um objecto remoto eacute feito usando uma referecircnciapara um proxy desse objecto
montanhaecho()
Problema como eacute que se obteacutem uma referecircncia remota ie para oproxy dum objecto remoto
I Tecnicamente atraveacutes do valor de retorno dum meacutetodo
Soluccedilatildeo semelhante ao portmapper de RPC
I Java RMI oferece um serviccedilo de nomes baacutesico ormiregistry
I O rmiregistry eacute um programa e tem que executar noscomputadores que disponibilizam objectos remotos
I O ldquoservidorrdquo regista o objecto com um nome (binds) normiregistry local
I O ldquoclienterdquo solicita uma referecircncia para um objecto remotoao rmiregistry no computador onde o objecto reside
O rmiregistry e a Interface Registry
I O rmiregistry eacute uma aplicaccedilatildeo que implementa ainterface Registryvoid rebind(String name Remote obj)void bind(String name Remote obj)void unbind(String name Remote obj)Remote lookup(String name)String []list()
I Se incorrectamente usado o rmiregistry pode impediro uso de classes ldquoimportadasrdquo
If you do start the rmiregistry and it can find your stubclasses in CLASSPATH it will not remember that theloaded stub class can be loaded from your serverrsquos codebase[] do Tutorial on-line da Sun sobre RMI
A classe Naming
I Permite aceder a objectos que implementam RegistryI Suporta os seguintes meacutetodos
void rebind(String name Remote obj)void bind(String name Remote obj)void unbind(String name Remote obj)Remote lookup(String name)String []list()
ondename eacute um URL sem o meacutetodo de acesso
computerNameportobjectNamesendo computerNameport a ldquolocalizaccedilatildeordquo do
rmiregistryI bind() difere de rebind() na medida em que assinala
uma excepccedilatildeo se name jaacute tiver sido registadoI O rmregistry natildeo eacute um servidor global
I O cliente tem que saber onde se encontra o objecto
Exemplo Registo e Localizaccedilatildeo do ObjectoI O servidor tem que registar o objecto remoto
Echo montanhatry
montanha = new Echo_Impl()Namingrebind(lsquolsquoalpesrsquorsquo montanha)
catch ( RemoteException e)
I O cliente tem que o localizar (em i01co2213)Echo montanhatry
montanha = Naminglookup(lsquolsquoi01co2213alpesrsquorsquo)
catch ( RemoteException e) Naminglookup() is RMI
Arquitectura de Java RMI
RMI Client
Web server
RMIregistry
RMI server
1 register object
3 return object reference
2 lookup object
4 request stub class
5 return stub class
6 remote invocation
7 return result
RMI e Seguranccedila
Problema Java RMI pode exigir a transferecircncia de coacutedigo(classes) de maacutequinas remotas
I este coacutedigo eacute uma potencial ameaccedila agrave seguranccedilaSoluccedilatildeo Usar um Security Manager
I um objecto que controla o acesso aos recursos locais
I Java 10 suportava um modecirclo de seguranccedila do tiposandbox
I Coacutedigo local natildeo tinha restriccedilotildees para aleacutem das impostaspelo SO
I Coacutedigo importado soacute podia aceder aos recursos (limitados)disponiacuteveis na sandbox
I A partir de Java 12 pode-se sujeitar todo o coacutedigoindependentemente de ser ou natildeo local a controlo deacesso sendo este determinado pela security policy emvigor
Poliacutetica de Seguranccedila (Security Policy) e Permissotildees
I A poliacutetica de seguranccedila define as permissotildees de coacutedigocom base na sua origem sendo configuraacutevel quer peloutilizador quer pelo administrador
I Cada permissatildeo especifica o tipo de acesso permitido aum determinado recurso tal como
I Lecircr ou escrever um ficheiro ou directoacuterioI Estabelecer uma conexatildeo para um determinado endereccedilo
IP e portoI Algumas operaccedilotildees sobre a proacutepria JVM requerem
permissotildeesI Substituir o ClassLoaderI Substituir o SecurityManagerI Alterar a poliacutetica de seguranccedila
Permissotildees
I Internamente permissotildees satildeo objectos PexI javaioFilePermission
I Uma permissatildeo tipicamente temNome que identifica o recurso a que se aplicaLista de acccedilotildees que especifica as operaccedilotildees permitidas
permissatildeo nome lista de acccedilotildeesjavaioFilePermission ldquousrlib-rdquo ldquoread executerdquojavanetSocketPermission ldquoabccom54321rdquo ldquoconnectrdquojavasecuritySecurityPermission ldquosetPolicyrdquojavalangRuntimePermission ldquocreateClassLoaderrdquojavalangRuntimePermission ldquosetSecurityManagerrdquo
I Uma poliacutetica de seguranccedila eacute um conjunto de permissotildeesque determinam que operaccedilotildees um segmento de coacutedigopode executar
I Naturalmente a poliacutetica de seguranccedila eacute representada porum objecto (javasecurityPolicy)
Inicializaccedilatildeo do javasecurityPolicy
I Na implementaccedilatildeo referecircncia este objecto pode serinicializado a partir de vaacuterios ficheiros de configuraccedilatildeo Poromissatildeo usa
I Um ficheiro de configuraccedilatildeo para todo o sistema$javahomelibsecurityjavapolicy
I Um ficheiro de configuraccedilatildeo por utilizador~javapolicy
I O ficheiro de configuraccedilatildeo das propriedades de seguranccedilapermite especificar ainda outros ficheiros de configuraccedilatildeo
$javahomelibsecurityjavasecurity
I O ficheiro com a poliacutetica de seguranccedila pode ainda serespecificado quando da invocaccedilatildeo da JVM
java -Djavasecuritypolicy=somefile I Se a propriedade policyallowSystemProperty o
permitir ndash pode ser activada no ficheiro de configuraccedilatildeodas propriedades de seguranccedila
Sintaxe dos Ficheiros de Poliacuteticas
I Consiste numa lista de elementos (entries)keystore eacute opcional (natildeo usaremos pelo menos para
jaacute)grant clausuacutela usada para especificar as permissotildees de
coacutedigo de acordo com algumas propriedades(consideraremos apenas a sua origem)
I Tem o seguinte formato (de facto omite regras)
grant [codebase ltURLgt] permission ltclass_namegt lttargetgt [ ltactiongt]
onde
codebase especifica a origem do coacutedigo
permission especifica uma permissatildeo podendo umelemento grant incluir vaacuterias permissotildees
I Pode ocorrer uma ou mais vezes
Sintaxe dos Ficheiros de Poliacuteticas Exemplos
grant permission javanetSocketPermission 1024-
connectacceptpermission javanetSocketPermission abccom
connectacceptpermission javaioFilePermission
homeannpublic_htmlclasses- readpermission javaioFilePermission
homejonespublic_htmlclasses- read
grant codeBase httppaginasfeuppt~ei77777classes permission javasecurityAllPermission
I policytool eacute uma aplicaccedilatildeo que faz parte do J2SDKque oferece um GUI para auxiliar a ediccedilatildeo de ficheiros depoliacuteticas
Security Manager (12)
I O Security Manager eacute um objecto que garante ocumprimento da poliacutetica de seguranccedila
I Consiste apenas num conjunto de meacutetodos tais comopublic void checkPermission(Permission perm)
throws SecurityException
public void checkCreateClassLoader( )throws SecurityException
I Normalmente um thread soacute pode executar uma operaccedilatildeose todos os meacutetodos activos que invocou tiverempermissatildeo para a executar
I Tipicamente essa decisatildeo eacute baseada na origem do coacutedigoI Estes meacutetodos satildeo invocados por outros objectos quando
executam certas operaccedilotildeesI O Security Manager eacute um Reference Monitor
Security Manager (22)
I O SecurityManager natildeo eacute instalado por omissatildeoI A instalaccedilatildeo do SecurityManager pode ser feita
I Pelo interpretador (JVM)java -Djavasecuritymanager
I Pelo coacutedigoSystemsetSecurityManager(new SecurityManager())
I A poliacutetica imposta pelo SecurityManager pode serconfigurada atraveacutes dos ficheiros de especificaccedilatildeo daSecurityPolicy
I O coacutedigo do sistema invoca os meacutetodos checkXXX doSecurityManager se este estiver instalado
I Estes meacutetodos por sua vez invocam o meacutetodocheckPermission() do AccessController
Access Controller
I A partir de Java 12 ojavasecurityAccessController eacute a classe quede facto garante o cumprimento da poliacutetica de seguranccedila
I Por concepccedilatildeo eacute mais faacutecil flexiacutevel que oSecurityManager e estaacute sempre instalado (soacute static)
I Implementa uma poliacutetica razoavelmente restritiva que podeser usada na maioria dos casos
I Naturalmente pode invocar-se directamente da aplicaccedilatildeoos meacutetodos do AccessControllerFilePermission perm = new FilePermission(tmptestFile read)AccessControllercheckPermission(perm)
I Se a poliacutetica de seguranccedila implementada peloAccessController natildeo focircr adequada pode seradaptada criando subclasses dojavalangSecurityManager
I Estas subclasses devem invocar os meacutetodos doAccessController sempre que tal faccedila sentido
javarmiRMISecurityManager
I javarmiRMISecurityManager eacute uma sua subclassedo javalangSecurityManager
I Implementa exactamente os mesmos meacutetodosI O RMISecurityManager deve ser usado com RMI
sempre que haacute necessidade de transferir coacutedigo dumcomputador remoto
I O RMI class loader recusa-se a carregar qualquer classese natildeo houver um Security Manager
I O RMISecurityManager pode ser instalado de 2 modos
I Atraveacutes do coacutedigoSystemsetSecurityManager(new RMISecurityManager())
I Atraveacutes da linha de comandojava -Djavasecuritymanager=javarmiRMISecurityManager
Arquitectura de Seguranccedila em Java
I O Security Manager natildeo eacute a histoacuteria toda
Classrepository
Classverifier
Loadedclassobject
Java interpreter
Java program
Requestclass
Select appropriate loader
Loader forremoteclasses
Loader forlocal
classes
Classrepository
Remote siteLocal site
Tempo de Vida dum Objecto Remoto
I A vida dum objecto chega ao fim quando deixa de serreferenciado
I sem qualquer referecircncia para o objecto natildeo eacute possiacutevelaceder-lhe
I Para objectos locaisI o garbage collector da JVM automaticamente detecta
quando um objecto deixa de ser referenciado e liberta osrecursos
I quando a JVM termina todos os objectos locais terminamI Para objectos remotos
I as diferentes JVMs executam um algoritmo distribuiacutedo parafazer garbage collection
I quando uma JVM termina objectos remotos por elacriados podem natildeo terminar Por exemplo
I o RMIregistry manteacutem uma referecircncia para todos osobjectos nele registados
Passos no Desenvolvimento com Java RMI1 Concepccedilatildeo e implementaccedilatildeo de servidor e clientes
I Definiccedilatildeo da interface remota ie dos meacutetodos que podemser invocados remotamente
I Implementaccedilatildeo de objectos remotos os quais devemimplementar a interface remota definida
I Implementaccedilatildeo de clientes2 Compilaccedilatildeo do coacutedigo e geraccedilatildeo de stubs
I a compilaccedilatildeo do coacutedigo eacute feita usando javacI os stubs a usar pelo cliente podem ser gerados usando ormic a partir do ficheiro class da implementaccedilatildeo
rmic Echo_Impl
Nota A partir de Java 50 Java RMI suporta a geraccedilatildeodinacircmica de stubs
3 Disponibilizaccedilatildeo do coacutedigo por exemplo num servidorHTTP
I classes que precisem ser carregadas (downloaded)incluindo os stubs devem ser disponibilizadas num servidorHTTP
RMI e Uploaded Code
I Aplicaccedilotildees (clientes ou servidores) que podem transferircoacutedigo deveratildeo instalar um Security Manager import javarmipublic class Echo_Client public static void main(String[] args)
if(argslength = 2) Systemoutprintln(Usage java Echo_Client +
srv_hostname obj_name)return
SystemsetSecurityManager(new RMISecurityManager())try
I Se o coacutedigo do stub pode ser uploaded haacute que inicializar apropriedade javarmiservercodebase na aplicaccedilatildeoservidora pexjava -Djavarmiservercodebase=httpweb~pfsecho_server
I Atenccedilatildeo ao rmiregistry
Arquitectura de Java RMI
RMI Client
Web server
RMIregistry
RMI server
1 register object
3 return object reference
2 lookup object
4 request stub class
5 return stub class
6 remote invocation
7 return result
Sumaacuterio
RMIConceitoImplementaccedilatildeoExemplos
Java RMICaracteriacutesticasObjectos Remotos e Interfaces RemotasImplementaccedilatildeo de Java RMIArgumentos e serializaccedilatildeoTransferecircncia de coacutedigoLocalizaccedilatildeo de objectos remotosSeguranccedilaTempo de vida dum objecto remotoPassos no desenvolvimento de aplicaccedilotildeesTransferecircncia de coacutedigo
Leitura Adicional
I Capiacutetulo 10 de Tanenbaum e van Steen DistributedSystems 2nd Ed
I Secccedilatildeo 101 Architecture excepto Subsecccedilatildeo 1013I Secccedilatildeo 103 Communication excepto Subsecccedilatildeo 1035
I Java RMI Specification da SunI Java Security Overview da Sun Secccedilotildees 1 2 e 8I Security Policy in Java SE 6 da SunI Permissions in Java SE 6 da Sun
- RMI
-
- Conceito
- Implementaccedilatildeo
- Exemplos
-
- Java RMI
-
- Caracteriacutesticas
- Objectos Remotos e Interfaces Remotas
- Implementaccedilatildeo de Java RMI
- Argumentos e serializaccedilatildeo
- Transferecircncia de coacutedigo
- Localizaccedilatildeo de objectos remotos
- Seguranccedila
- Tempo de vida dum objecto remoto
- Passos no desenvolvimento de aplicaccedilotildees
- Transferecircncia de coacutedigo
-
- Leitura Adicional
-
Java RMI Caracteriacutesticas (22)
I Benificia da mobilidade deI coacutedigo (classes)I objectos
entre computadores suportada por JavaI Distributed Garbage Collection
I um objecto ldquodesaparecerdquo automaticamente quando natildeopode ser acedido
Objectos Remotos e Interfaces Remotas
I Objectos remotos satildeo objectos cujos meacutetodos podem serinvocados duma JVM diferente daquela onde residem
I Um objecto remoto tem que implementar uma interfaceremota ie o seu tipo eacute um subtipo da interface Remote
I Permite que o compilador de Java gere o coacutedigonecessaacuterio para realizar a comunicaccedilatildeo entre objectos emJVMs distintas
I A natildeo-localidade dum objecto remoto eacute exposta aosprogramadores dos ldquoclientesrdquo
I Todos os meacutetodos da interface Remote tecircm que assinalarRemoteExceptions
I Um objecto remoto pode incluir meacutetodos natildeo invocaacuteveisremotamente
I Soacute meacutetodos declarados em interfaces remotas podem serinvocados remotamente
Remote Interface Exemplo
I A interface remota dum ldquoservidor de ecordquo pode serimport javarmiRemoteimport javarmiRemoteException
public interface Echo extends Remote String echo(String str) throws RemoteException
I Esta interface suporta um uacutenico meacutetodo remoto echo oqual retorna a string que lhe eacute passada como argumento
I O meacutetodo echo dum objecto que implemente estainterface pode ser invocado remotamente
I Ie pode ser invocado por um objecto a executar numamaacutequina virtual de Java (JVM) diferente
Acesso a Objectos Remotos
I Para usar um objecto remoto um cliente tem queconhecer a interface remota desse objecto
I ie os meacutetodos desse objecto que podem ser invocadosremotamente
I A sintaxe de invocaccedilatildeo de meacutetodos remotos eacute semelhanteagrave de invocaccedilatildeo de meacutetodos locaisEcho montanha = lookup montanhaString ecotry
eco = montanhaecho(lsquolsquoUh Uhrsquorsquo) catch ( RemoteException e)
I Contudo os clientes tecircm que processar excepccedilotildees do tipoRemoteException
Exemplo Implementaccedilatildeo da interface Echo
import javarmiimport javarmiserverUnicastRemoteObject
public class Echo_Impl extends UnicastRemoteObjectimplements Echo
public Echo_Impl() throws RemoteException
super() Actually this is not needed
public String echo(String str) return str
Java RMI e a JVM
I A JVM natildeo conhece objectos remotosI A JVM soacute suporta a invocaccedilatildeo de meacutetodos sobre objectos
locaisI Java RMI eacute uma camada de SW sobre a JVM natildeo faz
parte delaI Java RMI implementa RMI usando os mecanismos do
costumeI stubs do lado do clienteI skeletons do lado do servidor
Java RMI Stubs
I Em Java RMI o stub dum objecto remoto eacute um objectolocal (em relaccedilatildeo ao cliente) que representa esse objectoremoto
I Daiacute a designaccedilatildeo comum de proxy objectI Uma referecircncia remota eacute de facto uma referecircncia para o
stub correspondente O stub dum objecto remotoI implementa a sua interface remotaI conteacutem o seu ldquoendereccedilordquo
I Essencialmente as tarefas executadas pelo stub satildeo1 ldquomarshallingrdquo dos argumentos do meacutetodo2 envio do pedido de execuccedilatildeo do meacutetodo atraveacutes da ldquorederdquo3 recepccedilatildeo da resposta4 ldquounmarshallingrdquo do resultado da invocaccedilatildeo
Java RMI Servers (12)
I Na primeira versatildeo de Java RMI a funcionalidade do ladodo objecto remoto foi repartida por 2 tipos de objectos
I objectos do tipo RemoteServer ndash executam oprocessamento que eacute independente da interface remota
I pex esperar pela recepccedilatildeo de pedidos de invocaccedilatildeoI objectos do tipo skeleton ndash executam o processamento
que depende da interface remotaI unmarshalling dos argumentosI invocaccedilatildeo do meacutetodo do objecto remotoI marshalling dos resultados
Java RMI Servers (22)
I A partir de Java 12 objectos do tipo skeleton deixaram deser necessaacuterios
I objectos do tipo RemoteServer passaram a ser capazesde fazer tambeacutem as tarefas dos skeleton
I Java RMI oferece a classe UnicastRemoteObject aqual estende RemoteServer e oferece funcionalidademiacutenima para aplicaccedilotildees baseadas em RMI
I O objecto termina quando o processo que o criou terminaI Usa TCP na comunicaccedilatildeo com os clientes
Argumentos de Meacutetodos Remotos
I Os argumentos de ou o valor retornado por um meacutetodoremoto podem ser
1 tipos simples Por exemplo boolean char byte shortint long float ou double
2 objectos remotos ie que implementam a interfaceRemote
3 objectos locais serializaacuteveis ie que implementam ainterface Serializable (incluindo Strings e arrays)
I No caso de objectos locais RMI passa uma coacutepia doobjecto
I como o objecto eacute serializaacutevel tal eacute possiacutevelI note-se que Java RMI natildeo ldquoactualizardquo o objecto passado
caso o meacutetodo remoto o tenha modificadoI Atenccedilatildeo Uma referecircncia para um objecto remoto eacute de
facto uma referecircncia para o objecto proxy respectivo
Objectos Remotos vs Objectos Serializaacuteveis
Local objectO1
Copy of O1
Remote objectO2
Localreference L1
New localreference
Remotereference R1
Remoteinvocation withL1 and R1 asparameters
Copy of R1 to O2
Machine A Machine B
Machine C
Client code withRMI to server at C(proxy)
Server code(method implementation)
I Na praacutetica eacute como se objecto remoto O2 fosse passadopor referecircncia enquanto que o objecto local (serializaacutevel)O1 eacute passado por valor
I Semacircnticas diferentes transparecircncia ldquoturvardquo
Serializaccedilatildeo em Java (12)I Java RMI usa o mecanismo de serializaccedilatildeo de Java para
passar os argumentos e o valor retornadoI Em Java serializaccedilatildeo dum objecto consiste na conversatildeo
desse objecto numa sequecircncia de bytes de modo apermitir
I o seu armazenamento no disco para posteriorreincarnaccedilatildeo
I ou a sua migraccedilatildeo para uma outra JVMI A reconstituiccedilatildeo dum objecto a partir da sua
representaccedilatildeo serializada designa-se por deserializaccedilatildeoI Para que um objecto seja serializaacutevel deveraacute implementar
a interface javaioSerializableI A JVM implementa um procedimento de serializaccedilatildeo por
omissatildeo que pode ser usado pela grande maioria dosobjectos
I desde que a definiccedilatildeo da sua classe declare queimplementa a interface javaioSerializable
Serializaccedilatildeo em Java (22)
I Se um objecto tiver campos que satildeo referecircncias paraoutros objectos estes uacuteltimos deveratildeo ser serializaacuteveispara que o primeiro tambeacutem o seja
I para serializar o primeiro objecto haacute que serializar osoutros
I cada objecto soacute eacute serializado uma vez mesmo que sejareferenciado muacuteltiplas vezes
I Por razotildees de eficiecircncia os meacutetodos duma classe natildeo satildeoincluiacutedos na sequecircncia de bytes criada pela serializaccedilatildeo
I a JVM inclui apenas um identificador da classe a que oobjecto pertence
Class Downloading em Java e RMI
Problema Como eacute que um meacutetodo remoto pode invocar omeacutetodo dum objecto natildeo remoto que lhe eacute passado comoargumento
I Os meacutetodos dum objecto natildeo fazem parte da suarepresentaccedilatildeo serializada
Soluccedilatildeo Usando as facilidades de transferecircncia de coacutedigo emJava
I Note-se que esta transferecircncia pode natildeo sernecessaacuteria se a classe estiver disponiacutevel localmente
A capacidade de transferecircncia de classes atraveacutes da redepode tambeacutem ser usada pelo cliente para carregar o proxyobject
I natildeo haacute necessidade de manter todas as classes emtodos os computadores
Localizaccedilatildeo dum Objecto
I O acesso a um objecto remoto eacute feito usando uma referecircnciapara um proxy desse objecto
montanhaecho()
Problema como eacute que se obteacutem uma referecircncia remota ie para oproxy dum objecto remoto
I Tecnicamente atraveacutes do valor de retorno dum meacutetodo
Soluccedilatildeo semelhante ao portmapper de RPC
I Java RMI oferece um serviccedilo de nomes baacutesico ormiregistry
I O rmiregistry eacute um programa e tem que executar noscomputadores que disponibilizam objectos remotos
I O ldquoservidorrdquo regista o objecto com um nome (binds) normiregistry local
I O ldquoclienterdquo solicita uma referecircncia para um objecto remotoao rmiregistry no computador onde o objecto reside
O rmiregistry e a Interface Registry
I O rmiregistry eacute uma aplicaccedilatildeo que implementa ainterface Registryvoid rebind(String name Remote obj)void bind(String name Remote obj)void unbind(String name Remote obj)Remote lookup(String name)String []list()
I Se incorrectamente usado o rmiregistry pode impediro uso de classes ldquoimportadasrdquo
If you do start the rmiregistry and it can find your stubclasses in CLASSPATH it will not remember that theloaded stub class can be loaded from your serverrsquos codebase[] do Tutorial on-line da Sun sobre RMI
A classe Naming
I Permite aceder a objectos que implementam RegistryI Suporta os seguintes meacutetodos
void rebind(String name Remote obj)void bind(String name Remote obj)void unbind(String name Remote obj)Remote lookup(String name)String []list()
ondename eacute um URL sem o meacutetodo de acesso
computerNameportobjectNamesendo computerNameport a ldquolocalizaccedilatildeordquo do
rmiregistryI bind() difere de rebind() na medida em que assinala
uma excepccedilatildeo se name jaacute tiver sido registadoI O rmregistry natildeo eacute um servidor global
I O cliente tem que saber onde se encontra o objecto
Exemplo Registo e Localizaccedilatildeo do ObjectoI O servidor tem que registar o objecto remoto
Echo montanhatry
montanha = new Echo_Impl()Namingrebind(lsquolsquoalpesrsquorsquo montanha)
catch ( RemoteException e)
I O cliente tem que o localizar (em i01co2213)Echo montanhatry
montanha = Naminglookup(lsquolsquoi01co2213alpesrsquorsquo)
catch ( RemoteException e) Naminglookup() is RMI
Arquitectura de Java RMI
RMI Client
Web server
RMIregistry
RMI server
1 register object
3 return object reference
2 lookup object
4 request stub class
5 return stub class
6 remote invocation
7 return result
RMI e Seguranccedila
Problema Java RMI pode exigir a transferecircncia de coacutedigo(classes) de maacutequinas remotas
I este coacutedigo eacute uma potencial ameaccedila agrave seguranccedilaSoluccedilatildeo Usar um Security Manager
I um objecto que controla o acesso aos recursos locais
I Java 10 suportava um modecirclo de seguranccedila do tiposandbox
I Coacutedigo local natildeo tinha restriccedilotildees para aleacutem das impostaspelo SO
I Coacutedigo importado soacute podia aceder aos recursos (limitados)disponiacuteveis na sandbox
I A partir de Java 12 pode-se sujeitar todo o coacutedigoindependentemente de ser ou natildeo local a controlo deacesso sendo este determinado pela security policy emvigor
Poliacutetica de Seguranccedila (Security Policy) e Permissotildees
I A poliacutetica de seguranccedila define as permissotildees de coacutedigocom base na sua origem sendo configuraacutevel quer peloutilizador quer pelo administrador
I Cada permissatildeo especifica o tipo de acesso permitido aum determinado recurso tal como
I Lecircr ou escrever um ficheiro ou directoacuterioI Estabelecer uma conexatildeo para um determinado endereccedilo
IP e portoI Algumas operaccedilotildees sobre a proacutepria JVM requerem
permissotildeesI Substituir o ClassLoaderI Substituir o SecurityManagerI Alterar a poliacutetica de seguranccedila
Permissotildees
I Internamente permissotildees satildeo objectos PexI javaioFilePermission
I Uma permissatildeo tipicamente temNome que identifica o recurso a que se aplicaLista de acccedilotildees que especifica as operaccedilotildees permitidas
permissatildeo nome lista de acccedilotildeesjavaioFilePermission ldquousrlib-rdquo ldquoread executerdquojavanetSocketPermission ldquoabccom54321rdquo ldquoconnectrdquojavasecuritySecurityPermission ldquosetPolicyrdquojavalangRuntimePermission ldquocreateClassLoaderrdquojavalangRuntimePermission ldquosetSecurityManagerrdquo
I Uma poliacutetica de seguranccedila eacute um conjunto de permissotildeesque determinam que operaccedilotildees um segmento de coacutedigopode executar
I Naturalmente a poliacutetica de seguranccedila eacute representada porum objecto (javasecurityPolicy)
Inicializaccedilatildeo do javasecurityPolicy
I Na implementaccedilatildeo referecircncia este objecto pode serinicializado a partir de vaacuterios ficheiros de configuraccedilatildeo Poromissatildeo usa
I Um ficheiro de configuraccedilatildeo para todo o sistema$javahomelibsecurityjavapolicy
I Um ficheiro de configuraccedilatildeo por utilizador~javapolicy
I O ficheiro de configuraccedilatildeo das propriedades de seguranccedilapermite especificar ainda outros ficheiros de configuraccedilatildeo
$javahomelibsecurityjavasecurity
I O ficheiro com a poliacutetica de seguranccedila pode ainda serespecificado quando da invocaccedilatildeo da JVM
java -Djavasecuritypolicy=somefile I Se a propriedade policyallowSystemProperty o
permitir ndash pode ser activada no ficheiro de configuraccedilatildeodas propriedades de seguranccedila
Sintaxe dos Ficheiros de Poliacuteticas
I Consiste numa lista de elementos (entries)keystore eacute opcional (natildeo usaremos pelo menos para
jaacute)grant clausuacutela usada para especificar as permissotildees de
coacutedigo de acordo com algumas propriedades(consideraremos apenas a sua origem)
I Tem o seguinte formato (de facto omite regras)
grant [codebase ltURLgt] permission ltclass_namegt lttargetgt [ ltactiongt]
onde
codebase especifica a origem do coacutedigo
permission especifica uma permissatildeo podendo umelemento grant incluir vaacuterias permissotildees
I Pode ocorrer uma ou mais vezes
Sintaxe dos Ficheiros de Poliacuteticas Exemplos
grant permission javanetSocketPermission 1024-
connectacceptpermission javanetSocketPermission abccom
connectacceptpermission javaioFilePermission
homeannpublic_htmlclasses- readpermission javaioFilePermission
homejonespublic_htmlclasses- read
grant codeBase httppaginasfeuppt~ei77777classes permission javasecurityAllPermission
I policytool eacute uma aplicaccedilatildeo que faz parte do J2SDKque oferece um GUI para auxiliar a ediccedilatildeo de ficheiros depoliacuteticas
Security Manager (12)
I O Security Manager eacute um objecto que garante ocumprimento da poliacutetica de seguranccedila
I Consiste apenas num conjunto de meacutetodos tais comopublic void checkPermission(Permission perm)
throws SecurityException
public void checkCreateClassLoader( )throws SecurityException
I Normalmente um thread soacute pode executar uma operaccedilatildeose todos os meacutetodos activos que invocou tiverempermissatildeo para a executar
I Tipicamente essa decisatildeo eacute baseada na origem do coacutedigoI Estes meacutetodos satildeo invocados por outros objectos quando
executam certas operaccedilotildeesI O Security Manager eacute um Reference Monitor
Security Manager (22)
I O SecurityManager natildeo eacute instalado por omissatildeoI A instalaccedilatildeo do SecurityManager pode ser feita
I Pelo interpretador (JVM)java -Djavasecuritymanager
I Pelo coacutedigoSystemsetSecurityManager(new SecurityManager())
I A poliacutetica imposta pelo SecurityManager pode serconfigurada atraveacutes dos ficheiros de especificaccedilatildeo daSecurityPolicy
I O coacutedigo do sistema invoca os meacutetodos checkXXX doSecurityManager se este estiver instalado
I Estes meacutetodos por sua vez invocam o meacutetodocheckPermission() do AccessController
Access Controller
I A partir de Java 12 ojavasecurityAccessController eacute a classe quede facto garante o cumprimento da poliacutetica de seguranccedila
I Por concepccedilatildeo eacute mais faacutecil flexiacutevel que oSecurityManager e estaacute sempre instalado (soacute static)
I Implementa uma poliacutetica razoavelmente restritiva que podeser usada na maioria dos casos
I Naturalmente pode invocar-se directamente da aplicaccedilatildeoos meacutetodos do AccessControllerFilePermission perm = new FilePermission(tmptestFile read)AccessControllercheckPermission(perm)
I Se a poliacutetica de seguranccedila implementada peloAccessController natildeo focircr adequada pode seradaptada criando subclasses dojavalangSecurityManager
I Estas subclasses devem invocar os meacutetodos doAccessController sempre que tal faccedila sentido
javarmiRMISecurityManager
I javarmiRMISecurityManager eacute uma sua subclassedo javalangSecurityManager
I Implementa exactamente os mesmos meacutetodosI O RMISecurityManager deve ser usado com RMI
sempre que haacute necessidade de transferir coacutedigo dumcomputador remoto
I O RMI class loader recusa-se a carregar qualquer classese natildeo houver um Security Manager
I O RMISecurityManager pode ser instalado de 2 modos
I Atraveacutes do coacutedigoSystemsetSecurityManager(new RMISecurityManager())
I Atraveacutes da linha de comandojava -Djavasecuritymanager=javarmiRMISecurityManager
Arquitectura de Seguranccedila em Java
I O Security Manager natildeo eacute a histoacuteria toda
Classrepository
Classverifier
Loadedclassobject
Java interpreter
Java program
Requestclass
Select appropriate loader
Loader forremoteclasses
Loader forlocal
classes
Classrepository
Remote siteLocal site
Tempo de Vida dum Objecto Remoto
I A vida dum objecto chega ao fim quando deixa de serreferenciado
I sem qualquer referecircncia para o objecto natildeo eacute possiacutevelaceder-lhe
I Para objectos locaisI o garbage collector da JVM automaticamente detecta
quando um objecto deixa de ser referenciado e liberta osrecursos
I quando a JVM termina todos os objectos locais terminamI Para objectos remotos
I as diferentes JVMs executam um algoritmo distribuiacutedo parafazer garbage collection
I quando uma JVM termina objectos remotos por elacriados podem natildeo terminar Por exemplo
I o RMIregistry manteacutem uma referecircncia para todos osobjectos nele registados
Passos no Desenvolvimento com Java RMI1 Concepccedilatildeo e implementaccedilatildeo de servidor e clientes
I Definiccedilatildeo da interface remota ie dos meacutetodos que podemser invocados remotamente
I Implementaccedilatildeo de objectos remotos os quais devemimplementar a interface remota definida
I Implementaccedilatildeo de clientes2 Compilaccedilatildeo do coacutedigo e geraccedilatildeo de stubs
I a compilaccedilatildeo do coacutedigo eacute feita usando javacI os stubs a usar pelo cliente podem ser gerados usando ormic a partir do ficheiro class da implementaccedilatildeo
rmic Echo_Impl
Nota A partir de Java 50 Java RMI suporta a geraccedilatildeodinacircmica de stubs
3 Disponibilizaccedilatildeo do coacutedigo por exemplo num servidorHTTP
I classes que precisem ser carregadas (downloaded)incluindo os stubs devem ser disponibilizadas num servidorHTTP
RMI e Uploaded Code
I Aplicaccedilotildees (clientes ou servidores) que podem transferircoacutedigo deveratildeo instalar um Security Manager import javarmipublic class Echo_Client public static void main(String[] args)
if(argslength = 2) Systemoutprintln(Usage java Echo_Client +
srv_hostname obj_name)return
SystemsetSecurityManager(new RMISecurityManager())try
I Se o coacutedigo do stub pode ser uploaded haacute que inicializar apropriedade javarmiservercodebase na aplicaccedilatildeoservidora pexjava -Djavarmiservercodebase=httpweb~pfsecho_server
I Atenccedilatildeo ao rmiregistry
Arquitectura de Java RMI
RMI Client
Web server
RMIregistry
RMI server
1 register object
3 return object reference
2 lookup object
4 request stub class
5 return stub class
6 remote invocation
7 return result
Sumaacuterio
RMIConceitoImplementaccedilatildeoExemplos
Java RMICaracteriacutesticasObjectos Remotos e Interfaces RemotasImplementaccedilatildeo de Java RMIArgumentos e serializaccedilatildeoTransferecircncia de coacutedigoLocalizaccedilatildeo de objectos remotosSeguranccedilaTempo de vida dum objecto remotoPassos no desenvolvimento de aplicaccedilotildeesTransferecircncia de coacutedigo
Leitura Adicional
I Capiacutetulo 10 de Tanenbaum e van Steen DistributedSystems 2nd Ed
I Secccedilatildeo 101 Architecture excepto Subsecccedilatildeo 1013I Secccedilatildeo 103 Communication excepto Subsecccedilatildeo 1035
I Java RMI Specification da SunI Java Security Overview da Sun Secccedilotildees 1 2 e 8I Security Policy in Java SE 6 da SunI Permissions in Java SE 6 da Sun
- RMI
-
- Conceito
- Implementaccedilatildeo
- Exemplos
-
- Java RMI
-
- Caracteriacutesticas
- Objectos Remotos e Interfaces Remotas
- Implementaccedilatildeo de Java RMI
- Argumentos e serializaccedilatildeo
- Transferecircncia de coacutedigo
- Localizaccedilatildeo de objectos remotos
- Seguranccedila
- Tempo de vida dum objecto remoto
- Passos no desenvolvimento de aplicaccedilotildees
- Transferecircncia de coacutedigo
-
- Leitura Adicional
-
Remote Interface Exemplo
I A interface remota dum ldquoservidor de ecordquo pode serimport javarmiRemoteimport javarmiRemoteException
public interface Echo extends Remote String echo(String str) throws RemoteException
I Esta interface suporta um uacutenico meacutetodo remoto echo oqual retorna a string que lhe eacute passada como argumento
I O meacutetodo echo dum objecto que implemente estainterface pode ser invocado remotamente
I Ie pode ser invocado por um objecto a executar numamaacutequina virtual de Java (JVM) diferente
Acesso a Objectos Remotos
I Para usar um objecto remoto um cliente tem queconhecer a interface remota desse objecto
I ie os meacutetodos desse objecto que podem ser invocadosremotamente
I A sintaxe de invocaccedilatildeo de meacutetodos remotos eacute semelhanteagrave de invocaccedilatildeo de meacutetodos locaisEcho montanha = lookup montanhaString ecotry
eco = montanhaecho(lsquolsquoUh Uhrsquorsquo) catch ( RemoteException e)
I Contudo os clientes tecircm que processar excepccedilotildees do tipoRemoteException
Exemplo Implementaccedilatildeo da interface Echo
import javarmiimport javarmiserverUnicastRemoteObject
public class Echo_Impl extends UnicastRemoteObjectimplements Echo
public Echo_Impl() throws RemoteException
super() Actually this is not needed
public String echo(String str) return str
Java RMI e a JVM
I A JVM natildeo conhece objectos remotosI A JVM soacute suporta a invocaccedilatildeo de meacutetodos sobre objectos
locaisI Java RMI eacute uma camada de SW sobre a JVM natildeo faz
parte delaI Java RMI implementa RMI usando os mecanismos do
costumeI stubs do lado do clienteI skeletons do lado do servidor
Java RMI Stubs
I Em Java RMI o stub dum objecto remoto eacute um objectolocal (em relaccedilatildeo ao cliente) que representa esse objectoremoto
I Daiacute a designaccedilatildeo comum de proxy objectI Uma referecircncia remota eacute de facto uma referecircncia para o
stub correspondente O stub dum objecto remotoI implementa a sua interface remotaI conteacutem o seu ldquoendereccedilordquo
I Essencialmente as tarefas executadas pelo stub satildeo1 ldquomarshallingrdquo dos argumentos do meacutetodo2 envio do pedido de execuccedilatildeo do meacutetodo atraveacutes da ldquorederdquo3 recepccedilatildeo da resposta4 ldquounmarshallingrdquo do resultado da invocaccedilatildeo
Java RMI Servers (12)
I Na primeira versatildeo de Java RMI a funcionalidade do ladodo objecto remoto foi repartida por 2 tipos de objectos
I objectos do tipo RemoteServer ndash executam oprocessamento que eacute independente da interface remota
I pex esperar pela recepccedilatildeo de pedidos de invocaccedilatildeoI objectos do tipo skeleton ndash executam o processamento
que depende da interface remotaI unmarshalling dos argumentosI invocaccedilatildeo do meacutetodo do objecto remotoI marshalling dos resultados
Java RMI Servers (22)
I A partir de Java 12 objectos do tipo skeleton deixaram deser necessaacuterios
I objectos do tipo RemoteServer passaram a ser capazesde fazer tambeacutem as tarefas dos skeleton
I Java RMI oferece a classe UnicastRemoteObject aqual estende RemoteServer e oferece funcionalidademiacutenima para aplicaccedilotildees baseadas em RMI
I O objecto termina quando o processo que o criou terminaI Usa TCP na comunicaccedilatildeo com os clientes
Argumentos de Meacutetodos Remotos
I Os argumentos de ou o valor retornado por um meacutetodoremoto podem ser
1 tipos simples Por exemplo boolean char byte shortint long float ou double
2 objectos remotos ie que implementam a interfaceRemote
3 objectos locais serializaacuteveis ie que implementam ainterface Serializable (incluindo Strings e arrays)
I No caso de objectos locais RMI passa uma coacutepia doobjecto
I como o objecto eacute serializaacutevel tal eacute possiacutevelI note-se que Java RMI natildeo ldquoactualizardquo o objecto passado
caso o meacutetodo remoto o tenha modificadoI Atenccedilatildeo Uma referecircncia para um objecto remoto eacute de
facto uma referecircncia para o objecto proxy respectivo
Objectos Remotos vs Objectos Serializaacuteveis
Local objectO1
Copy of O1
Remote objectO2
Localreference L1
New localreference
Remotereference R1
Remoteinvocation withL1 and R1 asparameters
Copy of R1 to O2
Machine A Machine B
Machine C
Client code withRMI to server at C(proxy)
Server code(method implementation)
I Na praacutetica eacute como se objecto remoto O2 fosse passadopor referecircncia enquanto que o objecto local (serializaacutevel)O1 eacute passado por valor
I Semacircnticas diferentes transparecircncia ldquoturvardquo
Serializaccedilatildeo em Java (12)I Java RMI usa o mecanismo de serializaccedilatildeo de Java para
passar os argumentos e o valor retornadoI Em Java serializaccedilatildeo dum objecto consiste na conversatildeo
desse objecto numa sequecircncia de bytes de modo apermitir
I o seu armazenamento no disco para posteriorreincarnaccedilatildeo
I ou a sua migraccedilatildeo para uma outra JVMI A reconstituiccedilatildeo dum objecto a partir da sua
representaccedilatildeo serializada designa-se por deserializaccedilatildeoI Para que um objecto seja serializaacutevel deveraacute implementar
a interface javaioSerializableI A JVM implementa um procedimento de serializaccedilatildeo por
omissatildeo que pode ser usado pela grande maioria dosobjectos
I desde que a definiccedilatildeo da sua classe declare queimplementa a interface javaioSerializable
Serializaccedilatildeo em Java (22)
I Se um objecto tiver campos que satildeo referecircncias paraoutros objectos estes uacuteltimos deveratildeo ser serializaacuteveispara que o primeiro tambeacutem o seja
I para serializar o primeiro objecto haacute que serializar osoutros
I cada objecto soacute eacute serializado uma vez mesmo que sejareferenciado muacuteltiplas vezes
I Por razotildees de eficiecircncia os meacutetodos duma classe natildeo satildeoincluiacutedos na sequecircncia de bytes criada pela serializaccedilatildeo
I a JVM inclui apenas um identificador da classe a que oobjecto pertence
Class Downloading em Java e RMI
Problema Como eacute que um meacutetodo remoto pode invocar omeacutetodo dum objecto natildeo remoto que lhe eacute passado comoargumento
I Os meacutetodos dum objecto natildeo fazem parte da suarepresentaccedilatildeo serializada
Soluccedilatildeo Usando as facilidades de transferecircncia de coacutedigo emJava
I Note-se que esta transferecircncia pode natildeo sernecessaacuteria se a classe estiver disponiacutevel localmente
A capacidade de transferecircncia de classes atraveacutes da redepode tambeacutem ser usada pelo cliente para carregar o proxyobject
I natildeo haacute necessidade de manter todas as classes emtodos os computadores
Localizaccedilatildeo dum Objecto
I O acesso a um objecto remoto eacute feito usando uma referecircnciapara um proxy desse objecto
montanhaecho()
Problema como eacute que se obteacutem uma referecircncia remota ie para oproxy dum objecto remoto
I Tecnicamente atraveacutes do valor de retorno dum meacutetodo
Soluccedilatildeo semelhante ao portmapper de RPC
I Java RMI oferece um serviccedilo de nomes baacutesico ormiregistry
I O rmiregistry eacute um programa e tem que executar noscomputadores que disponibilizam objectos remotos
I O ldquoservidorrdquo regista o objecto com um nome (binds) normiregistry local
I O ldquoclienterdquo solicita uma referecircncia para um objecto remotoao rmiregistry no computador onde o objecto reside
O rmiregistry e a Interface Registry
I O rmiregistry eacute uma aplicaccedilatildeo que implementa ainterface Registryvoid rebind(String name Remote obj)void bind(String name Remote obj)void unbind(String name Remote obj)Remote lookup(String name)String []list()
I Se incorrectamente usado o rmiregistry pode impediro uso de classes ldquoimportadasrdquo
If you do start the rmiregistry and it can find your stubclasses in CLASSPATH it will not remember that theloaded stub class can be loaded from your serverrsquos codebase[] do Tutorial on-line da Sun sobre RMI
A classe Naming
I Permite aceder a objectos que implementam RegistryI Suporta os seguintes meacutetodos
void rebind(String name Remote obj)void bind(String name Remote obj)void unbind(String name Remote obj)Remote lookup(String name)String []list()
ondename eacute um URL sem o meacutetodo de acesso
computerNameportobjectNamesendo computerNameport a ldquolocalizaccedilatildeordquo do
rmiregistryI bind() difere de rebind() na medida em que assinala
uma excepccedilatildeo se name jaacute tiver sido registadoI O rmregistry natildeo eacute um servidor global
I O cliente tem que saber onde se encontra o objecto
Exemplo Registo e Localizaccedilatildeo do ObjectoI O servidor tem que registar o objecto remoto
Echo montanhatry
montanha = new Echo_Impl()Namingrebind(lsquolsquoalpesrsquorsquo montanha)
catch ( RemoteException e)
I O cliente tem que o localizar (em i01co2213)Echo montanhatry
montanha = Naminglookup(lsquolsquoi01co2213alpesrsquorsquo)
catch ( RemoteException e) Naminglookup() is RMI
Arquitectura de Java RMI
RMI Client
Web server
RMIregistry
RMI server
1 register object
3 return object reference
2 lookup object
4 request stub class
5 return stub class
6 remote invocation
7 return result
RMI e Seguranccedila
Problema Java RMI pode exigir a transferecircncia de coacutedigo(classes) de maacutequinas remotas
I este coacutedigo eacute uma potencial ameaccedila agrave seguranccedilaSoluccedilatildeo Usar um Security Manager
I um objecto que controla o acesso aos recursos locais
I Java 10 suportava um modecirclo de seguranccedila do tiposandbox
I Coacutedigo local natildeo tinha restriccedilotildees para aleacutem das impostaspelo SO
I Coacutedigo importado soacute podia aceder aos recursos (limitados)disponiacuteveis na sandbox
I A partir de Java 12 pode-se sujeitar todo o coacutedigoindependentemente de ser ou natildeo local a controlo deacesso sendo este determinado pela security policy emvigor
Poliacutetica de Seguranccedila (Security Policy) e Permissotildees
I A poliacutetica de seguranccedila define as permissotildees de coacutedigocom base na sua origem sendo configuraacutevel quer peloutilizador quer pelo administrador
I Cada permissatildeo especifica o tipo de acesso permitido aum determinado recurso tal como
I Lecircr ou escrever um ficheiro ou directoacuterioI Estabelecer uma conexatildeo para um determinado endereccedilo
IP e portoI Algumas operaccedilotildees sobre a proacutepria JVM requerem
permissotildeesI Substituir o ClassLoaderI Substituir o SecurityManagerI Alterar a poliacutetica de seguranccedila
Permissotildees
I Internamente permissotildees satildeo objectos PexI javaioFilePermission
I Uma permissatildeo tipicamente temNome que identifica o recurso a que se aplicaLista de acccedilotildees que especifica as operaccedilotildees permitidas
permissatildeo nome lista de acccedilotildeesjavaioFilePermission ldquousrlib-rdquo ldquoread executerdquojavanetSocketPermission ldquoabccom54321rdquo ldquoconnectrdquojavasecuritySecurityPermission ldquosetPolicyrdquojavalangRuntimePermission ldquocreateClassLoaderrdquojavalangRuntimePermission ldquosetSecurityManagerrdquo
I Uma poliacutetica de seguranccedila eacute um conjunto de permissotildeesque determinam que operaccedilotildees um segmento de coacutedigopode executar
I Naturalmente a poliacutetica de seguranccedila eacute representada porum objecto (javasecurityPolicy)
Inicializaccedilatildeo do javasecurityPolicy
I Na implementaccedilatildeo referecircncia este objecto pode serinicializado a partir de vaacuterios ficheiros de configuraccedilatildeo Poromissatildeo usa
I Um ficheiro de configuraccedilatildeo para todo o sistema$javahomelibsecurityjavapolicy
I Um ficheiro de configuraccedilatildeo por utilizador~javapolicy
I O ficheiro de configuraccedilatildeo das propriedades de seguranccedilapermite especificar ainda outros ficheiros de configuraccedilatildeo
$javahomelibsecurityjavasecurity
I O ficheiro com a poliacutetica de seguranccedila pode ainda serespecificado quando da invocaccedilatildeo da JVM
java -Djavasecuritypolicy=somefile I Se a propriedade policyallowSystemProperty o
permitir ndash pode ser activada no ficheiro de configuraccedilatildeodas propriedades de seguranccedila
Sintaxe dos Ficheiros de Poliacuteticas
I Consiste numa lista de elementos (entries)keystore eacute opcional (natildeo usaremos pelo menos para
jaacute)grant clausuacutela usada para especificar as permissotildees de
coacutedigo de acordo com algumas propriedades(consideraremos apenas a sua origem)
I Tem o seguinte formato (de facto omite regras)
grant [codebase ltURLgt] permission ltclass_namegt lttargetgt [ ltactiongt]
onde
codebase especifica a origem do coacutedigo
permission especifica uma permissatildeo podendo umelemento grant incluir vaacuterias permissotildees
I Pode ocorrer uma ou mais vezes
Sintaxe dos Ficheiros de Poliacuteticas Exemplos
grant permission javanetSocketPermission 1024-
connectacceptpermission javanetSocketPermission abccom
connectacceptpermission javaioFilePermission
homeannpublic_htmlclasses- readpermission javaioFilePermission
homejonespublic_htmlclasses- read
grant codeBase httppaginasfeuppt~ei77777classes permission javasecurityAllPermission
I policytool eacute uma aplicaccedilatildeo que faz parte do J2SDKque oferece um GUI para auxiliar a ediccedilatildeo de ficheiros depoliacuteticas
Security Manager (12)
I O Security Manager eacute um objecto que garante ocumprimento da poliacutetica de seguranccedila
I Consiste apenas num conjunto de meacutetodos tais comopublic void checkPermission(Permission perm)
throws SecurityException
public void checkCreateClassLoader( )throws SecurityException
I Normalmente um thread soacute pode executar uma operaccedilatildeose todos os meacutetodos activos que invocou tiverempermissatildeo para a executar
I Tipicamente essa decisatildeo eacute baseada na origem do coacutedigoI Estes meacutetodos satildeo invocados por outros objectos quando
executam certas operaccedilotildeesI O Security Manager eacute um Reference Monitor
Security Manager (22)
I O SecurityManager natildeo eacute instalado por omissatildeoI A instalaccedilatildeo do SecurityManager pode ser feita
I Pelo interpretador (JVM)java -Djavasecuritymanager
I Pelo coacutedigoSystemsetSecurityManager(new SecurityManager())
I A poliacutetica imposta pelo SecurityManager pode serconfigurada atraveacutes dos ficheiros de especificaccedilatildeo daSecurityPolicy
I O coacutedigo do sistema invoca os meacutetodos checkXXX doSecurityManager se este estiver instalado
I Estes meacutetodos por sua vez invocam o meacutetodocheckPermission() do AccessController
Access Controller
I A partir de Java 12 ojavasecurityAccessController eacute a classe quede facto garante o cumprimento da poliacutetica de seguranccedila
I Por concepccedilatildeo eacute mais faacutecil flexiacutevel que oSecurityManager e estaacute sempre instalado (soacute static)
I Implementa uma poliacutetica razoavelmente restritiva que podeser usada na maioria dos casos
I Naturalmente pode invocar-se directamente da aplicaccedilatildeoos meacutetodos do AccessControllerFilePermission perm = new FilePermission(tmptestFile read)AccessControllercheckPermission(perm)
I Se a poliacutetica de seguranccedila implementada peloAccessController natildeo focircr adequada pode seradaptada criando subclasses dojavalangSecurityManager
I Estas subclasses devem invocar os meacutetodos doAccessController sempre que tal faccedila sentido
javarmiRMISecurityManager
I javarmiRMISecurityManager eacute uma sua subclassedo javalangSecurityManager
I Implementa exactamente os mesmos meacutetodosI O RMISecurityManager deve ser usado com RMI
sempre que haacute necessidade de transferir coacutedigo dumcomputador remoto
I O RMI class loader recusa-se a carregar qualquer classese natildeo houver um Security Manager
I O RMISecurityManager pode ser instalado de 2 modos
I Atraveacutes do coacutedigoSystemsetSecurityManager(new RMISecurityManager())
I Atraveacutes da linha de comandojava -Djavasecuritymanager=javarmiRMISecurityManager
Arquitectura de Seguranccedila em Java
I O Security Manager natildeo eacute a histoacuteria toda
Classrepository
Classverifier
Loadedclassobject
Java interpreter
Java program
Requestclass
Select appropriate loader
Loader forremoteclasses
Loader forlocal
classes
Classrepository
Remote siteLocal site
Tempo de Vida dum Objecto Remoto
I A vida dum objecto chega ao fim quando deixa de serreferenciado
I sem qualquer referecircncia para o objecto natildeo eacute possiacutevelaceder-lhe
I Para objectos locaisI o garbage collector da JVM automaticamente detecta
quando um objecto deixa de ser referenciado e liberta osrecursos
I quando a JVM termina todos os objectos locais terminamI Para objectos remotos
I as diferentes JVMs executam um algoritmo distribuiacutedo parafazer garbage collection
I quando uma JVM termina objectos remotos por elacriados podem natildeo terminar Por exemplo
I o RMIregistry manteacutem uma referecircncia para todos osobjectos nele registados
Passos no Desenvolvimento com Java RMI1 Concepccedilatildeo e implementaccedilatildeo de servidor e clientes
I Definiccedilatildeo da interface remota ie dos meacutetodos que podemser invocados remotamente
I Implementaccedilatildeo de objectos remotos os quais devemimplementar a interface remota definida
I Implementaccedilatildeo de clientes2 Compilaccedilatildeo do coacutedigo e geraccedilatildeo de stubs
I a compilaccedilatildeo do coacutedigo eacute feita usando javacI os stubs a usar pelo cliente podem ser gerados usando ormic a partir do ficheiro class da implementaccedilatildeo
rmic Echo_Impl
Nota A partir de Java 50 Java RMI suporta a geraccedilatildeodinacircmica de stubs
3 Disponibilizaccedilatildeo do coacutedigo por exemplo num servidorHTTP
I classes que precisem ser carregadas (downloaded)incluindo os stubs devem ser disponibilizadas num servidorHTTP
RMI e Uploaded Code
I Aplicaccedilotildees (clientes ou servidores) que podem transferircoacutedigo deveratildeo instalar um Security Manager import javarmipublic class Echo_Client public static void main(String[] args)
if(argslength = 2) Systemoutprintln(Usage java Echo_Client +
srv_hostname obj_name)return
SystemsetSecurityManager(new RMISecurityManager())try
I Se o coacutedigo do stub pode ser uploaded haacute que inicializar apropriedade javarmiservercodebase na aplicaccedilatildeoservidora pexjava -Djavarmiservercodebase=httpweb~pfsecho_server
I Atenccedilatildeo ao rmiregistry
Arquitectura de Java RMI
RMI Client
Web server
RMIregistry
RMI server
1 register object
3 return object reference
2 lookup object
4 request stub class
5 return stub class
6 remote invocation
7 return result
Sumaacuterio
RMIConceitoImplementaccedilatildeoExemplos
Java RMICaracteriacutesticasObjectos Remotos e Interfaces RemotasImplementaccedilatildeo de Java RMIArgumentos e serializaccedilatildeoTransferecircncia de coacutedigoLocalizaccedilatildeo de objectos remotosSeguranccedilaTempo de vida dum objecto remotoPassos no desenvolvimento de aplicaccedilotildeesTransferecircncia de coacutedigo
Leitura Adicional
I Capiacutetulo 10 de Tanenbaum e van Steen DistributedSystems 2nd Ed
I Secccedilatildeo 101 Architecture excepto Subsecccedilatildeo 1013I Secccedilatildeo 103 Communication excepto Subsecccedilatildeo 1035
I Java RMI Specification da SunI Java Security Overview da Sun Secccedilotildees 1 2 e 8I Security Policy in Java SE 6 da SunI Permissions in Java SE 6 da Sun
- RMI
-
- Conceito
- Implementaccedilatildeo
- Exemplos
-
- Java RMI
-
- Caracteriacutesticas
- Objectos Remotos e Interfaces Remotas
- Implementaccedilatildeo de Java RMI
- Argumentos e serializaccedilatildeo
- Transferecircncia de coacutedigo
- Localizaccedilatildeo de objectos remotos
- Seguranccedila
- Tempo de vida dum objecto remoto
- Passos no desenvolvimento de aplicaccedilotildees
- Transferecircncia de coacutedigo
-
- Leitura Adicional
-
Exemplo Implementaccedilatildeo da interface Echo
import javarmiimport javarmiserverUnicastRemoteObject
public class Echo_Impl extends UnicastRemoteObjectimplements Echo
public Echo_Impl() throws RemoteException
super() Actually this is not needed
public String echo(String str) return str
Java RMI e a JVM
I A JVM natildeo conhece objectos remotosI A JVM soacute suporta a invocaccedilatildeo de meacutetodos sobre objectos
locaisI Java RMI eacute uma camada de SW sobre a JVM natildeo faz
parte delaI Java RMI implementa RMI usando os mecanismos do
costumeI stubs do lado do clienteI skeletons do lado do servidor
Java RMI Stubs
I Em Java RMI o stub dum objecto remoto eacute um objectolocal (em relaccedilatildeo ao cliente) que representa esse objectoremoto
I Daiacute a designaccedilatildeo comum de proxy objectI Uma referecircncia remota eacute de facto uma referecircncia para o
stub correspondente O stub dum objecto remotoI implementa a sua interface remotaI conteacutem o seu ldquoendereccedilordquo
I Essencialmente as tarefas executadas pelo stub satildeo1 ldquomarshallingrdquo dos argumentos do meacutetodo2 envio do pedido de execuccedilatildeo do meacutetodo atraveacutes da ldquorederdquo3 recepccedilatildeo da resposta4 ldquounmarshallingrdquo do resultado da invocaccedilatildeo
Java RMI Servers (12)
I Na primeira versatildeo de Java RMI a funcionalidade do ladodo objecto remoto foi repartida por 2 tipos de objectos
I objectos do tipo RemoteServer ndash executam oprocessamento que eacute independente da interface remota
I pex esperar pela recepccedilatildeo de pedidos de invocaccedilatildeoI objectos do tipo skeleton ndash executam o processamento
que depende da interface remotaI unmarshalling dos argumentosI invocaccedilatildeo do meacutetodo do objecto remotoI marshalling dos resultados
Java RMI Servers (22)
I A partir de Java 12 objectos do tipo skeleton deixaram deser necessaacuterios
I objectos do tipo RemoteServer passaram a ser capazesde fazer tambeacutem as tarefas dos skeleton
I Java RMI oferece a classe UnicastRemoteObject aqual estende RemoteServer e oferece funcionalidademiacutenima para aplicaccedilotildees baseadas em RMI
I O objecto termina quando o processo que o criou terminaI Usa TCP na comunicaccedilatildeo com os clientes
Argumentos de Meacutetodos Remotos
I Os argumentos de ou o valor retornado por um meacutetodoremoto podem ser
1 tipos simples Por exemplo boolean char byte shortint long float ou double
2 objectos remotos ie que implementam a interfaceRemote
3 objectos locais serializaacuteveis ie que implementam ainterface Serializable (incluindo Strings e arrays)
I No caso de objectos locais RMI passa uma coacutepia doobjecto
I como o objecto eacute serializaacutevel tal eacute possiacutevelI note-se que Java RMI natildeo ldquoactualizardquo o objecto passado
caso o meacutetodo remoto o tenha modificadoI Atenccedilatildeo Uma referecircncia para um objecto remoto eacute de
facto uma referecircncia para o objecto proxy respectivo
Objectos Remotos vs Objectos Serializaacuteveis
Local objectO1
Copy of O1
Remote objectO2
Localreference L1
New localreference
Remotereference R1
Remoteinvocation withL1 and R1 asparameters
Copy of R1 to O2
Machine A Machine B
Machine C
Client code withRMI to server at C(proxy)
Server code(method implementation)
I Na praacutetica eacute como se objecto remoto O2 fosse passadopor referecircncia enquanto que o objecto local (serializaacutevel)O1 eacute passado por valor
I Semacircnticas diferentes transparecircncia ldquoturvardquo
Serializaccedilatildeo em Java (12)I Java RMI usa o mecanismo de serializaccedilatildeo de Java para
passar os argumentos e o valor retornadoI Em Java serializaccedilatildeo dum objecto consiste na conversatildeo
desse objecto numa sequecircncia de bytes de modo apermitir
I o seu armazenamento no disco para posteriorreincarnaccedilatildeo
I ou a sua migraccedilatildeo para uma outra JVMI A reconstituiccedilatildeo dum objecto a partir da sua
representaccedilatildeo serializada designa-se por deserializaccedilatildeoI Para que um objecto seja serializaacutevel deveraacute implementar
a interface javaioSerializableI A JVM implementa um procedimento de serializaccedilatildeo por
omissatildeo que pode ser usado pela grande maioria dosobjectos
I desde que a definiccedilatildeo da sua classe declare queimplementa a interface javaioSerializable
Serializaccedilatildeo em Java (22)
I Se um objecto tiver campos que satildeo referecircncias paraoutros objectos estes uacuteltimos deveratildeo ser serializaacuteveispara que o primeiro tambeacutem o seja
I para serializar o primeiro objecto haacute que serializar osoutros
I cada objecto soacute eacute serializado uma vez mesmo que sejareferenciado muacuteltiplas vezes
I Por razotildees de eficiecircncia os meacutetodos duma classe natildeo satildeoincluiacutedos na sequecircncia de bytes criada pela serializaccedilatildeo
I a JVM inclui apenas um identificador da classe a que oobjecto pertence
Class Downloading em Java e RMI
Problema Como eacute que um meacutetodo remoto pode invocar omeacutetodo dum objecto natildeo remoto que lhe eacute passado comoargumento
I Os meacutetodos dum objecto natildeo fazem parte da suarepresentaccedilatildeo serializada
Soluccedilatildeo Usando as facilidades de transferecircncia de coacutedigo emJava
I Note-se que esta transferecircncia pode natildeo sernecessaacuteria se a classe estiver disponiacutevel localmente
A capacidade de transferecircncia de classes atraveacutes da redepode tambeacutem ser usada pelo cliente para carregar o proxyobject
I natildeo haacute necessidade de manter todas as classes emtodos os computadores
Localizaccedilatildeo dum Objecto
I O acesso a um objecto remoto eacute feito usando uma referecircnciapara um proxy desse objecto
montanhaecho()
Problema como eacute que se obteacutem uma referecircncia remota ie para oproxy dum objecto remoto
I Tecnicamente atraveacutes do valor de retorno dum meacutetodo
Soluccedilatildeo semelhante ao portmapper de RPC
I Java RMI oferece um serviccedilo de nomes baacutesico ormiregistry
I O rmiregistry eacute um programa e tem que executar noscomputadores que disponibilizam objectos remotos
I O ldquoservidorrdquo regista o objecto com um nome (binds) normiregistry local
I O ldquoclienterdquo solicita uma referecircncia para um objecto remotoao rmiregistry no computador onde o objecto reside
O rmiregistry e a Interface Registry
I O rmiregistry eacute uma aplicaccedilatildeo que implementa ainterface Registryvoid rebind(String name Remote obj)void bind(String name Remote obj)void unbind(String name Remote obj)Remote lookup(String name)String []list()
I Se incorrectamente usado o rmiregistry pode impediro uso de classes ldquoimportadasrdquo
If you do start the rmiregistry and it can find your stubclasses in CLASSPATH it will not remember that theloaded stub class can be loaded from your serverrsquos codebase[] do Tutorial on-line da Sun sobre RMI
A classe Naming
I Permite aceder a objectos que implementam RegistryI Suporta os seguintes meacutetodos
void rebind(String name Remote obj)void bind(String name Remote obj)void unbind(String name Remote obj)Remote lookup(String name)String []list()
ondename eacute um URL sem o meacutetodo de acesso
computerNameportobjectNamesendo computerNameport a ldquolocalizaccedilatildeordquo do
rmiregistryI bind() difere de rebind() na medida em que assinala
uma excepccedilatildeo se name jaacute tiver sido registadoI O rmregistry natildeo eacute um servidor global
I O cliente tem que saber onde se encontra o objecto
Exemplo Registo e Localizaccedilatildeo do ObjectoI O servidor tem que registar o objecto remoto
Echo montanhatry
montanha = new Echo_Impl()Namingrebind(lsquolsquoalpesrsquorsquo montanha)
catch ( RemoteException e)
I O cliente tem que o localizar (em i01co2213)Echo montanhatry
montanha = Naminglookup(lsquolsquoi01co2213alpesrsquorsquo)
catch ( RemoteException e) Naminglookup() is RMI
Arquitectura de Java RMI
RMI Client
Web server
RMIregistry
RMI server
1 register object
3 return object reference
2 lookup object
4 request stub class
5 return stub class
6 remote invocation
7 return result
RMI e Seguranccedila
Problema Java RMI pode exigir a transferecircncia de coacutedigo(classes) de maacutequinas remotas
I este coacutedigo eacute uma potencial ameaccedila agrave seguranccedilaSoluccedilatildeo Usar um Security Manager
I um objecto que controla o acesso aos recursos locais
I Java 10 suportava um modecirclo de seguranccedila do tiposandbox
I Coacutedigo local natildeo tinha restriccedilotildees para aleacutem das impostaspelo SO
I Coacutedigo importado soacute podia aceder aos recursos (limitados)disponiacuteveis na sandbox
I A partir de Java 12 pode-se sujeitar todo o coacutedigoindependentemente de ser ou natildeo local a controlo deacesso sendo este determinado pela security policy emvigor
Poliacutetica de Seguranccedila (Security Policy) e Permissotildees
I A poliacutetica de seguranccedila define as permissotildees de coacutedigocom base na sua origem sendo configuraacutevel quer peloutilizador quer pelo administrador
I Cada permissatildeo especifica o tipo de acesso permitido aum determinado recurso tal como
I Lecircr ou escrever um ficheiro ou directoacuterioI Estabelecer uma conexatildeo para um determinado endereccedilo
IP e portoI Algumas operaccedilotildees sobre a proacutepria JVM requerem
permissotildeesI Substituir o ClassLoaderI Substituir o SecurityManagerI Alterar a poliacutetica de seguranccedila
Permissotildees
I Internamente permissotildees satildeo objectos PexI javaioFilePermission
I Uma permissatildeo tipicamente temNome que identifica o recurso a que se aplicaLista de acccedilotildees que especifica as operaccedilotildees permitidas
permissatildeo nome lista de acccedilotildeesjavaioFilePermission ldquousrlib-rdquo ldquoread executerdquojavanetSocketPermission ldquoabccom54321rdquo ldquoconnectrdquojavasecuritySecurityPermission ldquosetPolicyrdquojavalangRuntimePermission ldquocreateClassLoaderrdquojavalangRuntimePermission ldquosetSecurityManagerrdquo
I Uma poliacutetica de seguranccedila eacute um conjunto de permissotildeesque determinam que operaccedilotildees um segmento de coacutedigopode executar
I Naturalmente a poliacutetica de seguranccedila eacute representada porum objecto (javasecurityPolicy)
Inicializaccedilatildeo do javasecurityPolicy
I Na implementaccedilatildeo referecircncia este objecto pode serinicializado a partir de vaacuterios ficheiros de configuraccedilatildeo Poromissatildeo usa
I Um ficheiro de configuraccedilatildeo para todo o sistema$javahomelibsecurityjavapolicy
I Um ficheiro de configuraccedilatildeo por utilizador~javapolicy
I O ficheiro de configuraccedilatildeo das propriedades de seguranccedilapermite especificar ainda outros ficheiros de configuraccedilatildeo
$javahomelibsecurityjavasecurity
I O ficheiro com a poliacutetica de seguranccedila pode ainda serespecificado quando da invocaccedilatildeo da JVM
java -Djavasecuritypolicy=somefile I Se a propriedade policyallowSystemProperty o
permitir ndash pode ser activada no ficheiro de configuraccedilatildeodas propriedades de seguranccedila
Sintaxe dos Ficheiros de Poliacuteticas
I Consiste numa lista de elementos (entries)keystore eacute opcional (natildeo usaremos pelo menos para
jaacute)grant clausuacutela usada para especificar as permissotildees de
coacutedigo de acordo com algumas propriedades(consideraremos apenas a sua origem)
I Tem o seguinte formato (de facto omite regras)
grant [codebase ltURLgt] permission ltclass_namegt lttargetgt [ ltactiongt]
onde
codebase especifica a origem do coacutedigo
permission especifica uma permissatildeo podendo umelemento grant incluir vaacuterias permissotildees
I Pode ocorrer uma ou mais vezes
Sintaxe dos Ficheiros de Poliacuteticas Exemplos
grant permission javanetSocketPermission 1024-
connectacceptpermission javanetSocketPermission abccom
connectacceptpermission javaioFilePermission
homeannpublic_htmlclasses- readpermission javaioFilePermission
homejonespublic_htmlclasses- read
grant codeBase httppaginasfeuppt~ei77777classes permission javasecurityAllPermission
I policytool eacute uma aplicaccedilatildeo que faz parte do J2SDKque oferece um GUI para auxiliar a ediccedilatildeo de ficheiros depoliacuteticas
Security Manager (12)
I O Security Manager eacute um objecto que garante ocumprimento da poliacutetica de seguranccedila
I Consiste apenas num conjunto de meacutetodos tais comopublic void checkPermission(Permission perm)
throws SecurityException
public void checkCreateClassLoader( )throws SecurityException
I Normalmente um thread soacute pode executar uma operaccedilatildeose todos os meacutetodos activos que invocou tiverempermissatildeo para a executar
I Tipicamente essa decisatildeo eacute baseada na origem do coacutedigoI Estes meacutetodos satildeo invocados por outros objectos quando
executam certas operaccedilotildeesI O Security Manager eacute um Reference Monitor
Security Manager (22)
I O SecurityManager natildeo eacute instalado por omissatildeoI A instalaccedilatildeo do SecurityManager pode ser feita
I Pelo interpretador (JVM)java -Djavasecuritymanager
I Pelo coacutedigoSystemsetSecurityManager(new SecurityManager())
I A poliacutetica imposta pelo SecurityManager pode serconfigurada atraveacutes dos ficheiros de especificaccedilatildeo daSecurityPolicy
I O coacutedigo do sistema invoca os meacutetodos checkXXX doSecurityManager se este estiver instalado
I Estes meacutetodos por sua vez invocam o meacutetodocheckPermission() do AccessController
Access Controller
I A partir de Java 12 ojavasecurityAccessController eacute a classe quede facto garante o cumprimento da poliacutetica de seguranccedila
I Por concepccedilatildeo eacute mais faacutecil flexiacutevel que oSecurityManager e estaacute sempre instalado (soacute static)
I Implementa uma poliacutetica razoavelmente restritiva que podeser usada na maioria dos casos
I Naturalmente pode invocar-se directamente da aplicaccedilatildeoos meacutetodos do AccessControllerFilePermission perm = new FilePermission(tmptestFile read)AccessControllercheckPermission(perm)
I Se a poliacutetica de seguranccedila implementada peloAccessController natildeo focircr adequada pode seradaptada criando subclasses dojavalangSecurityManager
I Estas subclasses devem invocar os meacutetodos doAccessController sempre que tal faccedila sentido
javarmiRMISecurityManager
I javarmiRMISecurityManager eacute uma sua subclassedo javalangSecurityManager
I Implementa exactamente os mesmos meacutetodosI O RMISecurityManager deve ser usado com RMI
sempre que haacute necessidade de transferir coacutedigo dumcomputador remoto
I O RMI class loader recusa-se a carregar qualquer classese natildeo houver um Security Manager
I O RMISecurityManager pode ser instalado de 2 modos
I Atraveacutes do coacutedigoSystemsetSecurityManager(new RMISecurityManager())
I Atraveacutes da linha de comandojava -Djavasecuritymanager=javarmiRMISecurityManager
Arquitectura de Seguranccedila em Java
I O Security Manager natildeo eacute a histoacuteria toda
Classrepository
Classverifier
Loadedclassobject
Java interpreter
Java program
Requestclass
Select appropriate loader
Loader forremoteclasses
Loader forlocal
classes
Classrepository
Remote siteLocal site
Tempo de Vida dum Objecto Remoto
I A vida dum objecto chega ao fim quando deixa de serreferenciado
I sem qualquer referecircncia para o objecto natildeo eacute possiacutevelaceder-lhe
I Para objectos locaisI o garbage collector da JVM automaticamente detecta
quando um objecto deixa de ser referenciado e liberta osrecursos
I quando a JVM termina todos os objectos locais terminamI Para objectos remotos
I as diferentes JVMs executam um algoritmo distribuiacutedo parafazer garbage collection
I quando uma JVM termina objectos remotos por elacriados podem natildeo terminar Por exemplo
I o RMIregistry manteacutem uma referecircncia para todos osobjectos nele registados
Passos no Desenvolvimento com Java RMI1 Concepccedilatildeo e implementaccedilatildeo de servidor e clientes
I Definiccedilatildeo da interface remota ie dos meacutetodos que podemser invocados remotamente
I Implementaccedilatildeo de objectos remotos os quais devemimplementar a interface remota definida
I Implementaccedilatildeo de clientes2 Compilaccedilatildeo do coacutedigo e geraccedilatildeo de stubs
I a compilaccedilatildeo do coacutedigo eacute feita usando javacI os stubs a usar pelo cliente podem ser gerados usando ormic a partir do ficheiro class da implementaccedilatildeo
rmic Echo_Impl
Nota A partir de Java 50 Java RMI suporta a geraccedilatildeodinacircmica de stubs
3 Disponibilizaccedilatildeo do coacutedigo por exemplo num servidorHTTP
I classes que precisem ser carregadas (downloaded)incluindo os stubs devem ser disponibilizadas num servidorHTTP
RMI e Uploaded Code
I Aplicaccedilotildees (clientes ou servidores) que podem transferircoacutedigo deveratildeo instalar um Security Manager import javarmipublic class Echo_Client public static void main(String[] args)
if(argslength = 2) Systemoutprintln(Usage java Echo_Client +
srv_hostname obj_name)return
SystemsetSecurityManager(new RMISecurityManager())try
I Se o coacutedigo do stub pode ser uploaded haacute que inicializar apropriedade javarmiservercodebase na aplicaccedilatildeoservidora pexjava -Djavarmiservercodebase=httpweb~pfsecho_server
I Atenccedilatildeo ao rmiregistry
Arquitectura de Java RMI
RMI Client
Web server
RMIregistry
RMI server
1 register object
3 return object reference
2 lookup object
4 request stub class
5 return stub class
6 remote invocation
7 return result
Sumaacuterio
RMIConceitoImplementaccedilatildeoExemplos
Java RMICaracteriacutesticasObjectos Remotos e Interfaces RemotasImplementaccedilatildeo de Java RMIArgumentos e serializaccedilatildeoTransferecircncia de coacutedigoLocalizaccedilatildeo de objectos remotosSeguranccedilaTempo de vida dum objecto remotoPassos no desenvolvimento de aplicaccedilotildeesTransferecircncia de coacutedigo
Leitura Adicional
I Capiacutetulo 10 de Tanenbaum e van Steen DistributedSystems 2nd Ed
I Secccedilatildeo 101 Architecture excepto Subsecccedilatildeo 1013I Secccedilatildeo 103 Communication excepto Subsecccedilatildeo 1035
I Java RMI Specification da SunI Java Security Overview da Sun Secccedilotildees 1 2 e 8I Security Policy in Java SE 6 da SunI Permissions in Java SE 6 da Sun
- RMI
-
- Conceito
- Implementaccedilatildeo
- Exemplos
-
- Java RMI
-
- Caracteriacutesticas
- Objectos Remotos e Interfaces Remotas
- Implementaccedilatildeo de Java RMI
- Argumentos e serializaccedilatildeo
- Transferecircncia de coacutedigo
- Localizaccedilatildeo de objectos remotos
- Seguranccedila
- Tempo de vida dum objecto remoto
- Passos no desenvolvimento de aplicaccedilotildees
- Transferecircncia de coacutedigo
-
- Leitura Adicional
-
Java RMI Stubs
I Em Java RMI o stub dum objecto remoto eacute um objectolocal (em relaccedilatildeo ao cliente) que representa esse objectoremoto
I Daiacute a designaccedilatildeo comum de proxy objectI Uma referecircncia remota eacute de facto uma referecircncia para o
stub correspondente O stub dum objecto remotoI implementa a sua interface remotaI conteacutem o seu ldquoendereccedilordquo
I Essencialmente as tarefas executadas pelo stub satildeo1 ldquomarshallingrdquo dos argumentos do meacutetodo2 envio do pedido de execuccedilatildeo do meacutetodo atraveacutes da ldquorederdquo3 recepccedilatildeo da resposta4 ldquounmarshallingrdquo do resultado da invocaccedilatildeo
Java RMI Servers (12)
I Na primeira versatildeo de Java RMI a funcionalidade do ladodo objecto remoto foi repartida por 2 tipos de objectos
I objectos do tipo RemoteServer ndash executam oprocessamento que eacute independente da interface remota
I pex esperar pela recepccedilatildeo de pedidos de invocaccedilatildeoI objectos do tipo skeleton ndash executam o processamento
que depende da interface remotaI unmarshalling dos argumentosI invocaccedilatildeo do meacutetodo do objecto remotoI marshalling dos resultados
Java RMI Servers (22)
I A partir de Java 12 objectos do tipo skeleton deixaram deser necessaacuterios
I objectos do tipo RemoteServer passaram a ser capazesde fazer tambeacutem as tarefas dos skeleton
I Java RMI oferece a classe UnicastRemoteObject aqual estende RemoteServer e oferece funcionalidademiacutenima para aplicaccedilotildees baseadas em RMI
I O objecto termina quando o processo que o criou terminaI Usa TCP na comunicaccedilatildeo com os clientes
Argumentos de Meacutetodos Remotos
I Os argumentos de ou o valor retornado por um meacutetodoremoto podem ser
1 tipos simples Por exemplo boolean char byte shortint long float ou double
2 objectos remotos ie que implementam a interfaceRemote
3 objectos locais serializaacuteveis ie que implementam ainterface Serializable (incluindo Strings e arrays)
I No caso de objectos locais RMI passa uma coacutepia doobjecto
I como o objecto eacute serializaacutevel tal eacute possiacutevelI note-se que Java RMI natildeo ldquoactualizardquo o objecto passado
caso o meacutetodo remoto o tenha modificadoI Atenccedilatildeo Uma referecircncia para um objecto remoto eacute de
facto uma referecircncia para o objecto proxy respectivo
Objectos Remotos vs Objectos Serializaacuteveis
Local objectO1
Copy of O1
Remote objectO2
Localreference L1
New localreference
Remotereference R1
Remoteinvocation withL1 and R1 asparameters
Copy of R1 to O2
Machine A Machine B
Machine C
Client code withRMI to server at C(proxy)
Server code(method implementation)
I Na praacutetica eacute como se objecto remoto O2 fosse passadopor referecircncia enquanto que o objecto local (serializaacutevel)O1 eacute passado por valor
I Semacircnticas diferentes transparecircncia ldquoturvardquo
Serializaccedilatildeo em Java (12)I Java RMI usa o mecanismo de serializaccedilatildeo de Java para
passar os argumentos e o valor retornadoI Em Java serializaccedilatildeo dum objecto consiste na conversatildeo
desse objecto numa sequecircncia de bytes de modo apermitir
I o seu armazenamento no disco para posteriorreincarnaccedilatildeo
I ou a sua migraccedilatildeo para uma outra JVMI A reconstituiccedilatildeo dum objecto a partir da sua
representaccedilatildeo serializada designa-se por deserializaccedilatildeoI Para que um objecto seja serializaacutevel deveraacute implementar
a interface javaioSerializableI A JVM implementa um procedimento de serializaccedilatildeo por
omissatildeo que pode ser usado pela grande maioria dosobjectos
I desde que a definiccedilatildeo da sua classe declare queimplementa a interface javaioSerializable
Serializaccedilatildeo em Java (22)
I Se um objecto tiver campos que satildeo referecircncias paraoutros objectos estes uacuteltimos deveratildeo ser serializaacuteveispara que o primeiro tambeacutem o seja
I para serializar o primeiro objecto haacute que serializar osoutros
I cada objecto soacute eacute serializado uma vez mesmo que sejareferenciado muacuteltiplas vezes
I Por razotildees de eficiecircncia os meacutetodos duma classe natildeo satildeoincluiacutedos na sequecircncia de bytes criada pela serializaccedilatildeo
I a JVM inclui apenas um identificador da classe a que oobjecto pertence
Class Downloading em Java e RMI
Problema Como eacute que um meacutetodo remoto pode invocar omeacutetodo dum objecto natildeo remoto que lhe eacute passado comoargumento
I Os meacutetodos dum objecto natildeo fazem parte da suarepresentaccedilatildeo serializada
Soluccedilatildeo Usando as facilidades de transferecircncia de coacutedigo emJava
I Note-se que esta transferecircncia pode natildeo sernecessaacuteria se a classe estiver disponiacutevel localmente
A capacidade de transferecircncia de classes atraveacutes da redepode tambeacutem ser usada pelo cliente para carregar o proxyobject
I natildeo haacute necessidade de manter todas as classes emtodos os computadores
Localizaccedilatildeo dum Objecto
I O acesso a um objecto remoto eacute feito usando uma referecircnciapara um proxy desse objecto
montanhaecho()
Problema como eacute que se obteacutem uma referecircncia remota ie para oproxy dum objecto remoto
I Tecnicamente atraveacutes do valor de retorno dum meacutetodo
Soluccedilatildeo semelhante ao portmapper de RPC
I Java RMI oferece um serviccedilo de nomes baacutesico ormiregistry
I O rmiregistry eacute um programa e tem que executar noscomputadores que disponibilizam objectos remotos
I O ldquoservidorrdquo regista o objecto com um nome (binds) normiregistry local
I O ldquoclienterdquo solicita uma referecircncia para um objecto remotoao rmiregistry no computador onde o objecto reside
O rmiregistry e a Interface Registry
I O rmiregistry eacute uma aplicaccedilatildeo que implementa ainterface Registryvoid rebind(String name Remote obj)void bind(String name Remote obj)void unbind(String name Remote obj)Remote lookup(String name)String []list()
I Se incorrectamente usado o rmiregistry pode impediro uso de classes ldquoimportadasrdquo
If you do start the rmiregistry and it can find your stubclasses in CLASSPATH it will not remember that theloaded stub class can be loaded from your serverrsquos codebase[] do Tutorial on-line da Sun sobre RMI
A classe Naming
I Permite aceder a objectos que implementam RegistryI Suporta os seguintes meacutetodos
void rebind(String name Remote obj)void bind(String name Remote obj)void unbind(String name Remote obj)Remote lookup(String name)String []list()
ondename eacute um URL sem o meacutetodo de acesso
computerNameportobjectNamesendo computerNameport a ldquolocalizaccedilatildeordquo do
rmiregistryI bind() difere de rebind() na medida em que assinala
uma excepccedilatildeo se name jaacute tiver sido registadoI O rmregistry natildeo eacute um servidor global
I O cliente tem que saber onde se encontra o objecto
Exemplo Registo e Localizaccedilatildeo do ObjectoI O servidor tem que registar o objecto remoto
Echo montanhatry
montanha = new Echo_Impl()Namingrebind(lsquolsquoalpesrsquorsquo montanha)
catch ( RemoteException e)
I O cliente tem que o localizar (em i01co2213)Echo montanhatry
montanha = Naminglookup(lsquolsquoi01co2213alpesrsquorsquo)
catch ( RemoteException e) Naminglookup() is RMI
Arquitectura de Java RMI
RMI Client
Web server
RMIregistry
RMI server
1 register object
3 return object reference
2 lookup object
4 request stub class
5 return stub class
6 remote invocation
7 return result
RMI e Seguranccedila
Problema Java RMI pode exigir a transferecircncia de coacutedigo(classes) de maacutequinas remotas
I este coacutedigo eacute uma potencial ameaccedila agrave seguranccedilaSoluccedilatildeo Usar um Security Manager
I um objecto que controla o acesso aos recursos locais
I Java 10 suportava um modecirclo de seguranccedila do tiposandbox
I Coacutedigo local natildeo tinha restriccedilotildees para aleacutem das impostaspelo SO
I Coacutedigo importado soacute podia aceder aos recursos (limitados)disponiacuteveis na sandbox
I A partir de Java 12 pode-se sujeitar todo o coacutedigoindependentemente de ser ou natildeo local a controlo deacesso sendo este determinado pela security policy emvigor
Poliacutetica de Seguranccedila (Security Policy) e Permissotildees
I A poliacutetica de seguranccedila define as permissotildees de coacutedigocom base na sua origem sendo configuraacutevel quer peloutilizador quer pelo administrador
I Cada permissatildeo especifica o tipo de acesso permitido aum determinado recurso tal como
I Lecircr ou escrever um ficheiro ou directoacuterioI Estabelecer uma conexatildeo para um determinado endereccedilo
IP e portoI Algumas operaccedilotildees sobre a proacutepria JVM requerem
permissotildeesI Substituir o ClassLoaderI Substituir o SecurityManagerI Alterar a poliacutetica de seguranccedila
Permissotildees
I Internamente permissotildees satildeo objectos PexI javaioFilePermission
I Uma permissatildeo tipicamente temNome que identifica o recurso a que se aplicaLista de acccedilotildees que especifica as operaccedilotildees permitidas
permissatildeo nome lista de acccedilotildeesjavaioFilePermission ldquousrlib-rdquo ldquoread executerdquojavanetSocketPermission ldquoabccom54321rdquo ldquoconnectrdquojavasecuritySecurityPermission ldquosetPolicyrdquojavalangRuntimePermission ldquocreateClassLoaderrdquojavalangRuntimePermission ldquosetSecurityManagerrdquo
I Uma poliacutetica de seguranccedila eacute um conjunto de permissotildeesque determinam que operaccedilotildees um segmento de coacutedigopode executar
I Naturalmente a poliacutetica de seguranccedila eacute representada porum objecto (javasecurityPolicy)
Inicializaccedilatildeo do javasecurityPolicy
I Na implementaccedilatildeo referecircncia este objecto pode serinicializado a partir de vaacuterios ficheiros de configuraccedilatildeo Poromissatildeo usa
I Um ficheiro de configuraccedilatildeo para todo o sistema$javahomelibsecurityjavapolicy
I Um ficheiro de configuraccedilatildeo por utilizador~javapolicy
I O ficheiro de configuraccedilatildeo das propriedades de seguranccedilapermite especificar ainda outros ficheiros de configuraccedilatildeo
$javahomelibsecurityjavasecurity
I O ficheiro com a poliacutetica de seguranccedila pode ainda serespecificado quando da invocaccedilatildeo da JVM
java -Djavasecuritypolicy=somefile I Se a propriedade policyallowSystemProperty o
permitir ndash pode ser activada no ficheiro de configuraccedilatildeodas propriedades de seguranccedila
Sintaxe dos Ficheiros de Poliacuteticas
I Consiste numa lista de elementos (entries)keystore eacute opcional (natildeo usaremos pelo menos para
jaacute)grant clausuacutela usada para especificar as permissotildees de
coacutedigo de acordo com algumas propriedades(consideraremos apenas a sua origem)
I Tem o seguinte formato (de facto omite regras)
grant [codebase ltURLgt] permission ltclass_namegt lttargetgt [ ltactiongt]
onde
codebase especifica a origem do coacutedigo
permission especifica uma permissatildeo podendo umelemento grant incluir vaacuterias permissotildees
I Pode ocorrer uma ou mais vezes
Sintaxe dos Ficheiros de Poliacuteticas Exemplos
grant permission javanetSocketPermission 1024-
connectacceptpermission javanetSocketPermission abccom
connectacceptpermission javaioFilePermission
homeannpublic_htmlclasses- readpermission javaioFilePermission
homejonespublic_htmlclasses- read
grant codeBase httppaginasfeuppt~ei77777classes permission javasecurityAllPermission
I policytool eacute uma aplicaccedilatildeo que faz parte do J2SDKque oferece um GUI para auxiliar a ediccedilatildeo de ficheiros depoliacuteticas
Security Manager (12)
I O Security Manager eacute um objecto que garante ocumprimento da poliacutetica de seguranccedila
I Consiste apenas num conjunto de meacutetodos tais comopublic void checkPermission(Permission perm)
throws SecurityException
public void checkCreateClassLoader( )throws SecurityException
I Normalmente um thread soacute pode executar uma operaccedilatildeose todos os meacutetodos activos que invocou tiverempermissatildeo para a executar
I Tipicamente essa decisatildeo eacute baseada na origem do coacutedigoI Estes meacutetodos satildeo invocados por outros objectos quando
executam certas operaccedilotildeesI O Security Manager eacute um Reference Monitor
Security Manager (22)
I O SecurityManager natildeo eacute instalado por omissatildeoI A instalaccedilatildeo do SecurityManager pode ser feita
I Pelo interpretador (JVM)java -Djavasecuritymanager
I Pelo coacutedigoSystemsetSecurityManager(new SecurityManager())
I A poliacutetica imposta pelo SecurityManager pode serconfigurada atraveacutes dos ficheiros de especificaccedilatildeo daSecurityPolicy
I O coacutedigo do sistema invoca os meacutetodos checkXXX doSecurityManager se este estiver instalado
I Estes meacutetodos por sua vez invocam o meacutetodocheckPermission() do AccessController
Access Controller
I A partir de Java 12 ojavasecurityAccessController eacute a classe quede facto garante o cumprimento da poliacutetica de seguranccedila
I Por concepccedilatildeo eacute mais faacutecil flexiacutevel que oSecurityManager e estaacute sempre instalado (soacute static)
I Implementa uma poliacutetica razoavelmente restritiva que podeser usada na maioria dos casos
I Naturalmente pode invocar-se directamente da aplicaccedilatildeoos meacutetodos do AccessControllerFilePermission perm = new FilePermission(tmptestFile read)AccessControllercheckPermission(perm)
I Se a poliacutetica de seguranccedila implementada peloAccessController natildeo focircr adequada pode seradaptada criando subclasses dojavalangSecurityManager
I Estas subclasses devem invocar os meacutetodos doAccessController sempre que tal faccedila sentido
javarmiRMISecurityManager
I javarmiRMISecurityManager eacute uma sua subclassedo javalangSecurityManager
I Implementa exactamente os mesmos meacutetodosI O RMISecurityManager deve ser usado com RMI
sempre que haacute necessidade de transferir coacutedigo dumcomputador remoto
I O RMI class loader recusa-se a carregar qualquer classese natildeo houver um Security Manager
I O RMISecurityManager pode ser instalado de 2 modos
I Atraveacutes do coacutedigoSystemsetSecurityManager(new RMISecurityManager())
I Atraveacutes da linha de comandojava -Djavasecuritymanager=javarmiRMISecurityManager
Arquitectura de Seguranccedila em Java
I O Security Manager natildeo eacute a histoacuteria toda
Classrepository
Classverifier
Loadedclassobject
Java interpreter
Java program
Requestclass
Select appropriate loader
Loader forremoteclasses
Loader forlocal
classes
Classrepository
Remote siteLocal site
Tempo de Vida dum Objecto Remoto
I A vida dum objecto chega ao fim quando deixa de serreferenciado
I sem qualquer referecircncia para o objecto natildeo eacute possiacutevelaceder-lhe
I Para objectos locaisI o garbage collector da JVM automaticamente detecta
quando um objecto deixa de ser referenciado e liberta osrecursos
I quando a JVM termina todos os objectos locais terminamI Para objectos remotos
I as diferentes JVMs executam um algoritmo distribuiacutedo parafazer garbage collection
I quando uma JVM termina objectos remotos por elacriados podem natildeo terminar Por exemplo
I o RMIregistry manteacutem uma referecircncia para todos osobjectos nele registados
Passos no Desenvolvimento com Java RMI1 Concepccedilatildeo e implementaccedilatildeo de servidor e clientes
I Definiccedilatildeo da interface remota ie dos meacutetodos que podemser invocados remotamente
I Implementaccedilatildeo de objectos remotos os quais devemimplementar a interface remota definida
I Implementaccedilatildeo de clientes2 Compilaccedilatildeo do coacutedigo e geraccedilatildeo de stubs
I a compilaccedilatildeo do coacutedigo eacute feita usando javacI os stubs a usar pelo cliente podem ser gerados usando ormic a partir do ficheiro class da implementaccedilatildeo
rmic Echo_Impl
Nota A partir de Java 50 Java RMI suporta a geraccedilatildeodinacircmica de stubs
3 Disponibilizaccedilatildeo do coacutedigo por exemplo num servidorHTTP
I classes que precisem ser carregadas (downloaded)incluindo os stubs devem ser disponibilizadas num servidorHTTP
RMI e Uploaded Code
I Aplicaccedilotildees (clientes ou servidores) que podem transferircoacutedigo deveratildeo instalar um Security Manager import javarmipublic class Echo_Client public static void main(String[] args)
if(argslength = 2) Systemoutprintln(Usage java Echo_Client +
srv_hostname obj_name)return
SystemsetSecurityManager(new RMISecurityManager())try
I Se o coacutedigo do stub pode ser uploaded haacute que inicializar apropriedade javarmiservercodebase na aplicaccedilatildeoservidora pexjava -Djavarmiservercodebase=httpweb~pfsecho_server
I Atenccedilatildeo ao rmiregistry
Arquitectura de Java RMI
RMI Client
Web server
RMIregistry
RMI server
1 register object
3 return object reference
2 lookup object
4 request stub class
5 return stub class
6 remote invocation
7 return result
Sumaacuterio
RMIConceitoImplementaccedilatildeoExemplos
Java RMICaracteriacutesticasObjectos Remotos e Interfaces RemotasImplementaccedilatildeo de Java RMIArgumentos e serializaccedilatildeoTransferecircncia de coacutedigoLocalizaccedilatildeo de objectos remotosSeguranccedilaTempo de vida dum objecto remotoPassos no desenvolvimento de aplicaccedilotildeesTransferecircncia de coacutedigo
Leitura Adicional
I Capiacutetulo 10 de Tanenbaum e van Steen DistributedSystems 2nd Ed
I Secccedilatildeo 101 Architecture excepto Subsecccedilatildeo 1013I Secccedilatildeo 103 Communication excepto Subsecccedilatildeo 1035
I Java RMI Specification da SunI Java Security Overview da Sun Secccedilotildees 1 2 e 8I Security Policy in Java SE 6 da SunI Permissions in Java SE 6 da Sun
- RMI
-
- Conceito
- Implementaccedilatildeo
- Exemplos
-
- Java RMI
-
- Caracteriacutesticas
- Objectos Remotos e Interfaces Remotas
- Implementaccedilatildeo de Java RMI
- Argumentos e serializaccedilatildeo
- Transferecircncia de coacutedigo
- Localizaccedilatildeo de objectos remotos
- Seguranccedila
- Tempo de vida dum objecto remoto
- Passos no desenvolvimento de aplicaccedilotildees
- Transferecircncia de coacutedigo
-
- Leitura Adicional
-
Java RMI Servers (22)
I A partir de Java 12 objectos do tipo skeleton deixaram deser necessaacuterios
I objectos do tipo RemoteServer passaram a ser capazesde fazer tambeacutem as tarefas dos skeleton
I Java RMI oferece a classe UnicastRemoteObject aqual estende RemoteServer e oferece funcionalidademiacutenima para aplicaccedilotildees baseadas em RMI
I O objecto termina quando o processo que o criou terminaI Usa TCP na comunicaccedilatildeo com os clientes
Argumentos de Meacutetodos Remotos
I Os argumentos de ou o valor retornado por um meacutetodoremoto podem ser
1 tipos simples Por exemplo boolean char byte shortint long float ou double
2 objectos remotos ie que implementam a interfaceRemote
3 objectos locais serializaacuteveis ie que implementam ainterface Serializable (incluindo Strings e arrays)
I No caso de objectos locais RMI passa uma coacutepia doobjecto
I como o objecto eacute serializaacutevel tal eacute possiacutevelI note-se que Java RMI natildeo ldquoactualizardquo o objecto passado
caso o meacutetodo remoto o tenha modificadoI Atenccedilatildeo Uma referecircncia para um objecto remoto eacute de
facto uma referecircncia para o objecto proxy respectivo
Objectos Remotos vs Objectos Serializaacuteveis
Local objectO1
Copy of O1
Remote objectO2
Localreference L1
New localreference
Remotereference R1
Remoteinvocation withL1 and R1 asparameters
Copy of R1 to O2
Machine A Machine B
Machine C
Client code withRMI to server at C(proxy)
Server code(method implementation)
I Na praacutetica eacute como se objecto remoto O2 fosse passadopor referecircncia enquanto que o objecto local (serializaacutevel)O1 eacute passado por valor
I Semacircnticas diferentes transparecircncia ldquoturvardquo
Serializaccedilatildeo em Java (12)I Java RMI usa o mecanismo de serializaccedilatildeo de Java para
passar os argumentos e o valor retornadoI Em Java serializaccedilatildeo dum objecto consiste na conversatildeo
desse objecto numa sequecircncia de bytes de modo apermitir
I o seu armazenamento no disco para posteriorreincarnaccedilatildeo
I ou a sua migraccedilatildeo para uma outra JVMI A reconstituiccedilatildeo dum objecto a partir da sua
representaccedilatildeo serializada designa-se por deserializaccedilatildeoI Para que um objecto seja serializaacutevel deveraacute implementar
a interface javaioSerializableI A JVM implementa um procedimento de serializaccedilatildeo por
omissatildeo que pode ser usado pela grande maioria dosobjectos
I desde que a definiccedilatildeo da sua classe declare queimplementa a interface javaioSerializable
Serializaccedilatildeo em Java (22)
I Se um objecto tiver campos que satildeo referecircncias paraoutros objectos estes uacuteltimos deveratildeo ser serializaacuteveispara que o primeiro tambeacutem o seja
I para serializar o primeiro objecto haacute que serializar osoutros
I cada objecto soacute eacute serializado uma vez mesmo que sejareferenciado muacuteltiplas vezes
I Por razotildees de eficiecircncia os meacutetodos duma classe natildeo satildeoincluiacutedos na sequecircncia de bytes criada pela serializaccedilatildeo
I a JVM inclui apenas um identificador da classe a que oobjecto pertence
Class Downloading em Java e RMI
Problema Como eacute que um meacutetodo remoto pode invocar omeacutetodo dum objecto natildeo remoto que lhe eacute passado comoargumento
I Os meacutetodos dum objecto natildeo fazem parte da suarepresentaccedilatildeo serializada
Soluccedilatildeo Usando as facilidades de transferecircncia de coacutedigo emJava
I Note-se que esta transferecircncia pode natildeo sernecessaacuteria se a classe estiver disponiacutevel localmente
A capacidade de transferecircncia de classes atraveacutes da redepode tambeacutem ser usada pelo cliente para carregar o proxyobject
I natildeo haacute necessidade de manter todas as classes emtodos os computadores
Localizaccedilatildeo dum Objecto
I O acesso a um objecto remoto eacute feito usando uma referecircnciapara um proxy desse objecto
montanhaecho()
Problema como eacute que se obteacutem uma referecircncia remota ie para oproxy dum objecto remoto
I Tecnicamente atraveacutes do valor de retorno dum meacutetodo
Soluccedilatildeo semelhante ao portmapper de RPC
I Java RMI oferece um serviccedilo de nomes baacutesico ormiregistry
I O rmiregistry eacute um programa e tem que executar noscomputadores que disponibilizam objectos remotos
I O ldquoservidorrdquo regista o objecto com um nome (binds) normiregistry local
I O ldquoclienterdquo solicita uma referecircncia para um objecto remotoao rmiregistry no computador onde o objecto reside
O rmiregistry e a Interface Registry
I O rmiregistry eacute uma aplicaccedilatildeo que implementa ainterface Registryvoid rebind(String name Remote obj)void bind(String name Remote obj)void unbind(String name Remote obj)Remote lookup(String name)String []list()
I Se incorrectamente usado o rmiregistry pode impediro uso de classes ldquoimportadasrdquo
If you do start the rmiregistry and it can find your stubclasses in CLASSPATH it will not remember that theloaded stub class can be loaded from your serverrsquos codebase[] do Tutorial on-line da Sun sobre RMI
A classe Naming
I Permite aceder a objectos que implementam RegistryI Suporta os seguintes meacutetodos
void rebind(String name Remote obj)void bind(String name Remote obj)void unbind(String name Remote obj)Remote lookup(String name)String []list()
ondename eacute um URL sem o meacutetodo de acesso
computerNameportobjectNamesendo computerNameport a ldquolocalizaccedilatildeordquo do
rmiregistryI bind() difere de rebind() na medida em que assinala
uma excepccedilatildeo se name jaacute tiver sido registadoI O rmregistry natildeo eacute um servidor global
I O cliente tem que saber onde se encontra o objecto
Exemplo Registo e Localizaccedilatildeo do ObjectoI O servidor tem que registar o objecto remoto
Echo montanhatry
montanha = new Echo_Impl()Namingrebind(lsquolsquoalpesrsquorsquo montanha)
catch ( RemoteException e)
I O cliente tem que o localizar (em i01co2213)Echo montanhatry
montanha = Naminglookup(lsquolsquoi01co2213alpesrsquorsquo)
catch ( RemoteException e) Naminglookup() is RMI
Arquitectura de Java RMI
RMI Client
Web server
RMIregistry
RMI server
1 register object
3 return object reference
2 lookup object
4 request stub class
5 return stub class
6 remote invocation
7 return result
RMI e Seguranccedila
Problema Java RMI pode exigir a transferecircncia de coacutedigo(classes) de maacutequinas remotas
I este coacutedigo eacute uma potencial ameaccedila agrave seguranccedilaSoluccedilatildeo Usar um Security Manager
I um objecto que controla o acesso aos recursos locais
I Java 10 suportava um modecirclo de seguranccedila do tiposandbox
I Coacutedigo local natildeo tinha restriccedilotildees para aleacutem das impostaspelo SO
I Coacutedigo importado soacute podia aceder aos recursos (limitados)disponiacuteveis na sandbox
I A partir de Java 12 pode-se sujeitar todo o coacutedigoindependentemente de ser ou natildeo local a controlo deacesso sendo este determinado pela security policy emvigor
Poliacutetica de Seguranccedila (Security Policy) e Permissotildees
I A poliacutetica de seguranccedila define as permissotildees de coacutedigocom base na sua origem sendo configuraacutevel quer peloutilizador quer pelo administrador
I Cada permissatildeo especifica o tipo de acesso permitido aum determinado recurso tal como
I Lecircr ou escrever um ficheiro ou directoacuterioI Estabelecer uma conexatildeo para um determinado endereccedilo
IP e portoI Algumas operaccedilotildees sobre a proacutepria JVM requerem
permissotildeesI Substituir o ClassLoaderI Substituir o SecurityManagerI Alterar a poliacutetica de seguranccedila
Permissotildees
I Internamente permissotildees satildeo objectos PexI javaioFilePermission
I Uma permissatildeo tipicamente temNome que identifica o recurso a que se aplicaLista de acccedilotildees que especifica as operaccedilotildees permitidas
permissatildeo nome lista de acccedilotildeesjavaioFilePermission ldquousrlib-rdquo ldquoread executerdquojavanetSocketPermission ldquoabccom54321rdquo ldquoconnectrdquojavasecuritySecurityPermission ldquosetPolicyrdquojavalangRuntimePermission ldquocreateClassLoaderrdquojavalangRuntimePermission ldquosetSecurityManagerrdquo
I Uma poliacutetica de seguranccedila eacute um conjunto de permissotildeesque determinam que operaccedilotildees um segmento de coacutedigopode executar
I Naturalmente a poliacutetica de seguranccedila eacute representada porum objecto (javasecurityPolicy)
Inicializaccedilatildeo do javasecurityPolicy
I Na implementaccedilatildeo referecircncia este objecto pode serinicializado a partir de vaacuterios ficheiros de configuraccedilatildeo Poromissatildeo usa
I Um ficheiro de configuraccedilatildeo para todo o sistema$javahomelibsecurityjavapolicy
I Um ficheiro de configuraccedilatildeo por utilizador~javapolicy
I O ficheiro de configuraccedilatildeo das propriedades de seguranccedilapermite especificar ainda outros ficheiros de configuraccedilatildeo
$javahomelibsecurityjavasecurity
I O ficheiro com a poliacutetica de seguranccedila pode ainda serespecificado quando da invocaccedilatildeo da JVM
java -Djavasecuritypolicy=somefile I Se a propriedade policyallowSystemProperty o
permitir ndash pode ser activada no ficheiro de configuraccedilatildeodas propriedades de seguranccedila
Sintaxe dos Ficheiros de Poliacuteticas
I Consiste numa lista de elementos (entries)keystore eacute opcional (natildeo usaremos pelo menos para
jaacute)grant clausuacutela usada para especificar as permissotildees de
coacutedigo de acordo com algumas propriedades(consideraremos apenas a sua origem)
I Tem o seguinte formato (de facto omite regras)
grant [codebase ltURLgt] permission ltclass_namegt lttargetgt [ ltactiongt]
onde
codebase especifica a origem do coacutedigo
permission especifica uma permissatildeo podendo umelemento grant incluir vaacuterias permissotildees
I Pode ocorrer uma ou mais vezes
Sintaxe dos Ficheiros de Poliacuteticas Exemplos
grant permission javanetSocketPermission 1024-
connectacceptpermission javanetSocketPermission abccom
connectacceptpermission javaioFilePermission
homeannpublic_htmlclasses- readpermission javaioFilePermission
homejonespublic_htmlclasses- read
grant codeBase httppaginasfeuppt~ei77777classes permission javasecurityAllPermission
I policytool eacute uma aplicaccedilatildeo que faz parte do J2SDKque oferece um GUI para auxiliar a ediccedilatildeo de ficheiros depoliacuteticas
Security Manager (12)
I O Security Manager eacute um objecto que garante ocumprimento da poliacutetica de seguranccedila
I Consiste apenas num conjunto de meacutetodos tais comopublic void checkPermission(Permission perm)
throws SecurityException
public void checkCreateClassLoader( )throws SecurityException
I Normalmente um thread soacute pode executar uma operaccedilatildeose todos os meacutetodos activos que invocou tiverempermissatildeo para a executar
I Tipicamente essa decisatildeo eacute baseada na origem do coacutedigoI Estes meacutetodos satildeo invocados por outros objectos quando
executam certas operaccedilotildeesI O Security Manager eacute um Reference Monitor
Security Manager (22)
I O SecurityManager natildeo eacute instalado por omissatildeoI A instalaccedilatildeo do SecurityManager pode ser feita
I Pelo interpretador (JVM)java -Djavasecuritymanager
I Pelo coacutedigoSystemsetSecurityManager(new SecurityManager())
I A poliacutetica imposta pelo SecurityManager pode serconfigurada atraveacutes dos ficheiros de especificaccedilatildeo daSecurityPolicy
I O coacutedigo do sistema invoca os meacutetodos checkXXX doSecurityManager se este estiver instalado
I Estes meacutetodos por sua vez invocam o meacutetodocheckPermission() do AccessController
Access Controller
I A partir de Java 12 ojavasecurityAccessController eacute a classe quede facto garante o cumprimento da poliacutetica de seguranccedila
I Por concepccedilatildeo eacute mais faacutecil flexiacutevel que oSecurityManager e estaacute sempre instalado (soacute static)
I Implementa uma poliacutetica razoavelmente restritiva que podeser usada na maioria dos casos
I Naturalmente pode invocar-se directamente da aplicaccedilatildeoos meacutetodos do AccessControllerFilePermission perm = new FilePermission(tmptestFile read)AccessControllercheckPermission(perm)
I Se a poliacutetica de seguranccedila implementada peloAccessController natildeo focircr adequada pode seradaptada criando subclasses dojavalangSecurityManager
I Estas subclasses devem invocar os meacutetodos doAccessController sempre que tal faccedila sentido
javarmiRMISecurityManager
I javarmiRMISecurityManager eacute uma sua subclassedo javalangSecurityManager
I Implementa exactamente os mesmos meacutetodosI O RMISecurityManager deve ser usado com RMI
sempre que haacute necessidade de transferir coacutedigo dumcomputador remoto
I O RMI class loader recusa-se a carregar qualquer classese natildeo houver um Security Manager
I O RMISecurityManager pode ser instalado de 2 modos
I Atraveacutes do coacutedigoSystemsetSecurityManager(new RMISecurityManager())
I Atraveacutes da linha de comandojava -Djavasecuritymanager=javarmiRMISecurityManager
Arquitectura de Seguranccedila em Java
I O Security Manager natildeo eacute a histoacuteria toda
Classrepository
Classverifier
Loadedclassobject
Java interpreter
Java program
Requestclass
Select appropriate loader
Loader forremoteclasses
Loader forlocal
classes
Classrepository
Remote siteLocal site
Tempo de Vida dum Objecto Remoto
I A vida dum objecto chega ao fim quando deixa de serreferenciado
I sem qualquer referecircncia para o objecto natildeo eacute possiacutevelaceder-lhe
I Para objectos locaisI o garbage collector da JVM automaticamente detecta
quando um objecto deixa de ser referenciado e liberta osrecursos
I quando a JVM termina todos os objectos locais terminamI Para objectos remotos
I as diferentes JVMs executam um algoritmo distribuiacutedo parafazer garbage collection
I quando uma JVM termina objectos remotos por elacriados podem natildeo terminar Por exemplo
I o RMIregistry manteacutem uma referecircncia para todos osobjectos nele registados
Passos no Desenvolvimento com Java RMI1 Concepccedilatildeo e implementaccedilatildeo de servidor e clientes
I Definiccedilatildeo da interface remota ie dos meacutetodos que podemser invocados remotamente
I Implementaccedilatildeo de objectos remotos os quais devemimplementar a interface remota definida
I Implementaccedilatildeo de clientes2 Compilaccedilatildeo do coacutedigo e geraccedilatildeo de stubs
I a compilaccedilatildeo do coacutedigo eacute feita usando javacI os stubs a usar pelo cliente podem ser gerados usando ormic a partir do ficheiro class da implementaccedilatildeo
rmic Echo_Impl
Nota A partir de Java 50 Java RMI suporta a geraccedilatildeodinacircmica de stubs
3 Disponibilizaccedilatildeo do coacutedigo por exemplo num servidorHTTP
I classes que precisem ser carregadas (downloaded)incluindo os stubs devem ser disponibilizadas num servidorHTTP
RMI e Uploaded Code
I Aplicaccedilotildees (clientes ou servidores) que podem transferircoacutedigo deveratildeo instalar um Security Manager import javarmipublic class Echo_Client public static void main(String[] args)
if(argslength = 2) Systemoutprintln(Usage java Echo_Client +
srv_hostname obj_name)return
SystemsetSecurityManager(new RMISecurityManager())try
I Se o coacutedigo do stub pode ser uploaded haacute que inicializar apropriedade javarmiservercodebase na aplicaccedilatildeoservidora pexjava -Djavarmiservercodebase=httpweb~pfsecho_server
I Atenccedilatildeo ao rmiregistry
Arquitectura de Java RMI
RMI Client
Web server
RMIregistry
RMI server
1 register object
3 return object reference
2 lookup object
4 request stub class
5 return stub class
6 remote invocation
7 return result
Sumaacuterio
RMIConceitoImplementaccedilatildeoExemplos
Java RMICaracteriacutesticasObjectos Remotos e Interfaces RemotasImplementaccedilatildeo de Java RMIArgumentos e serializaccedilatildeoTransferecircncia de coacutedigoLocalizaccedilatildeo de objectos remotosSeguranccedilaTempo de vida dum objecto remotoPassos no desenvolvimento de aplicaccedilotildeesTransferecircncia de coacutedigo
Leitura Adicional
I Capiacutetulo 10 de Tanenbaum e van Steen DistributedSystems 2nd Ed
I Secccedilatildeo 101 Architecture excepto Subsecccedilatildeo 1013I Secccedilatildeo 103 Communication excepto Subsecccedilatildeo 1035
I Java RMI Specification da SunI Java Security Overview da Sun Secccedilotildees 1 2 e 8I Security Policy in Java SE 6 da SunI Permissions in Java SE 6 da Sun
- RMI
-
- Conceito
- Implementaccedilatildeo
- Exemplos
-
- Java RMI
-
- Caracteriacutesticas
- Objectos Remotos e Interfaces Remotas
- Implementaccedilatildeo de Java RMI
- Argumentos e serializaccedilatildeo
- Transferecircncia de coacutedigo
- Localizaccedilatildeo de objectos remotos
- Seguranccedila
- Tempo de vida dum objecto remoto
- Passos no desenvolvimento de aplicaccedilotildees
- Transferecircncia de coacutedigo
-
- Leitura Adicional
-
Objectos Remotos vs Objectos Serializaacuteveis
Local objectO1
Copy of O1
Remote objectO2
Localreference L1
New localreference
Remotereference R1
Remoteinvocation withL1 and R1 asparameters
Copy of R1 to O2
Machine A Machine B
Machine C
Client code withRMI to server at C(proxy)
Server code(method implementation)
I Na praacutetica eacute como se objecto remoto O2 fosse passadopor referecircncia enquanto que o objecto local (serializaacutevel)O1 eacute passado por valor
I Semacircnticas diferentes transparecircncia ldquoturvardquo
Serializaccedilatildeo em Java (12)I Java RMI usa o mecanismo de serializaccedilatildeo de Java para
passar os argumentos e o valor retornadoI Em Java serializaccedilatildeo dum objecto consiste na conversatildeo
desse objecto numa sequecircncia de bytes de modo apermitir
I o seu armazenamento no disco para posteriorreincarnaccedilatildeo
I ou a sua migraccedilatildeo para uma outra JVMI A reconstituiccedilatildeo dum objecto a partir da sua
representaccedilatildeo serializada designa-se por deserializaccedilatildeoI Para que um objecto seja serializaacutevel deveraacute implementar
a interface javaioSerializableI A JVM implementa um procedimento de serializaccedilatildeo por
omissatildeo que pode ser usado pela grande maioria dosobjectos
I desde que a definiccedilatildeo da sua classe declare queimplementa a interface javaioSerializable
Serializaccedilatildeo em Java (22)
I Se um objecto tiver campos que satildeo referecircncias paraoutros objectos estes uacuteltimos deveratildeo ser serializaacuteveispara que o primeiro tambeacutem o seja
I para serializar o primeiro objecto haacute que serializar osoutros
I cada objecto soacute eacute serializado uma vez mesmo que sejareferenciado muacuteltiplas vezes
I Por razotildees de eficiecircncia os meacutetodos duma classe natildeo satildeoincluiacutedos na sequecircncia de bytes criada pela serializaccedilatildeo
I a JVM inclui apenas um identificador da classe a que oobjecto pertence
Class Downloading em Java e RMI
Problema Como eacute que um meacutetodo remoto pode invocar omeacutetodo dum objecto natildeo remoto que lhe eacute passado comoargumento
I Os meacutetodos dum objecto natildeo fazem parte da suarepresentaccedilatildeo serializada
Soluccedilatildeo Usando as facilidades de transferecircncia de coacutedigo emJava
I Note-se que esta transferecircncia pode natildeo sernecessaacuteria se a classe estiver disponiacutevel localmente
A capacidade de transferecircncia de classes atraveacutes da redepode tambeacutem ser usada pelo cliente para carregar o proxyobject
I natildeo haacute necessidade de manter todas as classes emtodos os computadores
Localizaccedilatildeo dum Objecto
I O acesso a um objecto remoto eacute feito usando uma referecircnciapara um proxy desse objecto
montanhaecho()
Problema como eacute que se obteacutem uma referecircncia remota ie para oproxy dum objecto remoto
I Tecnicamente atraveacutes do valor de retorno dum meacutetodo
Soluccedilatildeo semelhante ao portmapper de RPC
I Java RMI oferece um serviccedilo de nomes baacutesico ormiregistry
I O rmiregistry eacute um programa e tem que executar noscomputadores que disponibilizam objectos remotos
I O ldquoservidorrdquo regista o objecto com um nome (binds) normiregistry local
I O ldquoclienterdquo solicita uma referecircncia para um objecto remotoao rmiregistry no computador onde o objecto reside
O rmiregistry e a Interface Registry
I O rmiregistry eacute uma aplicaccedilatildeo que implementa ainterface Registryvoid rebind(String name Remote obj)void bind(String name Remote obj)void unbind(String name Remote obj)Remote lookup(String name)String []list()
I Se incorrectamente usado o rmiregistry pode impediro uso de classes ldquoimportadasrdquo
If you do start the rmiregistry and it can find your stubclasses in CLASSPATH it will not remember that theloaded stub class can be loaded from your serverrsquos codebase[] do Tutorial on-line da Sun sobre RMI
A classe Naming
I Permite aceder a objectos que implementam RegistryI Suporta os seguintes meacutetodos
void rebind(String name Remote obj)void bind(String name Remote obj)void unbind(String name Remote obj)Remote lookup(String name)String []list()
ondename eacute um URL sem o meacutetodo de acesso
computerNameportobjectNamesendo computerNameport a ldquolocalizaccedilatildeordquo do
rmiregistryI bind() difere de rebind() na medida em que assinala
uma excepccedilatildeo se name jaacute tiver sido registadoI O rmregistry natildeo eacute um servidor global
I O cliente tem que saber onde se encontra o objecto
Exemplo Registo e Localizaccedilatildeo do ObjectoI O servidor tem que registar o objecto remoto
Echo montanhatry
montanha = new Echo_Impl()Namingrebind(lsquolsquoalpesrsquorsquo montanha)
catch ( RemoteException e)
I O cliente tem que o localizar (em i01co2213)Echo montanhatry
montanha = Naminglookup(lsquolsquoi01co2213alpesrsquorsquo)
catch ( RemoteException e) Naminglookup() is RMI
Arquitectura de Java RMI
RMI Client
Web server
RMIregistry
RMI server
1 register object
3 return object reference
2 lookup object
4 request stub class
5 return stub class
6 remote invocation
7 return result
RMI e Seguranccedila
Problema Java RMI pode exigir a transferecircncia de coacutedigo(classes) de maacutequinas remotas
I este coacutedigo eacute uma potencial ameaccedila agrave seguranccedilaSoluccedilatildeo Usar um Security Manager
I um objecto que controla o acesso aos recursos locais
I Java 10 suportava um modecirclo de seguranccedila do tiposandbox
I Coacutedigo local natildeo tinha restriccedilotildees para aleacutem das impostaspelo SO
I Coacutedigo importado soacute podia aceder aos recursos (limitados)disponiacuteveis na sandbox
I A partir de Java 12 pode-se sujeitar todo o coacutedigoindependentemente de ser ou natildeo local a controlo deacesso sendo este determinado pela security policy emvigor
Poliacutetica de Seguranccedila (Security Policy) e Permissotildees
I A poliacutetica de seguranccedila define as permissotildees de coacutedigocom base na sua origem sendo configuraacutevel quer peloutilizador quer pelo administrador
I Cada permissatildeo especifica o tipo de acesso permitido aum determinado recurso tal como
I Lecircr ou escrever um ficheiro ou directoacuterioI Estabelecer uma conexatildeo para um determinado endereccedilo
IP e portoI Algumas operaccedilotildees sobre a proacutepria JVM requerem
permissotildeesI Substituir o ClassLoaderI Substituir o SecurityManagerI Alterar a poliacutetica de seguranccedila
Permissotildees
I Internamente permissotildees satildeo objectos PexI javaioFilePermission
I Uma permissatildeo tipicamente temNome que identifica o recurso a que se aplicaLista de acccedilotildees que especifica as operaccedilotildees permitidas
permissatildeo nome lista de acccedilotildeesjavaioFilePermission ldquousrlib-rdquo ldquoread executerdquojavanetSocketPermission ldquoabccom54321rdquo ldquoconnectrdquojavasecuritySecurityPermission ldquosetPolicyrdquojavalangRuntimePermission ldquocreateClassLoaderrdquojavalangRuntimePermission ldquosetSecurityManagerrdquo
I Uma poliacutetica de seguranccedila eacute um conjunto de permissotildeesque determinam que operaccedilotildees um segmento de coacutedigopode executar
I Naturalmente a poliacutetica de seguranccedila eacute representada porum objecto (javasecurityPolicy)
Inicializaccedilatildeo do javasecurityPolicy
I Na implementaccedilatildeo referecircncia este objecto pode serinicializado a partir de vaacuterios ficheiros de configuraccedilatildeo Poromissatildeo usa
I Um ficheiro de configuraccedilatildeo para todo o sistema$javahomelibsecurityjavapolicy
I Um ficheiro de configuraccedilatildeo por utilizador~javapolicy
I O ficheiro de configuraccedilatildeo das propriedades de seguranccedilapermite especificar ainda outros ficheiros de configuraccedilatildeo
$javahomelibsecurityjavasecurity
I O ficheiro com a poliacutetica de seguranccedila pode ainda serespecificado quando da invocaccedilatildeo da JVM
java -Djavasecuritypolicy=somefile I Se a propriedade policyallowSystemProperty o
permitir ndash pode ser activada no ficheiro de configuraccedilatildeodas propriedades de seguranccedila
Sintaxe dos Ficheiros de Poliacuteticas
I Consiste numa lista de elementos (entries)keystore eacute opcional (natildeo usaremos pelo menos para
jaacute)grant clausuacutela usada para especificar as permissotildees de
coacutedigo de acordo com algumas propriedades(consideraremos apenas a sua origem)
I Tem o seguinte formato (de facto omite regras)
grant [codebase ltURLgt] permission ltclass_namegt lttargetgt [ ltactiongt]
onde
codebase especifica a origem do coacutedigo
permission especifica uma permissatildeo podendo umelemento grant incluir vaacuterias permissotildees
I Pode ocorrer uma ou mais vezes
Sintaxe dos Ficheiros de Poliacuteticas Exemplos
grant permission javanetSocketPermission 1024-
connectacceptpermission javanetSocketPermission abccom
connectacceptpermission javaioFilePermission
homeannpublic_htmlclasses- readpermission javaioFilePermission
homejonespublic_htmlclasses- read
grant codeBase httppaginasfeuppt~ei77777classes permission javasecurityAllPermission
I policytool eacute uma aplicaccedilatildeo que faz parte do J2SDKque oferece um GUI para auxiliar a ediccedilatildeo de ficheiros depoliacuteticas
Security Manager (12)
I O Security Manager eacute um objecto que garante ocumprimento da poliacutetica de seguranccedila
I Consiste apenas num conjunto de meacutetodos tais comopublic void checkPermission(Permission perm)
throws SecurityException
public void checkCreateClassLoader( )throws SecurityException
I Normalmente um thread soacute pode executar uma operaccedilatildeose todos os meacutetodos activos que invocou tiverempermissatildeo para a executar
I Tipicamente essa decisatildeo eacute baseada na origem do coacutedigoI Estes meacutetodos satildeo invocados por outros objectos quando
executam certas operaccedilotildeesI O Security Manager eacute um Reference Monitor
Security Manager (22)
I O SecurityManager natildeo eacute instalado por omissatildeoI A instalaccedilatildeo do SecurityManager pode ser feita
I Pelo interpretador (JVM)java -Djavasecuritymanager
I Pelo coacutedigoSystemsetSecurityManager(new SecurityManager())
I A poliacutetica imposta pelo SecurityManager pode serconfigurada atraveacutes dos ficheiros de especificaccedilatildeo daSecurityPolicy
I O coacutedigo do sistema invoca os meacutetodos checkXXX doSecurityManager se este estiver instalado
I Estes meacutetodos por sua vez invocam o meacutetodocheckPermission() do AccessController
Access Controller
I A partir de Java 12 ojavasecurityAccessController eacute a classe quede facto garante o cumprimento da poliacutetica de seguranccedila
I Por concepccedilatildeo eacute mais faacutecil flexiacutevel que oSecurityManager e estaacute sempre instalado (soacute static)
I Implementa uma poliacutetica razoavelmente restritiva que podeser usada na maioria dos casos
I Naturalmente pode invocar-se directamente da aplicaccedilatildeoos meacutetodos do AccessControllerFilePermission perm = new FilePermission(tmptestFile read)AccessControllercheckPermission(perm)
I Se a poliacutetica de seguranccedila implementada peloAccessController natildeo focircr adequada pode seradaptada criando subclasses dojavalangSecurityManager
I Estas subclasses devem invocar os meacutetodos doAccessController sempre que tal faccedila sentido
javarmiRMISecurityManager
I javarmiRMISecurityManager eacute uma sua subclassedo javalangSecurityManager
I Implementa exactamente os mesmos meacutetodosI O RMISecurityManager deve ser usado com RMI
sempre que haacute necessidade de transferir coacutedigo dumcomputador remoto
I O RMI class loader recusa-se a carregar qualquer classese natildeo houver um Security Manager
I O RMISecurityManager pode ser instalado de 2 modos
I Atraveacutes do coacutedigoSystemsetSecurityManager(new RMISecurityManager())
I Atraveacutes da linha de comandojava -Djavasecuritymanager=javarmiRMISecurityManager
Arquitectura de Seguranccedila em Java
I O Security Manager natildeo eacute a histoacuteria toda
Classrepository
Classverifier
Loadedclassobject
Java interpreter
Java program
Requestclass
Select appropriate loader
Loader forremoteclasses
Loader forlocal
classes
Classrepository
Remote siteLocal site
Tempo de Vida dum Objecto Remoto
I A vida dum objecto chega ao fim quando deixa de serreferenciado
I sem qualquer referecircncia para o objecto natildeo eacute possiacutevelaceder-lhe
I Para objectos locaisI o garbage collector da JVM automaticamente detecta
quando um objecto deixa de ser referenciado e liberta osrecursos
I quando a JVM termina todos os objectos locais terminamI Para objectos remotos
I as diferentes JVMs executam um algoritmo distribuiacutedo parafazer garbage collection
I quando uma JVM termina objectos remotos por elacriados podem natildeo terminar Por exemplo
I o RMIregistry manteacutem uma referecircncia para todos osobjectos nele registados
Passos no Desenvolvimento com Java RMI1 Concepccedilatildeo e implementaccedilatildeo de servidor e clientes
I Definiccedilatildeo da interface remota ie dos meacutetodos que podemser invocados remotamente
I Implementaccedilatildeo de objectos remotos os quais devemimplementar a interface remota definida
I Implementaccedilatildeo de clientes2 Compilaccedilatildeo do coacutedigo e geraccedilatildeo de stubs
I a compilaccedilatildeo do coacutedigo eacute feita usando javacI os stubs a usar pelo cliente podem ser gerados usando ormic a partir do ficheiro class da implementaccedilatildeo
rmic Echo_Impl
Nota A partir de Java 50 Java RMI suporta a geraccedilatildeodinacircmica de stubs
3 Disponibilizaccedilatildeo do coacutedigo por exemplo num servidorHTTP
I classes que precisem ser carregadas (downloaded)incluindo os stubs devem ser disponibilizadas num servidorHTTP
RMI e Uploaded Code
I Aplicaccedilotildees (clientes ou servidores) que podem transferircoacutedigo deveratildeo instalar um Security Manager import javarmipublic class Echo_Client public static void main(String[] args)
if(argslength = 2) Systemoutprintln(Usage java Echo_Client +
srv_hostname obj_name)return
SystemsetSecurityManager(new RMISecurityManager())try
I Se o coacutedigo do stub pode ser uploaded haacute que inicializar apropriedade javarmiservercodebase na aplicaccedilatildeoservidora pexjava -Djavarmiservercodebase=httpweb~pfsecho_server
I Atenccedilatildeo ao rmiregistry
Arquitectura de Java RMI
RMI Client
Web server
RMIregistry
RMI server
1 register object
3 return object reference
2 lookup object
4 request stub class
5 return stub class
6 remote invocation
7 return result
Sumaacuterio
RMIConceitoImplementaccedilatildeoExemplos
Java RMICaracteriacutesticasObjectos Remotos e Interfaces RemotasImplementaccedilatildeo de Java RMIArgumentos e serializaccedilatildeoTransferecircncia de coacutedigoLocalizaccedilatildeo de objectos remotosSeguranccedilaTempo de vida dum objecto remotoPassos no desenvolvimento de aplicaccedilotildeesTransferecircncia de coacutedigo
Leitura Adicional
I Capiacutetulo 10 de Tanenbaum e van Steen DistributedSystems 2nd Ed
I Secccedilatildeo 101 Architecture excepto Subsecccedilatildeo 1013I Secccedilatildeo 103 Communication excepto Subsecccedilatildeo 1035
I Java RMI Specification da SunI Java Security Overview da Sun Secccedilotildees 1 2 e 8I Security Policy in Java SE 6 da SunI Permissions in Java SE 6 da Sun
- RMI
-
- Conceito
- Implementaccedilatildeo
- Exemplos
-
- Java RMI
-
- Caracteriacutesticas
- Objectos Remotos e Interfaces Remotas
- Implementaccedilatildeo de Java RMI
- Argumentos e serializaccedilatildeo
- Transferecircncia de coacutedigo
- Localizaccedilatildeo de objectos remotos
- Seguranccedila
- Tempo de vida dum objecto remoto
- Passos no desenvolvimento de aplicaccedilotildees
- Transferecircncia de coacutedigo
-
- Leitura Adicional
-
Serializaccedilatildeo em Java (22)
I Se um objecto tiver campos que satildeo referecircncias paraoutros objectos estes uacuteltimos deveratildeo ser serializaacuteveispara que o primeiro tambeacutem o seja
I para serializar o primeiro objecto haacute que serializar osoutros
I cada objecto soacute eacute serializado uma vez mesmo que sejareferenciado muacuteltiplas vezes
I Por razotildees de eficiecircncia os meacutetodos duma classe natildeo satildeoincluiacutedos na sequecircncia de bytes criada pela serializaccedilatildeo
I a JVM inclui apenas um identificador da classe a que oobjecto pertence
Class Downloading em Java e RMI
Problema Como eacute que um meacutetodo remoto pode invocar omeacutetodo dum objecto natildeo remoto que lhe eacute passado comoargumento
I Os meacutetodos dum objecto natildeo fazem parte da suarepresentaccedilatildeo serializada
Soluccedilatildeo Usando as facilidades de transferecircncia de coacutedigo emJava
I Note-se que esta transferecircncia pode natildeo sernecessaacuteria se a classe estiver disponiacutevel localmente
A capacidade de transferecircncia de classes atraveacutes da redepode tambeacutem ser usada pelo cliente para carregar o proxyobject
I natildeo haacute necessidade de manter todas as classes emtodos os computadores
Localizaccedilatildeo dum Objecto
I O acesso a um objecto remoto eacute feito usando uma referecircnciapara um proxy desse objecto
montanhaecho()
Problema como eacute que se obteacutem uma referecircncia remota ie para oproxy dum objecto remoto
I Tecnicamente atraveacutes do valor de retorno dum meacutetodo
Soluccedilatildeo semelhante ao portmapper de RPC
I Java RMI oferece um serviccedilo de nomes baacutesico ormiregistry
I O rmiregistry eacute um programa e tem que executar noscomputadores que disponibilizam objectos remotos
I O ldquoservidorrdquo regista o objecto com um nome (binds) normiregistry local
I O ldquoclienterdquo solicita uma referecircncia para um objecto remotoao rmiregistry no computador onde o objecto reside
O rmiregistry e a Interface Registry
I O rmiregistry eacute uma aplicaccedilatildeo que implementa ainterface Registryvoid rebind(String name Remote obj)void bind(String name Remote obj)void unbind(String name Remote obj)Remote lookup(String name)String []list()
I Se incorrectamente usado o rmiregistry pode impediro uso de classes ldquoimportadasrdquo
If you do start the rmiregistry and it can find your stubclasses in CLASSPATH it will not remember that theloaded stub class can be loaded from your serverrsquos codebase[] do Tutorial on-line da Sun sobre RMI
A classe Naming
I Permite aceder a objectos que implementam RegistryI Suporta os seguintes meacutetodos
void rebind(String name Remote obj)void bind(String name Remote obj)void unbind(String name Remote obj)Remote lookup(String name)String []list()
ondename eacute um URL sem o meacutetodo de acesso
computerNameportobjectNamesendo computerNameport a ldquolocalizaccedilatildeordquo do
rmiregistryI bind() difere de rebind() na medida em que assinala
uma excepccedilatildeo se name jaacute tiver sido registadoI O rmregistry natildeo eacute um servidor global
I O cliente tem que saber onde se encontra o objecto
Exemplo Registo e Localizaccedilatildeo do ObjectoI O servidor tem que registar o objecto remoto
Echo montanhatry
montanha = new Echo_Impl()Namingrebind(lsquolsquoalpesrsquorsquo montanha)
catch ( RemoteException e)
I O cliente tem que o localizar (em i01co2213)Echo montanhatry
montanha = Naminglookup(lsquolsquoi01co2213alpesrsquorsquo)
catch ( RemoteException e) Naminglookup() is RMI
Arquitectura de Java RMI
RMI Client
Web server
RMIregistry
RMI server
1 register object
3 return object reference
2 lookup object
4 request stub class
5 return stub class
6 remote invocation
7 return result
RMI e Seguranccedila
Problema Java RMI pode exigir a transferecircncia de coacutedigo(classes) de maacutequinas remotas
I este coacutedigo eacute uma potencial ameaccedila agrave seguranccedilaSoluccedilatildeo Usar um Security Manager
I um objecto que controla o acesso aos recursos locais
I Java 10 suportava um modecirclo de seguranccedila do tiposandbox
I Coacutedigo local natildeo tinha restriccedilotildees para aleacutem das impostaspelo SO
I Coacutedigo importado soacute podia aceder aos recursos (limitados)disponiacuteveis na sandbox
I A partir de Java 12 pode-se sujeitar todo o coacutedigoindependentemente de ser ou natildeo local a controlo deacesso sendo este determinado pela security policy emvigor
Poliacutetica de Seguranccedila (Security Policy) e Permissotildees
I A poliacutetica de seguranccedila define as permissotildees de coacutedigocom base na sua origem sendo configuraacutevel quer peloutilizador quer pelo administrador
I Cada permissatildeo especifica o tipo de acesso permitido aum determinado recurso tal como
I Lecircr ou escrever um ficheiro ou directoacuterioI Estabelecer uma conexatildeo para um determinado endereccedilo
IP e portoI Algumas operaccedilotildees sobre a proacutepria JVM requerem
permissotildeesI Substituir o ClassLoaderI Substituir o SecurityManagerI Alterar a poliacutetica de seguranccedila
Permissotildees
I Internamente permissotildees satildeo objectos PexI javaioFilePermission
I Uma permissatildeo tipicamente temNome que identifica o recurso a que se aplicaLista de acccedilotildees que especifica as operaccedilotildees permitidas
permissatildeo nome lista de acccedilotildeesjavaioFilePermission ldquousrlib-rdquo ldquoread executerdquojavanetSocketPermission ldquoabccom54321rdquo ldquoconnectrdquojavasecuritySecurityPermission ldquosetPolicyrdquojavalangRuntimePermission ldquocreateClassLoaderrdquojavalangRuntimePermission ldquosetSecurityManagerrdquo
I Uma poliacutetica de seguranccedila eacute um conjunto de permissotildeesque determinam que operaccedilotildees um segmento de coacutedigopode executar
I Naturalmente a poliacutetica de seguranccedila eacute representada porum objecto (javasecurityPolicy)
Inicializaccedilatildeo do javasecurityPolicy
I Na implementaccedilatildeo referecircncia este objecto pode serinicializado a partir de vaacuterios ficheiros de configuraccedilatildeo Poromissatildeo usa
I Um ficheiro de configuraccedilatildeo para todo o sistema$javahomelibsecurityjavapolicy
I Um ficheiro de configuraccedilatildeo por utilizador~javapolicy
I O ficheiro de configuraccedilatildeo das propriedades de seguranccedilapermite especificar ainda outros ficheiros de configuraccedilatildeo
$javahomelibsecurityjavasecurity
I O ficheiro com a poliacutetica de seguranccedila pode ainda serespecificado quando da invocaccedilatildeo da JVM
java -Djavasecuritypolicy=somefile I Se a propriedade policyallowSystemProperty o
permitir ndash pode ser activada no ficheiro de configuraccedilatildeodas propriedades de seguranccedila
Sintaxe dos Ficheiros de Poliacuteticas
I Consiste numa lista de elementos (entries)keystore eacute opcional (natildeo usaremos pelo menos para
jaacute)grant clausuacutela usada para especificar as permissotildees de
coacutedigo de acordo com algumas propriedades(consideraremos apenas a sua origem)
I Tem o seguinte formato (de facto omite regras)
grant [codebase ltURLgt] permission ltclass_namegt lttargetgt [ ltactiongt]
onde
codebase especifica a origem do coacutedigo
permission especifica uma permissatildeo podendo umelemento grant incluir vaacuterias permissotildees
I Pode ocorrer uma ou mais vezes
Sintaxe dos Ficheiros de Poliacuteticas Exemplos
grant permission javanetSocketPermission 1024-
connectacceptpermission javanetSocketPermission abccom
connectacceptpermission javaioFilePermission
homeannpublic_htmlclasses- readpermission javaioFilePermission
homejonespublic_htmlclasses- read
grant codeBase httppaginasfeuppt~ei77777classes permission javasecurityAllPermission
I policytool eacute uma aplicaccedilatildeo que faz parte do J2SDKque oferece um GUI para auxiliar a ediccedilatildeo de ficheiros depoliacuteticas
Security Manager (12)
I O Security Manager eacute um objecto que garante ocumprimento da poliacutetica de seguranccedila
I Consiste apenas num conjunto de meacutetodos tais comopublic void checkPermission(Permission perm)
throws SecurityException
public void checkCreateClassLoader( )throws SecurityException
I Normalmente um thread soacute pode executar uma operaccedilatildeose todos os meacutetodos activos que invocou tiverempermissatildeo para a executar
I Tipicamente essa decisatildeo eacute baseada na origem do coacutedigoI Estes meacutetodos satildeo invocados por outros objectos quando
executam certas operaccedilotildeesI O Security Manager eacute um Reference Monitor
Security Manager (22)
I O SecurityManager natildeo eacute instalado por omissatildeoI A instalaccedilatildeo do SecurityManager pode ser feita
I Pelo interpretador (JVM)java -Djavasecuritymanager
I Pelo coacutedigoSystemsetSecurityManager(new SecurityManager())
I A poliacutetica imposta pelo SecurityManager pode serconfigurada atraveacutes dos ficheiros de especificaccedilatildeo daSecurityPolicy
I O coacutedigo do sistema invoca os meacutetodos checkXXX doSecurityManager se este estiver instalado
I Estes meacutetodos por sua vez invocam o meacutetodocheckPermission() do AccessController
Access Controller
I A partir de Java 12 ojavasecurityAccessController eacute a classe quede facto garante o cumprimento da poliacutetica de seguranccedila
I Por concepccedilatildeo eacute mais faacutecil flexiacutevel que oSecurityManager e estaacute sempre instalado (soacute static)
I Implementa uma poliacutetica razoavelmente restritiva que podeser usada na maioria dos casos
I Naturalmente pode invocar-se directamente da aplicaccedilatildeoos meacutetodos do AccessControllerFilePermission perm = new FilePermission(tmptestFile read)AccessControllercheckPermission(perm)
I Se a poliacutetica de seguranccedila implementada peloAccessController natildeo focircr adequada pode seradaptada criando subclasses dojavalangSecurityManager
I Estas subclasses devem invocar os meacutetodos doAccessController sempre que tal faccedila sentido
javarmiRMISecurityManager
I javarmiRMISecurityManager eacute uma sua subclassedo javalangSecurityManager
I Implementa exactamente os mesmos meacutetodosI O RMISecurityManager deve ser usado com RMI
sempre que haacute necessidade de transferir coacutedigo dumcomputador remoto
I O RMI class loader recusa-se a carregar qualquer classese natildeo houver um Security Manager
I O RMISecurityManager pode ser instalado de 2 modos
I Atraveacutes do coacutedigoSystemsetSecurityManager(new RMISecurityManager())
I Atraveacutes da linha de comandojava -Djavasecuritymanager=javarmiRMISecurityManager
Arquitectura de Seguranccedila em Java
I O Security Manager natildeo eacute a histoacuteria toda
Classrepository
Classverifier
Loadedclassobject
Java interpreter
Java program
Requestclass
Select appropriate loader
Loader forremoteclasses
Loader forlocal
classes
Classrepository
Remote siteLocal site
Tempo de Vida dum Objecto Remoto
I A vida dum objecto chega ao fim quando deixa de serreferenciado
I sem qualquer referecircncia para o objecto natildeo eacute possiacutevelaceder-lhe
I Para objectos locaisI o garbage collector da JVM automaticamente detecta
quando um objecto deixa de ser referenciado e liberta osrecursos
I quando a JVM termina todos os objectos locais terminamI Para objectos remotos
I as diferentes JVMs executam um algoritmo distribuiacutedo parafazer garbage collection
I quando uma JVM termina objectos remotos por elacriados podem natildeo terminar Por exemplo
I o RMIregistry manteacutem uma referecircncia para todos osobjectos nele registados
Passos no Desenvolvimento com Java RMI1 Concepccedilatildeo e implementaccedilatildeo de servidor e clientes
I Definiccedilatildeo da interface remota ie dos meacutetodos que podemser invocados remotamente
I Implementaccedilatildeo de objectos remotos os quais devemimplementar a interface remota definida
I Implementaccedilatildeo de clientes2 Compilaccedilatildeo do coacutedigo e geraccedilatildeo de stubs
I a compilaccedilatildeo do coacutedigo eacute feita usando javacI os stubs a usar pelo cliente podem ser gerados usando ormic a partir do ficheiro class da implementaccedilatildeo
rmic Echo_Impl
Nota A partir de Java 50 Java RMI suporta a geraccedilatildeodinacircmica de stubs
3 Disponibilizaccedilatildeo do coacutedigo por exemplo num servidorHTTP
I classes que precisem ser carregadas (downloaded)incluindo os stubs devem ser disponibilizadas num servidorHTTP
RMI e Uploaded Code
I Aplicaccedilotildees (clientes ou servidores) que podem transferircoacutedigo deveratildeo instalar um Security Manager import javarmipublic class Echo_Client public static void main(String[] args)
if(argslength = 2) Systemoutprintln(Usage java Echo_Client +
srv_hostname obj_name)return
SystemsetSecurityManager(new RMISecurityManager())try
I Se o coacutedigo do stub pode ser uploaded haacute que inicializar apropriedade javarmiservercodebase na aplicaccedilatildeoservidora pexjava -Djavarmiservercodebase=httpweb~pfsecho_server
I Atenccedilatildeo ao rmiregistry
Arquitectura de Java RMI
RMI Client
Web server
RMIregistry
RMI server
1 register object
3 return object reference
2 lookup object
4 request stub class
5 return stub class
6 remote invocation
7 return result
Sumaacuterio
RMIConceitoImplementaccedilatildeoExemplos
Java RMICaracteriacutesticasObjectos Remotos e Interfaces RemotasImplementaccedilatildeo de Java RMIArgumentos e serializaccedilatildeoTransferecircncia de coacutedigoLocalizaccedilatildeo de objectos remotosSeguranccedilaTempo de vida dum objecto remotoPassos no desenvolvimento de aplicaccedilotildeesTransferecircncia de coacutedigo
Leitura Adicional
I Capiacutetulo 10 de Tanenbaum e van Steen DistributedSystems 2nd Ed
I Secccedilatildeo 101 Architecture excepto Subsecccedilatildeo 1013I Secccedilatildeo 103 Communication excepto Subsecccedilatildeo 1035
I Java RMI Specification da SunI Java Security Overview da Sun Secccedilotildees 1 2 e 8I Security Policy in Java SE 6 da SunI Permissions in Java SE 6 da Sun
- RMI
-
- Conceito
- Implementaccedilatildeo
- Exemplos
-
- Java RMI
-
- Caracteriacutesticas
- Objectos Remotos e Interfaces Remotas
- Implementaccedilatildeo de Java RMI
- Argumentos e serializaccedilatildeo
- Transferecircncia de coacutedigo
- Localizaccedilatildeo de objectos remotos
- Seguranccedila
- Tempo de vida dum objecto remoto
- Passos no desenvolvimento de aplicaccedilotildees
- Transferecircncia de coacutedigo
-
- Leitura Adicional
-
Localizaccedilatildeo dum Objecto
I O acesso a um objecto remoto eacute feito usando uma referecircnciapara um proxy desse objecto
montanhaecho()
Problema como eacute que se obteacutem uma referecircncia remota ie para oproxy dum objecto remoto
I Tecnicamente atraveacutes do valor de retorno dum meacutetodo
Soluccedilatildeo semelhante ao portmapper de RPC
I Java RMI oferece um serviccedilo de nomes baacutesico ormiregistry
I O rmiregistry eacute um programa e tem que executar noscomputadores que disponibilizam objectos remotos
I O ldquoservidorrdquo regista o objecto com um nome (binds) normiregistry local
I O ldquoclienterdquo solicita uma referecircncia para um objecto remotoao rmiregistry no computador onde o objecto reside
O rmiregistry e a Interface Registry
I O rmiregistry eacute uma aplicaccedilatildeo que implementa ainterface Registryvoid rebind(String name Remote obj)void bind(String name Remote obj)void unbind(String name Remote obj)Remote lookup(String name)String []list()
I Se incorrectamente usado o rmiregistry pode impediro uso de classes ldquoimportadasrdquo
If you do start the rmiregistry and it can find your stubclasses in CLASSPATH it will not remember that theloaded stub class can be loaded from your serverrsquos codebase[] do Tutorial on-line da Sun sobre RMI
A classe Naming
I Permite aceder a objectos que implementam RegistryI Suporta os seguintes meacutetodos
void rebind(String name Remote obj)void bind(String name Remote obj)void unbind(String name Remote obj)Remote lookup(String name)String []list()
ondename eacute um URL sem o meacutetodo de acesso
computerNameportobjectNamesendo computerNameport a ldquolocalizaccedilatildeordquo do
rmiregistryI bind() difere de rebind() na medida em que assinala
uma excepccedilatildeo se name jaacute tiver sido registadoI O rmregistry natildeo eacute um servidor global
I O cliente tem que saber onde se encontra o objecto
Exemplo Registo e Localizaccedilatildeo do ObjectoI O servidor tem que registar o objecto remoto
Echo montanhatry
montanha = new Echo_Impl()Namingrebind(lsquolsquoalpesrsquorsquo montanha)
catch ( RemoteException e)
I O cliente tem que o localizar (em i01co2213)Echo montanhatry
montanha = Naminglookup(lsquolsquoi01co2213alpesrsquorsquo)
catch ( RemoteException e) Naminglookup() is RMI
Arquitectura de Java RMI
RMI Client
Web server
RMIregistry
RMI server
1 register object
3 return object reference
2 lookup object
4 request stub class
5 return stub class
6 remote invocation
7 return result
RMI e Seguranccedila
Problema Java RMI pode exigir a transferecircncia de coacutedigo(classes) de maacutequinas remotas
I este coacutedigo eacute uma potencial ameaccedila agrave seguranccedilaSoluccedilatildeo Usar um Security Manager
I um objecto que controla o acesso aos recursos locais
I Java 10 suportava um modecirclo de seguranccedila do tiposandbox
I Coacutedigo local natildeo tinha restriccedilotildees para aleacutem das impostaspelo SO
I Coacutedigo importado soacute podia aceder aos recursos (limitados)disponiacuteveis na sandbox
I A partir de Java 12 pode-se sujeitar todo o coacutedigoindependentemente de ser ou natildeo local a controlo deacesso sendo este determinado pela security policy emvigor
Poliacutetica de Seguranccedila (Security Policy) e Permissotildees
I A poliacutetica de seguranccedila define as permissotildees de coacutedigocom base na sua origem sendo configuraacutevel quer peloutilizador quer pelo administrador
I Cada permissatildeo especifica o tipo de acesso permitido aum determinado recurso tal como
I Lecircr ou escrever um ficheiro ou directoacuterioI Estabelecer uma conexatildeo para um determinado endereccedilo
IP e portoI Algumas operaccedilotildees sobre a proacutepria JVM requerem
permissotildeesI Substituir o ClassLoaderI Substituir o SecurityManagerI Alterar a poliacutetica de seguranccedila
Permissotildees
I Internamente permissotildees satildeo objectos PexI javaioFilePermission
I Uma permissatildeo tipicamente temNome que identifica o recurso a que se aplicaLista de acccedilotildees que especifica as operaccedilotildees permitidas
permissatildeo nome lista de acccedilotildeesjavaioFilePermission ldquousrlib-rdquo ldquoread executerdquojavanetSocketPermission ldquoabccom54321rdquo ldquoconnectrdquojavasecuritySecurityPermission ldquosetPolicyrdquojavalangRuntimePermission ldquocreateClassLoaderrdquojavalangRuntimePermission ldquosetSecurityManagerrdquo
I Uma poliacutetica de seguranccedila eacute um conjunto de permissotildeesque determinam que operaccedilotildees um segmento de coacutedigopode executar
I Naturalmente a poliacutetica de seguranccedila eacute representada porum objecto (javasecurityPolicy)
Inicializaccedilatildeo do javasecurityPolicy
I Na implementaccedilatildeo referecircncia este objecto pode serinicializado a partir de vaacuterios ficheiros de configuraccedilatildeo Poromissatildeo usa
I Um ficheiro de configuraccedilatildeo para todo o sistema$javahomelibsecurityjavapolicy
I Um ficheiro de configuraccedilatildeo por utilizador~javapolicy
I O ficheiro de configuraccedilatildeo das propriedades de seguranccedilapermite especificar ainda outros ficheiros de configuraccedilatildeo
$javahomelibsecurityjavasecurity
I O ficheiro com a poliacutetica de seguranccedila pode ainda serespecificado quando da invocaccedilatildeo da JVM
java -Djavasecuritypolicy=somefile I Se a propriedade policyallowSystemProperty o
permitir ndash pode ser activada no ficheiro de configuraccedilatildeodas propriedades de seguranccedila
Sintaxe dos Ficheiros de Poliacuteticas
I Consiste numa lista de elementos (entries)keystore eacute opcional (natildeo usaremos pelo menos para
jaacute)grant clausuacutela usada para especificar as permissotildees de
coacutedigo de acordo com algumas propriedades(consideraremos apenas a sua origem)
I Tem o seguinte formato (de facto omite regras)
grant [codebase ltURLgt] permission ltclass_namegt lttargetgt [ ltactiongt]
onde
codebase especifica a origem do coacutedigo
permission especifica uma permissatildeo podendo umelemento grant incluir vaacuterias permissotildees
I Pode ocorrer uma ou mais vezes
Sintaxe dos Ficheiros de Poliacuteticas Exemplos
grant permission javanetSocketPermission 1024-
connectacceptpermission javanetSocketPermission abccom
connectacceptpermission javaioFilePermission
homeannpublic_htmlclasses- readpermission javaioFilePermission
homejonespublic_htmlclasses- read
grant codeBase httppaginasfeuppt~ei77777classes permission javasecurityAllPermission
I policytool eacute uma aplicaccedilatildeo que faz parte do J2SDKque oferece um GUI para auxiliar a ediccedilatildeo de ficheiros depoliacuteticas
Security Manager (12)
I O Security Manager eacute um objecto que garante ocumprimento da poliacutetica de seguranccedila
I Consiste apenas num conjunto de meacutetodos tais comopublic void checkPermission(Permission perm)
throws SecurityException
public void checkCreateClassLoader( )throws SecurityException
I Normalmente um thread soacute pode executar uma operaccedilatildeose todos os meacutetodos activos que invocou tiverempermissatildeo para a executar
I Tipicamente essa decisatildeo eacute baseada na origem do coacutedigoI Estes meacutetodos satildeo invocados por outros objectos quando
executam certas operaccedilotildeesI O Security Manager eacute um Reference Monitor
Security Manager (22)
I O SecurityManager natildeo eacute instalado por omissatildeoI A instalaccedilatildeo do SecurityManager pode ser feita
I Pelo interpretador (JVM)java -Djavasecuritymanager
I Pelo coacutedigoSystemsetSecurityManager(new SecurityManager())
I A poliacutetica imposta pelo SecurityManager pode serconfigurada atraveacutes dos ficheiros de especificaccedilatildeo daSecurityPolicy
I O coacutedigo do sistema invoca os meacutetodos checkXXX doSecurityManager se este estiver instalado
I Estes meacutetodos por sua vez invocam o meacutetodocheckPermission() do AccessController
Access Controller
I A partir de Java 12 ojavasecurityAccessController eacute a classe quede facto garante o cumprimento da poliacutetica de seguranccedila
I Por concepccedilatildeo eacute mais faacutecil flexiacutevel que oSecurityManager e estaacute sempre instalado (soacute static)
I Implementa uma poliacutetica razoavelmente restritiva que podeser usada na maioria dos casos
I Naturalmente pode invocar-se directamente da aplicaccedilatildeoos meacutetodos do AccessControllerFilePermission perm = new FilePermission(tmptestFile read)AccessControllercheckPermission(perm)
I Se a poliacutetica de seguranccedila implementada peloAccessController natildeo focircr adequada pode seradaptada criando subclasses dojavalangSecurityManager
I Estas subclasses devem invocar os meacutetodos doAccessController sempre que tal faccedila sentido
javarmiRMISecurityManager
I javarmiRMISecurityManager eacute uma sua subclassedo javalangSecurityManager
I Implementa exactamente os mesmos meacutetodosI O RMISecurityManager deve ser usado com RMI
sempre que haacute necessidade de transferir coacutedigo dumcomputador remoto
I O RMI class loader recusa-se a carregar qualquer classese natildeo houver um Security Manager
I O RMISecurityManager pode ser instalado de 2 modos
I Atraveacutes do coacutedigoSystemsetSecurityManager(new RMISecurityManager())
I Atraveacutes da linha de comandojava -Djavasecuritymanager=javarmiRMISecurityManager
Arquitectura de Seguranccedila em Java
I O Security Manager natildeo eacute a histoacuteria toda
Classrepository
Classverifier
Loadedclassobject
Java interpreter
Java program
Requestclass
Select appropriate loader
Loader forremoteclasses
Loader forlocal
classes
Classrepository
Remote siteLocal site
Tempo de Vida dum Objecto Remoto
I A vida dum objecto chega ao fim quando deixa de serreferenciado
I sem qualquer referecircncia para o objecto natildeo eacute possiacutevelaceder-lhe
I Para objectos locaisI o garbage collector da JVM automaticamente detecta
quando um objecto deixa de ser referenciado e liberta osrecursos
I quando a JVM termina todos os objectos locais terminamI Para objectos remotos
I as diferentes JVMs executam um algoritmo distribuiacutedo parafazer garbage collection
I quando uma JVM termina objectos remotos por elacriados podem natildeo terminar Por exemplo
I o RMIregistry manteacutem uma referecircncia para todos osobjectos nele registados
Passos no Desenvolvimento com Java RMI1 Concepccedilatildeo e implementaccedilatildeo de servidor e clientes
I Definiccedilatildeo da interface remota ie dos meacutetodos que podemser invocados remotamente
I Implementaccedilatildeo de objectos remotos os quais devemimplementar a interface remota definida
I Implementaccedilatildeo de clientes2 Compilaccedilatildeo do coacutedigo e geraccedilatildeo de stubs
I a compilaccedilatildeo do coacutedigo eacute feita usando javacI os stubs a usar pelo cliente podem ser gerados usando ormic a partir do ficheiro class da implementaccedilatildeo
rmic Echo_Impl
Nota A partir de Java 50 Java RMI suporta a geraccedilatildeodinacircmica de stubs
3 Disponibilizaccedilatildeo do coacutedigo por exemplo num servidorHTTP
I classes que precisem ser carregadas (downloaded)incluindo os stubs devem ser disponibilizadas num servidorHTTP
RMI e Uploaded Code
I Aplicaccedilotildees (clientes ou servidores) que podem transferircoacutedigo deveratildeo instalar um Security Manager import javarmipublic class Echo_Client public static void main(String[] args)
if(argslength = 2) Systemoutprintln(Usage java Echo_Client +
srv_hostname obj_name)return
SystemsetSecurityManager(new RMISecurityManager())try
I Se o coacutedigo do stub pode ser uploaded haacute que inicializar apropriedade javarmiservercodebase na aplicaccedilatildeoservidora pexjava -Djavarmiservercodebase=httpweb~pfsecho_server
I Atenccedilatildeo ao rmiregistry
Arquitectura de Java RMI
RMI Client
Web server
RMIregistry
RMI server
1 register object
3 return object reference
2 lookup object
4 request stub class
5 return stub class
6 remote invocation
7 return result
Sumaacuterio
RMIConceitoImplementaccedilatildeoExemplos
Java RMICaracteriacutesticasObjectos Remotos e Interfaces RemotasImplementaccedilatildeo de Java RMIArgumentos e serializaccedilatildeoTransferecircncia de coacutedigoLocalizaccedilatildeo de objectos remotosSeguranccedilaTempo de vida dum objecto remotoPassos no desenvolvimento de aplicaccedilotildeesTransferecircncia de coacutedigo
Leitura Adicional
I Capiacutetulo 10 de Tanenbaum e van Steen DistributedSystems 2nd Ed
I Secccedilatildeo 101 Architecture excepto Subsecccedilatildeo 1013I Secccedilatildeo 103 Communication excepto Subsecccedilatildeo 1035
I Java RMI Specification da SunI Java Security Overview da Sun Secccedilotildees 1 2 e 8I Security Policy in Java SE 6 da SunI Permissions in Java SE 6 da Sun
- RMI
-
- Conceito
- Implementaccedilatildeo
- Exemplos
-
- Java RMI
-
- Caracteriacutesticas
- Objectos Remotos e Interfaces Remotas
- Implementaccedilatildeo de Java RMI
- Argumentos e serializaccedilatildeo
- Transferecircncia de coacutedigo
- Localizaccedilatildeo de objectos remotos
- Seguranccedila
- Tempo de vida dum objecto remoto
- Passos no desenvolvimento de aplicaccedilotildees
- Transferecircncia de coacutedigo
-
- Leitura Adicional
-
A classe Naming
I Permite aceder a objectos que implementam RegistryI Suporta os seguintes meacutetodos
void rebind(String name Remote obj)void bind(String name Remote obj)void unbind(String name Remote obj)Remote lookup(String name)String []list()
ondename eacute um URL sem o meacutetodo de acesso
computerNameportobjectNamesendo computerNameport a ldquolocalizaccedilatildeordquo do
rmiregistryI bind() difere de rebind() na medida em que assinala
uma excepccedilatildeo se name jaacute tiver sido registadoI O rmregistry natildeo eacute um servidor global
I O cliente tem que saber onde se encontra o objecto
Exemplo Registo e Localizaccedilatildeo do ObjectoI O servidor tem que registar o objecto remoto
Echo montanhatry
montanha = new Echo_Impl()Namingrebind(lsquolsquoalpesrsquorsquo montanha)
catch ( RemoteException e)
I O cliente tem que o localizar (em i01co2213)Echo montanhatry
montanha = Naminglookup(lsquolsquoi01co2213alpesrsquorsquo)
catch ( RemoteException e) Naminglookup() is RMI
Arquitectura de Java RMI
RMI Client
Web server
RMIregistry
RMI server
1 register object
3 return object reference
2 lookup object
4 request stub class
5 return stub class
6 remote invocation
7 return result
RMI e Seguranccedila
Problema Java RMI pode exigir a transferecircncia de coacutedigo(classes) de maacutequinas remotas
I este coacutedigo eacute uma potencial ameaccedila agrave seguranccedilaSoluccedilatildeo Usar um Security Manager
I um objecto que controla o acesso aos recursos locais
I Java 10 suportava um modecirclo de seguranccedila do tiposandbox
I Coacutedigo local natildeo tinha restriccedilotildees para aleacutem das impostaspelo SO
I Coacutedigo importado soacute podia aceder aos recursos (limitados)disponiacuteveis na sandbox
I A partir de Java 12 pode-se sujeitar todo o coacutedigoindependentemente de ser ou natildeo local a controlo deacesso sendo este determinado pela security policy emvigor
Poliacutetica de Seguranccedila (Security Policy) e Permissotildees
I A poliacutetica de seguranccedila define as permissotildees de coacutedigocom base na sua origem sendo configuraacutevel quer peloutilizador quer pelo administrador
I Cada permissatildeo especifica o tipo de acesso permitido aum determinado recurso tal como
I Lecircr ou escrever um ficheiro ou directoacuterioI Estabelecer uma conexatildeo para um determinado endereccedilo
IP e portoI Algumas operaccedilotildees sobre a proacutepria JVM requerem
permissotildeesI Substituir o ClassLoaderI Substituir o SecurityManagerI Alterar a poliacutetica de seguranccedila
Permissotildees
I Internamente permissotildees satildeo objectos PexI javaioFilePermission
I Uma permissatildeo tipicamente temNome que identifica o recurso a que se aplicaLista de acccedilotildees que especifica as operaccedilotildees permitidas
permissatildeo nome lista de acccedilotildeesjavaioFilePermission ldquousrlib-rdquo ldquoread executerdquojavanetSocketPermission ldquoabccom54321rdquo ldquoconnectrdquojavasecuritySecurityPermission ldquosetPolicyrdquojavalangRuntimePermission ldquocreateClassLoaderrdquojavalangRuntimePermission ldquosetSecurityManagerrdquo
I Uma poliacutetica de seguranccedila eacute um conjunto de permissotildeesque determinam que operaccedilotildees um segmento de coacutedigopode executar
I Naturalmente a poliacutetica de seguranccedila eacute representada porum objecto (javasecurityPolicy)
Inicializaccedilatildeo do javasecurityPolicy
I Na implementaccedilatildeo referecircncia este objecto pode serinicializado a partir de vaacuterios ficheiros de configuraccedilatildeo Poromissatildeo usa
I Um ficheiro de configuraccedilatildeo para todo o sistema$javahomelibsecurityjavapolicy
I Um ficheiro de configuraccedilatildeo por utilizador~javapolicy
I O ficheiro de configuraccedilatildeo das propriedades de seguranccedilapermite especificar ainda outros ficheiros de configuraccedilatildeo
$javahomelibsecurityjavasecurity
I O ficheiro com a poliacutetica de seguranccedila pode ainda serespecificado quando da invocaccedilatildeo da JVM
java -Djavasecuritypolicy=somefile I Se a propriedade policyallowSystemProperty o
permitir ndash pode ser activada no ficheiro de configuraccedilatildeodas propriedades de seguranccedila
Sintaxe dos Ficheiros de Poliacuteticas
I Consiste numa lista de elementos (entries)keystore eacute opcional (natildeo usaremos pelo menos para
jaacute)grant clausuacutela usada para especificar as permissotildees de
coacutedigo de acordo com algumas propriedades(consideraremos apenas a sua origem)
I Tem o seguinte formato (de facto omite regras)
grant [codebase ltURLgt] permission ltclass_namegt lttargetgt [ ltactiongt]
onde
codebase especifica a origem do coacutedigo
permission especifica uma permissatildeo podendo umelemento grant incluir vaacuterias permissotildees
I Pode ocorrer uma ou mais vezes
Sintaxe dos Ficheiros de Poliacuteticas Exemplos
grant permission javanetSocketPermission 1024-
connectacceptpermission javanetSocketPermission abccom
connectacceptpermission javaioFilePermission
homeannpublic_htmlclasses- readpermission javaioFilePermission
homejonespublic_htmlclasses- read
grant codeBase httppaginasfeuppt~ei77777classes permission javasecurityAllPermission
I policytool eacute uma aplicaccedilatildeo que faz parte do J2SDKque oferece um GUI para auxiliar a ediccedilatildeo de ficheiros depoliacuteticas
Security Manager (12)
I O Security Manager eacute um objecto que garante ocumprimento da poliacutetica de seguranccedila
I Consiste apenas num conjunto de meacutetodos tais comopublic void checkPermission(Permission perm)
throws SecurityException
public void checkCreateClassLoader( )throws SecurityException
I Normalmente um thread soacute pode executar uma operaccedilatildeose todos os meacutetodos activos que invocou tiverempermissatildeo para a executar
I Tipicamente essa decisatildeo eacute baseada na origem do coacutedigoI Estes meacutetodos satildeo invocados por outros objectos quando
executam certas operaccedilotildeesI O Security Manager eacute um Reference Monitor
Security Manager (22)
I O SecurityManager natildeo eacute instalado por omissatildeoI A instalaccedilatildeo do SecurityManager pode ser feita
I Pelo interpretador (JVM)java -Djavasecuritymanager
I Pelo coacutedigoSystemsetSecurityManager(new SecurityManager())
I A poliacutetica imposta pelo SecurityManager pode serconfigurada atraveacutes dos ficheiros de especificaccedilatildeo daSecurityPolicy
I O coacutedigo do sistema invoca os meacutetodos checkXXX doSecurityManager se este estiver instalado
I Estes meacutetodos por sua vez invocam o meacutetodocheckPermission() do AccessController
Access Controller
I A partir de Java 12 ojavasecurityAccessController eacute a classe quede facto garante o cumprimento da poliacutetica de seguranccedila
I Por concepccedilatildeo eacute mais faacutecil flexiacutevel que oSecurityManager e estaacute sempre instalado (soacute static)
I Implementa uma poliacutetica razoavelmente restritiva que podeser usada na maioria dos casos
I Naturalmente pode invocar-se directamente da aplicaccedilatildeoos meacutetodos do AccessControllerFilePermission perm = new FilePermission(tmptestFile read)AccessControllercheckPermission(perm)
I Se a poliacutetica de seguranccedila implementada peloAccessController natildeo focircr adequada pode seradaptada criando subclasses dojavalangSecurityManager
I Estas subclasses devem invocar os meacutetodos doAccessController sempre que tal faccedila sentido
javarmiRMISecurityManager
I javarmiRMISecurityManager eacute uma sua subclassedo javalangSecurityManager
I Implementa exactamente os mesmos meacutetodosI O RMISecurityManager deve ser usado com RMI
sempre que haacute necessidade de transferir coacutedigo dumcomputador remoto
I O RMI class loader recusa-se a carregar qualquer classese natildeo houver um Security Manager
I O RMISecurityManager pode ser instalado de 2 modos
I Atraveacutes do coacutedigoSystemsetSecurityManager(new RMISecurityManager())
I Atraveacutes da linha de comandojava -Djavasecuritymanager=javarmiRMISecurityManager
Arquitectura de Seguranccedila em Java
I O Security Manager natildeo eacute a histoacuteria toda
Classrepository
Classverifier
Loadedclassobject
Java interpreter
Java program
Requestclass
Select appropriate loader
Loader forremoteclasses
Loader forlocal
classes
Classrepository
Remote siteLocal site
Tempo de Vida dum Objecto Remoto
I A vida dum objecto chega ao fim quando deixa de serreferenciado
I sem qualquer referecircncia para o objecto natildeo eacute possiacutevelaceder-lhe
I Para objectos locaisI o garbage collector da JVM automaticamente detecta
quando um objecto deixa de ser referenciado e liberta osrecursos
I quando a JVM termina todos os objectos locais terminamI Para objectos remotos
I as diferentes JVMs executam um algoritmo distribuiacutedo parafazer garbage collection
I quando uma JVM termina objectos remotos por elacriados podem natildeo terminar Por exemplo
I o RMIregistry manteacutem uma referecircncia para todos osobjectos nele registados
Passos no Desenvolvimento com Java RMI1 Concepccedilatildeo e implementaccedilatildeo de servidor e clientes
I Definiccedilatildeo da interface remota ie dos meacutetodos que podemser invocados remotamente
I Implementaccedilatildeo de objectos remotos os quais devemimplementar a interface remota definida
I Implementaccedilatildeo de clientes2 Compilaccedilatildeo do coacutedigo e geraccedilatildeo de stubs
I a compilaccedilatildeo do coacutedigo eacute feita usando javacI os stubs a usar pelo cliente podem ser gerados usando ormic a partir do ficheiro class da implementaccedilatildeo
rmic Echo_Impl
Nota A partir de Java 50 Java RMI suporta a geraccedilatildeodinacircmica de stubs
3 Disponibilizaccedilatildeo do coacutedigo por exemplo num servidorHTTP
I classes que precisem ser carregadas (downloaded)incluindo os stubs devem ser disponibilizadas num servidorHTTP
RMI e Uploaded Code
I Aplicaccedilotildees (clientes ou servidores) que podem transferircoacutedigo deveratildeo instalar um Security Manager import javarmipublic class Echo_Client public static void main(String[] args)
if(argslength = 2) Systemoutprintln(Usage java Echo_Client +
srv_hostname obj_name)return
SystemsetSecurityManager(new RMISecurityManager())try
I Se o coacutedigo do stub pode ser uploaded haacute que inicializar apropriedade javarmiservercodebase na aplicaccedilatildeoservidora pexjava -Djavarmiservercodebase=httpweb~pfsecho_server
I Atenccedilatildeo ao rmiregistry
Arquitectura de Java RMI
RMI Client
Web server
RMIregistry
RMI server
1 register object
3 return object reference
2 lookup object
4 request stub class
5 return stub class
6 remote invocation
7 return result
Sumaacuterio
RMIConceitoImplementaccedilatildeoExemplos
Java RMICaracteriacutesticasObjectos Remotos e Interfaces RemotasImplementaccedilatildeo de Java RMIArgumentos e serializaccedilatildeoTransferecircncia de coacutedigoLocalizaccedilatildeo de objectos remotosSeguranccedilaTempo de vida dum objecto remotoPassos no desenvolvimento de aplicaccedilotildeesTransferecircncia de coacutedigo
Leitura Adicional
I Capiacutetulo 10 de Tanenbaum e van Steen DistributedSystems 2nd Ed
I Secccedilatildeo 101 Architecture excepto Subsecccedilatildeo 1013I Secccedilatildeo 103 Communication excepto Subsecccedilatildeo 1035
I Java RMI Specification da SunI Java Security Overview da Sun Secccedilotildees 1 2 e 8I Security Policy in Java SE 6 da SunI Permissions in Java SE 6 da Sun
- RMI
-
- Conceito
- Implementaccedilatildeo
- Exemplos
-
- Java RMI
-
- Caracteriacutesticas
- Objectos Remotos e Interfaces Remotas
- Implementaccedilatildeo de Java RMI
- Argumentos e serializaccedilatildeo
- Transferecircncia de coacutedigo
- Localizaccedilatildeo de objectos remotos
- Seguranccedila
- Tempo de vida dum objecto remoto
- Passos no desenvolvimento de aplicaccedilotildees
- Transferecircncia de coacutedigo
-
- Leitura Adicional
-
Arquitectura de Java RMI
RMI Client
Web server
RMIregistry
RMI server
1 register object
3 return object reference
2 lookup object
4 request stub class
5 return stub class
6 remote invocation
7 return result
RMI e Seguranccedila
Problema Java RMI pode exigir a transferecircncia de coacutedigo(classes) de maacutequinas remotas
I este coacutedigo eacute uma potencial ameaccedila agrave seguranccedilaSoluccedilatildeo Usar um Security Manager
I um objecto que controla o acesso aos recursos locais
I Java 10 suportava um modecirclo de seguranccedila do tiposandbox
I Coacutedigo local natildeo tinha restriccedilotildees para aleacutem das impostaspelo SO
I Coacutedigo importado soacute podia aceder aos recursos (limitados)disponiacuteveis na sandbox
I A partir de Java 12 pode-se sujeitar todo o coacutedigoindependentemente de ser ou natildeo local a controlo deacesso sendo este determinado pela security policy emvigor
Poliacutetica de Seguranccedila (Security Policy) e Permissotildees
I A poliacutetica de seguranccedila define as permissotildees de coacutedigocom base na sua origem sendo configuraacutevel quer peloutilizador quer pelo administrador
I Cada permissatildeo especifica o tipo de acesso permitido aum determinado recurso tal como
I Lecircr ou escrever um ficheiro ou directoacuterioI Estabelecer uma conexatildeo para um determinado endereccedilo
IP e portoI Algumas operaccedilotildees sobre a proacutepria JVM requerem
permissotildeesI Substituir o ClassLoaderI Substituir o SecurityManagerI Alterar a poliacutetica de seguranccedila
Permissotildees
I Internamente permissotildees satildeo objectos PexI javaioFilePermission
I Uma permissatildeo tipicamente temNome que identifica o recurso a que se aplicaLista de acccedilotildees que especifica as operaccedilotildees permitidas
permissatildeo nome lista de acccedilotildeesjavaioFilePermission ldquousrlib-rdquo ldquoread executerdquojavanetSocketPermission ldquoabccom54321rdquo ldquoconnectrdquojavasecuritySecurityPermission ldquosetPolicyrdquojavalangRuntimePermission ldquocreateClassLoaderrdquojavalangRuntimePermission ldquosetSecurityManagerrdquo
I Uma poliacutetica de seguranccedila eacute um conjunto de permissotildeesque determinam que operaccedilotildees um segmento de coacutedigopode executar
I Naturalmente a poliacutetica de seguranccedila eacute representada porum objecto (javasecurityPolicy)
Inicializaccedilatildeo do javasecurityPolicy
I Na implementaccedilatildeo referecircncia este objecto pode serinicializado a partir de vaacuterios ficheiros de configuraccedilatildeo Poromissatildeo usa
I Um ficheiro de configuraccedilatildeo para todo o sistema$javahomelibsecurityjavapolicy
I Um ficheiro de configuraccedilatildeo por utilizador~javapolicy
I O ficheiro de configuraccedilatildeo das propriedades de seguranccedilapermite especificar ainda outros ficheiros de configuraccedilatildeo
$javahomelibsecurityjavasecurity
I O ficheiro com a poliacutetica de seguranccedila pode ainda serespecificado quando da invocaccedilatildeo da JVM
java -Djavasecuritypolicy=somefile I Se a propriedade policyallowSystemProperty o
permitir ndash pode ser activada no ficheiro de configuraccedilatildeodas propriedades de seguranccedila
Sintaxe dos Ficheiros de Poliacuteticas
I Consiste numa lista de elementos (entries)keystore eacute opcional (natildeo usaremos pelo menos para
jaacute)grant clausuacutela usada para especificar as permissotildees de
coacutedigo de acordo com algumas propriedades(consideraremos apenas a sua origem)
I Tem o seguinte formato (de facto omite regras)
grant [codebase ltURLgt] permission ltclass_namegt lttargetgt [ ltactiongt]
onde
codebase especifica a origem do coacutedigo
permission especifica uma permissatildeo podendo umelemento grant incluir vaacuterias permissotildees
I Pode ocorrer uma ou mais vezes
Sintaxe dos Ficheiros de Poliacuteticas Exemplos
grant permission javanetSocketPermission 1024-
connectacceptpermission javanetSocketPermission abccom
connectacceptpermission javaioFilePermission
homeannpublic_htmlclasses- readpermission javaioFilePermission
homejonespublic_htmlclasses- read
grant codeBase httppaginasfeuppt~ei77777classes permission javasecurityAllPermission
I policytool eacute uma aplicaccedilatildeo que faz parte do J2SDKque oferece um GUI para auxiliar a ediccedilatildeo de ficheiros depoliacuteticas
Security Manager (12)
I O Security Manager eacute um objecto que garante ocumprimento da poliacutetica de seguranccedila
I Consiste apenas num conjunto de meacutetodos tais comopublic void checkPermission(Permission perm)
throws SecurityException
public void checkCreateClassLoader( )throws SecurityException
I Normalmente um thread soacute pode executar uma operaccedilatildeose todos os meacutetodos activos que invocou tiverempermissatildeo para a executar
I Tipicamente essa decisatildeo eacute baseada na origem do coacutedigoI Estes meacutetodos satildeo invocados por outros objectos quando
executam certas operaccedilotildeesI O Security Manager eacute um Reference Monitor
Security Manager (22)
I O SecurityManager natildeo eacute instalado por omissatildeoI A instalaccedilatildeo do SecurityManager pode ser feita
I Pelo interpretador (JVM)java -Djavasecuritymanager
I Pelo coacutedigoSystemsetSecurityManager(new SecurityManager())
I A poliacutetica imposta pelo SecurityManager pode serconfigurada atraveacutes dos ficheiros de especificaccedilatildeo daSecurityPolicy
I O coacutedigo do sistema invoca os meacutetodos checkXXX doSecurityManager se este estiver instalado
I Estes meacutetodos por sua vez invocam o meacutetodocheckPermission() do AccessController
Access Controller
I A partir de Java 12 ojavasecurityAccessController eacute a classe quede facto garante o cumprimento da poliacutetica de seguranccedila
I Por concepccedilatildeo eacute mais faacutecil flexiacutevel que oSecurityManager e estaacute sempre instalado (soacute static)
I Implementa uma poliacutetica razoavelmente restritiva que podeser usada na maioria dos casos
I Naturalmente pode invocar-se directamente da aplicaccedilatildeoos meacutetodos do AccessControllerFilePermission perm = new FilePermission(tmptestFile read)AccessControllercheckPermission(perm)
I Se a poliacutetica de seguranccedila implementada peloAccessController natildeo focircr adequada pode seradaptada criando subclasses dojavalangSecurityManager
I Estas subclasses devem invocar os meacutetodos doAccessController sempre que tal faccedila sentido
javarmiRMISecurityManager
I javarmiRMISecurityManager eacute uma sua subclassedo javalangSecurityManager
I Implementa exactamente os mesmos meacutetodosI O RMISecurityManager deve ser usado com RMI
sempre que haacute necessidade de transferir coacutedigo dumcomputador remoto
I O RMI class loader recusa-se a carregar qualquer classese natildeo houver um Security Manager
I O RMISecurityManager pode ser instalado de 2 modos
I Atraveacutes do coacutedigoSystemsetSecurityManager(new RMISecurityManager())
I Atraveacutes da linha de comandojava -Djavasecuritymanager=javarmiRMISecurityManager
Arquitectura de Seguranccedila em Java
I O Security Manager natildeo eacute a histoacuteria toda
Classrepository
Classverifier
Loadedclassobject
Java interpreter
Java program
Requestclass
Select appropriate loader
Loader forremoteclasses
Loader forlocal
classes
Classrepository
Remote siteLocal site
Tempo de Vida dum Objecto Remoto
I A vida dum objecto chega ao fim quando deixa de serreferenciado
I sem qualquer referecircncia para o objecto natildeo eacute possiacutevelaceder-lhe
I Para objectos locaisI o garbage collector da JVM automaticamente detecta
quando um objecto deixa de ser referenciado e liberta osrecursos
I quando a JVM termina todos os objectos locais terminamI Para objectos remotos
I as diferentes JVMs executam um algoritmo distribuiacutedo parafazer garbage collection
I quando uma JVM termina objectos remotos por elacriados podem natildeo terminar Por exemplo
I o RMIregistry manteacutem uma referecircncia para todos osobjectos nele registados
Passos no Desenvolvimento com Java RMI1 Concepccedilatildeo e implementaccedilatildeo de servidor e clientes
I Definiccedilatildeo da interface remota ie dos meacutetodos que podemser invocados remotamente
I Implementaccedilatildeo de objectos remotos os quais devemimplementar a interface remota definida
I Implementaccedilatildeo de clientes2 Compilaccedilatildeo do coacutedigo e geraccedilatildeo de stubs
I a compilaccedilatildeo do coacutedigo eacute feita usando javacI os stubs a usar pelo cliente podem ser gerados usando ormic a partir do ficheiro class da implementaccedilatildeo
rmic Echo_Impl
Nota A partir de Java 50 Java RMI suporta a geraccedilatildeodinacircmica de stubs
3 Disponibilizaccedilatildeo do coacutedigo por exemplo num servidorHTTP
I classes que precisem ser carregadas (downloaded)incluindo os stubs devem ser disponibilizadas num servidorHTTP
RMI e Uploaded Code
I Aplicaccedilotildees (clientes ou servidores) que podem transferircoacutedigo deveratildeo instalar um Security Manager import javarmipublic class Echo_Client public static void main(String[] args)
if(argslength = 2) Systemoutprintln(Usage java Echo_Client +
srv_hostname obj_name)return
SystemsetSecurityManager(new RMISecurityManager())try
I Se o coacutedigo do stub pode ser uploaded haacute que inicializar apropriedade javarmiservercodebase na aplicaccedilatildeoservidora pexjava -Djavarmiservercodebase=httpweb~pfsecho_server
I Atenccedilatildeo ao rmiregistry
Arquitectura de Java RMI
RMI Client
Web server
RMIregistry
RMI server
1 register object
3 return object reference
2 lookup object
4 request stub class
5 return stub class
6 remote invocation
7 return result
Sumaacuterio
RMIConceitoImplementaccedilatildeoExemplos
Java RMICaracteriacutesticasObjectos Remotos e Interfaces RemotasImplementaccedilatildeo de Java RMIArgumentos e serializaccedilatildeoTransferecircncia de coacutedigoLocalizaccedilatildeo de objectos remotosSeguranccedilaTempo de vida dum objecto remotoPassos no desenvolvimento de aplicaccedilotildeesTransferecircncia de coacutedigo
Leitura Adicional
I Capiacutetulo 10 de Tanenbaum e van Steen DistributedSystems 2nd Ed
I Secccedilatildeo 101 Architecture excepto Subsecccedilatildeo 1013I Secccedilatildeo 103 Communication excepto Subsecccedilatildeo 1035
I Java RMI Specification da SunI Java Security Overview da Sun Secccedilotildees 1 2 e 8I Security Policy in Java SE 6 da SunI Permissions in Java SE 6 da Sun
- RMI
-
- Conceito
- Implementaccedilatildeo
- Exemplos
-
- Java RMI
-
- Caracteriacutesticas
- Objectos Remotos e Interfaces Remotas
- Implementaccedilatildeo de Java RMI
- Argumentos e serializaccedilatildeo
- Transferecircncia de coacutedigo
- Localizaccedilatildeo de objectos remotos
- Seguranccedila
- Tempo de vida dum objecto remoto
- Passos no desenvolvimento de aplicaccedilotildees
- Transferecircncia de coacutedigo
-
- Leitura Adicional
-
Poliacutetica de Seguranccedila (Security Policy) e Permissotildees
I A poliacutetica de seguranccedila define as permissotildees de coacutedigocom base na sua origem sendo configuraacutevel quer peloutilizador quer pelo administrador
I Cada permissatildeo especifica o tipo de acesso permitido aum determinado recurso tal como
I Lecircr ou escrever um ficheiro ou directoacuterioI Estabelecer uma conexatildeo para um determinado endereccedilo
IP e portoI Algumas operaccedilotildees sobre a proacutepria JVM requerem
permissotildeesI Substituir o ClassLoaderI Substituir o SecurityManagerI Alterar a poliacutetica de seguranccedila
Permissotildees
I Internamente permissotildees satildeo objectos PexI javaioFilePermission
I Uma permissatildeo tipicamente temNome que identifica o recurso a que se aplicaLista de acccedilotildees que especifica as operaccedilotildees permitidas
permissatildeo nome lista de acccedilotildeesjavaioFilePermission ldquousrlib-rdquo ldquoread executerdquojavanetSocketPermission ldquoabccom54321rdquo ldquoconnectrdquojavasecuritySecurityPermission ldquosetPolicyrdquojavalangRuntimePermission ldquocreateClassLoaderrdquojavalangRuntimePermission ldquosetSecurityManagerrdquo
I Uma poliacutetica de seguranccedila eacute um conjunto de permissotildeesque determinam que operaccedilotildees um segmento de coacutedigopode executar
I Naturalmente a poliacutetica de seguranccedila eacute representada porum objecto (javasecurityPolicy)
Inicializaccedilatildeo do javasecurityPolicy
I Na implementaccedilatildeo referecircncia este objecto pode serinicializado a partir de vaacuterios ficheiros de configuraccedilatildeo Poromissatildeo usa
I Um ficheiro de configuraccedilatildeo para todo o sistema$javahomelibsecurityjavapolicy
I Um ficheiro de configuraccedilatildeo por utilizador~javapolicy
I O ficheiro de configuraccedilatildeo das propriedades de seguranccedilapermite especificar ainda outros ficheiros de configuraccedilatildeo
$javahomelibsecurityjavasecurity
I O ficheiro com a poliacutetica de seguranccedila pode ainda serespecificado quando da invocaccedilatildeo da JVM
java -Djavasecuritypolicy=somefile I Se a propriedade policyallowSystemProperty o
permitir ndash pode ser activada no ficheiro de configuraccedilatildeodas propriedades de seguranccedila
Sintaxe dos Ficheiros de Poliacuteticas
I Consiste numa lista de elementos (entries)keystore eacute opcional (natildeo usaremos pelo menos para
jaacute)grant clausuacutela usada para especificar as permissotildees de
coacutedigo de acordo com algumas propriedades(consideraremos apenas a sua origem)
I Tem o seguinte formato (de facto omite regras)
grant [codebase ltURLgt] permission ltclass_namegt lttargetgt [ ltactiongt]
onde
codebase especifica a origem do coacutedigo
permission especifica uma permissatildeo podendo umelemento grant incluir vaacuterias permissotildees
I Pode ocorrer uma ou mais vezes
Sintaxe dos Ficheiros de Poliacuteticas Exemplos
grant permission javanetSocketPermission 1024-
connectacceptpermission javanetSocketPermission abccom
connectacceptpermission javaioFilePermission
homeannpublic_htmlclasses- readpermission javaioFilePermission
homejonespublic_htmlclasses- read
grant codeBase httppaginasfeuppt~ei77777classes permission javasecurityAllPermission
I policytool eacute uma aplicaccedilatildeo que faz parte do J2SDKque oferece um GUI para auxiliar a ediccedilatildeo de ficheiros depoliacuteticas
Security Manager (12)
I O Security Manager eacute um objecto que garante ocumprimento da poliacutetica de seguranccedila
I Consiste apenas num conjunto de meacutetodos tais comopublic void checkPermission(Permission perm)
throws SecurityException
public void checkCreateClassLoader( )throws SecurityException
I Normalmente um thread soacute pode executar uma operaccedilatildeose todos os meacutetodos activos que invocou tiverempermissatildeo para a executar
I Tipicamente essa decisatildeo eacute baseada na origem do coacutedigoI Estes meacutetodos satildeo invocados por outros objectos quando
executam certas operaccedilotildeesI O Security Manager eacute um Reference Monitor
Security Manager (22)
I O SecurityManager natildeo eacute instalado por omissatildeoI A instalaccedilatildeo do SecurityManager pode ser feita
I Pelo interpretador (JVM)java -Djavasecuritymanager
I Pelo coacutedigoSystemsetSecurityManager(new SecurityManager())
I A poliacutetica imposta pelo SecurityManager pode serconfigurada atraveacutes dos ficheiros de especificaccedilatildeo daSecurityPolicy
I O coacutedigo do sistema invoca os meacutetodos checkXXX doSecurityManager se este estiver instalado
I Estes meacutetodos por sua vez invocam o meacutetodocheckPermission() do AccessController
Access Controller
I A partir de Java 12 ojavasecurityAccessController eacute a classe quede facto garante o cumprimento da poliacutetica de seguranccedila
I Por concepccedilatildeo eacute mais faacutecil flexiacutevel que oSecurityManager e estaacute sempre instalado (soacute static)
I Implementa uma poliacutetica razoavelmente restritiva que podeser usada na maioria dos casos
I Naturalmente pode invocar-se directamente da aplicaccedilatildeoos meacutetodos do AccessControllerFilePermission perm = new FilePermission(tmptestFile read)AccessControllercheckPermission(perm)
I Se a poliacutetica de seguranccedila implementada peloAccessController natildeo focircr adequada pode seradaptada criando subclasses dojavalangSecurityManager
I Estas subclasses devem invocar os meacutetodos doAccessController sempre que tal faccedila sentido
javarmiRMISecurityManager
I javarmiRMISecurityManager eacute uma sua subclassedo javalangSecurityManager
I Implementa exactamente os mesmos meacutetodosI O RMISecurityManager deve ser usado com RMI
sempre que haacute necessidade de transferir coacutedigo dumcomputador remoto
I O RMI class loader recusa-se a carregar qualquer classese natildeo houver um Security Manager
I O RMISecurityManager pode ser instalado de 2 modos
I Atraveacutes do coacutedigoSystemsetSecurityManager(new RMISecurityManager())
I Atraveacutes da linha de comandojava -Djavasecuritymanager=javarmiRMISecurityManager
Arquitectura de Seguranccedila em Java
I O Security Manager natildeo eacute a histoacuteria toda
Classrepository
Classverifier
Loadedclassobject
Java interpreter
Java program
Requestclass
Select appropriate loader
Loader forremoteclasses
Loader forlocal
classes
Classrepository
Remote siteLocal site
Tempo de Vida dum Objecto Remoto
I A vida dum objecto chega ao fim quando deixa de serreferenciado
I sem qualquer referecircncia para o objecto natildeo eacute possiacutevelaceder-lhe
I Para objectos locaisI o garbage collector da JVM automaticamente detecta
quando um objecto deixa de ser referenciado e liberta osrecursos
I quando a JVM termina todos os objectos locais terminamI Para objectos remotos
I as diferentes JVMs executam um algoritmo distribuiacutedo parafazer garbage collection
I quando uma JVM termina objectos remotos por elacriados podem natildeo terminar Por exemplo
I o RMIregistry manteacutem uma referecircncia para todos osobjectos nele registados
Passos no Desenvolvimento com Java RMI1 Concepccedilatildeo e implementaccedilatildeo de servidor e clientes
I Definiccedilatildeo da interface remota ie dos meacutetodos que podemser invocados remotamente
I Implementaccedilatildeo de objectos remotos os quais devemimplementar a interface remota definida
I Implementaccedilatildeo de clientes2 Compilaccedilatildeo do coacutedigo e geraccedilatildeo de stubs
I a compilaccedilatildeo do coacutedigo eacute feita usando javacI os stubs a usar pelo cliente podem ser gerados usando ormic a partir do ficheiro class da implementaccedilatildeo
rmic Echo_Impl
Nota A partir de Java 50 Java RMI suporta a geraccedilatildeodinacircmica de stubs
3 Disponibilizaccedilatildeo do coacutedigo por exemplo num servidorHTTP
I classes que precisem ser carregadas (downloaded)incluindo os stubs devem ser disponibilizadas num servidorHTTP
RMI e Uploaded Code
I Aplicaccedilotildees (clientes ou servidores) que podem transferircoacutedigo deveratildeo instalar um Security Manager import javarmipublic class Echo_Client public static void main(String[] args)
if(argslength = 2) Systemoutprintln(Usage java Echo_Client +
srv_hostname obj_name)return
SystemsetSecurityManager(new RMISecurityManager())try
I Se o coacutedigo do stub pode ser uploaded haacute que inicializar apropriedade javarmiservercodebase na aplicaccedilatildeoservidora pexjava -Djavarmiservercodebase=httpweb~pfsecho_server
I Atenccedilatildeo ao rmiregistry
Arquitectura de Java RMI
RMI Client
Web server
RMIregistry
RMI server
1 register object
3 return object reference
2 lookup object
4 request stub class
5 return stub class
6 remote invocation
7 return result
Sumaacuterio
RMIConceitoImplementaccedilatildeoExemplos
Java RMICaracteriacutesticasObjectos Remotos e Interfaces RemotasImplementaccedilatildeo de Java RMIArgumentos e serializaccedilatildeoTransferecircncia de coacutedigoLocalizaccedilatildeo de objectos remotosSeguranccedilaTempo de vida dum objecto remotoPassos no desenvolvimento de aplicaccedilotildeesTransferecircncia de coacutedigo
Leitura Adicional
I Capiacutetulo 10 de Tanenbaum e van Steen DistributedSystems 2nd Ed
I Secccedilatildeo 101 Architecture excepto Subsecccedilatildeo 1013I Secccedilatildeo 103 Communication excepto Subsecccedilatildeo 1035
I Java RMI Specification da SunI Java Security Overview da Sun Secccedilotildees 1 2 e 8I Security Policy in Java SE 6 da SunI Permissions in Java SE 6 da Sun
- RMI
-
- Conceito
- Implementaccedilatildeo
- Exemplos
-
- Java RMI
-
- Caracteriacutesticas
- Objectos Remotos e Interfaces Remotas
- Implementaccedilatildeo de Java RMI
- Argumentos e serializaccedilatildeo
- Transferecircncia de coacutedigo
- Localizaccedilatildeo de objectos remotos
- Seguranccedila
- Tempo de vida dum objecto remoto
- Passos no desenvolvimento de aplicaccedilotildees
- Transferecircncia de coacutedigo
-
- Leitura Adicional
-
Inicializaccedilatildeo do javasecurityPolicy
I Na implementaccedilatildeo referecircncia este objecto pode serinicializado a partir de vaacuterios ficheiros de configuraccedilatildeo Poromissatildeo usa
I Um ficheiro de configuraccedilatildeo para todo o sistema$javahomelibsecurityjavapolicy
I Um ficheiro de configuraccedilatildeo por utilizador~javapolicy
I O ficheiro de configuraccedilatildeo das propriedades de seguranccedilapermite especificar ainda outros ficheiros de configuraccedilatildeo
$javahomelibsecurityjavasecurity
I O ficheiro com a poliacutetica de seguranccedila pode ainda serespecificado quando da invocaccedilatildeo da JVM
java -Djavasecuritypolicy=somefile I Se a propriedade policyallowSystemProperty o
permitir ndash pode ser activada no ficheiro de configuraccedilatildeodas propriedades de seguranccedila
Sintaxe dos Ficheiros de Poliacuteticas
I Consiste numa lista de elementos (entries)keystore eacute opcional (natildeo usaremos pelo menos para
jaacute)grant clausuacutela usada para especificar as permissotildees de
coacutedigo de acordo com algumas propriedades(consideraremos apenas a sua origem)
I Tem o seguinte formato (de facto omite regras)
grant [codebase ltURLgt] permission ltclass_namegt lttargetgt [ ltactiongt]
onde
codebase especifica a origem do coacutedigo
permission especifica uma permissatildeo podendo umelemento grant incluir vaacuterias permissotildees
I Pode ocorrer uma ou mais vezes
Sintaxe dos Ficheiros de Poliacuteticas Exemplos
grant permission javanetSocketPermission 1024-
connectacceptpermission javanetSocketPermission abccom
connectacceptpermission javaioFilePermission
homeannpublic_htmlclasses- readpermission javaioFilePermission
homejonespublic_htmlclasses- read
grant codeBase httppaginasfeuppt~ei77777classes permission javasecurityAllPermission
I policytool eacute uma aplicaccedilatildeo que faz parte do J2SDKque oferece um GUI para auxiliar a ediccedilatildeo de ficheiros depoliacuteticas
Security Manager (12)
I O Security Manager eacute um objecto que garante ocumprimento da poliacutetica de seguranccedila
I Consiste apenas num conjunto de meacutetodos tais comopublic void checkPermission(Permission perm)
throws SecurityException
public void checkCreateClassLoader( )throws SecurityException
I Normalmente um thread soacute pode executar uma operaccedilatildeose todos os meacutetodos activos que invocou tiverempermissatildeo para a executar
I Tipicamente essa decisatildeo eacute baseada na origem do coacutedigoI Estes meacutetodos satildeo invocados por outros objectos quando
executam certas operaccedilotildeesI O Security Manager eacute um Reference Monitor
Security Manager (22)
I O SecurityManager natildeo eacute instalado por omissatildeoI A instalaccedilatildeo do SecurityManager pode ser feita
I Pelo interpretador (JVM)java -Djavasecuritymanager
I Pelo coacutedigoSystemsetSecurityManager(new SecurityManager())
I A poliacutetica imposta pelo SecurityManager pode serconfigurada atraveacutes dos ficheiros de especificaccedilatildeo daSecurityPolicy
I O coacutedigo do sistema invoca os meacutetodos checkXXX doSecurityManager se este estiver instalado
I Estes meacutetodos por sua vez invocam o meacutetodocheckPermission() do AccessController
Access Controller
I A partir de Java 12 ojavasecurityAccessController eacute a classe quede facto garante o cumprimento da poliacutetica de seguranccedila
I Por concepccedilatildeo eacute mais faacutecil flexiacutevel que oSecurityManager e estaacute sempre instalado (soacute static)
I Implementa uma poliacutetica razoavelmente restritiva que podeser usada na maioria dos casos
I Naturalmente pode invocar-se directamente da aplicaccedilatildeoos meacutetodos do AccessControllerFilePermission perm = new FilePermission(tmptestFile read)AccessControllercheckPermission(perm)
I Se a poliacutetica de seguranccedila implementada peloAccessController natildeo focircr adequada pode seradaptada criando subclasses dojavalangSecurityManager
I Estas subclasses devem invocar os meacutetodos doAccessController sempre que tal faccedila sentido
javarmiRMISecurityManager
I javarmiRMISecurityManager eacute uma sua subclassedo javalangSecurityManager
I Implementa exactamente os mesmos meacutetodosI O RMISecurityManager deve ser usado com RMI
sempre que haacute necessidade de transferir coacutedigo dumcomputador remoto
I O RMI class loader recusa-se a carregar qualquer classese natildeo houver um Security Manager
I O RMISecurityManager pode ser instalado de 2 modos
I Atraveacutes do coacutedigoSystemsetSecurityManager(new RMISecurityManager())
I Atraveacutes da linha de comandojava -Djavasecuritymanager=javarmiRMISecurityManager
Arquitectura de Seguranccedila em Java
I O Security Manager natildeo eacute a histoacuteria toda
Classrepository
Classverifier
Loadedclassobject
Java interpreter
Java program
Requestclass
Select appropriate loader
Loader forremoteclasses
Loader forlocal
classes
Classrepository
Remote siteLocal site
Tempo de Vida dum Objecto Remoto
I A vida dum objecto chega ao fim quando deixa de serreferenciado
I sem qualquer referecircncia para o objecto natildeo eacute possiacutevelaceder-lhe
I Para objectos locaisI o garbage collector da JVM automaticamente detecta
quando um objecto deixa de ser referenciado e liberta osrecursos
I quando a JVM termina todos os objectos locais terminamI Para objectos remotos
I as diferentes JVMs executam um algoritmo distribuiacutedo parafazer garbage collection
I quando uma JVM termina objectos remotos por elacriados podem natildeo terminar Por exemplo
I o RMIregistry manteacutem uma referecircncia para todos osobjectos nele registados
Passos no Desenvolvimento com Java RMI1 Concepccedilatildeo e implementaccedilatildeo de servidor e clientes
I Definiccedilatildeo da interface remota ie dos meacutetodos que podemser invocados remotamente
I Implementaccedilatildeo de objectos remotos os quais devemimplementar a interface remota definida
I Implementaccedilatildeo de clientes2 Compilaccedilatildeo do coacutedigo e geraccedilatildeo de stubs
I a compilaccedilatildeo do coacutedigo eacute feita usando javacI os stubs a usar pelo cliente podem ser gerados usando ormic a partir do ficheiro class da implementaccedilatildeo
rmic Echo_Impl
Nota A partir de Java 50 Java RMI suporta a geraccedilatildeodinacircmica de stubs
3 Disponibilizaccedilatildeo do coacutedigo por exemplo num servidorHTTP
I classes que precisem ser carregadas (downloaded)incluindo os stubs devem ser disponibilizadas num servidorHTTP
RMI e Uploaded Code
I Aplicaccedilotildees (clientes ou servidores) que podem transferircoacutedigo deveratildeo instalar um Security Manager import javarmipublic class Echo_Client public static void main(String[] args)
if(argslength = 2) Systemoutprintln(Usage java Echo_Client +
srv_hostname obj_name)return
SystemsetSecurityManager(new RMISecurityManager())try
I Se o coacutedigo do stub pode ser uploaded haacute que inicializar apropriedade javarmiservercodebase na aplicaccedilatildeoservidora pexjava -Djavarmiservercodebase=httpweb~pfsecho_server
I Atenccedilatildeo ao rmiregistry
Arquitectura de Java RMI
RMI Client
Web server
RMIregistry
RMI server
1 register object
3 return object reference
2 lookup object
4 request stub class
5 return stub class
6 remote invocation
7 return result
Sumaacuterio
RMIConceitoImplementaccedilatildeoExemplos
Java RMICaracteriacutesticasObjectos Remotos e Interfaces RemotasImplementaccedilatildeo de Java RMIArgumentos e serializaccedilatildeoTransferecircncia de coacutedigoLocalizaccedilatildeo de objectos remotosSeguranccedilaTempo de vida dum objecto remotoPassos no desenvolvimento de aplicaccedilotildeesTransferecircncia de coacutedigo
Leitura Adicional
I Capiacutetulo 10 de Tanenbaum e van Steen DistributedSystems 2nd Ed
I Secccedilatildeo 101 Architecture excepto Subsecccedilatildeo 1013I Secccedilatildeo 103 Communication excepto Subsecccedilatildeo 1035
I Java RMI Specification da SunI Java Security Overview da Sun Secccedilotildees 1 2 e 8I Security Policy in Java SE 6 da SunI Permissions in Java SE 6 da Sun
- RMI
-
- Conceito
- Implementaccedilatildeo
- Exemplos
-
- Java RMI
-
- Caracteriacutesticas
- Objectos Remotos e Interfaces Remotas
- Implementaccedilatildeo de Java RMI
- Argumentos e serializaccedilatildeo
- Transferecircncia de coacutedigo
- Localizaccedilatildeo de objectos remotos
- Seguranccedila
- Tempo de vida dum objecto remoto
- Passos no desenvolvimento de aplicaccedilotildees
- Transferecircncia de coacutedigo
-
- Leitura Adicional
-
Sintaxe dos Ficheiros de Poliacuteticas Exemplos
grant permission javanetSocketPermission 1024-
connectacceptpermission javanetSocketPermission abccom
connectacceptpermission javaioFilePermission
homeannpublic_htmlclasses- readpermission javaioFilePermission
homejonespublic_htmlclasses- read
grant codeBase httppaginasfeuppt~ei77777classes permission javasecurityAllPermission
I policytool eacute uma aplicaccedilatildeo que faz parte do J2SDKque oferece um GUI para auxiliar a ediccedilatildeo de ficheiros depoliacuteticas
Security Manager (12)
I O Security Manager eacute um objecto que garante ocumprimento da poliacutetica de seguranccedila
I Consiste apenas num conjunto de meacutetodos tais comopublic void checkPermission(Permission perm)
throws SecurityException
public void checkCreateClassLoader( )throws SecurityException
I Normalmente um thread soacute pode executar uma operaccedilatildeose todos os meacutetodos activos que invocou tiverempermissatildeo para a executar
I Tipicamente essa decisatildeo eacute baseada na origem do coacutedigoI Estes meacutetodos satildeo invocados por outros objectos quando
executam certas operaccedilotildeesI O Security Manager eacute um Reference Monitor
Security Manager (22)
I O SecurityManager natildeo eacute instalado por omissatildeoI A instalaccedilatildeo do SecurityManager pode ser feita
I Pelo interpretador (JVM)java -Djavasecuritymanager
I Pelo coacutedigoSystemsetSecurityManager(new SecurityManager())
I A poliacutetica imposta pelo SecurityManager pode serconfigurada atraveacutes dos ficheiros de especificaccedilatildeo daSecurityPolicy
I O coacutedigo do sistema invoca os meacutetodos checkXXX doSecurityManager se este estiver instalado
I Estes meacutetodos por sua vez invocam o meacutetodocheckPermission() do AccessController
Access Controller
I A partir de Java 12 ojavasecurityAccessController eacute a classe quede facto garante o cumprimento da poliacutetica de seguranccedila
I Por concepccedilatildeo eacute mais faacutecil flexiacutevel que oSecurityManager e estaacute sempre instalado (soacute static)
I Implementa uma poliacutetica razoavelmente restritiva que podeser usada na maioria dos casos
I Naturalmente pode invocar-se directamente da aplicaccedilatildeoos meacutetodos do AccessControllerFilePermission perm = new FilePermission(tmptestFile read)AccessControllercheckPermission(perm)
I Se a poliacutetica de seguranccedila implementada peloAccessController natildeo focircr adequada pode seradaptada criando subclasses dojavalangSecurityManager
I Estas subclasses devem invocar os meacutetodos doAccessController sempre que tal faccedila sentido
javarmiRMISecurityManager
I javarmiRMISecurityManager eacute uma sua subclassedo javalangSecurityManager
I Implementa exactamente os mesmos meacutetodosI O RMISecurityManager deve ser usado com RMI
sempre que haacute necessidade de transferir coacutedigo dumcomputador remoto
I O RMI class loader recusa-se a carregar qualquer classese natildeo houver um Security Manager
I O RMISecurityManager pode ser instalado de 2 modos
I Atraveacutes do coacutedigoSystemsetSecurityManager(new RMISecurityManager())
I Atraveacutes da linha de comandojava -Djavasecuritymanager=javarmiRMISecurityManager
Arquitectura de Seguranccedila em Java
I O Security Manager natildeo eacute a histoacuteria toda
Classrepository
Classverifier
Loadedclassobject
Java interpreter
Java program
Requestclass
Select appropriate loader
Loader forremoteclasses
Loader forlocal
classes
Classrepository
Remote siteLocal site
Tempo de Vida dum Objecto Remoto
I A vida dum objecto chega ao fim quando deixa de serreferenciado
I sem qualquer referecircncia para o objecto natildeo eacute possiacutevelaceder-lhe
I Para objectos locaisI o garbage collector da JVM automaticamente detecta
quando um objecto deixa de ser referenciado e liberta osrecursos
I quando a JVM termina todos os objectos locais terminamI Para objectos remotos
I as diferentes JVMs executam um algoritmo distribuiacutedo parafazer garbage collection
I quando uma JVM termina objectos remotos por elacriados podem natildeo terminar Por exemplo
I o RMIregistry manteacutem uma referecircncia para todos osobjectos nele registados
Passos no Desenvolvimento com Java RMI1 Concepccedilatildeo e implementaccedilatildeo de servidor e clientes
I Definiccedilatildeo da interface remota ie dos meacutetodos que podemser invocados remotamente
I Implementaccedilatildeo de objectos remotos os quais devemimplementar a interface remota definida
I Implementaccedilatildeo de clientes2 Compilaccedilatildeo do coacutedigo e geraccedilatildeo de stubs
I a compilaccedilatildeo do coacutedigo eacute feita usando javacI os stubs a usar pelo cliente podem ser gerados usando ormic a partir do ficheiro class da implementaccedilatildeo
rmic Echo_Impl
Nota A partir de Java 50 Java RMI suporta a geraccedilatildeodinacircmica de stubs
3 Disponibilizaccedilatildeo do coacutedigo por exemplo num servidorHTTP
I classes que precisem ser carregadas (downloaded)incluindo os stubs devem ser disponibilizadas num servidorHTTP
RMI e Uploaded Code
I Aplicaccedilotildees (clientes ou servidores) que podem transferircoacutedigo deveratildeo instalar um Security Manager import javarmipublic class Echo_Client public static void main(String[] args)
if(argslength = 2) Systemoutprintln(Usage java Echo_Client +
srv_hostname obj_name)return
SystemsetSecurityManager(new RMISecurityManager())try
I Se o coacutedigo do stub pode ser uploaded haacute que inicializar apropriedade javarmiservercodebase na aplicaccedilatildeoservidora pexjava -Djavarmiservercodebase=httpweb~pfsecho_server
I Atenccedilatildeo ao rmiregistry
Arquitectura de Java RMI
RMI Client
Web server
RMIregistry
RMI server
1 register object
3 return object reference
2 lookup object
4 request stub class
5 return stub class
6 remote invocation
7 return result
Sumaacuterio
RMIConceitoImplementaccedilatildeoExemplos
Java RMICaracteriacutesticasObjectos Remotos e Interfaces RemotasImplementaccedilatildeo de Java RMIArgumentos e serializaccedilatildeoTransferecircncia de coacutedigoLocalizaccedilatildeo de objectos remotosSeguranccedilaTempo de vida dum objecto remotoPassos no desenvolvimento de aplicaccedilotildeesTransferecircncia de coacutedigo
Leitura Adicional
I Capiacutetulo 10 de Tanenbaum e van Steen DistributedSystems 2nd Ed
I Secccedilatildeo 101 Architecture excepto Subsecccedilatildeo 1013I Secccedilatildeo 103 Communication excepto Subsecccedilatildeo 1035
I Java RMI Specification da SunI Java Security Overview da Sun Secccedilotildees 1 2 e 8I Security Policy in Java SE 6 da SunI Permissions in Java SE 6 da Sun
- RMI
-
- Conceito
- Implementaccedilatildeo
- Exemplos
-
- Java RMI
-
- Caracteriacutesticas
- Objectos Remotos e Interfaces Remotas
- Implementaccedilatildeo de Java RMI
- Argumentos e serializaccedilatildeo
- Transferecircncia de coacutedigo
- Localizaccedilatildeo de objectos remotos
- Seguranccedila
- Tempo de vida dum objecto remoto
- Passos no desenvolvimento de aplicaccedilotildees
- Transferecircncia de coacutedigo
-
- Leitura Adicional
-
Security Manager (22)
I O SecurityManager natildeo eacute instalado por omissatildeoI A instalaccedilatildeo do SecurityManager pode ser feita
I Pelo interpretador (JVM)java -Djavasecuritymanager
I Pelo coacutedigoSystemsetSecurityManager(new SecurityManager())
I A poliacutetica imposta pelo SecurityManager pode serconfigurada atraveacutes dos ficheiros de especificaccedilatildeo daSecurityPolicy
I O coacutedigo do sistema invoca os meacutetodos checkXXX doSecurityManager se este estiver instalado
I Estes meacutetodos por sua vez invocam o meacutetodocheckPermission() do AccessController
Access Controller
I A partir de Java 12 ojavasecurityAccessController eacute a classe quede facto garante o cumprimento da poliacutetica de seguranccedila
I Por concepccedilatildeo eacute mais faacutecil flexiacutevel que oSecurityManager e estaacute sempre instalado (soacute static)
I Implementa uma poliacutetica razoavelmente restritiva que podeser usada na maioria dos casos
I Naturalmente pode invocar-se directamente da aplicaccedilatildeoos meacutetodos do AccessControllerFilePermission perm = new FilePermission(tmptestFile read)AccessControllercheckPermission(perm)
I Se a poliacutetica de seguranccedila implementada peloAccessController natildeo focircr adequada pode seradaptada criando subclasses dojavalangSecurityManager
I Estas subclasses devem invocar os meacutetodos doAccessController sempre que tal faccedila sentido
javarmiRMISecurityManager
I javarmiRMISecurityManager eacute uma sua subclassedo javalangSecurityManager
I Implementa exactamente os mesmos meacutetodosI O RMISecurityManager deve ser usado com RMI
sempre que haacute necessidade de transferir coacutedigo dumcomputador remoto
I O RMI class loader recusa-se a carregar qualquer classese natildeo houver um Security Manager
I O RMISecurityManager pode ser instalado de 2 modos
I Atraveacutes do coacutedigoSystemsetSecurityManager(new RMISecurityManager())
I Atraveacutes da linha de comandojava -Djavasecuritymanager=javarmiRMISecurityManager
Arquitectura de Seguranccedila em Java
I O Security Manager natildeo eacute a histoacuteria toda
Classrepository
Classverifier
Loadedclassobject
Java interpreter
Java program
Requestclass
Select appropriate loader
Loader forremoteclasses
Loader forlocal
classes
Classrepository
Remote siteLocal site
Tempo de Vida dum Objecto Remoto
I A vida dum objecto chega ao fim quando deixa de serreferenciado
I sem qualquer referecircncia para o objecto natildeo eacute possiacutevelaceder-lhe
I Para objectos locaisI o garbage collector da JVM automaticamente detecta
quando um objecto deixa de ser referenciado e liberta osrecursos
I quando a JVM termina todos os objectos locais terminamI Para objectos remotos
I as diferentes JVMs executam um algoritmo distribuiacutedo parafazer garbage collection
I quando uma JVM termina objectos remotos por elacriados podem natildeo terminar Por exemplo
I o RMIregistry manteacutem uma referecircncia para todos osobjectos nele registados
Passos no Desenvolvimento com Java RMI1 Concepccedilatildeo e implementaccedilatildeo de servidor e clientes
I Definiccedilatildeo da interface remota ie dos meacutetodos que podemser invocados remotamente
I Implementaccedilatildeo de objectos remotos os quais devemimplementar a interface remota definida
I Implementaccedilatildeo de clientes2 Compilaccedilatildeo do coacutedigo e geraccedilatildeo de stubs
I a compilaccedilatildeo do coacutedigo eacute feita usando javacI os stubs a usar pelo cliente podem ser gerados usando ormic a partir do ficheiro class da implementaccedilatildeo
rmic Echo_Impl
Nota A partir de Java 50 Java RMI suporta a geraccedilatildeodinacircmica de stubs
3 Disponibilizaccedilatildeo do coacutedigo por exemplo num servidorHTTP
I classes que precisem ser carregadas (downloaded)incluindo os stubs devem ser disponibilizadas num servidorHTTP
RMI e Uploaded Code
I Aplicaccedilotildees (clientes ou servidores) que podem transferircoacutedigo deveratildeo instalar um Security Manager import javarmipublic class Echo_Client public static void main(String[] args)
if(argslength = 2) Systemoutprintln(Usage java Echo_Client +
srv_hostname obj_name)return
SystemsetSecurityManager(new RMISecurityManager())try
I Se o coacutedigo do stub pode ser uploaded haacute que inicializar apropriedade javarmiservercodebase na aplicaccedilatildeoservidora pexjava -Djavarmiservercodebase=httpweb~pfsecho_server
I Atenccedilatildeo ao rmiregistry
Arquitectura de Java RMI
RMI Client
Web server
RMIregistry
RMI server
1 register object
3 return object reference
2 lookup object
4 request stub class
5 return stub class
6 remote invocation
7 return result
Sumaacuterio
RMIConceitoImplementaccedilatildeoExemplos
Java RMICaracteriacutesticasObjectos Remotos e Interfaces RemotasImplementaccedilatildeo de Java RMIArgumentos e serializaccedilatildeoTransferecircncia de coacutedigoLocalizaccedilatildeo de objectos remotosSeguranccedilaTempo de vida dum objecto remotoPassos no desenvolvimento de aplicaccedilotildeesTransferecircncia de coacutedigo
Leitura Adicional
I Capiacutetulo 10 de Tanenbaum e van Steen DistributedSystems 2nd Ed
I Secccedilatildeo 101 Architecture excepto Subsecccedilatildeo 1013I Secccedilatildeo 103 Communication excepto Subsecccedilatildeo 1035
I Java RMI Specification da SunI Java Security Overview da Sun Secccedilotildees 1 2 e 8I Security Policy in Java SE 6 da SunI Permissions in Java SE 6 da Sun
- RMI
-
- Conceito
- Implementaccedilatildeo
- Exemplos
-
- Java RMI
-
- Caracteriacutesticas
- Objectos Remotos e Interfaces Remotas
- Implementaccedilatildeo de Java RMI
- Argumentos e serializaccedilatildeo
- Transferecircncia de coacutedigo
- Localizaccedilatildeo de objectos remotos
- Seguranccedila
- Tempo de vida dum objecto remoto
- Passos no desenvolvimento de aplicaccedilotildees
- Transferecircncia de coacutedigo
-
- Leitura Adicional
-
javarmiRMISecurityManager
I javarmiRMISecurityManager eacute uma sua subclassedo javalangSecurityManager
I Implementa exactamente os mesmos meacutetodosI O RMISecurityManager deve ser usado com RMI
sempre que haacute necessidade de transferir coacutedigo dumcomputador remoto
I O RMI class loader recusa-se a carregar qualquer classese natildeo houver um Security Manager
I O RMISecurityManager pode ser instalado de 2 modos
I Atraveacutes do coacutedigoSystemsetSecurityManager(new RMISecurityManager())
I Atraveacutes da linha de comandojava -Djavasecuritymanager=javarmiRMISecurityManager
Arquitectura de Seguranccedila em Java
I O Security Manager natildeo eacute a histoacuteria toda
Classrepository
Classverifier
Loadedclassobject
Java interpreter
Java program
Requestclass
Select appropriate loader
Loader forremoteclasses
Loader forlocal
classes
Classrepository
Remote siteLocal site
Tempo de Vida dum Objecto Remoto
I A vida dum objecto chega ao fim quando deixa de serreferenciado
I sem qualquer referecircncia para o objecto natildeo eacute possiacutevelaceder-lhe
I Para objectos locaisI o garbage collector da JVM automaticamente detecta
quando um objecto deixa de ser referenciado e liberta osrecursos
I quando a JVM termina todos os objectos locais terminamI Para objectos remotos
I as diferentes JVMs executam um algoritmo distribuiacutedo parafazer garbage collection
I quando uma JVM termina objectos remotos por elacriados podem natildeo terminar Por exemplo
I o RMIregistry manteacutem uma referecircncia para todos osobjectos nele registados
Passos no Desenvolvimento com Java RMI1 Concepccedilatildeo e implementaccedilatildeo de servidor e clientes
I Definiccedilatildeo da interface remota ie dos meacutetodos que podemser invocados remotamente
I Implementaccedilatildeo de objectos remotos os quais devemimplementar a interface remota definida
I Implementaccedilatildeo de clientes2 Compilaccedilatildeo do coacutedigo e geraccedilatildeo de stubs
I a compilaccedilatildeo do coacutedigo eacute feita usando javacI os stubs a usar pelo cliente podem ser gerados usando ormic a partir do ficheiro class da implementaccedilatildeo
rmic Echo_Impl
Nota A partir de Java 50 Java RMI suporta a geraccedilatildeodinacircmica de stubs
3 Disponibilizaccedilatildeo do coacutedigo por exemplo num servidorHTTP
I classes que precisem ser carregadas (downloaded)incluindo os stubs devem ser disponibilizadas num servidorHTTP
RMI e Uploaded Code
I Aplicaccedilotildees (clientes ou servidores) que podem transferircoacutedigo deveratildeo instalar um Security Manager import javarmipublic class Echo_Client public static void main(String[] args)
if(argslength = 2) Systemoutprintln(Usage java Echo_Client +
srv_hostname obj_name)return
SystemsetSecurityManager(new RMISecurityManager())try
I Se o coacutedigo do stub pode ser uploaded haacute que inicializar apropriedade javarmiservercodebase na aplicaccedilatildeoservidora pexjava -Djavarmiservercodebase=httpweb~pfsecho_server
I Atenccedilatildeo ao rmiregistry
Arquitectura de Java RMI
RMI Client
Web server
RMIregistry
RMI server
1 register object
3 return object reference
2 lookup object
4 request stub class
5 return stub class
6 remote invocation
7 return result
Sumaacuterio
RMIConceitoImplementaccedilatildeoExemplos
Java RMICaracteriacutesticasObjectos Remotos e Interfaces RemotasImplementaccedilatildeo de Java RMIArgumentos e serializaccedilatildeoTransferecircncia de coacutedigoLocalizaccedilatildeo de objectos remotosSeguranccedilaTempo de vida dum objecto remotoPassos no desenvolvimento de aplicaccedilotildeesTransferecircncia de coacutedigo
Leitura Adicional
I Capiacutetulo 10 de Tanenbaum e van Steen DistributedSystems 2nd Ed
I Secccedilatildeo 101 Architecture excepto Subsecccedilatildeo 1013I Secccedilatildeo 103 Communication excepto Subsecccedilatildeo 1035
I Java RMI Specification da SunI Java Security Overview da Sun Secccedilotildees 1 2 e 8I Security Policy in Java SE 6 da SunI Permissions in Java SE 6 da Sun
- RMI
-
- Conceito
- Implementaccedilatildeo
- Exemplos
-
- Java RMI
-
- Caracteriacutesticas
- Objectos Remotos e Interfaces Remotas
- Implementaccedilatildeo de Java RMI
- Argumentos e serializaccedilatildeo
- Transferecircncia de coacutedigo
- Localizaccedilatildeo de objectos remotos
- Seguranccedila
- Tempo de vida dum objecto remoto
- Passos no desenvolvimento de aplicaccedilotildees
- Transferecircncia de coacutedigo
-
- Leitura Adicional
-
Tempo de Vida dum Objecto Remoto
I A vida dum objecto chega ao fim quando deixa de serreferenciado
I sem qualquer referecircncia para o objecto natildeo eacute possiacutevelaceder-lhe
I Para objectos locaisI o garbage collector da JVM automaticamente detecta
quando um objecto deixa de ser referenciado e liberta osrecursos
I quando a JVM termina todos os objectos locais terminamI Para objectos remotos
I as diferentes JVMs executam um algoritmo distribuiacutedo parafazer garbage collection
I quando uma JVM termina objectos remotos por elacriados podem natildeo terminar Por exemplo
I o RMIregistry manteacutem uma referecircncia para todos osobjectos nele registados
Passos no Desenvolvimento com Java RMI1 Concepccedilatildeo e implementaccedilatildeo de servidor e clientes
I Definiccedilatildeo da interface remota ie dos meacutetodos que podemser invocados remotamente
I Implementaccedilatildeo de objectos remotos os quais devemimplementar a interface remota definida
I Implementaccedilatildeo de clientes2 Compilaccedilatildeo do coacutedigo e geraccedilatildeo de stubs
I a compilaccedilatildeo do coacutedigo eacute feita usando javacI os stubs a usar pelo cliente podem ser gerados usando ormic a partir do ficheiro class da implementaccedilatildeo
rmic Echo_Impl
Nota A partir de Java 50 Java RMI suporta a geraccedilatildeodinacircmica de stubs
3 Disponibilizaccedilatildeo do coacutedigo por exemplo num servidorHTTP
I classes que precisem ser carregadas (downloaded)incluindo os stubs devem ser disponibilizadas num servidorHTTP
RMI e Uploaded Code
I Aplicaccedilotildees (clientes ou servidores) que podem transferircoacutedigo deveratildeo instalar um Security Manager import javarmipublic class Echo_Client public static void main(String[] args)
if(argslength = 2) Systemoutprintln(Usage java Echo_Client +
srv_hostname obj_name)return
SystemsetSecurityManager(new RMISecurityManager())try
I Se o coacutedigo do stub pode ser uploaded haacute que inicializar apropriedade javarmiservercodebase na aplicaccedilatildeoservidora pexjava -Djavarmiservercodebase=httpweb~pfsecho_server
I Atenccedilatildeo ao rmiregistry
Arquitectura de Java RMI
RMI Client
Web server
RMIregistry
RMI server
1 register object
3 return object reference
2 lookup object
4 request stub class
5 return stub class
6 remote invocation
7 return result
Sumaacuterio
RMIConceitoImplementaccedilatildeoExemplos
Java RMICaracteriacutesticasObjectos Remotos e Interfaces RemotasImplementaccedilatildeo de Java RMIArgumentos e serializaccedilatildeoTransferecircncia de coacutedigoLocalizaccedilatildeo de objectos remotosSeguranccedilaTempo de vida dum objecto remotoPassos no desenvolvimento de aplicaccedilotildeesTransferecircncia de coacutedigo
Leitura Adicional
I Capiacutetulo 10 de Tanenbaum e van Steen DistributedSystems 2nd Ed
I Secccedilatildeo 101 Architecture excepto Subsecccedilatildeo 1013I Secccedilatildeo 103 Communication excepto Subsecccedilatildeo 1035
I Java RMI Specification da SunI Java Security Overview da Sun Secccedilotildees 1 2 e 8I Security Policy in Java SE 6 da SunI Permissions in Java SE 6 da Sun
- RMI
-
- Conceito
- Implementaccedilatildeo
- Exemplos
-
- Java RMI
-
- Caracteriacutesticas
- Objectos Remotos e Interfaces Remotas
- Implementaccedilatildeo de Java RMI
- Argumentos e serializaccedilatildeo
- Transferecircncia de coacutedigo
- Localizaccedilatildeo de objectos remotos
- Seguranccedila
- Tempo de vida dum objecto remoto
- Passos no desenvolvimento de aplicaccedilotildees
- Transferecircncia de coacutedigo
-
- Leitura Adicional
-
RMI e Uploaded Code
I Aplicaccedilotildees (clientes ou servidores) que podem transferircoacutedigo deveratildeo instalar um Security Manager import javarmipublic class Echo_Client public static void main(String[] args)
if(argslength = 2) Systemoutprintln(Usage java Echo_Client +
srv_hostname obj_name)return
SystemsetSecurityManager(new RMISecurityManager())try
I Se o coacutedigo do stub pode ser uploaded haacute que inicializar apropriedade javarmiservercodebase na aplicaccedilatildeoservidora pexjava -Djavarmiservercodebase=httpweb~pfsecho_server
I Atenccedilatildeo ao rmiregistry
Arquitectura de Java RMI
RMI Client
Web server
RMIregistry
RMI server
1 register object
3 return object reference
2 lookup object
4 request stub class
5 return stub class
6 remote invocation
7 return result
Sumaacuterio
RMIConceitoImplementaccedilatildeoExemplos
Java RMICaracteriacutesticasObjectos Remotos e Interfaces RemotasImplementaccedilatildeo de Java RMIArgumentos e serializaccedilatildeoTransferecircncia de coacutedigoLocalizaccedilatildeo de objectos remotosSeguranccedilaTempo de vida dum objecto remotoPassos no desenvolvimento de aplicaccedilotildeesTransferecircncia de coacutedigo
Leitura Adicional
I Capiacutetulo 10 de Tanenbaum e van Steen DistributedSystems 2nd Ed
I Secccedilatildeo 101 Architecture excepto Subsecccedilatildeo 1013I Secccedilatildeo 103 Communication excepto Subsecccedilatildeo 1035
I Java RMI Specification da SunI Java Security Overview da Sun Secccedilotildees 1 2 e 8I Security Policy in Java SE 6 da SunI Permissions in Java SE 6 da Sun
- RMI
-
- Conceito
- Implementaccedilatildeo
- Exemplos
-
- Java RMI
-
- Caracteriacutesticas
- Objectos Remotos e Interfaces Remotas
- Implementaccedilatildeo de Java RMI
- Argumentos e serializaccedilatildeo
- Transferecircncia de coacutedigo
- Localizaccedilatildeo de objectos remotos
- Seguranccedila
- Tempo de vida dum objecto remoto
- Passos no desenvolvimento de aplicaccedilotildees
- Transferecircncia de coacutedigo
-
- Leitura Adicional
-
Sumaacuterio
RMIConceitoImplementaccedilatildeoExemplos
Java RMICaracteriacutesticasObjectos Remotos e Interfaces RemotasImplementaccedilatildeo de Java RMIArgumentos e serializaccedilatildeoTransferecircncia de coacutedigoLocalizaccedilatildeo de objectos remotosSeguranccedilaTempo de vida dum objecto remotoPassos no desenvolvimento de aplicaccedilotildeesTransferecircncia de coacutedigo
Leitura Adicional
I Capiacutetulo 10 de Tanenbaum e van Steen DistributedSystems 2nd Ed
I Secccedilatildeo 101 Architecture excepto Subsecccedilatildeo 1013I Secccedilatildeo 103 Communication excepto Subsecccedilatildeo 1035
I Java RMI Specification da SunI Java Security Overview da Sun Secccedilotildees 1 2 e 8I Security Policy in Java SE 6 da SunI Permissions in Java SE 6 da Sun
- RMI
-
- Conceito
- Implementaccedilatildeo
- Exemplos
-
- Java RMI
-
- Caracteriacutesticas
- Objectos Remotos e Interfaces Remotas
- Implementaccedilatildeo de Java RMI
- Argumentos e serializaccedilatildeo
- Transferecircncia de coacutedigo
- Localizaccedilatildeo de objectos remotos
- Seguranccedila
- Tempo de vida dum objecto remoto
- Passos no desenvolvimento de aplicaccedilotildees
- Transferecircncia de coacutedigo
-
- Leitura Adicional
-