Hochschule Bremen JDK 1.x Java – Security - Modell Veranstaltung Security SS `99 Dozent Prof. Dr. Th. Risse Datum 18. Mai 1999 Autor Catrin Godau Semester I8I1 Security / Java-Sicherheit Catrin Godau Java – Sicherheitsmodelle ................................................................................................................... 3 ClassLoader ..................................................................................................................................... 5 Bytecode-Verifikation ....................................................................................................................... 5 Das neue Sicherheitsmodell des JDK 1.2 ........................................................................................... 6 Sicherheit in Applets ............................................................................................................................ 8 Appletviewer, Java-Plug-In .............................................................................................................. 9 Internet Explorer ............................................................................................................................... 9 Netscape Communicator .................................................................................................................. 9 Beispiel für die Nutzung des SecurityManager .................................................................................. 11 Mit dem JDK1.2 jar.exe ein neues Jar-File erstellen: .................................................................... 13 Mit dem JDK 1.2 keytool.exe eine neue .keystore - Datei erzeugen: ................................................ 14 Mit dem JDK1.2 jarsigner.exe aus der mit jar.exe erzeugten jar-Datei eine signierte jar-Datei erstellen:............................................................................................................................................. 17 Java – Sicherheits – Dateien / ........................................................................................................... 19 Policy - Datei ...................................................................................................................................... 20 Benutzung des Policy Tools: .......................................................................................................... 20 Listing des Beispiel-Applets ............................................................................................................... 24 Einbinden der signierten und unsignierten Applet-Klassen in eine HTML Seite, die auf irgendeiner WebPage verfügbar ist: ..................................................................................................................... 28 Quellen ............................................................................................................................................... 29 2 Java – Sicherheitsmodelle Einer der Aspekte, mit denen für Java als Programmiersprache geworben wird ist, daß Java eine „sichere“ Sprache sein soll. Das ist aufgrund der verteilten Natur von Java auch besonders wichtig, denn ohne ein gewisses Maß an Sicherheit würde sich wohl kein vernünftiger Anwender unbekannten Programmcode von einer Website herunterladen und auf dem eigenen Rechner laufen lassen. Ob eine Anwendung als bösartig angesehen wird, hängt primär davon ab, ob sie als Applikation oder als Applet läuft. Applikationen werden als sicher angesehen und haben volle Rechte, während Applets als nicht vertrauenswürdiger Code angesehen werden. Auf fast jeder Website laufen mittlerweile Java-Applets. Diese müssen vom Netz heruntergeladen und auf dem eigenen Rechner ausgeführt werden. Java stellt Mechanismen für solche Sicherheitsbelange zur Verfügung. Es werden verschiedene Sicherheitsstufen in den verschiedenen JDKVersionen bereitgestellt die vor sogenanntem bösartigem Code schützen sollen: Java-Programme können keine Zeiger auf den Arbeitsspeicher anlegen, oder Arrays über die Array- oder String- Grenzen hinaus lesen. Dadurch, daß der Zugriff auf den Speicher damit völlig unterbunden wird, wird ein großer Teil von Sicherheitsattacken vollständig unterbunden. Der Java-Interpreter führt bei jedem unbekannten Code eine Überprüfung des ByteCodes durch. Dadurch wird sichergestellt, daß der Code richtig geformt ist. D.h., daß der keine illegalen Byte-Codes enthält, oder einen Unterlauf des Stacks verursacht. Somit wird ausgeschlossen, daß Implementierungslücken des Interpreters ausgenutzt werden. Eine weiter Sicherheitsschicht stellt das sogenannte Sandbox-Modell dar. Der unbekannte Programmcode (Applet) wird quasi in einer Art Sandkasten plaziert, in dem er sicher „spielen“ kann, ohne der realen Welt (Ausführungs-Umgebung) Schaden zufügen zu können . In dieser Sandbox gelten eine Reihe von Einschränkungen: keinerlei Zugriff auf das lokale Dateisystem, kein Herstellen von Netzwerkverbindungen, etc. 3 Security / Java-Sicherheit Catrin Godau Die Security-Beschränkungen werden von der Java-Klasse SecurityManager umgesetzt. Alle Java-Kernklassen, die sensitive Operationen durchführen (Dateizugriff, 4 etc.) fragen zuerst den SecurityManager um Erlaubnis, ob die jeweils angeforderte Operation durchgeführt werden darf. Erfolgt ein solcher Aufruf direkt oder indirekt durch unbekannten Code, generiert der SecurityManager eine SecurityException und die Operation wird nicht erlaubt. Das Sicherheitsmodell des JDK 1.0.x wird noch vom Alles-oder-Nichts-Prinzip (Alle Rechte oder keine) geprägt. Es ist hier von der Laufzeitumgebung nur die Entscheidung zu fällen, ob ein heruntergeladenes Applet als vertrauenswürdig eingestuft wird oder nicht. Erscheint es vertrauenswürdig, bekommt es alle Rechte, wird es als nicht vertrauenswürdig eingestuft, bekommt es keinerlei Rechte. Ein feines granulierbares, individuell anpaßbares Sicherheitsmodell ist mit diesem SecurityManager nicht möglich. Ebenfalls unterliegt die Ausführung auf dem Host ausgeführten Codes nicht der Kontrolle dieses SecurityManagers. Das JDK 1.0x umfaßt aber bereits den Bytecode-Verifier und den Applet-Class-Loader. ClassLoader Ein weiterer wichtiger Bestandteil der Java-Sicherheit, ist die Art und Weise, wie Java Klassen über das Netzwerk lädt. Wie das geschieht, wird in der Klasse java.lang.ClassLoader definiert. Appletviewer und Browser legen Subklassen von dieser Klasse an, um zu definieren, wie Klassendateien über verschiedene Protokolle geladen werden dürfen. Eine der wichtigen Funktion des ClassLoaders besteht darin, sicherzustellen, daß die geladenen Klassen in einem anderen Namensraum liegen als die vom lokalen System geladenen Klassen. Auf diese Weise werden Namenskonflikte vermieden und gleichzeitig verhindert, daß ein böswilliges Applet Java-Standardklassen durch eigene Versionen ersetzt. Der ClassLoader ist ebenfalls dafür zuständig, das der über das Netzwerk geladene Bytecode an den Bytecode-Verifier zur Überprüfung übergeben wird. Bytecode-Verifikation Dieser Prozeß stellt sicher, daß der Code nicht die Namens- und Typumwandlungsbeschränkungen von Java verletzt. Er stellt ebenfalls sicher, daß der Code die folgenden Bedingungen erfüllt: Es muß sich um gültigen Code der Java Virtual Machine handeln,der keinen Über- Unterlauf des Stacks verursacht, Register nicht inkorrekt verwendet und keine illegalen Datenkonvertierungen durchführt. ... Ab dem JDK 1.1.x werden sogenannte signierte Applets eingeführt. Der Programmierer hat damit die Möglichkeit, seine Applets mit einer digitalen Signatur zu versehen, die dann vom Security-Manager überprüfbar ist. So kann die Herkunft des Codes kryptografisch gesichert und fälschungssicher bestimmt werden. Wenn man angibt, daß man einer bestimmten „Quelle“ (Person, Firma, etc.) vertraut, können die Applets dieser Quellen außerhalb der Sandbox-Umgebung ausgeführt werden. Applets mit einer solchen Signatur können damit die gleichen Rechte eingeräumt werden wie lokalen Applikationen, sofern die zugehörige digitale Unterschrift des Applets akzeptiert wurde. Appletts ohne digitale Unterschrift bleiben weiterhin in der Sandbox-Umgebung gefangen und haben keine lokalen Berechtigungen. Die Zuteilung der Rechte erfolgt im JDK 1.1 jedoch weiterhin binär, d.h. es können einem Applet entweder alle Rechte oder keine Rechte zugeteilt werden. Das hat sich ebenfalls als unflexibel und für die professionelle Praxis noch als unzureichend erwiesen. 5 Security / Java-Sicherheit Catrin Godau Das neue Sicherheitsmodell des JDK 1.2 Das neue Sicherheitsmodell des JDK 1.2 beruht auf sogenannten Policies. Ab dem JDK 1.2 können Applets entweder nach Herkunftsort (Codebase) oder nach Urheber (Signierer) differenzierte Rechte zugeteilt werden. Dadurch kann einem Applet der Zugriff auf eine bestimmte lokale Datei gewährt werden, während er einem anderen verwehrt wird. Dadurch können Rechte jetzt sehr gezielt vergeben werden. Diese Rechte werden in Policy-Dateien gespeichert. Das JDK 1.2 enthält eine sogenannte System-Policy-Datei (<JAVA_HOME>/jre/lib/security/java.policy)1, in der die Grundeinstellungen gespeichert sind. Jeder Benutzer hat die Möglichkeit eine eigene private Policy-Datei zu erstellen. Diese Datei muß im Home-Verzeichnis des Benutzers abgelegt werden. Die Policy-Datei kann mit jedem beliebigen ASCII-Editor geändert werden. Einfacher ist es aber, wenn das von Sun mitgelieferte Tool policytool verwendet wird. Damit lassen sich Policy-Dateien laden, verändern und an gewünschtem Ort abspeichern. Ebenfalls ist es nicht nötig die Syntax der Grant-Befehle zu kennen. Die Codebase wird durch eine URL, der Signierer durch den Alias in der lokalen Public-KeyDatenbank angegeben. Zwar konnte man schon immer Unterklassen des Security-Managers2 bilden und somit dessen Verhalten auf die eigenen Belange abändern. Diese Vorgehensweise besaß aber zwei Nachteile: Zum einen lag darin die Gefahr, potentielle Angriffspunkte nach Außen zu bieten, zum anderen implementierten die Browser-Hersteller eigene Security-Manager womit der Applet-Entwickler wieder in seine Schranken gewiesen wurde. Damit blieb das ursprüngliche Modell zu restriktiv für Applets und bot lokalen Applikationen viel zu großen Freiraum. Ab dem JDK 1.2 soll jede Klasse ihre eigenständigen Rechte besitzen. Auch die Verknüpfung lokaler Dateien mit Java-Klassen soll individuell möglich sein. Deshalb wurden sogenannte Protection-Domains eingeführt und die Funktionalität des ClassLoaders um einige Aufgaben erweitert. Über Protection-Domains kann ein Client ganz genau festlegen, welche Ressourcen einem Applet oder einer Applikation mit welchen Berechtigungen zur Verfügung stehen. Applets müssen also ihre Sicherheitsbestimmungen nicht mehr mitbringen (im Quellcode des Applets eincodiert), sondern laufen jetzt mit den Rechten, die vom lokalen Rechner bestimmt werden. Im neuen Sicherheitsmodell des JDK 1.2 gehört jede Klasse zu genau einer ProtectionDomain. Eine Protection-Domain kann von mehreren Klassen gleichzeitig genutzt werden. Damit können heruntergeladene Applets auf vorher definierte Ressourcen zugreifen; d.h, die Sandbox wird jetzt nach den lokal vergebenen Sicherheitsvorkehrungen geöffnet. Der Zugriff auf lokale Ressourcen kann damit auch für lokale Applikationen eingeschränkt werden. Dieser Sicherheits-Mechanismus wird vom Security-Class-Loader umgesetzt. Es ist nicht mehr der gesamte Bereich der JVM zugänglich, sondern nur eingeschränkte vom Security-Class-Loader freigegebene Bereiche. Die Elemente des eigentlichen Sicherheitsmechanismus werden jetzt außerhalb der JVM verwaltet. Protection-Domains werden in zwei Kategorien eingeteilt: System-Domains und Applikation-Domains. Zu den System-Domains gehöhren alle Systemressourcen wie FileIO, Maus, Keyboard oder Netzwerkzugriff. Zu den Applikation-Domains gehören alle spezifischen Ressourcen einer Applikation. In der Regel will eine Anwendung auf Ressourcen zugreifen, die zu beiden Kategorien gehören, weil an einer Ausführungseinheit des Java-Bytecodes typischerweise mehrere Klassen beteiligt sind, und so meistens auch mehr als eine Protection-Domain betroffen ist. Die Menge der jeweiligen Rechte beim Überqueren der Grenzen muß mit den vorgegebenen Berechtigungen übereinstimmen. Die Überwachung übernimmt das JRE. Eine Anwendung aus einem unkritischen Bereich darf nicht plötzlich über mehr Berechtigungen verfügen, nur weil der Aufrufer einer Methode über mehr Berechtigungen verfügt. Zu den neuen Security-Utilities des JDK 1.2 gehören die Programme policytool und keytool, sowie der jarsigner. Mit dem policytool-Utility können Sicherheitskriterien festgelegt werden. Es können damit die Dateien java.policy und java.security 1 2 Datei-Ausdruck im Anhang Beispiel im Anhang 6 editiert werden. Mit dem keytool-Utility lassen sich Zertifikate und Aliases verwalten. Dieses Utility arbeitet mit der Datei .keystore, die sich im Java-Home-Verzeichnis befindet. Diese Datei existiert erst nachdem sie mit diesem Utility erzeugt wurde. In der Datei befinden sich verschlüsselte Einträge eingerichteter Zertifikate mit zugehörigem Alias. Ein dort eingetragener Alias wird vom signedBy-Feld der Policy-Datei verwendet. Er repräsentiert dabei ein Objekt, das Code unterschreiben kann. Der jarsigner ist ein Utility, mit dem jar-Dateien signiert werden können. Dazu kommen Informationen aus dem .keystore-File zum Einsatz. Die Utilities jarsigner und keytool ersetzen das Utility des JDK 1.1 javakey. 7 Security / Java-Sicherheit Catrin Godau Sicherheit in Applets In HTML-Seiten eingebundene Applets werden vom Browser sofort aus dem Netz geladen und gestartet. Internet-Explorer und Netscape-Navigator bieten die Möglichkeit einzustellen, ob Applets im Browser ausgeführt werden dürfen oder nicht. Damit ist es aber nicht möglich bestimmte Sicherheitsrestriktionen zu vergeben. Vor der Ausführung des heruntergeladenen Bytecodes wird dieser zuerst durch den Bytecode-Verfier auf Sicherheitsrestriktionen überprüft und nur dann zur Ausführung freigegeben, wenn der Code korrekt ist. D.h., illegale Bytecodes werden gar nicht erst ausgeführt. Wenn der Bytecode vom Verfier als korrekt eingestuft wird, und es sich um einen sicherheitsrelevanten Befehl wie z.B. eine Dateioperation handelt, kommt der SecurityManager ins Spiel. Dieser überprüft zur Laufzeit alle sicherheitsrelevanten Operationen daraufhin, ob sie ausgeführt werden dürfen oder nicht. Der Security-Manager wird automatisch beim Start des Browsers bzw. Appletviewers gestartet und bleibt bis zur Beendigung aktiv. Wird innerhalb eines Applets einschließlich JDK 1.1 eine illegale Operation ausgeführt, löst das eine SecurityException aus. Ab JDK 1.2 wird eine AccessControlException ausgelöst. sicherheitsrelevante Operationen sind Dateizugriffe aller Art und Netzwerkoperationen. Die Restriktionen, die vom Security-Manager überwacht werden, unterscheiden sich zwischen Applets, die: in einem Browser mit einer integrierten Virtual Machine gestartet werden in einem Appletviewer oder über Java-Plug-In gestartet werden übers Netz geladen werden lokal geladen werden (auf der lokalen Platte und das Verzeichnis, in dem sich das Applet befindet muß im CLASSPATH eingetragen sein). In Verzeichnissen, die in der Umgebungsvariable CLASSPATH abgelegt sind, sollten nur verifizierte Klassen stehen, da sie gegenüber anderen Klassen erweiterte Zugriffsmöglichkeiten besitzen. Durch das name-space Konzept (Klassen werden beim Laden je nach Herkunftsort in name-spaces abgelegt) ist es möglich Klassen mit gleichen Namen zu laden. Befindet sich eine Klasse in einem name-space, der im CLASSPATH eingetragen ist, hat sie erweiterte Rechte. 8 Internet Explorer, Netscape Communicator, Appletviewer, Java-Plug-In Werden keine Einstellungen vorgenommen, gelten für diese Appletbetrachter folgende Restriktionen: Applets dürfen nicht auf lokale Dateien zugreifen Applets dürfen nur zu dem Rechner Netzwerkverbindungen aufnehmen, von dem sie geladen wurden. Appletviewer, Java-Plug-In Das vom JDK 1.2 eingeführte Sicherheitsmodell wird bisher nur vom Appletviewer und Java-Plug-In implementiert, noch nicht von den Browsern! Internet Explorer Im Internet Explorer 4.0 können die Rechte relativ flexibel eingestellt werden: lokale Applets (müssen sich im CLASSPATH befinden) haben prinzipiell die gleichen Rechte wie Applikationen. Die Seiten, die der Internet Explorer übers Netz lädt, werden, abhängig vom Herkunftsort, in eine von vier Zonen eingeteilt. Jeder Zone können eigene JavaEinstellungen zugeordnet werden. Applets können so in unterschieldlichen Zonen mit unterschhiedlichen Rechten ausgeführt werden. Signierten Applets können wiederum andere Rechte zugeordnet werden als nichtsignierten Applets, auch wenn sie nicht aus der selben Zone stammen. Netscape Communicator Das Sicherheitsmodell des Netscape Communicators weicht von den bisher beschrieben ab. Soll ein Applet mit erweiterten Rechten ausgeführt werden, müssen in jedem Fall Änderungen am Quellcode vorgenommen werden. Netscape hat für diesen Zweck die Capabilities API entwickelt. Ein Applet, das eine sicherheitsrelevante Operation durchführen will, muß diese Operation zunächst angefordert werden. Dies geschieht über die Methode enablePrivilege() der Klasse netscape.security.PrivilegeManager. Diese Klasse ist im JDK 1.2 nicht 9 Security / Java-Sicherheit Catrin Godau enthalten und muß gesondert von Netscape angefordert werden (download). Die Anforderung eines solchen Rechts sieht könnte im Quellcode folgendermaßen aussehen: PrivilegeManager.enablePrivilege(„UniversalPropertyRead“); Als Parameter dienen die sogenannten System Targets. Beim Aufruf von enablePrivilege() erscheint dem Benutzer ein Meldungsdialog, in dem er darüber informiert wird, welche Operation das Applet durchführen will. Der Benutzer kann darufhin die Aktion erlauebn oder verbieten. Wird die Operation erlaubt, hat das Applet solange das angeforderte Recht, bis die Methode, in der der Aufruf stattfand beendet ist. Sollen Applets in unterschiedlichen Browsern laufen, müssen auf Server-Seite verschiedene Applet-Versionen bereitgestellt werden, mit enablePrivilege()-Aufrufen und ohne. 10 Beispiel für die Nutzung des SecurityManager public class SecurityManagerDemo { public static void main(String args[]) { // Setzen des SecurityManagers System.setSecurityManager(new IOSecurityManager()); // Verweis auf Datei anlegen File f = new File("/tmp/test.dat"); try { // Versuch, in die Datei zu schreiben FileOutputStream out = new FileOutputStream(f); } catch (IOException e) { e.printStackTrace(); } } } class IOSecurityManager extends SecurityManager { public void checkPropertyAccess(String key) { // Abfrage von Dateipfad-Trennungszeichen erlauben if ( ! key.equals("file.separator") && (! key.equals("path.separator"))) throw new SecurityException("Property not allowed"); } public void checkRead(String file) { // Nur Lesen von '/tmp/test.dat' erlaubt 11 Security / Java-Sicherheit Catrin Godau if (! file.equals("/tmp/test.dat")) throw new SecurityException("you mustn't open this file"); } public void checkDelete(String file) { // Es darf keine Datei geläscht werden throw new SecurityException("you mustn't delete files"); } public void checkWrite(String file) { // Es darf in keine Datei geschrieben werden throw new SecurityException("you mustn't write files"); } } 12 Mit dem JDK1.2 jar.exe ein neues Jar-File erstellen: C:\jdk1.2\bin> jar Usage: jar {ctxu}[vfm0M] [jar-file] [manifest-file] [-C dir] files ... Options: -c create new archive -t list table of contents for archive -x extract named (or all) files from archive -u update existing archive -v generate verbose output on standard output -f specify archive file name -m include manifest information from specified manifest file -0 store only; use no ZIP compression -M Do not create a manifest file for the entries -C change to the specified directory and include the following file Aufruf im MS-DOS-Fenster, um aus den Dateien SystemInfo.class und LabelField.class eine .jar-Datei zu erzeugen: C:\jdk1.2\bin> jar cvf c:\catrin\security\test\sysinf.jar c:\catrin\security\test\SystemInfo.class c:\catrin\security\test\LabelField.class added manifest adding: c:/catrin/security/test/SystemInfo.class (in=3132) (out=1561) (deflated 50%) adding: c:/catrin/security/test/LabelField.class (in=1246) (out=713) (deflated 42%) Die Datei sysinf.jar wurde im Verzeichnis c:\catrin\security\test\ erzeugt! 13 Security / Java-Sicherheit Catrin Godau Mit dem JDK 1.2 keytool.exe eine neue .keystore - Datei erzeugen: C:\jdk1.2\bin> keytool keytool usage: -certreq [-v] [-alias <alias>] [-sigalg <sigalg>] [-file <csr_file>] [-keypass <keypass>] [-keystore <keystore>] [-storepass <storepass>] [-storetype <storetype>] -delete [-v] -alias <alias> [-keystore <keystore>] [-storepass <storepass>] [-storetype <storetype>] -export [-v] [-rfc] [-alias <alias>] [-file <cert_file>] [-keystore <keystore>] [-storepass <storepass>] [-storetype <storetype>] -genkey [-v] [-alias <alias>] [-keyalg <keyalg>] [-keysize <keysize>] [-sigalg <sigalg>] [-dname <dname>] [-validity <valDays>] [-keypass <keypass>] [-keystore <keystore>] [-storepass <storepass>] [-storetype <storetype>] -help -identitydb [-v] [-file <idb_file>] [-keystore <keystore>] [-storepass <storepass>] [-storetype <storetype>] -import [-v] [-noprompt] [-trustcacerts] [-alias <alias>] [-file <cert_file>] [-keypass <keypass>] [-keystore <keystore>] [-storepass <storepass>] [-storetype <storetype>] -keyclone [-v] [-alias <alias>] -dest <dest_alias> [-keypass <keypass>] [-new <new_keypass>] [-keystore <keystore>] [-storepass <storepass>] [-storetype <storetype>] -keypasswd [-v] [-alias <alias>] 14 [-keypass <old_keypass>] [-new <new_keypass>] [-keystore <keystore>] [-storepass <storepass>] [-storetype <storetype>] -list [-v | -rfc] [-alias <alias>] [-keystore <keystore>] [-storepass <storepass>] [-storetype <storetype>] -printcert [-v] [-file <cert_file>] -selfcert [-v] [-alias <alias>] [-sigalg <sigalg>] [-dname <dname>] [-validity <valDays>] [-keypass <keypass>] [-keystore <keystore>] [-storepass <storepass>] [-storetype <storetype>] -storepasswd [-v] [-new <new_storepass>] [-keystore <keystore>] [-storepass <storepass>] [-storetype <storetype>] Aufruf: C:\jdk1.2\bin> keytool -genkey -alias catrin -keypass catrin keystore c:\catrin\security\test\.catrinskeystore -storepass catrinspass What is your first and last name? [Unknown]: catrin What is the name of your organizational unit? [Unknown]: xxx What is the name of your organization? [Unknown]: yyy What is the name of your City or Locality? [Unknown]: bremen What is the name of your State or Province? [Unknown]: germany What is the two-letter country code for this unit? [Unknown]: de Is <CN=catrin, OU=xxx, O=yyy, L=bremen, ST=germany, C=de> correct? [no]: yes 15 Security / Java-Sicherheit Catrin Godau Die Datei .catrinskeystore wurde im Verzeichnis c:\catrin\security\test\ erzeugt. Durch den Aufruf: C:\jdk1.2\bin>keytool -genkey -alias tom -keypass tomnoah keystore c:\catrin\security\test\.catrinskeystore -storepass catrinspass What is your first and last name? [Unknown]: tom What is the name of your organizational unit? [Unknown]: kk What is the name of your organization? [Unknown]: ll What is the name of your City or Locality? [Unknown]: bremen What is the name of your State or Province? [Unknown]: germany What is the two-letter country code for this unit? [Unknown]: de Is <CN=tom, OU=kk, O=ll, L=bremen, ST=germany, C=de> correct? [no]: yes kann ein zusätzlicher Alias in der vorher angelegten Datei .catrinskeystore erzeugt werden. 16 Mit dem JDK1.2 jarsigner.exe aus der mit jar.exe erzeugten jar-Datei eine signierte jar-Datei erstellen: C:\jdk1.2\bin>jarsigner Usage: jarsigner [options] jar-file alias jarsigner -verify [options] jar-file [-keystore <url>] keystore location [-storepass <password>] [-storetype <type>] keystore type [-keypass <password>] [-sigfile <file>] [-signedjar <file>] [-verify] [-verbose] [-certs] [-internalsf] [-sectionsonly] password for keystore integrity password for private key (if different) name of .SF/.DSA file name of signed JAR file verify a signed JAR file verbose output when signing/verifying display certificates when verbose and verifying include the .SF file inside the signature block don't compute hash of entire manifest Aufruf: C:\jdk1.2\bin> C:\jdk1.2\bin>jarsigner -keystore c:\catrin\security\test\.catrinskeystore -storepass catrinspass signedjar c:\catrin\security\test\sysinfsignedcatrin.jar c:\catrin\security\test\sysinf.jar catrin Enter key password for catrin: catrin C:\jdk1.2\bin>jarsigner -keystore c:\catrin\security\test\.catrinskeystore -storepass catrinspass signedjar c:\catrin\security\test\sysinfsignedtom.jar c:\catrin\security\test\sysinf.jar tom Enter key password for tom: tomnoah Die Dateien sysinfsignedcatrin.jar und sysinfsignedtom.jar wurden im Verzeichnis c:\catrin\security\test\ erzeugt. 17 Security / Java-Sicherheit Catrin Godau 18 Java – Sicherheits – Dateien / Die Security – Datei (c:\catrin\security\test\java.security) muß im Verzeichnis {java.home}/lib/security/ oder {user.home}/ stehen. security.provider.1=sun.security.provider.Sun policy.provider=sun.security.provider.PolicyFile policy.url.1=file:${java.home}/lib/security/java.policy policy.url.2=file:${user.home}/.java.policy policy.url.3=file:$c:\catrin\security\test\java.policy policy.expandProperties=true policy.allowSystemProperty=true policy.ignoreIdentityScope=false keystore.type=jks system.scope=sun.security.provider.IdentityDatabase package.access=sun. 19 Security / Java-Sicherheit Catrin Godau Policy - Datei Benutzung des Policy Tools: 20 21 Security / Java-Sicherheit Catrin Godau 22 Policy – Datei (c:\catrin\security\test\java.policy) /* AUTOMATICALLY GENERATED ON Fri Jul 16 14:47:29 GMT+02:00 1999*/ /* DO NOT EDIT */ keystore "c:\catrin\security\test\.catrinskeystore"; grant codeBase "file:${java.home}/lib/ext/-" { permission java.security.AllPermission; }; grant { permission java.lang.RuntimePermission "stopThread"; permission java.net.SocketPermission "localhost:1024-", "listen"; permission java.util.PropertyPermission "java.version", "read"; permission java.util.PropertyPermission "java.vendor", "read"; permission java.util.PropertyPermission "java.vendor.url", "read"; permission java.util.PropertyPermission "java.class.version", "read"; permission java.util.PropertyPermission "os.name", "read"; permission java.util.PropertyPermission "os.version", "read"; permission java.util.PropertyPermission "os.arch", "read"; permission java.util.PropertyPermission "file.separator", "read"; permission java.util.PropertyPermission "path.separator", "read"; permission java.util.PropertyPermission "line.separator", "read"; permission java.util.PropertyPermission "java.specification.version", "read"; permission java.util.PropertyPermission "java.specification.vendor", "read"; permission java.util.PropertyPermission "java.specification.name", "read"; permission java.util.PropertyPermission "java.vm.specification.version", "read"; permission java.util.PropertyPermission "java.vm.specification.vendor", "read"; permission java.util.PropertyPermission "java.vm.specification.name", "read"; permission java.util.PropertyPermission "java.vm.version", "read"; permission java.util.PropertyPermission "java.vm.vendor", "read"; permission java.util.PropertyPermission "java.vm.name", "read"; }; grant signedBy "catrin", codeBase "file://c:\catrin\security\test\sysinfsignedcatrin.jar" { permission java.util.PropertyPermission "user.name", "read, write", signedBy "catrin"; permission java.util.PropertyPermission "user.home", "read, write", signedBy "catrin"; permission java.util.PropertyPermission "user.dir", "read, write", signedBy "catrin"; }; grant signedBy "tom", codeBase "file://c:\catrin\security\test\sysinfsignedtom.jar" { permission java.util.PropertyPermission "java.version", "read, write", signedBy "tom"; permission java.util.PropertyPermission "java.vendor", "read, write", signedBy "tom"; }; 23 Security / Java-Sicherheit Catrin Godau Listing des Beispiel-Applets Datei SystemInfo.java ________________________________________________________________ import java.applet.*; import java.awt.*; class LabelField extends Panel { int labelWidth; Label lbl; TextField field; public LabelField(int labelWidth, String lbl, String val) { this.labelWidth = labelWidth; add(this.lbl = new Label(lbl)); add(this.field = new TextField(val)); field.setEditable(false); } public void layout() { Dimension d = size(); Dimension p1 = lbl.preferredSize(); Dimension p2 = field.preferredSize(); lbl.reshape(0, 0, labelWidth, p1.height); field.reshape(labelWidth + 5, 0, d.width - (labelWidth + 5), p2.height); } } public class SystemInfo extends Applet { 24 CardLayout c; Panel p; public void init() { Font lbl = new Font("Helvetica", Font.BOLD, 14); setLayout(new BorderLayout()); add("South", p = new Panel()); p.add(new Button("Next")); p.add(new Button("Previous")); add("Center", p = new Panel()); p.setLayout(c = new CardLayout()); Panel p2 = new Panel(); p2.setLayout(new GridLayout(0, 1)); p2.add(new Label("System Properties")).setFont(lbl); p2.add(new LabelField(100, "version:", System.getProperty("java.version"))); p2.add(new LabelField(100, "vendor:", System.getProperty("java.vendor"))); p2.add(new LabelField(100, "vendor.url:", System.getProperty("java.vendor.url"))); p.add("system", p2); p2 = new Panel(); p2.setLayout(new GridLayout(0, 1)); p2.add(new Label("User Properties")).setFont(lbl); p2.add(new LabelField(100, "User:", System.getProperty("user.name"))); p2.add(new LabelField(100, "Home:", System.getProperty("user.home"))); p2.add(new LabelField(100, "Current:", System.getProperty("user.dir"))); p.add("user", p2); 25 Security / Java-Sicherheit Catrin Godau p2 = new Panel(); p2.add(new Label("Java Properties")).setFont(lbl); p2.setLayout(new GridLayout(0, 1)); p2.add(new LabelField(100, "java home:", System.getProperty("java.home"))); p2.add(new LabelField(100, "class version:", System.getProperty("java.class.version"))); p2.add(new LabelField(100, "class path:", System.getProperty("java.class.path"))); p.add("java", p2); p2 = new Panel(); p2.setLayout(new GridLayout(0, 1)); p2.add(new Label("OS Properties")).setFont(lbl); p2.add(new LabelField(100, "OS:", System.getProperty("os.name"))); p2.add(new LabelField(100, "OS Arch:", System.getProperty("os.arch"))); p2.add(new LabelField(100, "OS Version:", System.getProperty("os.version"))); p.add("os", p2); p2 = new Panel(); p2.setLayout(new GridLayout(0, 1)); p2.add(new Label("Misc Properties")).setFont(lbl); p2.add(new LabelField(100, "File Separator:", System.getProperty("file.separator"))); p2.add(new LabelField(100, "Path Separator:", System.getProperty("path.separator"))); p2.add(new LabelField(100, "Line Separator:", System.getProperty("line.separator"))); p.add("sep", p2); } public boolean action(Event evt, Object obj) { if ("Next".equals(obj)) { 26 c.next(p); return true; } if ("Previous".equals(obj)) { c.previous(p); return true; } return false; } } ____________________________________________________________ 27 Security / Java-Sicherheit Catrin Godau Einbinden der signierten und unsignierten Applet-Klassen in eine HTML Seite, die auf irgendeiner WebPage verfügbar ist: ____________________________________________________________________ <HTML> <HEAD> <TITLE>SystemInfo-HTML unsigned</TITLE> </HEAD> <BODY> <APPLET CODE="sysinf.jar" WIDTH=430 HEIGHT=270></APPLET> </BODY> </HTML> _____________________________________________________________________ <HTML> <HEAD> <TITLE>SystemInfo-HTML signed Catrin</TITLE> </HEAD> <BODY> <APPLET CODE="sysinfsignedcatrin.jar" WIDTH=430 HEIGHT=270></APPLET> </BODY> </HTML> ______________________________________________________________________ <HTML> <HEAD> <TITLE>SystemInfo-HTML signed Tom</TITLE> </HEAD> <BODY> <APPLET CODE="sysinfsignedtom.jar" WIDTH=430 HEIGHT=270></APPLET> </BODY> </HTML> ______________________________________________________________________ 28 nun kann durch den Besuch der WebPage das Applet ausgeführt werden und die verschiedenen Restriktionen bzw. Schreib- und Leserechte können getestet werden. Quellen C:\jdk1.2\docs\guide\security\permissions.html C:\jdk1.2\docs\guide\security\PolicyFiles.html C:\jdk1.2\docs\tooldocs\win32\keytool.html C:\jdk1.2\docs\guide\security\spec\security-spec.doc.html Unix open Mai 99 „Raus aus dem Sandkasten“ (Manfred Simon) O’Reilly JAVA in an Nutshell 1998 29