![]() |
|
|||||
Wenn ein Client einen entfernten Aufruf startet, sucht er die Stub-Klasse. Findet er die Klasse nicht in dem eigenen Namensraum, wird die Codebase hinzugezogen. Der Client wird dann die Stub-Klasse von der angegebenen URL anfordern. Der Server überträgt anschließend die Klassendatei zum RMI-Client. Die Stub-Klasse muss also dem Server bekannt sein, da er sie ja übertragen muss. Sollten die Klassen nur vom Server geladen werden und aus anderen, vielleicht dunklen Stellen des Dateisystems nicht, so ist die Eigenschaft java.rmi.useCodebaseOnly auf true zu setzen. 18.11.2 Sicherheitsmanager
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Beispiel Ein RMISecurityManager ist nichts anderes als ein SecurityManager. Sun könnte jedoch jederzeit die Implementierung ändern und spezielle Einschränkungen vorsehen.
public class RMISecurityManager extends SecurityManager { public RMISecurityManager() { } } |
Wenn wir folgende Zeile in unseren Servercode aufnehmen, wird RMI vom Klassenlader die Klassen laden können:
System.setSecurityManager( new RMISecurityManager() );
Erst der Sicherheitsmanager gibt uns das Recht zur Übertragung. Tragen wir ihn nicht ein, führt das zu einer Fehlermeldung der folgenden Art:
java.security.AccessControlException: access denied (java.net.SocketPermission 127.0.0.1:1099 connect,resolve)
Die Meldung zeigt an, dass die aktuellen Sicherheitsrichtlinien die Übertragung nicht zulassen. Häufig ist es so, dass die Java-Installationen Sicherheitsrichtlinien vorgeben, die sehr eingeschränkt sind.
Um die Richtlinien zu lockern, müssen wir eine Policy-Datei anlegen, die uns die Rechte zum Laden von Klassen gibt.
Beispiel Die folgende Datei rmi.policy vergibt alle Rechte.
grant { permission java.security.AllPermission; }; |
Der Sicherheitsmanager bindet nun eine Reihe dieser Policy-Dateien ein. Wollen wir zusätzliche Policies einbinden, so geben wir sie auf der Kommandozeile für den Java-Interpreter an.
$ java -Djava.security.manager -Djava.security.policy=rmi.policy MyClass
Die Option -D setzt Systemeigenschaften. Die Anweisung -Djava.security.manager hat den gleichen Effekt wie
System.setSecurityManager( new SecurityManager() );
Dies installiert einen Sicherheitsmanager, der dann die nachfolgende Policy behandelt. Sie ist als URL angegeben und in unserem Fall eine Datei im aktuellen Verzeichnis.
Beispiel In einem Verzeichnis befinden sich die Policy-Datei rmi.policy und die Klassen für RMI. Über die Systemeigenschaften lassen sich codebase und policy setzen.
String codebase = ">http://server/verzeichnis/RMI/"; System.setProperty( "java.rmi.server.codebase", codebase ); System.setProperty( "java.security.policy", codebase+"rmi.policy" ); System.setSecurityManager( new RMISecurityManager() ); |
| Tipp Die Sicherheitsrichtlinie sollte wohl überlegt erfolgen. Lädt der Server jeden Stub beziehungsweise Skeleton oder jede Klasse vom Client, hat er es natürlich leicht, Server-Funktionalität auszuführen. Schmuggelt er miesen Programmcode ein, kann dies großen Schaden anrichten, da der Server häufig über mehr Rechte als der Client verfügt. |
| << zurück |
Copyright (c) Galileo Press GmbH 2004
Für Ihren privaten Gebrauch dürfen Sie die Online-Version natürlich ausdrucken. Ansonsten unterliegt das <openbook> denselben Bestimmungen, wie die gebundene Ausgabe: Das Werk einschließlich aller seiner Teile ist urheberrechtlich geschützt. Alle Rechte vorbehalten einschließlich der Vervielfältigung, Übersetzung, Mikroverfilmung sowie Einspeicherung und Verarbeitung in elektronischen Systemen.